{"version":3,"file":"interactiveCalendar.bundle.js","sources":["../../../node_modules/hammerjs/hammer.js","../../Blocks/InteractiveCalendarBlock/interactive-calendar.js"],"sourcesContent":["/*! 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.\\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","class InteractiveCalendar {\r\n constructor() {\r\n const cards = document.querySelectorAll('.interactive-calendar__card');\r\n\r\n if (!cards.length) {\r\n return;\r\n }\r\n\r\n this.initializeCards(cards, true);\r\n this.attachEventListeners(this, cards)\r\n this.attachIntersectionObserver();\r\n }\r\n\r\n attachIntersectionObserver() {\r\n const watcher = [...document.querySelectorAll('.interactive-calendar__cards .interactive-calendar__card')][0]\r\n const options = {\r\n rootMargin: \"0px\",\r\n threshold: 0.75\r\n };\r\n const observer = new IntersectionObserver(function (entries, observer) {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n watcher.classList.add('interactive-calendar__card--wiggle');\r\n setTimeout(() => {\r\n watcher.classList.remove('interactive-calendar__card--wiggle');\r\n observer.unobserve(entry.target);\r\n }, 1500)\r\n } else {\r\n watcher.classList.remove('interactive-calendar__card--wiggle');\r\n }\r\n });\r\n }, options);\r\n\r\n observer.observe(watcher);\r\n }\r\n\r\n attachEventListeners(self, cards) {\r\n cards.forEach(function (el) {\r\n const hammertime = new Hammer(el);\r\n\r\n hammertime.on('pan', function (e) {\r\n e.preventDefault();\r\n el.classList.add('moving');\r\n });\r\n\r\n hammertime.on('pan', function (e) {\r\n e.preventDefault();\r\n if (e.deltaX === 0)\r\n return;\r\n if (e.center.x === 0 && e.center.y === 0)\r\n return;\r\n\r\n const xMulti = e.deltaX * 0.03;\r\n const yMulti = e.deltaY / 80;\r\n const rotate = ((xMulti * yMulti) / 5);\r\n\r\n e.target.style.transform = 'translate(' + e.deltaX + 'px, ' + e.deltaY + 'px) rotate(' + rotate + 'deg)';\r\n });\r\n\r\n hammertime.on('panend', function (e) {\r\n el.classList.remove('moving');\r\n const moveOutWidth = document.body.clientWidth;\r\n e.target.classList.toggle('interactive-calendar__card--removed');\r\n\r\n const endX = Math.max(Math.abs(e.velocityX) * moveOutWidth, moveOutWidth);\r\n const toX = e.deltaX > 0 ? endX : -endX;\r\n const endY = Math.abs(e.velocityY) * moveOutWidth;\r\n const toY = e.deltaY > 0 ? endY : -endY;\r\n const xMulti = e.deltaX * 0.03;\r\n const yMulti = e.deltaY / 80;\r\n const rotate = ((xMulti * yMulti) / 5);\r\n\r\n e.target.style.transform = 'translate(' + toX + 'px, ' + (toY + e.deltaY) + 'px) rotate(' + rotate + 'deg)';\r\n self.initializeCards(cards, true);\r\n });\r\n });\r\n\r\n\r\n const previousButtons = document.querySelectorAll('.interactive-calendar__button.interactive-calendar__button--previous');\r\n previousButtons.forEach(function (previousButton) {\r\n previousButton.addEventListener('click', () => self.previousOrNextButtonOnClick(false, self));\r\n });\r\n\r\n const nextButtons = document.querySelectorAll('.interactive-calendar__button.interactive-calendar__button--next');\r\n nextButtons.forEach(function (nextButton) {\r\n nextButton.addEventListener('click', () => self.previousOrNextButtonOnClick(true, self));\r\n });\r\n\r\n const timelineButtons = document.querySelectorAll('.interactive-calendar__timeline-item');\r\n timelineButtons.forEach(function (timelineButton) {\r\n timelineButton.addEventListener('click', (e) => self.handleTimelineButtonOnClick(e, self));\r\n });\r\n }\r\n\r\n initializeCards(cards, next) {\r\n const newCards = document.querySelectorAll('.interactive-calendar__card:not(.interactive-calendar__card--removed)');\r\n\r\n newCards.forEach(function (card, index) {\r\n card.style.zIndex = cards.length - index;\r\n if (index === 0) {\r\n card.style.transform = '';\r\n } else if (index === 1) {\r\n card.style.transform = 'rotate(3.5deg)';\r\n } else if (index === 2) {\r\n card.style.transform = 'rotate(1deg)';\r\n } else {\r\n card.style.transform = 'rotate(-1.5deg)';\r\n }\r\n });\r\n\r\n const removedCards = document.querySelectorAll('.interactive-calendar__card.interactive-calendar__card--removed');\r\n if (removedCards.length) {\r\n removedCards.forEach(function (card) {\r\n if (next) {\r\n card.parentNode.appendChild(card);\r\n }\r\n else {\r\n card.parentNode.insertBefore(card, card.parentNode.firstChild);\r\n }\r\n card.classList.remove('interactive-calendar__card--removed');\r\n });\r\n\r\n this.initializeCards(cards, next);\r\n }\r\n\r\n const currentCard = [...document.querySelectorAll('.interactive-calendar__cards .interactive-calendar__card')][0]\r\n const currentTitle = currentCard.getElementsByClassName('interactive-calendar__card-title')[0];\r\n\r\n const timelineTags = document.querySelectorAll('.interactive-calendar__timeline-tag');\r\n timelineTags.forEach(function (tag) {\r\n tag.innerText = currentTitle.innerText;\r\n });\r\n\r\n const timelineItems = new Set(document.querySelectorAll('.interactive-calendar__timeline-item'));\r\n\r\n timelineItems.forEach(function (item) {\r\n if (currentCard.dataset.card === item.dataset.card) {\r\n if (item.classList.contains('interactive-calendar__timeline-item--active')) {\r\n const event = new Event('changedcard');\r\n event.card = currentCard;\r\n event.cardNumber = currentCard.dataset.card;\r\n event.totalCards = cards.length;\r\n item.dispatchEvent(event);\r\n }\r\n item.classList.add('interactive-calendar__timeline-item--active');\r\n } else {\r\n item.classList.remove('interactive-calendar__timeline-item--active');\r\n }\r\n });\r\n\r\n document.querySelector('.interactive-calendar__cards').classList.add('interactive-calendar__cards--loaded');\r\n }\r\n\r\n previousOrNextButtonOnClick(next, self) {\r\n const cards = document.querySelectorAll('.interactive-calendar__card:not(.interactive-calendar__card--removed)');\r\n\r\n if (!cards.length)\r\n return false;\r\n\r\n if (next) {\r\n const card = cards[0];\r\n card.classList.add('interactive-calendar__card--removed');\r\n }\r\n else {\r\n const card = cards[cards.length - 1];\r\n card.classList.add('interactive-calendar__card--removed');\r\n }\r\n\r\n const allCards = document.querySelectorAll('.interactive-calendar__card');\r\n self.initializeCards(allCards, next);\r\n }\r\n\r\n handleTimelineButtonOnClick(e, self) {\r\n const targetCardId = e.target.dataset.card;\r\n const CARDS_SELECTOR = '.interactive-calendar__card:not(.interactive-calendar__card--removed)';\r\n let currentCardId = parseInt(document.querySelectorAll(CARDS_SELECTOR)[0].dataset.card);\r\n\r\n if (targetCardId > currentCardId) {\r\n do {\r\n self.previousOrNextButtonOnClick(true, self);\r\n currentCardId = parseInt(document.querySelectorAll(CARDS_SELECTOR)[0].dataset.card);\r\n } while (targetCardId > currentCardId)\r\n }\r\n else if (targetCardId < currentCardId) {\r\n do {\r\n self.previousOrNextButtonOnClick(false, self);\r\n currentCardId = parseInt(document.querySelectorAll(CARDS_SELECTOR)[0].dataset.card);\r\n } while (targetCardId < currentCardId)\r\n }\r\n }\r\n}\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n new InteractiveCalendar();\r\n});"],"names":["window","document","exportName","undefined","VENDOR_PREFIXES","TEST_ELEMENT","TYPE_FUNCTION","round","abs","now","setTimeoutContext","fn","timeout","context","bindFn","invokeArrayArg","arg","each","obj","iterator","i","deprecate","method","name","message","deprecationMessage","e","stack","log","assign","target","output","index","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","properties","baseP","childP","boolOrFn","val","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","removeEventListeners","hasParent","node","parent","inStr","str","find","inArray","findByKey","toArray","uniqueArray","key","sort","results","values","a","b","prefixed","property","prefix","prop","camelProp","_uniqueId","uniqueId","getWindowForElement","element","doc","MOBILE_REGEX","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","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","ev","createInputInstance","Type","inputClass","PointerEventInput","TouchInput","TouchMouseInput","MouseInput","inputHandler","eventType","input","pointersLen","changedPointersLen","isFirst","isFinal","computeInputData","session","pointers","pointersLength","simpleCloneInputData","firstInput","firstMultiple","offsetCenter","center","getCenter","getAngle","getDistance","computeDeltaXY","getDirection","overallVelocity","getVelocity","getScale","getRotation","computeIntervalInputData","offset","prevDelta","prevInput","last","deltaTime","velocity","velocityX","velocityY","direction","deltaX","deltaY","v","x","y","p1","p2","props","start","end","MOUSE_INPUT_MAP","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","POINTER_INPUT_MAP","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","removePointer","eventTypeNormalized","pointerType","isTouch","storeIndex","SINGLE_TOUCH_INPUT_MAP","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","SingleTouchInput","touches","normalizeSingleTouches","all","changed","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","getTouches","allTouches","targetIds","targetTouches","changedTouches","changedTargetTouches","touch","DEDUP_TIMEOUT","DEDUP_DISTANCE","inputEvent","inputData","isMouse","recordTouches","isSyntheticEvent","eventData","setLastTouch","lastTouch","lts","removeLastTouch","t","dx","dy","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","getTouchActionProps","TouchAction","value","actions","recognizer","cleanTouchActions","srcEvent","hasNone","hasPanY","hasPanX","isTapPointer","isTapMovement","isTapTouchTime","touchMap","cssSupports","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","Recognizer","options","otherRecognizer","simultaneous","getRecognizerByNameIfManager","requireFail","state","emit","event","stateStr","inputDataClone","directionStr","AttrRecognizer","optionPointers","isRecognized","isValid","PanRecognizer","hasMoved","distance","PinchRecognizer","inOut","PressRecognizer","validPointers","validMovement","validTime","RotateRecognizer","SwipeRecognizer","TapRecognizer","validTouchTime","validInterval","validMultiTap","tapCount","Hammer","Manager","STOP","FORCED_STOP","toggleCssProps","item","force","recognizers","curRecognizer","existing","events","handlers","data","triggerDomEvent","add","gestureEvent","freeGlobal","module","InteractiveCalendar","cards","watcher","entries","observer","entry","el","hammertime","xMulti","yMulti","rotate","moveOutWidth","endX","toX","endY","toY","previousButton","nextButton","timelineButton","next","card","removedCards","currentCard","currentTitle","tag","allCards","targetCardId","CARDS_SELECTOR","currentCardId"],"mappings":"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","x_google_ignoreList":[0]}