File: D:/HostingSpaces/pietvanmierlo/stempelbv.nl/wwwroot/js/site/vendor.js.map
{"version":3,"sources":["webpack:///./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js","webpack:///./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js","webpack:///./node_modules/hammerjs/hammer.js"],"names":["window","t","navigator","userAgent","match","n","parseInt","document","documentElement","style","o","e","i","l","a","d","split","length","clientWidth","clientHeight","indexOf","dataset","objectFit","getAttribute","objectPosition","parentNode","getComputedStyle","getPropertyValue","position","overflow","display","height","className","top","right","bottom","left","width","marginTop","marginLeft","Event","querySelectorAll","nodeName","toLowerCase","complete","addEventListener","this","readyState","objectFitPolyfill","exports","r","Array","isArray","from","Object","defineProperty","value","removeEventListener","platform","test","c","u","s","v","f","some","options","allowTouchMove","m","event","target","touches","preventDefault","setTimeout","body","paddingRight","disableBodyScroll","console","error","targetElement","concat","ontouchstart","targetTouches","clientY","ontouchmove","scrollTop","scrollHeight","stopPropagation","passive","reserveScrollBarGap","innerWidth","clearAllBodyScrollLocks","forEach","enableBodyScroll","filter","exportName","undefined","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","TYPE_FUNCTION","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","bindFn","invokeArrayArg","arg","each","obj","iterator","call","hasOwnProperty","deprecate","method","name","message","deprecationMessage","Error","stack","replace","log","warn","apply","arguments","TypeError","output","index","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","properties","childP","baseP","prototype","create","constructor","_super","boolOrFn","val","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","removeEventListeners","hasParent","node","parent","inStr","str","find","trim","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","push","b","prefixed","property","prefix","prop","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","COMPUTE_INTERVAL","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","start","end","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","SingleTouchInput","started","normalizeSingleTouches","all","changed","changedTouches","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","TouchInput","targetIds","getTouches","allTouches","identifier","changedTargetTouches","touch","DEDUP_TIMEOUT","DEDUP_DISTANCE","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","item","add","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","STATE_FAILED","Tap","Pan","Swipe","Pinch","Rotate","Press"],"mappings":"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","file":"/js/site/vendor.js","sourcesContent":["!function(){\"use strict\";if(\"undefined\"!=typeof window){var t=window.navigator.userAgent.match(/Edge\\/(\\d{2})\\./),n=!!t&&16<=parseInt(t[1],10);if(!(\"objectFit\"in document.documentElement.style!=!1)||n){var o=function(t,e,i){var n,o,l,a,d;if((i=i.split(\" \")).length<2&&(i[1]=i[0]),\"x\"===t)n=i[0],o=i[1],l=\"left\",a=\"right\",d=e.clientWidth;else{if(\"y\"!==t)return;n=i[1],o=i[0],l=\"top\",a=\"bottom\",d=e.clientHeight}if(n!==l&&o!==l){if(n!==a&&o!==a)return\"center\"===n||\"50%\"===n?(e.style[l]=\"50%\",void(e.style[\"margin-\"+l]=d/-2+\"px\")):void(0<=n.indexOf(\"%\")?(n=parseInt(n))<50?(e.style[l]=n+\"%\",e.style[\"margin-\"+l]=d*(n/-100)+\"px\"):(n=100-n,e.style[a]=n+\"%\",e.style[\"margin-\"+a]=d*(n/-100)+\"px\"):e.style[l]=n);e.style[a]=\"0\"}else e.style[l]=\"0\"},l=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute(\"data-object-fit\"),i=t.dataset?t.dataset.objectPosition:t.getAttribute(\"data-object-position\");e=e||\"cover\",i=i||\"50% 50%\";var n=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),i=e.getPropertyValue(\"position\"),n=e.getPropertyValue(\"overflow\"),o=e.getPropertyValue(\"display\");i&&\"static\"!==i||(t.style.position=\"relative\"),\"hidden\"!==n&&(t.style.overflow=\"hidden\"),o&&\"inline\"!==o||(t.style.display=\"block\"),0===t.clientHeight&&(t.style.height=\"100%\"),-1===t.className.indexOf(\"object-fit-polyfill\")&&(t.className=t.className+\" object-fit-polyfill\")}(n),function(t){var e=window.getComputedStyle(t,null),i={\"max-width\":\"none\",\"max-height\":\"none\",\"min-width\":\"0px\",\"min-height\":\"0px\",top:\"auto\",right:\"auto\",bottom:\"auto\",left:\"auto\",\"margin-top\":\"0px\",\"margin-right\":\"0px\",\"margin-bottom\":\"0px\",\"margin-left\":\"0px\"};for(var n in i)e.getPropertyValue(n)!==i[n]&&(t.style[n]=i[n])}(t),t.style.position=\"absolute\",t.style.width=\"auto\",t.style.height=\"auto\",\"scale-down\"===e&&(e=t.clientWidth<n.clientWidth&&t.clientHeight<n.clientHeight?\"none\":\"contain\"),\"none\"===e?(o(\"x\",t,i),void o(\"y\",t,i)):\"fill\"===e?(t.style.width=\"100%\",t.style.height=\"100%\",o(\"x\",t,i),void o(\"y\",t,i)):(t.style.height=\"100%\",void(\"cover\"===e&&t.clientWidth>n.clientWidth||\"contain\"===e&&t.clientWidth<n.clientWidth?(t.style.top=\"0\",t.style.marginTop=\"0\",o(\"x\",t,i)):(t.style.width=\"100%\",t.style.height=\"auto\",t.style.left=\"0\",t.style.marginLeft=\"0\",o(\"y\",t,i))))},e=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll(\"[data-object-fit]\");else if(t&&t.nodeName)t=[t];else{if(\"object\"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var e=0;e<t.length;e++)if(t[e].nodeName){var i=t[e].nodeName.toLowerCase();if(\"img\"===i){if(n)continue;t[e].complete?l(t[e]):t[e].addEventListener(\"load\",function(){l(this)})}else\"video\"===i?0<t[e].readyState?l(t[e]):t[e].addEventListener(\"loadedmetadata\",function(){l(this)}):l(t[e])}return!0};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",e):e(),window.addEventListener(\"resize\",e),window.objectFitPolyfill=e}else window.objectFitPolyfill=function(){return!1}}}();","!function(e,t){if(\"function\"==typeof define&&define.amd)define([\"exports\"],t);else if(\"undefined\"!=typeof exports)t(exports);else{var o={};t(o),e.bodyScrollLock=o}}(this,function(exports){\"use strict\";function r(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}return Array.from(e)}Object.defineProperty(exports,\"__esModule\",{value:!0});var l=!1;if(\"undefined\"!=typeof window){var e={get passive(){l=!0}};window.addEventListener(\"testPassive\",null,e),window.removeEventListener(\"testPassive\",null,e)}var d=\"undefined\"!=typeof window&&window.navigator&&window.navigator.platform&&/iP(ad|hone|od)/.test(window.navigator.platform),c=[],u=!1,a=-1,s=void 0,v=void 0,f=function(t){return c.some(function(e){return!(!e.options.allowTouchMove||!e.options.allowTouchMove(t))})},m=function(e){var t=e||window.event;return!!f(t.target)||(1<t.touches.length||(t.preventDefault&&t.preventDefault(),!1))},o=function(){setTimeout(function(){void 0!==v&&(document.body.style.paddingRight=v,v=void 0),void 0!==s&&(document.body.style.overflow=s,s=void 0)})};exports.disableBodyScroll=function(i,e){if(d){if(!i)return void console.error(\"disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.\");if(i&&!c.some(function(e){return e.targetElement===i})){var t={targetElement:i,options:e||{}};c=[].concat(r(c),[t]),i.ontouchstart=function(e){1===e.targetTouches.length&&(a=e.targetTouches[0].clientY)},i.ontouchmove=function(e){var t,o,n,r;1===e.targetTouches.length&&(o=i,r=(t=e).targetTouches[0].clientY-a,!f(t.target)&&(o&&0===o.scrollTop&&0<r?m(t):(n=o)&&n.scrollHeight-n.scrollTop<=n.clientHeight&&r<0?m(t):t.stopPropagation()))},u||(document.addEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!0)}}else{n=e,setTimeout(function(){if(void 0===v){var e=!!n&&!0===n.reserveScrollBarGap,t=window.innerWidth-document.documentElement.clientWidth;e&&0<t&&(v=document.body.style.paddingRight,document.body.style.paddingRight=t+\"px\")}void 0===s&&(s=document.body.style.overflow,document.body.style.overflow=\"hidden\")});var o={targetElement:i,options:e||{}};c=[].concat(r(c),[o])}var n},exports.clearAllBodyScrollLocks=function(){d?(c.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),u&&(document.removeEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!1),c=[],a=-1):(o(),c=[])},exports.enableBodyScroll=function(t){if(d){if(!t)return void console.error(\"enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.\");t.ontouchstart=null,t.ontouchmove=null,c=c.filter(function(e){return e.targetElement!==t}),u&&0===c.length&&(document.removeEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!1)}else(c=c.filter(function(e){return e.targetElement!==t})).length||o()}});\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n"],"sourceRoot":""}