{"version":3,"sources":["drag.js","swipe.js","touch.js","transform.js","mobile-angular-ui.gestures.js"],"names":["angular","module","provider","this","$get","$touch","$transform","style","document","createElement","appendChild","createTextNode","head","sheet","insertRule","NULL_TRANSFORM","element","transform","TRANSLATE_BOTH","touch","translateX","distanceX","translateY","distanceY","TRANSLATE_HORIZONTAL","TRANSLATE_UP","TRANSLATE_DOWN","TRANSLATE_LEFT","TRANSLATE_RIGHT","TRANSLATE_VERTICAL","TRANSLATE_INSIDE","wrapperElementOrRectangle","length","tx","ty","re","getBoundingClientRect","rw","Element","width","right","stepX","left","height","bottom","stepY","top","bind","$element","dragOptions","touchOptions","tS","rS","startEventHandler","start","endEventHandler","end","moveEventHandler","move","cancelEventHandler","cancel","transformEventHandler","domElement","tO","get","rO","moving","isMoving","cleanup","removeClass","reset","set","undo","setup","addClass","createDragInfo","extend","originalTransform","originalRect","startRect","rect","startTransform","onTouchMove","event","preventDefault","onTouchEnd","__UiSwipeHandled__","onTouchCancel","factory","VELOCITY_THRESHOLD","MOVEMENT_THRESHOLD","TURNAROUND_MAX","ANGLE_THRESHOLD","abs","Math","defaultOptions","movementThreshold","valid","t","absAngle","angle","validDistance","total","distance","validAngle","validVelocity","averageVelocity","eventHandlers","options","forEach","prefix","direction","directiveName","directive","$swipe","$parse","link","scope","elem","attrs","onSwipe","swipe","toUpperCase","$apply","VALID","POINTER_EVENTS","mouse","POINTER_TYPES","SENSITIVE_AREA","ownerDocument","documentElement","setPointerEvents","pointerEvents","Object","keys","setValid","fn","setMovementThreshold","v","setSensitiveArea","fnOrElementOrRect","atan2","sqrt","getCoordinates","touches","e","changedTouches","originalEvent","x","clientX","y","clientY","getEvents","pointerTypes","eventType","res","pointerType","eventName","push","join","now","Date","timediff","t1","t2","len","buildTouchInfo","type","c","t0","tl","ts","ts0","timestamp","tsl","x0","y0","xl","yl","totalXl","totalX","totalYl","totalY","duration","durationl","dxl","dyl","dl","dx","dy","d","tv","dir","PI","startX","startY","prevX","prevY","step","velocity","isValid","undefined","sensitiveArea","startEvents","endEvents","moveEvents","cancelEvents","$movementTarget","resetTouch","off","isActive","Boolean","onTouchStart","on","coords","mva","mvaRect","cancelable","setTimeout","cssPrefix","transformProperty","styleProperty","prefixes","i","toLowerCase","getElementTransformProperty","tr","window","getComputedStyle","getPropertyValue","setElementTransformProperty","value","SMALL_NUMBER","rad2deg","asin","cos","floor","cloneMatrix","m","j","determinant2x2","a","b","determinant3x3","a1","a2","a3","b1","b2","b3","c1","c2","c3","determinant4x4","d1","d2","d3","a4","b4","c4","d4","adjoint","inverse","det","transposeMatrix4","v4MulPointByMatrix","p","v3Length","v3Scale","desiredLength","l","v3Dot","v3Combine","ascl","bscl","v3Cross","decompose","mat","result","localMatrix","perspectiveMatrix","rightHandSide","inversePerspectiveMatrix","transposedInversePerspectiveMatrix","perspectivePoint","perspectiveX","perspectiveY","perspectiveZ","perspectiveW","translateZ","pdum3","row","scaleX","skewXY","scaleY","skewXZ","skewYZ","scaleZ","rotateY","rotateX","rotateZ","fCom","n","def","val","String","toFixed","fPx","fDeg","fromCssMatrix","M","elems","split","map","Number","match","col","toCss","perspective","translate","scale","rotation","skew","str"],"mappings":"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","file":"mobile-angular-ui.gestures.min.js","sourcesContent":["/**\n * @module mobile-angular-ui.gestures.drag\n * @description\n *\n * `mobile-angular-ui.gestures.drag` module exposes the `$drag` service that is used\n * to handle drag gestures. `$drag` service wraps [$touch](../module:touch) service adding\n * CSS transforms reacting to `touchmove` events.\n *\n * ## Usage\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures']);\n * ```\n *\n * Or\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures.drag']);\n * ```\n *\n * ``` js\n * var dragOptions = {\n * transform: $drag.TRANSLATE_BOTH,\n * start: function(dragInfo, event){},\n * end: function(dragInfo, event){},\n * move: function(dragInfo, event){},\n * cancel: function(dragInfo, event){}\n * };\n *\n * $drag.bind(element, dragOptions, touchOptions);\n * ```\n *\n * Where:\n *\n * - `transform` is a `function(element, currentTransform, touch) -> newTransform`\n * returning taking an `element`, its `currentTransform` and returning the `newTransform`\n * for the element in response to `touch`. See [$transform](../module:transform) for more.\n * Default to `$drag.TRANSLATE_BOTH`.\n * - `start`, `end`, `move`, `cancel` are optional callbacks responding to `drag` movement phases.\n * - `dragInfo` is an extended version of `touchInfo` from [$touch](../module:touch),\n * extending it with:\n * - `originalTransform`: The [$transform](../module:transform) object relative to CSS transform before `$drag` is bound.\n * - `originalRect`: The [Bounding Client Rect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)\n * for bound element before any drag action.\n * - `startRect`: The [Bounding Client Rect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)\n * for bound element registered at `start` event.\n * - `startTransform`: The [$transform](../module:transform) at `start` event.\n * - `rect`: The current [Bounding Client Rect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect) for bound element.\n * - `transform`: The current [$transform](../module:transform).\n * - `reset`: A function restoring element to `originalTransform`.\n * - `undo`: A function restoring element to `startTransform`.\n * - `touchOptions` is an option object to be passed to underlying [`$touch`](../module:touch) service.\n *\n * ### Predefined transforms\n *\n * - `$drag.NULL_TRANSFORM`: No transform follow movement\n * - `$drag.TRANSLATE_BOTH`: Transform translate following movement on both x and y axis.\n * - `$drag.TRANSLATE_HORIZONTAL`: Transform translate following movement on x axis.\n * - `$drag.TRANSLATE_UP`: Transform translate following movement on negative y axis.\n * - `$drag.TRANSLATE_DOWN`: Transform translate following movement on positive y axis.\n * - `$drag.TRANSLATE_LEFT`: Transform translate following movement on negative x axis.\n * - `$drag.TRANSLATE_RIGHT`: Transform translate following movement on positive x axis.\n * - `$drag.TRANSLATE_VERTICAL`: Transform translate following movement on y axis.\n * - `$drag.TRANSLATE_INSIDE`: Is a function and should be used like:\n *\n * ``` js\n * {\n * transform: $drag.TRANSLATE_INSIDE(myElement)\n * }\n * ```\n *\n * It returns a transform function that contains translate movement inside\n * the passed element.\n *\n * ### `.ui-drag-move` style\n *\n * While moving an `.ui-drag-move` class is attached to element. Style for this class is defined via\n * [insertRule](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet.insertRule) and aims to\n * fix common problems while dragging, specifically:\n *\n * - Brings the element in front of other elements\n * - Disable transitions\n * - Makes text unselectable\n *\n * **NOTE** Transitions are disabled cause they may introduce conflicts between `transition: transform`\n * and `dragOptions.transform` function.\n *\n * They will be re-enabled after drag, and this can be used to achieve some graceful effects.\n *\n * If you need transition that does not involve transforms during movement you can apply them to an\n * inner or wrapping element.\n *\n * ### Examples\n *\n * #### Limit movement to an element\n *\n * ``` js\n * app.directive('dragMe', ['$drag', function($drag){\n * return {\n * controller: function($scope, $element) {\n * $drag.bind($element,\n * {\n * transform: $drag.TRANSLATE_INSIDE($element.parent()),\n * end: function(drag) {\n * drag.reset();\n * }\n * },\n * { // release touch when movement is outside bounduaries\n * sensitiveArea: $element.parent()\n * }\n * );\n * }\n * };\n * }]);\n * ```\n * \n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.gestures.drag', [\n 'mobile-angular-ui.gestures.touch',\n 'mobile-angular-ui.gestures.transform'\n ])\n\n .provider('$drag', function() {\n this.$get = ['$touch', '$transform', function($touch, $transform) {\n\n // Add some css rules to be used while moving elements\n var style = document.createElement('style');\n style.appendChild(document.createTextNode(''));\n document.head.appendChild(style);\n var sheet = style.sheet;\n\n // Makes z-index 99999\n sheet.insertRule('html .ui-drag-move{z-index: 99999 !important;}', 0);\n // Disable transitions\n sheet.insertRule('html .ui-drag-move{' +\n '-webkit-transition: none !important;' +\n '-moz-transition: none !important;-o-transition: none !important;' +\n '-ms-transition: none !important;transition: none !important;' +\n '}', 0);\n\n // Makes text unselectable\n sheet.insertRule('html .ui-drag-move, html .ui-drag-move *{' +\n '-webkit-touch-callout: none !important;' +\n '-webkit-user-select: none !important;' +\n '-khtml-user-select: none !important;' +\n '-moz-user-select: none !important;' +\n '-ms-user-select: none !important;' +\n 'user-select: none !important;' +\n '}', 0);\n\n style = sheet = null; // we wont use them anymore so make\n // their memory immediately claimable\n\n return {\n\n //\n // built-in transforms\n //\n NULL_TRANSFORM: function(element, transform) {\n return transform;\n },\n\n TRANSLATE_BOTH: function(element, transform, touch) {\n transform.translateX = touch.distanceX;\n transform.translateY = touch.distanceY;\n return transform;\n },\n\n TRANSLATE_HORIZONTAL: function(element, transform, touch) {\n transform.translateX = touch.distanceX;\n transform.translateY = 0;\n return transform;\n },\n\n TRANSLATE_UP: function(element, transform, touch) {\n transform.translateY = touch.distanceY <= 0 ? touch.distanceY : 0;\n transform.translateX = 0;\n return transform;\n },\n\n TRANSLATE_DOWN: function(element, transform, touch) {\n transform.translateY = touch.distanceY >= 0 ? touch.distanceY : 0;\n transform.translateX = 0;\n return transform;\n },\n\n TRANSLATE_LEFT: function(element, transform, touch) {\n transform.translateX = touch.distanceX <= 0 ? touch.distanceX : 0;\n transform.translateY = 0;\n return transform;\n },\n\n TRANSLATE_RIGHT: function(element, transform, touch) {\n transform.translateX = touch.distanceX >= 0 ? touch.distanceX : 0;\n transform.translateY = 0;\n return transform;\n },\n\n TRANSLATE_VERTICAL: function(element, transform, touch) {\n transform.translateX = 0;\n transform.translateY = touch.distanceY;\n return transform;\n },\n\n TRANSLATE_INSIDE: function(wrapperElementOrRectangle) {\n wrapperElementOrRectangle = wrapperElementOrRectangle.length ? wrapperElementOrRectangle[0] : wrapperElementOrRectangle;\n\n return function(element, transform, touch) {\n element = element.length ? element[0] : element;\n var re = element.getBoundingClientRect();\n var rw = wrapperElementOrRectangle instanceof Element ? wrapperElementOrRectangle.getBoundingClientRect() : wrapperElementOrRectangle;\n var tx;\n var ty;\n\n if (re.width >= rw.width) {\n tx = 0;\n } else if (re.right + touch.stepX > rw.right) {\n tx = rw.right - re.right;\n } else if (re.left + touch.stepX < rw.left) {\n tx = rw.left - re.left;\n } else {\n tx = touch.stepX;\n }\n\n if (re.height >= rw.height) {\n ty = 0;\n } else if (re.bottom + touch.stepY > rw.bottom) {\n ty = rw.bottom - re.bottom;\n } else if (re.top + touch.stepY < rw.top) {\n ty = rw.top - re.top;\n } else {\n ty = touch.stepY;\n }\n\n transform.translateX += tx;\n transform.translateY += ty;\n return transform;\n };\n },\n\n //\n // bind function\n //\n bind: function($element, dragOptions, touchOptions) {\n $element = angular.element($element);\n dragOptions = dragOptions || {};\n touchOptions = touchOptions || {};\n\n var startEventHandler = dragOptions.start;\n var endEventHandler = dragOptions.end;\n var moveEventHandler = dragOptions.move;\n var cancelEventHandler = dragOptions.cancel;\n var transformEventHandler = dragOptions.transform || this.TRANSLATE_BOTH;\n\n var domElement = $element[0];\n var tO = $transform.get($element); // original transform\n var rO = domElement.getBoundingClientRect(); // original bounding rect\n var tS; // transform at start\n var rS;\n\n var moving = false;\n\n var isMoving = function() {\n return moving;\n };\n\n var cleanup = function() {\n moving = false;\n tS = rS = null;\n $element.removeClass('ui-drag-move');\n };\n\n var reset = function() {\n $transform.set(domElement, tO);\n };\n\n var undo = function() {\n $transform.set(domElement, tS || tO);\n };\n\n var setup = function() {\n moving = true;\n rS = domElement.getBoundingClientRect();\n tS = $transform.get(domElement);\n $element.addClass('ui-drag-move');\n };\n\n var createDragInfo = function(touch) {\n touch = angular.extend({}, touch);\n touch.originalTransform = tO;\n touch.originalRect = rO;\n touch.startRect = rS;\n touch.rect = domElement.getBoundingClientRect();\n touch.startTransform = tS;\n touch.transform = $transform.get(domElement);\n touch.reset = reset;\n touch.undo = undo;\n return touch;\n };\n\n var onTouchMove = function(touch, event) {\n // preventDefault no matter what\n // it is (ie. maybe html5 drag for images or scroll)\n event.preventDefault();\n\n // $touch calls start on the first touch\n // to ensure $drag.start is called only while actually\n // dragging and not for touches we will bind $drag.start\n // to the first time move is called\n\n if (isMoving()) { // drag move\n touch = createDragInfo(touch);\n\n var transform = transformEventHandler($element, angular.extend({}, touch.transform), touch, event);\n\n $transform.set(domElement, transform);\n\n if (moveEventHandler) {\n moveEventHandler(touch, event);\n }\n } else { // drag start\n setup();\n if (startEventHandler) {\n startEventHandler(createDragInfo(touch), event);\n }\n }\n };\n\n var onTouchEnd = function(touch, event) {\n if (!isMoving()) {\n return;\n }\n\n // prevents outer swipes\n event.__UiSwipeHandled__ = true;\n\n touch = createDragInfo(touch);\n cleanup();\n\n if (endEventHandler) {\n endEventHandler(touch, event);\n }\n };\n\n var onTouchCancel = function(touch, event) {\n if (!isMoving()) {\n return;\n }\n\n touch = createDragInfo(touch);\n undo(); // on cancel movement is undoed automatically;\n cleanup();\n\n if (cancelEventHandler) {\n cancelEventHandler(touch, event);\n }\n };\n\n return $touch.bind($element,\n {move: onTouchMove, end: onTouchEnd, cancel: onTouchCancel},\n touchOptions);\n } // ~ bind\n }; // ~ return $drag\n }]; // ~ $get\n });\n\n})();\n","/**\n * A module providing swipe gesture services and directives.\n *\n * @module mobile-angular-ui.gestures.swipe\n */\n(function() {\n 'use strict';\n\n var module = angular.module('mobile-angular-ui.gestures.swipe',\n ['mobile-angular-ui.gestures.touch']);\n\n /**\n * An adaptation of `ngTouch.$swipe`, it is basically the same despite of:\n *\n * - It is based on [$touch](../module:touch)\n * - Swipes are recognized by touch velocity and direction\n * - It does not require `ngTouch` thus is better compatible with fastclick.js\n * - Swipe directives are nestable\n * - It allows to unbind\n * - It has only one difference in interface, and its about how to pass `pointerTypes`:\n *\n * ``` js\n * // ngTouch.$swipe\n * $swipe.bind(..., ['mouse', ... });\n *\n * // mobile-angular-ui.gestures.swipe.$swipe\n * $swipe.bind(..., pointerTypes: { mouse: { start: 'mousedown', ...} });\n * ```\n * This is due to the fact that the second parameter of `$swipe.bind` is destinated to options for\n * underlying `$touch` service.\n *\n * @service $swipe\n * @as class\n */\n module.factory('$swipe', ['$touch', function($touch) {\n var VELOCITY_THRESHOLD = 500; // px/sec\n var MOVEMENT_THRESHOLD = 10; // px\n var TURNAROUND_MAX = 10; // px\n var ANGLE_THRESHOLD = 10; // deg\n var abs = Math.abs;\n\n var defaultOptions = {\n movementThreshold: MOVEMENT_THRESHOLD, // start to consider only if movement\n // exceeded MOVEMENT_THRESHOLD\n valid: function(t) {\n var absAngle = abs(t.angle);\n absAngle = absAngle >= 90 ? absAngle - 90 : absAngle;\n\n var validDistance = t.total - t.distance <= TURNAROUND_MAX;\n var validAngle = absAngle <= ANGLE_THRESHOLD || absAngle >= 90 - ANGLE_THRESHOLD;\n var validVelocity = t.averageVelocity >= VELOCITY_THRESHOLD;\n\n return validDistance && validAngle && validVelocity;\n }\n };\n\n return {\n /**\n * Bind swipe gesture handlers for an element.\n *\n * ``` js\n * var unbind = $swipe.bind(elem, {\n * end: function(touch) {\n * console.log('Swiped:', touch.direction);\n * unbind();\n * }\n * });\n * ```\n *\n * **Swipes Detection**\n *\n * Before consider a touch to be a swipe Mobile Angular UI verifies that:\n *\n * 1. Movement is quick. Average touch velocity should exceed a `VELOCITY_THRESHOLD`.\n * 2. Movement is linear.\n * 3. Movement has a clear, non-ambiguous direction. So we can assume without error\n * that underlying `touch.direction` is exactly the swipe direction. For that\n * movement is checked against an `ANGLE_THRESHOLD`.\n *\n * @param {Element|$element} element The element to observe for swipe gestures.\n * @param {object} eventHandlers An object with handlers for specific swipe events.\n * @param {function} [eventHandlers.start] The callback for swipe start event.\n * @param {function} [eventHandlers.end] The callback for swipe end event.\n * @param {function} [eventHandlers.move] The callback for swipe move event.\n * @param {function} [eventHandlers.cancel] The callback for swipe cancel event.\n * @param {object} [options] Options to be passed to underlying [$touch.bind](../module:touch) function.\n *\n * @returns {function} The unbind function.\n *\n * @method bind\n * @memberOf mobile-angular-ui.gestures.swipe~$swipe\n */\n bind: function(element, eventHandlers, options) {\n options = angular.extend({}, defaultOptions, options || {});\n return $touch.bind(element, eventHandlers, options);\n }\n };\n }]);\n\n /**\n * Specify custom behavior when an element is swiped to the left on a touchscreen device.\n * A leftward swipe is a quick, right-to-left slide of the finger.\n *\n * @directive uiSwipeLeft\n * @param {expression} uiSwipeLeft An expression to be evaluated on leftward swipe.\n */\n /**\n * Specify custom behavior when an element is swiped to the right on a touchscreen device.\n * A rightward swipe is a quick, left-to-right slide of the finger.\n *\n * @directive uiSwipeRight\n * @param {expression} uiSwipeRight An expression to be evaluated on rightward swipe.\n */\n /**\n * Alias for [uiSwipeLeft](#uiswipeleft).\n *\n * @directive ngSwipeLeft\n * @deprecated\n */\n /**\n * Alias for [uiSwipeRight](#uiswiperight).\n *\n * @directive ngSwipeRight\n * @deprecated\n */\n angular.forEach(['ui', 'ng'], function(prefix) {\n angular.forEach(['Left', 'Right'], function(direction) {\n var directiveName = prefix + 'Swipe' + direction;\n module.directive(directiveName, ['$swipe', '$parse', function($swipe, $parse) {\n return {\n link: function(scope, elem, attrs) {\n var onSwipe = $parse(attrs[directiveName]);\n $swipe.bind(elem, {\n end: function(swipe, event) {\n if (swipe.direction === direction.toUpperCase()) {\n if (!event.__UiSwipeHandled__) {\n event.__UiSwipeHandled__ = true;\n scope.$apply(function() {\n onSwipe(scope, {$touch: swipe});\n });\n }\n }\n }\n });\n }\n };\n }]);\n });\n });\n})();\n","/* eslint complexity: 0 */\n\n/**\n * Device agnostic touch handling.\n *\n * **Usage**\n *\n * Require this module doing either\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures']);\n * ```\n *\n * Or standalone\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures.touch']);\n * ```\n *\n * Then you will be able to use the `$touch` service like that:\n *\n * ``` js\n * var unbindFn = $touch.bind(element, {\n * start: function(touchInfo, e);\n * move: function(touchInfo, e);\n * end: function(touchInfo, e);\n * cancel: function(touchInfo, e);\n * }, options);\n * ```\n *\n * @module mobile-angular-ui.gestures.touch\n */\n(function() {\n 'use strict';\n var module = angular.module('mobile-angular-ui.gestures.touch', []);\n\n /**\n * `$touch` is an abstraction of touch event handling that works with\n * any kind of input devices.\n *\n * It is intended for single touch only and provides\n * extended infos about touch like: movement, direction, velocity, duration, and more.\n * $touch service is intended as base to build any single-touch gesture handlers.\n *\n * **Usage**\n *\n * ``` js\n * var unbindFn = $touch.bind(element, {\n * start: function(touchInfo, e);\n * move: function(touchInfo, e);\n * end: function(touchInfo, e);\n * cancel: function(touchInfo, e);\n * }, options);\n * ```\n *\n * @service $touch\n * @as class\n */\n\n /**\n * Configurable provider for `$touch` service\n * @class $touchProvider\n * @ngdoc provider\n * @memberOf mobile-angular-ui.gestures.touch~$touch\n */\n module.provider('$touch', function() {\n\n /* =====================================\n = Configuration =\n =====================================*/\n\n var VALID = function() {\n return true;\n };\n\n var MOVEMENT_THRESHOLD = 1;\n\n var POINTER_EVENTS = {\n mouse: {\n start: 'mousedown',\n move: 'mousemove',\n end: 'mouseup'\n },\n touch: {\n start: 'touchstart',\n move: 'touchmove',\n end: 'touchend',\n cancel: 'touchcancel'\n }\n };\n\n var POINTER_TYPES = ['mouse', 'touch'];\n\n // function or element or rect\n var SENSITIVE_AREA = function($element) {\n return $element[0].ownerDocument.documentElement.getBoundingClientRect();\n };\n\n /**\n * Set default pointer events option.\n * Pointer Events option specifies a device-by-device map between device specific events and\n * touch events.\n *\n * The default Pointer Events Map is defined as:\n *\n * ``` js\n * var POINTER_EVENTS = {\n * 'mouse': {\n * start: 'mousedown',\n * move: 'mousemove',\n * end: 'mouseup'\n * },\n * 'touch': {\n * start: 'touchstart',\n * move: 'touchmove',\n * end: 'touchend',\n * cancel: 'touchcancel'\n * }\n * };\n * ```\n *\n * Ie.\n *\n * ```\n * app.config(function($touchProvider){\n * $touchProvider.setPointerEvents({ pen: {start: \"pendown\", end: \"penup\", move: \"penmove\" }});\n * });\n * ```\n *\n * @name setPointerEvents\n * @param {object} pointerEvents The pointer events map object\n * @memberOf mobile-angular-ui.gestures.touch~$touch.$touchProvider\n */\n this.setPointerEvents = function(pointerEvents) {\n POINTER_EVENTS = pointerEvents;\n POINTER_TYPES = Object.keys(POINTER_EVENTS);\n };\n\n /**\n * Set default validity function for a touch.\n *\n * The default is defined as always true:\n *\n * ``` js\n * $touchProvider.setValid(function(touch, event) {\n * return true;\n * });\n * ```\n *\n * @param {function} validityFunction The validity function. A function that takes two\n * arguments: `touchInfo` and `event`, and returns\n * a `Boolean` indicating wether the corresponding touch\n * should be considered valid and its handlers triggered,\n * or considered invalid and its handlers be ignored.\n * @method setValid\n * @memberOf mobile-angular-ui.gestures.touch~$touch.$touchProvider\n */\n this.setValid = function(fn) {\n VALID = fn;\n };\n\n /**\n * Set default amount of pixels of movement before\n * start to trigger `touchmove` handlers.\n *\n * Default is `1`.\n *\n * ie.\n *\n * ``` js\n * $touchProvider.setMovementThreshold(120);\n * ```\n *\n * @param {integer} threshold The new treeshold.\n *\n * @method setMovementThreshold\n * @memberOf mobile-angular-ui.gestures.touch~$touch.$touchProvider\n */\n this.setMovementThreshold = function(v) {\n MOVEMENT_THRESHOLD = v;\n };\n /**\n * Set default sensitive area.\n *\n * The sensitive area of a touch is the area of the screen inside what\n * we consider a touch to be meaningful thus triggering its handlers.\n *\n * **NOTE:** if movement goes out the sensitive area the touch event is not cancelled,\n * instead its handler are just ignored.\n *\n * By default sensitive area is defined as `ownerDocument` bounding rectangle\n * of the bound element.\n *\n * ie.\n *\n * ``` js\n * $touchProvider.setSensitiveArea(function($element) {\n * return $element[0].ownerDocument.documentElement.getBoundingClientRect();\n * });\n * ```\n *\n * @param {function|Element|TextRectangle} sensitiveArea The new default sensitive area,\n * either static or as function\n * taking an element and returning another\n * element or a\n * [rectangle](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect).\n *\n * @method setSensitiveArea\n * @memberOf mobile-angular-ui.gestures.touch~$touch.$touchProvider\n */\n this.setSensitiveArea = function(fnOrElementOrRect) {\n SENSITIVE_AREA = fnOrElementOrRect;\n };\n\n //\n // Shorthands for minification\n //\n var abs = Math.abs;\n var atan2 = Math.atan2;\n var sqrt = Math.sqrt;\n\n /* ===============================\n = Helpers =\n ===============================*/\n\n var getCoordinates = function(event) {\n var touches = event.touches && event.touches.length ? event.touches : [event];\n var e = (event.changedTouches && event.changedTouches[0]) ||\n (event.originalEvent && event.originalEvent.changedTouches &&\n event.originalEvent.changedTouches[0]) ||\n touches[0].originalEvent || touches[0];\n\n return {\n x: e.clientX,\n y: e.clientY\n };\n };\n\n var getEvents = function(pointerTypes, eventType) {\n var res = [];\n angular.forEach(pointerTypes, function(pointerType) {\n var eventName = POINTER_EVENTS[pointerType][eventType];\n if (eventName) {\n res.push(eventName);\n }\n });\n return res.join(' ');\n };\n\n var now = function() {\n return new Date();\n };\n\n var timediff = function(t1, t2) {\n t2 = t2 || now();\n return abs(t2 - t1);\n };\n\n var len = function(x, y) {\n return sqrt(x * x + y * y);\n };\n\n /**\n * `TouchInfo` is an object containing the following extended informations about any touch\n * event.\n *\n * @property {string} type Normalized event type. Despite of pointer device is always one of `touchstart`, `touchend`, `touchmove`, `touchcancel`.\n * @property {Date} timestamp The time object corresponding to the moment this touch event happened.\n * @property {integer} duration The difference between this touch event and the corresponding `touchstart`.\n * @property {float} startX X coord of related `touchstart`.\n * @property {float} startY Y coord of related `touchstart`.\n * @property {float} prevX X coord of previous `touchstart` or `touchmove`.\n * @property {float} prevY Y coord of previous `touchstart` or `touchmove`.\n * @property {float} x X coord of this touch event.\n * @property {float} y Y coord of this touch event.\n * @property {float} step Distance between `[prevX, prevY]` and `[x, y]` points.\n * @property {float} stepX Distance between `prevX` and `x`.\n * @property {float} stepY Distance between `prevY` and `y`.\n * @property {float} velocity Instantaneous velocity of a touch event in pixels per second.\n * @property {float} averageVelocity Average velocity of a touch event from its corresponding `touchstart` in pixels per second.\n * @property {float} distance Distance between `[startX, startY]` and `[x, y]` points.\n * @property {float} distanceX Distance between `startX` and `x`.\n * @property {float} distanceY Distance between `startY` and `y`.\n * @property {float} total Total number of pixels covered by movement, taking account of direction changes and turnarounds.\n * @property {float} totalX Total number of pixels covered by horizontal movement, taking account of direction changes and turnarounds.\n * @property {float} totalY Total number of pixels covered by vertical, taking account of direction changes and turnarounds.\n * @property {string} direction The current prevalent direction for this touch, one of `LEFT`, `RIGHT`, `TOP`, `BOTTOM`.\n * @property {float} angle Angle in degree between x axis and the vector `[x, y]`, is `null` when no movement happens.\n *\n * @class TouchInfo\n * @ngdoc type\n * @memberOf mobile-angular-ui.gestures.touch~$touch\n */\n\n var buildTouchInfo = function(type, c, t0, tl) {\n // Compute values for new TouchInfo based on coordinates and previus touches.\n // - c is coords of new touch\n // - t0 is first touch: useful to compute duration and distance (how far pointer\n // got from first touch)\n // - tl is last touch: useful to compute velocity and length (total length of the movement)\n\n t0 = t0 || {};\n tl = tl || {};\n\n // timestamps\n var ts = now();\n var ts0 = t0.timestamp || ts;\n var tsl = tl.timestamp || ts0;\n\n // coords\n var x = c.x;\n var y = c.y;\n var x0 = t0.x || x;\n var y0 = t0.y || y;\n var xl = tl.x || x0;\n var yl = tl.y || y0;\n\n // total movement\n var totalXl = tl.totalX || 0;\n var totalYl = tl.totalY || 0;\n var totalX = totalXl + abs(x - xl);\n var totalY = totalYl + abs(y - yl);\n var total = len(totalX, totalY);\n\n // duration\n var duration = timediff(ts, ts0);\n var durationl = timediff(ts, tsl);\n\n // distance\n var dxl = x - xl;\n var dyl = y - yl;\n var dl = len(dxl, dyl);\n var dx = x - x0;\n var dy = y - y0;\n var d = len(dx, dy);\n\n // velocity (px per second)\n var v = durationl > 0 ? abs(dl / (durationl / 1000)) : 0;\n var tv = duration > 0 ? abs(total / (duration / 1000)) : 0;\n\n // main direction: 'LEFT', 'RIGHT', 'TOP', 'BOTTOM'\n var dir = abs(dx) > abs(dy) ?\n (dx < 0 ? 'LEFT' : 'RIGHT') :\n (dy < 0 ? 'TOP' : 'BOTTOM');\n\n // angle (angle between distance vector and x axis)\n // angle will be:\n // 0 for x > 0 and y = 0\n // 90 for y < 0 and x = 0\n // 180 for x < 0 and y = 0\n // -90 for y > 0 and x = 0\n //\n // -90°\n // |\n // |\n // |\n // 180° --------|-------- 0°\n // |\n // |\n // |\n // 90°\n //\n var angle = dx !== 0 || dy !== 0 ? atan2(dy, dx) * (180 / Math.PI) : null;\n angle = angle === -180 ? 180 : angle;\n\n return {\n type: type,\n timestamp: ts,\n duration: duration,\n startX: x0,\n startY: y0,\n prevX: xl,\n prevY: yl,\n x: c.x,\n y: c.y,\n\n step: dl, // distance from prev\n stepX: dxl,\n stepY: dyl,\n\n velocity: v,\n averageVelocity: tv,\n\n distance: d, // distance from start\n distanceX: dx,\n distanceY: dy,\n\n total: total, // total length of momement,\n // considering turnaround\n totalX: totalX,\n totalY: totalY,\n direction: dir,\n angle: angle\n };\n };\n\n /* ======================================\n = Factory Method =\n ======================================*/\n\n this.$get = [function() {\n\n return {\n /**\n *\n * Bind touch handlers for an element.\n *\n * ``` js\n * var unbind = $touch.bind(elem, {\n * end: function(touch) {\n * console.log('Avg Speed:', touch.averageVelocity);\n * unbind();\n * }\n * });\n * ```\n *\n * @param {Element|$element} element The element to bound to.\n * @param {object} eventHandlers An object with handlers for specific touch events.\n * @param {function} [eventHandlers.start] The callback for `touchstart` event.\n * @param {function} [eventHandlers.end] The callback for `touchend` event.\n * @param {function} [eventHandlers.move] The callback for `touchmove` event.\n * @param {function} [eventHandlers.cancel] The callback for `touchcancel` event.\n * @param {object} [options] Options.\n * @param {integer} [options.movementThreshold] Amount of pixels of movement before start to trigger `touchmove` handlers.\n * @param {function} [options.valid] Validity function. A `function(TouchInfo, event)⟶boolean` deciding if a touch should be handled or ignored.\n * @param {function|Element|TextRectangle} [options.sensitiveArea] A\n * [Bounding Client Rect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect) or an element\n * or a function that takes the bound element and returns one of the previous.\n * Sensitive area define bounduaries to release touch when movement is outside.\n * @param {array} [options.pointerTypes] Pointer types to handle. An array of pointer types that is intended to be\n * a subset of keys from default pointer events map (see `$touchProvider.setPointerEvents`).\n *\n * @returns {function} The unbind function.\n *\n * @memberOf mobile-angular-ui.gestures.touch~$touch\n */\n bind: function($element, eventHandlers, options) {\n\n // ensure element to be an angular element\n $element = angular.element($element);\n\n options = options || {};\n // uses default pointer types in case of none passed\n var pointerTypes = options.pointerTypes || POINTER_TYPES;\n var isValid = options.valid === undefined ? VALID : options.valid;\n var movementThreshold = options.movementThreshold === undefined ? MOVEMENT_THRESHOLD : options.movementThreshold;\n var sensitiveArea = options.sensitiveArea === undefined ? SENSITIVE_AREA : options.sensitiveArea;\n\n // first and last touch\n var t0;\n var tl;\n\n // events\n var startEvents = getEvents(pointerTypes, 'start');\n var endEvents = getEvents(pointerTypes, 'end');\n var moveEvents = getEvents(pointerTypes, 'move');\n var cancelEvents = getEvents(pointerTypes, 'cancel');\n\n var startEventHandler = eventHandlers.start;\n var endEventHandler = eventHandlers.end;\n var moveEventHandler = eventHandlers.move;\n var cancelEventHandler = eventHandlers.cancel;\n\n var $movementTarget = angular.element($element[0].ownerDocument);\n var onTouchMove;\n var onTouchEnd;\n var onTouchCancel;\n\n var resetTouch = function() {\n t0 = tl = null;\n $movementTarget.off(moveEvents, onTouchMove);\n $movementTarget.off(endEvents, onTouchEnd);\n if (cancelEvents) {\n $movementTarget.off(cancelEvents, onTouchCancel);\n }\n };\n\n var isActive = function() {\n return Boolean(t0);\n };\n\n //\n // Callbacks\n //\n\n // on touchstart\n var onTouchStart = function(event) {\n // don't handle multi-touch\n if (event.touches && event.touches.length > 1) {\n return;\n }\n tl = t0 = buildTouchInfo('touchstart', getCoordinates(event));\n $movementTarget.on(moveEvents, onTouchMove);\n $movementTarget.on(endEvents, onTouchEnd);\n if (cancelEvents) {\n $movementTarget.on(cancelEvents, onTouchCancel);\n }\n if (startEventHandler) {\n startEventHandler(t0, event);\n }\n };\n\n // on touchCancel\n onTouchCancel = function(event) {\n var t = buildTouchInfo('touchcancel', getCoordinates(event), t0, tl);\n resetTouch();\n if (cancelEventHandler) {\n cancelEventHandler(t, event);\n }\n };\n\n // on touchMove\n onTouchMove = function(event) {\n // don't handle multi-touch\n if (event.touches && event.touches.length > 1) {\n return;\n }\n\n if (!isActive()) {\n return;\n }\n\n var coords = getCoordinates(event);\n\n //\n // wont fire outside sensitive area\n //\n var mva = typeof sensitiveArea === 'function' ? sensitiveArea($element) : sensitiveArea;\n mva = mva.length ? mva[0] : mva;\n\n var mvaRect = mva instanceof Element ? mva.getBoundingClientRect() : mva;\n\n if (coords.x < mvaRect.left || coords.x > mvaRect.right || coords.y < mvaRect.top || coords.y > mvaRect.bottom) {\n return;\n }\n\n var t = buildTouchInfo('touchmove', coords, t0, tl);\n var totalX = t.totalX;\n var totalY = t.totalY;\n\n tl = t;\n\n if (totalX < movementThreshold && totalY < movementThreshold) {\n return;\n }\n\n if (isValid(t, event)) {\n if (event.cancelable === undefined || event.cancelable) {\n event.preventDefault();\n }\n if (moveEventHandler) {\n moveEventHandler(t, event);\n }\n }\n };\n\n // on touchEnd\n onTouchEnd = function(event) {\n // don't handle multi-touch\n if (event.touches && event.touches.length > 1) {\n return;\n }\n\n if (!isActive()) {\n return;\n }\n\n var t = angular.extend({}, tl, {type: 'touchend'});\n if (isValid(t, event)) {\n if (event.cancelable === undefined || event.cancelable) {\n event.preventDefault();\n }\n if (endEventHandler) {\n setTimeout(function() { // weird workaround to avoid\n // delays with dom manipulations\n // inside the handler\n endEventHandler(t, event);\n }, 0);\n }\n }\n resetTouch();\n };\n\n $element.on(startEvents, onTouchStart);\n\n return function unbind() {\n if ($element) { // <- wont throw if accidentally called twice\n $element.off(startEvents, onTouchStart);\n if (cancelEvents) {\n $movementTarget.off(cancelEvents, onTouchCancel);\n }\n $movementTarget.off(moveEvents, onTouchMove);\n $movementTarget.off(endEvents, onTouchEnd);\n\n // Clear all those variables we carried out from `#bind` method scope\n // to local scope and that we don't have to use anymore\n $element = $movementTarget = startEvents = cancelEvents =\n moveEvents = endEvents = onTouchStart = onTouchCancel =\n onTouchMove = onTouchEnd = pointerTypes = isValid =\n movementThreshold = sensitiveArea = null;\n }\n };\n }\n };\n }];\n });\n})();\n","/* eslint complexity: 0 */\n\n/**\n * @module mobile-angular-ui.gestures.transform\n * @description\n *\n * `mobile-angular-ui.gestures.transform` provides the `$transform` service is designed\n * with the specific aim to provide a cross-browser way to interpolate CSS 3d transform\n * without having to deal with CSS Matrix, and being able to take into account any previous\n * unknown transform already applied to an element.\n *\n * ## Usage\n *\n * Require this module doing either\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures']);\n * ```\n *\n * Or standalone\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.gestures.transform']);\n * ```\n *\n * Say we have an element with applyed css:\n *\n * ``` html\n *
\n * ```\n *\n * ``` css\n * .myelem {\n * transform: translate(12px) rotate(20deg);\n * }\n * ```\n *\n * Then you can use `$transform` like this:\n *\n * ``` js\n * t = $transform.get(e);\n * t.rotationZ += 15;\n * t.translateX += 1;\n * $transform.set(e, t);\n * ```\n *\n * ### `$transform` service API\n *\n * #### `$transform.fromCssMatrix(cssMatrixString) -> transform`\n *\n * Returns a decomposition of the transform matrix `cssMatrixString`.\n * NOTE: 2d matrices are translated to 3d matrices before any other operation.\n *\n * #### `$transform.toCss(decomposedTransform)`\n *\n * Recompose a css string from `decomposedTransform`.\n *\n * Transforms are recomposed as a composition of:\n *\n * ``` css\n * matrix3d(1,0,0,0, 0,1,0,0, 0,0,1,0, perspective[0], perspective[1], perspective[2], perspective[3])\n * translate3d(translation[0], translation[1], translation[2])\n * rotateX(rotation[0]) rotateY(rotation[1]) rotateZ(rotation[2])\n * matrix3d(1,0,0,0, 0,1,0,0, 0,skew[2],1,0, 0,0,0,1)\n * matrix3d(1,0,0,0, 0,1,0,0, skew[1],0,1,0, 0,0,0,1)\n * matrix3d(1,0,0,0, skew[0],1,0,0, 0,0,1,0, 0,0,0,1)\n * scale3d(scale[0], scale[1], scale[2])\n * ```\n *\n * #### `$transform.get(e) -> transform`\n *\n * Returns a decomposition of the transform matrix applied to `e`.\n *\n * #### `$transform.set(element, transform)`\n *\n * If transform is a string just set it for element `element`. Otherwise is considered as a\n * decomposed transform and is recomposed with `$transform.toCss` and then set to element.\n *\n * ### The decomposed transform object\n *\n * Result of transform matrix decomposition is an object with the following properties:\n *\n * ```\n * translateX\n * translateY\n * translateZ\n * perspectiveX\n * perspectiveY\n * perspectiveZ\n * perspectiveW\n * scaleX\n * scaleY\n * scaleZ\n * rotateX\n * rotateY\n * rotateZ\n * skewXY\n * skewXZ\n * skewYZ\n * ```\n */\n(function() {\n 'use strict';\n\n var module = angular.module('mobile-angular-ui.gestures.transform', []);\n\n module.factory('$transform', function() {\n\n /* ==============================================================\n = Cross-Browser Property Prefix Handling =\n ==============================================================*/\n\n // Cross-Browser style properties\n var cssPrefix;\n var transformProperty;\n var styleProperty;\n var prefixes = ['', 'webkit', 'Moz', 'O', 'ms'];\n var d = document.createElement('div');\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n if ((prefix + 'Perspective') in d.style) {\n cssPrefix = (prefix === '' ? '' : '-' + prefix.toLowerCase() + '-');\n styleProperty = prefix + (prefix === '' ? 'transform' : 'Transform');\n transformProperty = cssPrefix + 'transform';\n break;\n }\n }\n\n d = null;\n\n // return current element transform matrix in a cross-browser way\n var getElementTransformProperty = function(e) {\n e = e.length ? e[0] : e;\n var tr = window\n .getComputedStyle(e, null)\n .getPropertyValue(transformProperty);\n return tr;\n };\n\n // set current element transform matrix in a cross-browser way\n var setElementTransformProperty = function(elem, value) {\n elem = elem.length ? elem[0] : elem;\n elem.style[styleProperty] = value;\n };\n\n /* ======================================================\n = Transform Matrix Decomposition =\n ======================================================*/\n\n var SMALL_NUMBER = 1.e-7;\n\n var rad2deg = function(angle) {\n return angle * 180 / Math.PI;\n };\n\n var sqrt = Math.sqrt;\n var asin = Math.asin;\n var atan2 = Math.atan2;\n var cos = Math.cos;\n var abs = Math.abs;\n var floor = Math.floor;\n\n var cloneMatrix = function(m) {\n var res = [[], [], [], []];\n for (var i = 0; i < m.length; i++) {\n for (var j = 0; j < m[i].length; j++) {\n res[i][j] = m[i][j];\n }\n }\n return res;\n };\n\n var determinant2x2 = function(a, b, c, d) {\n return a * d - b * c;\n };\n\n var determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3) {\n return a1 * determinant2x2(b2, b3, c2, c3) - b1 * determinant2x2(a2, a3, c2, c3) + c1 * determinant2x2(a2, a3, b2, b3);\n };\n\n var determinant4x4 = function(m) {\n var a1 = m[0][0];\n var b1 = m[0][1];\n var c1 = m[0][2];\n var d1 = m[0][3];\n var a2 = m[1][0];\n var b2 = m[1][1];\n var c2 = m[1][2];\n var d2 = m[1][3];\n var a3 = m[2][0];\n var b3 = m[2][1];\n var c3 = m[2][2];\n var d3 = m[2][3];\n var a4 = m[3][0];\n var b4 = m[3][1];\n var c4 = m[3][2];\n var d4 = m[3][3];\n return a1 * determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) -\n b1 * determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) +\n c1 * determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) -\n d1 * determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);\n };\n\n var adjoint = function(m) {\n var res = [[], [], [], []];\n var a1 = m[0][0];\n var b1 = m[0][1];\n var c1 = m[0][2];\n var d1 = m[0][3];\n var a2 = m[1][0];\n var b2 = m[1][1];\n var c2 = m[1][2];\n var d2 = m[1][3];\n var a3 = m[2][0];\n var b3 = m[2][1];\n var c3 = m[2][2];\n var d3 = m[2][3];\n var a4 = m[3][0];\n var b4 = m[3][1];\n var c4 = m[3][2];\n var d4 = m[3][3];\n\n res[0][0] = determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);\n res[1][0] = -determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);\n res[2][0] = determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);\n res[3][0] = -determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);\n res[0][1] = -determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);\n res[1][1] = determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);\n res[2][1] = -determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);\n res[3][1] = determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);\n res[0][2] = determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);\n res[1][2] = -determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);\n res[2][2] = determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);\n res[3][2] = -determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);\n res[0][3] = -determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);\n res[1][3] = determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);\n res[2][3] = -determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);\n res[3][3] = determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);\n\n return res;\n };\n\n var inverse = function(m) {\n var res = adjoint(m);\n var det = determinant4x4(m);\n if (abs(det) < SMALL_NUMBER) {\n return false;\n }\n\n for (var i = 0; i < 4; i++) {\n for (var j = 0; j < 4; j++) {\n res[i][j] /= det;\n }\n }\n return res;\n };\n\n var transposeMatrix4 = function(m) {\n var res = [[], [], [], []];\n for (var i = 0; i < 4; i++) {\n for (var j = 0; j < 4; j++) {\n res[i][j] = m[j][i];\n }\n }\n return res;\n };\n\n var v4MulPointByMatrix = function(p, m) {\n var res = [];\n\n res[0] = (p[0] * m[0][0]) + (p[1] * m[1][0]) +\n (p[2] * m[2][0]) + (p[3] * m[3][0]);\n res[1] = (p[0] * m[0][1]) + (p[1] * m[1][1]) +\n (p[2] * m[2][1]) + (p[3] * m[3][1]);\n res[2] = (p[0] * m[0][2]) + (p[1] * m[1][2]) +\n (p[2] * m[2][2]) + (p[3] * m[3][2]);\n res[3] = (p[0] * m[0][3]) + (p[1] * m[1][3]) +\n (p[2] * m[2][3]) + (p[3] * m[3][3]);\n\n return res;\n };\n\n var v3Length = function(a) {\n return sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2]));\n };\n\n var v3Scale = function(v, desiredLength) {\n var res = [];\n var len = v3Length(v);\n if (len !== 0) {\n var l = desiredLength / len;\n res[0] *= l;\n res[1] *= l;\n res[2] *= l;\n }\n return res;\n };\n\n var v3Dot = function(a, b) {\n return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);\n };\n\n var v3Combine = function(a, b, ascl, bscl) {\n var res = [];\n res[0] = (ascl * a[0]) + (bscl * b[0]);\n res[1] = (ascl * a[1]) + (bscl * b[1]);\n res[2] = (ascl * a[2]) + (bscl * b[2]);\n return res;\n };\n\n var v3Cross = function(a, b) {\n var res = [];\n res[0] = (a[1] * b[2]) - (a[2] * b[1]);\n res[1] = (a[2] * b[0]) - (a[0] * b[2]);\n res[2] = (a[0] * b[1]) - (a[1] * b[0]);\n return res;\n };\n\n var decompose = function(mat) {\n var result = {};\n var localMatrix = cloneMatrix(mat);\n var i;\n var j;\n\n // Normalize the matrix.\n if (localMatrix[3][3] === 0) {\n return false;\n }\n\n for (i = 0; i < 4; i++) {\n for (j = 0; j < 4; j++) {\n localMatrix[i][j] /= localMatrix[3][3];\n }\n }\n\n var perspectiveMatrix = cloneMatrix(localMatrix);\n for (i = 0; i < 3; i++) {\n perspectiveMatrix[i][3] = 0;\n }\n perspectiveMatrix[3][3] = 1;\n\n if (determinant4x4(perspectiveMatrix) === 0) {\n return false;\n }\n\n // First, isolate perspective. This is the messiest.\n if (localMatrix[0][3] !== 0 || localMatrix[1][3] !== 0 || localMatrix[2][3] !== 0) {\n // rightHandSide is the right hand side of the equation.\n var rightHandSide = [];\n rightHandSide[0] = localMatrix[0][3];\n rightHandSide[1] = localMatrix[1][3];\n rightHandSide[2] = localMatrix[2][3];\n rightHandSide[3] = localMatrix[3][3];\n\n // Solve the equation by inverting perspectiveMatrix and multiplying\n // rightHandSide by the inverse. (This is the easiest way, not\n // necessarily the best.)\n var inversePerspectiveMatrix = inverse(perspectiveMatrix);\n var transposedInversePerspectiveMatrix = transposeMatrix4(inversePerspectiveMatrix);\n var perspectivePoint = v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix);\n\n result.perspectiveX = perspectivePoint[0];\n result.perspectiveY = perspectivePoint[1];\n result.perspectiveZ = perspectivePoint[2];\n result.perspectiveW = perspectivePoint[3];\n\n // Clear the perspective partition\n localMatrix[0][3] = localMatrix[1][3] = localMatrix[2][3] = 0;\n localMatrix[3][3] = 1;\n } else {\n // No perspective.\n result.perspectiveX = result.perspectiveY = result.perspectiveZ = 0;\n result.perspectiveW = 1;\n }\n\n // Next take care of translation (easy).\n result.translateX = localMatrix[3][0];\n localMatrix[3][0] = 0;\n result.translateY = localMatrix[3][1];\n localMatrix[3][1] = 0;\n result.translateZ = localMatrix[3][2];\n localMatrix[3][2] = 0;\n\n // Now get scale and shear.\n var row = [[], [], []];\n var pdum3;\n\n for (i = 0; i < 3; i++) {\n row[i][0] = localMatrix[i][0];\n row[i][1] = localMatrix[i][1];\n row[i][2] = localMatrix[i][2];\n }\n\n // Compute X scale factor and normalize first row.\n result.scaleX = v3Length(row[0]);\n v3Scale(row[0], 1.0);\n\n // Compute XY shear factor and make 2nd row orthogonal to 1st.\n result.skewXY = v3Dot(row[0], row[1]);\n v3Combine(row[1], row[0], row[1], 1.0, -result.skewXY);\n\n // Now, compute Y scale and normalize 2nd row.\n result.scaleY = v3Length(row[1]);\n v3Scale(row[1], 1.0);\n result.skewXY /= result.scaleY;\n\n // Compute XZ and YZ shears, orthogonalize 3rd row.\n result.skewXZ = v3Dot(row[0], row[2]);\n v3Combine(row[2], row[0], row[2], 1.0, -result.skewXZ);\n result.skewYZ = v3Dot(row[1], row[2]);\n v3Combine(row[2], row[1], row[2], 1.0, -result.skewYZ);\n\n // Next, get Z scale and normalize 3rd row.\n result.scaleZ = v3Length(row[2]);\n v3Scale(row[2], 1.0);\n result.skewXZ /= result.scaleZ;\n result.skewYZ /= result.scaleZ;\n\n // At this point, the matrix (in rows[]) is orthonormal.\n // Check for a coordinate system flip. If the determinant\n // is -1, then negate the matrix and the scaling factors.\n pdum3 = v3Cross(row[1], row[2]);\n\n if (v3Dot(row[0], pdum3) < 0) {\n for (i = 0; i < 3; i++) {\n result.scaleX *= -1;\n row[i][0] *= -1;\n row[i][1] *= -1;\n row[i][2] *= -1;\n }\n }\n\n // Rotation (angles smaller then SMALL_NUMBER are zeroed)\n result.rotateY = rad2deg(asin(-row[0][2])) || 0;\n if (cos(result.rotateY) === 0) {\n result.rotateX = rad2deg(atan2(-row[2][0], row[1][1])) || 0;\n result.rotateZ = 0;\n } else {\n result.rotateX = rad2deg(atan2(row[1][2], row[2][2])) || 0;\n result.rotateZ = rad2deg(atan2(row[0][1], row[0][0])) || 0;\n }\n\n return result;\n };\n\n /* =========================================\n = Factory interface =\n =========================================*/\n\n var fCom = function(n, def) {\n // avoid scientific notation with toFixed\n var val = (n || def || 0);\n return String(val.toFixed(20));\n };\n\n var fPx = function(n, def) {\n return fCom(n, def) + 'px';\n };\n\n var fDeg = function(n, def) {\n return fCom(n, def) + 'deg';\n };\n\n return {\n fromCssMatrix: function(tr) {\n var M = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];\n\n // Just returns identity in case no transform is setup for the element\n if (tr && tr !== 'none') {\n var elems = tr.split('(')[1].split(')')[0].split(',').map(Number);\n\n // Is a 2d transform: matrix(a, b, c, d, tx, ty) is a shorthand\n // for matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1)\n if (tr.match(/^matrix\\(/)) {\n M[0][0] = elems[0];\n M[1][0] = elems[1];\n M[0][1] = elems[2];\n M[1][1] = elems[3];\n M[3][0] = elems[4];\n M[3][1] = elems[5];\n\n // Is a 3d transform, set elements by rows\n } else {\n for (var i = 0; i < 16; i++) {\n var row = floor(i / 4);\n var col = i % 4;\n M[row][col] = elems[i];\n }\n }\n }\n return decompose(M);\n },\n\n toCss: function(t) {\n //\n // Transforms are recomposed as a composition of:\n //\n // matrix3d(1,0,0,0, 0,1,0,0, 0,0,1,0, perspective[0], perspective[1], perspective[2], perspective[3])\n // translate3d(translation[0], translation[1], translation[2])\n // rotateX(rotation[0]) rotateY(rotation[1]) rotateZ(rotation[2])\n // matrix3d(1,0,0,0, 0,1,0,0, 0,skew[2],1,0, 0,0,0,1)\n // matrix3d(1,0,0,0, 0,1,0,0, skew[1],0,1,0, 0,0,0,1)\n // matrix3d(1,0,0,0, skew[0],1,0,0, 0,0,1,0, 0,0,0,1)\n // scale3d(scale[0], scale[1], scale[2])\n //\n\n var perspective = [\n fCom(t.perspectiveX),\n fCom(t.perspectiveY),\n fCom(t.perspectiveZ),\n fCom(t.perspectiveW, 1)\n ];\n var translate = [\n fPx(t.translateX),\n fPx(t.translateY),\n fPx(t.translateZ)\n ];\n var scale = [\n fCom(t.scaleX),\n fCom(t.scaleY),\n fCom(t.scaleZ)\n ];\n var rotation = [\n fDeg(t.rotateX),\n fDeg(t.rotateY),\n fDeg(t.rotateZ)\n ];\n var skew = [\n fCom(t.skewXY),\n fCom(t.skewXZ),\n fCom(t.skewYZ)\n ];\n\n return [\n 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,' + perspective.join(',') + ')',\n 'translate3d(' + translate.join(',') + ')',\n 'rotateX(' + rotation[0] + ') rotateY(' + rotation[1] + ') rotateZ(' + rotation[2] + ')',\n 'matrix3d(1,0,0,0,0,1,0,0,0,' + skew[2] + ',1,0,0,0,0,1)',\n 'matrix3d(1,0,0,0,0,1,0,0,' + skew[1] + ',0,1,0,0,0,0,1)',\n 'matrix3d(1,0,0,0,' + skew[0] + ',1,0,0,0,0,1,0,0,0,0,1)',\n 'scale3d(' + scale.join(',') + ')'\n ].join(' ');\n },\n\n //\n // Returns a decomposition of the transform matrix applied\n // to `e`;\n //\n // NOTE: 2d matrices are translated to 3d matrices\n // before any other operation.\n //\n get: function(e) {\n return this.fromCssMatrix(getElementTransformProperty(e));\n },\n\n // Recompose a transform from decomposition `t` and apply it to element `e`\n set: function(e, t) {\n var str = (typeof t === 'string') ? t : this.toCss(t);\n setElementTransformProperty(e, str);\n }\n };\n });\n})();\n","/**\n * @module mobile-angular-ui.gestures\n * @position 100\n * @description\n *\n * It has directives and services to support `touch`, `swipe` and `drag` gestures.\n *\n * It does not need any `.css` to work.\n *\n *\n * This module will not work with `ngTouch`\n * cause it is intended, among offering more features, to be a drop-in\n * replacement for it.\n *
\n *\n * Be aware that `ngTouch` is still not playing well with `fastclick.js` and its usage with `mobile-angular-ui` is currently discouraged anyway.\n *
\n *