From 275fc2461f17ca5006de098ee23ecf2ba24c3054 Mon Sep 17 00:00:00 2001 From: santiagovazquez Date: Fri, 17 Feb 2017 21:13:55 -0300 Subject: [PATCH 1/3] Fixing file location --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00bfb8b..e3d1a92 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mobile-angular-ui", "version": "1.3.4", "description": "Mobile Angular UI", - "main": "dist/mobile-angular-ui.js", + "main": "dist/js/mobile-angular-ui.js", "directories": { "demo": "demo", "dist": "dist" From 931bd95732014bf4e61cfd3250afe2463553e3b6 Mon Sep 17 00:00:00 2001 From: santiagovazquez Date: Sat, 18 Feb 2017 11:39:42 -0300 Subject: [PATCH 2/3] Adding jetbrains IDE to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c3e0580..1f2a2f1 100644 --- a/.gitignore +++ b/.gitignore @@ -146,6 +146,9 @@ xcuserdata/ # proportion of contributors will probably not be using SublimeText # *.sublime-project +### Jetbrains WebStorm ### +.idea/ + # sftp configuration file sftp-config.json From 002ed9701414b95ec363d0feec488bd583093891 Mon Sep 17 00:00:00 2001 From: santiagovazquez Date: Sat, 18 Feb 2017 11:41:34 -0300 Subject: [PATCH 3/3] Making FastClick visible from inner module --- dist/js/mobile-angular-ui.core.js | 8 ++++++-- dist/js/mobile-angular-ui.core.min.js | 2 +- dist/js/mobile-angular-ui.core.min.js.map | 2 +- dist/js/mobile-angular-ui.gestures.min.js.map | 2 +- dist/js/mobile-angular-ui.js | 8 ++++++-- dist/js/mobile-angular-ui.min.js | 2 +- dist/js/mobile-angular-ui.min.js.map | 2 +- src/js/core/fastclick.js | 8 ++++++-- 8 files changed, 23 insertions(+), 11 deletions(-) diff --git a/dist/js/mobile-angular-ui.core.js b/dist/js/mobile-angular-ui.core.js index e5e7fb8..6db3116 100644 --- a/dist/js/mobile-angular-ui.core.js +++ b/dist/js/mobile-angular-ui.core.js @@ -1173,7 +1173,11 @@ })(); -(function() { +if (typeof FastClick === 'undefined') { + throw new Error('mobile-angular-ui\'s JavaScript requires FastClick') +} + +(function(FastClick) { 'use strict'; var module = angular.module('mobile-angular-ui.core.fastclick', []); @@ -1214,7 +1218,7 @@ }; }); }); -})(); +})(FastClick); /** * diff --git a/dist/js/mobile-angular-ui.core.min.js b/dist/js/mobile-angular-ui.core.min.js index a1f23fb..5da563b 100644 --- a/dist/js/mobile-angular-ui.core.min.js +++ b/dist/js/mobile-angular-ui.core.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";function e(t,i){function r(e,t){return function(){return e.apply(t,arguments)}}var o;if(i=i||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=i.touchBoundary||10,this.layer=t,this.tapDelay=i.tapDelay||200,this.tapTimeout=i.tapTimeout||700,!e.notNeeded(t)){for(var a=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],u=this,c=0,l=a.length;l>c;c++)u[a[c]]=r(u[a[c]],u);n&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,i){var r=Node.prototype.removeEventListener;"click"===e?r.call(t,e,n.hijacked||n,i):r.call(t,e,n,i)},t.addEventListener=function(e,n,i){var r=Node.prototype.addEventListener;"click"===e?r.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),i):r.call(t,e,n,i)}),"function"==typeof t.onclick&&(o=t.onclick,t.addEventListener("click",function(e){o(e)},!1),t.onclick=null)}}var t=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!t,i=/iP(ad|hone|od)/.test(navigator.userAgent)&&!t,r=i&&/OS 4_\d(_\d)?/.test(navigator.userAgent),o=i&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(i&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,i;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),i=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return n&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;i&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,o;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],i){if(o=window.getSelection(),o.rangeCount&&!o.isCollapsed)return!0;if(!r){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,a,u,c,l,s=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,o&&(l=e.changedTouches[0],s=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),u=s.tagName.toLowerCase(),"label"===u){if(t=this.findControl(s)){if(this.focus(s),n)return!1;s=t}}else if(this.needsFocus(s))return e.timeStamp-a>100||i&&window.top!==window&&"input"===u?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,e),i&&"select"===u||(this.targetElement=null,e.preventDefault()),!1);return i&&!r&&(c=s.fastClickScrollParent,c&&c.fastClickLastScrollTop!==c.scrollTop)?!0:(this.needsClick(s)||(e.preventDefault(),this.sendClick(s,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;n&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,i,r,o;if("undefined"==typeof window.ontouchstart)return!0;if(i=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(i>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],o>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof module&&module.exports?(module.exports=e.attach,module.exports.FastClick=e):window.FastClick=e}(),function(){"use strict";angular.module("mobile-angular-ui.core.activeLinks",[]).provider("setupActiveLinks",["$locationProvider",function(e){this.$get=["$document","$location",function(t,n){return function(){for(var i=n.path(),r=t[0].links,o=0;o0;){if(n[0]===t[0])return n=null,!0;n=n.parent()}return n=null,!1}}).factory("bindOuterClick",["$document","$timeout","_mauiIsAncestorOrSelf",function(e,t,n){return function(i,r,o,a){var u=function(e){n(angular.element(e.target),r)||i.$apply(function(){o(i,{$event:e})})},c=angular.noop,l=null;a?c=i.$watch(a,function(n){t.cancel(l),n?l=t(function(){e.on("click tap",u)},0):e.unbind("click tap",u)}):(t.cancel(l),e.on("click tap",u)),i.$on("$destroy",function(){c(),e.unbind("click tap",u)})}}]).directive("uiOuterClick",["bindOuterClick","$parse",function(e,t){return{restrict:"A",compile:function(n,i){var r=t(i.uiOuterClick),o=i.uiOuterClickIf;return function(t,n){e(t,n,r,o)}}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.core.sharedState",[]);e.factory("SharedState",["$rootScope","$log",function(e,t){var n={},i={},r={},o={};return{initialize:function(t,a,u){u=u||{};var c=void 0===r[t],l=u.defaultValue,s=u.exclusionGroup;r[t.$id]=r[t.$id]||[],r[t.$id].push(a),i[a]?c&&i[a].references++:(i[a]=angular.extend({},u,{references:1}),e.$broadcast("mobile-angular-ui.state.initialized."+a,l),void 0!==l&&this.setOne(a,l),s&&(o[s]=o[s]||{},o[s][a]=!0)),t.$on("$destroy",function(){for(var u=r[t.$id]||[],c=0;c2||r.length<1)throw new Error('Error parsing uiScopeContext="'+e+'"');n.push(r)}return n},i=function(e,t,n){for(var i=0;ic;c++)u[a[c]]=r(u[a[c]],u);n&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,i){var r=Node.prototype.removeEventListener;"click"===e?r.call(t,e,n.hijacked||n,i):r.call(t,e,n,i)},t.addEventListener=function(e,n,i){var r=Node.prototype.addEventListener;"click"===e?r.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),i):r.call(t,e,n,i)}),"function"==typeof t.onclick&&(o=t.onclick,t.addEventListener("click",function(e){o(e)},!1),t.onclick=null)}}var t=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!t,i=/iP(ad|hone|od)/.test(navigator.userAgent)&&!t,r=i&&/OS 4_\d(_\d)?/.test(navigator.userAgent),o=i&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(i&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,i;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),i=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return n&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;i&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,o;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],i){if(o=window.getSelection(),o.rangeCount&&!o.isCollapsed)return!0;if(!r){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,a,u,c,l,s=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,o&&(l=e.changedTouches[0],s=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),u=s.tagName.toLowerCase(),"label"===u){if(t=this.findControl(s)){if(this.focus(s),n)return!1;s=t}}else if(this.needsFocus(s))return e.timeStamp-a>100||i&&window.top!==window&&"input"===u?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,e),i&&"select"===u||(this.targetElement=null,e.preventDefault()),!1);return i&&!r&&(c=s.fastClickScrollParent,c&&c.fastClickLastScrollTop!==c.scrollTop)?!0:(this.needsClick(s)||(e.preventDefault(),this.sendClick(s,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;n&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,i,r,o;if("undefined"==typeof window.ontouchstart)return!0;if(i=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(i>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],o>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof module&&module.exports?(module.exports=e.attach,module.exports.FastClick=e):window.FastClick=e}(),function(){"use strict";angular.module("mobile-angular-ui.core.activeLinks",[]).provider("setupActiveLinks",["$locationProvider",function(e){this.$get=["$document","$location",function(t,n){return function(){for(var i=n.path(),r=t[0].links,o=0;o0;){if(n[0]===t[0])return n=null,!0;n=n.parent()}return n=null,!1}}).factory("bindOuterClick",["$document","$timeout","_mauiIsAncestorOrSelf",function(e,t,n){return function(i,r,o,a){var u=function(e){n(angular.element(e.target),r)||i.$apply(function(){o(i,{$event:e})})},c=angular.noop,l=null;a?c=i.$watch(a,function(n){t.cancel(l),n?l=t(function(){e.on("click tap",u)},0):e.unbind("click tap",u)}):(t.cancel(l),e.on("click tap",u)),i.$on("$destroy",function(){c(),e.unbind("click tap",u)})}}]).directive("uiOuterClick",["bindOuterClick","$parse",function(e,t){return{restrict:"A",compile:function(n,i){var r=t(i.uiOuterClick),o=i.uiOuterClickIf;return function(t,n){e(t,n,r,o)}}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.core.sharedState",[]);e.factory("SharedState",["$rootScope","$log",function(e,t){var n={},i={},r={},o={};return{initialize:function(t,a,u){u=u||{};var c=void 0===r[t],l=u.defaultValue,s=u.exclusionGroup;r[t.$id]=r[t.$id]||[],r[t.$id].push(a),i[a]?c&&i[a].references++:(i[a]=angular.extend({},u,{references:1}),e.$broadcast("mobile-angular-ui.state.initialized."+a,l),void 0!==l&&this.setOne(a,l),s&&(o[s]=o[s]||{},o[s][a]=!0)),t.$on("$destroy",function(){for(var u=r[t.$id]||[],c=0;c2||r.length<1)throw new Error('Error parsing uiScopeContext="'+e+'"');n.push(r)}return n},i=function(e,t,n){for(var i=0;i\n *\n *
\n *
\n * Default Title\n *
\n *
\n *\n *
\n * \n *
\n * ```\n *\n * Use `ui-content-for` inside any view to populate the `ui-yield-to` content.\n *\n * ``` html\n * \n *\n *
\n * My View Title\n *
\n * ```\n *\n * Since the original scope is preserved you can use directives inside\n * `ui-content-for` blocks to interact with the current scope. In the following\n * example we will add a navbar button to submit a form inside a nested view.\n *\n * ``` html\n * \n *\n *
\n *
\n *
\n *
\n *\n *
\n * \n *
\n * ```\n *\n * ``` html\n * \n *\n *
\n *\n *
\n * \n *
\n *\n *
\n * \n *
\n *\n *
\n * ```\n *\n * ``` javascript\n * app.controller('newCustomerController', function($scope, Store){\n * $scope.customer = {};\n * $scope.createCustomer = function(){\n * Store.create($scope.customer);\n * // ...\n * }\n * });\n * ```\n *\n * If you wish you can also duplicate markup instead of move it. Just add `duplicate` parameter to `uiContentFor` directive to specify this behaviour.\n *\n * ``` html\n *
\n * \n *
\n * ```\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.core.capture', [])\n\n .run([\n 'Capture',\n '$rootScope',\n function(Capture, $rootScope) {\n $rootScope.$on('$routeChangeSuccess', function() {\n Capture.resetAll();\n });\n }\n ])\n\n .factory('Capture', [\n '$compile',\n function($compile) {\n var yielders = {};\n\n return {\n yielders: yielders,\n\n resetAll: function() {\n for (var name in yielders) {\n if (yielders.hasOwnProperty(name)) {\n this.resetYielder(name);\n }\n }\n },\n\n resetYielder: function(name) {\n var b = yielders[name];\n this.setContentFor(name, b.defaultContent, b.defaultScope);\n },\n\n putYielder: function(name, element, defaultScope, defaultContent) {\n var yielder = {};\n yielder.name = name;\n yielder.element = element;\n yielder.defaultContent = defaultContent || '';\n yielder.defaultScope = defaultScope;\n yielders[name] = yielder;\n },\n\n getYielder: function(name) {\n return yielders[name];\n },\n\n removeYielder: function(name) {\n delete yielders[name];\n },\n\n setContentFor: function(name, content, scope) {\n var b = yielders[name];\n if (!b) {\n return;\n }\n b.element.html(content);\n $compile(b.element.contents())(scope);\n }\n\n };\n }\n ])\n\n /**\n * @directive uiContentFor\n * @restrict A\n * @description\n *\n * `ui-content-for` makes inner contents to replace the corresponding\n * `ui-yield-to` placeholder contents.\n *\n * `uiContentFor` is intended to be used inside a view in order to populate outer placeholders.\n * Any content you send to placeholders via `ui-content-for` is\n * reverted to placeholder defaults after view changes (ie. on `$routeChangeStart`).\n *\n * @param {string} uiContentFor The id of the placeholder to be replaced\n * @param {boolean} uiDuplicate If present duplicates the content instead of moving it (default to `false`)\n *\n */\n .directive('uiContentFor', [\n 'Capture',\n function(Capture) {\n return {\n compile: function(tElem, tAttrs) {\n var rawContent = tElem.html();\n if (tAttrs.uiDuplicate === null || tAttrs.uiDuplicate === undefined) {\n // no need to compile anything!\n tElem.html('');\n tElem.remove();\n }\n return function(scope, elem, attrs) {\n Capture.setContentFor(attrs.uiContentFor, rawContent, scope);\n };\n }\n };\n }\n ])\n\n /**\n * @directive uiYieldTo\n * @restrict A\n * @description\n *\n * `ui-yield-to` defines a placeholder which contents will be further replaced by `ui-content-for` directive.\n *\n * Inner html is considered to be a default. Default is restored any time `$routeChangeStart` happens.\n *\n * @param {string} uiYieldTo The unique id of this placeholder.\n *\n */\n .directive('uiYieldTo', [\n '$compile', 'Capture', function($compile, Capture) {\n return {\n link: function(scope, element, attr) {\n Capture.putYielder(attr.uiYieldTo, element, scope, element.html());\n\n element.on('$destroy', function() {\n Capture.removeYielder(attr.uiYieldTo);\n });\n\n scope.$on('$destroy', function() {\n Capture.removeYielder(attr.uiYieldTo);\n });\n }\n };\n }\n ]);\n\n})();\n","/**\n *\n * @module mobile-angular-ui.core.outerClick\n * @description\n *\n * Provides a directive to specifiy a behaviour when click/tap events\n * happen outside an element. This can be easily used\n * to implement eg. __close on outer click__ feature for a dropdown.\n *\n * ## Usage\n *\n * Declare it as a dependency to your app unless you have already\n * included some of its super-modules.\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui']);\n * ```\n *\n * Or\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core']);\n * ```\n *\n * Or\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core.outerClick']);\n * ```\n *\n * Use `ui-outer-click` to define an expression to evaluate when an _Outer Click_ event happens.\n * Use `ui-outer-click-if` parameter to define a condition to enable/disable the listener.\n *\n * ``` html\n *
\n * \n * \n * \n * \n *\n *
  • Action
  • \n *
  • Another action
  • \n *
  • Something else here
  • \n *
  • \n *
  • Separated link
  • \n * \n *
    \n * ```\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.core.outerClick', [])\n\n .factory('_mauiIsAncestorOrSelf', function() {\n return function(element, target) {\n var parent = element;\n while (parent.length > 0) {\n if (parent[0] === target[0]) {\n parent = null;\n return true;\n }\n parent = parent.parent();\n }\n parent = null;\n return false;\n };\n })\n\n /**\n * @service bindOuterClick\n * @as function\n *\n * @description\n * This is a service function that binds a callback to be conditionally executed\n * when a click event happens outside a specified element.\n *\n * Ie.\n *\n * ``` js\n * app.directive('myDirective', function('bindOuterClick'){\n * return {\n * link: function(scope, element) {\n * bindOuterClick(element, function(scope, extra){\n * alert('You clicked ouside me!');\n * }, function(e){\n * return element.hasClass('disabled') ? true : false;\n * });\n * }\n * };\n * });\n * ```\n * @scope {scope} the scope to eval callbacks\n * @param {DomElement|$element} element The element to bind to.\n * @param {function} callback A `function(scope, options)`, usually the result of `$parse`, that is called when an _outer click_ event happens.\n * @param {string|function} condition Angular `$watch` expression to decide whether to run `callback` or not.\n */\n .factory('bindOuterClick', [\n '$document',\n '$timeout',\n '_mauiIsAncestorOrSelf',\n function($document, $timeout, isAncestorOrSelf) {\n\n return function(scope, element, outerClickFn, outerClickIf) {\n var handleOuterClick = function(event) {\n if (!isAncestorOrSelf(angular.element(event.target), element)) {\n scope.$apply(function() {\n outerClickFn(scope, {$event: event});\n });\n }\n };\n\n var stopWatching = angular.noop;\n var t = null;\n\n if (outerClickIf) {\n stopWatching = scope.$watch(outerClickIf, function(value) {\n $timeout.cancel(t);\n\n if (value) {\n // prevents race conditions\n // activating with other click events\n t = $timeout(function() {\n $document.on('click tap', handleOuterClick);\n }, 0);\n\n } else {\n $document.unbind('click tap', handleOuterClick);\n }\n });\n } else {\n $timeout.cancel(t);\n $document.on('click tap', handleOuterClick);\n }\n\n scope.$on('$destroy', function() {\n stopWatching();\n $document.unbind('click tap', handleOuterClick);\n });\n };\n }\n ])\n\n /**\n * @directive outerClick\n *\n * @description\n * Evaluates an expression when an _Outer Click_ event happens.\n *\n * @param {expression} uiOuterClick Expression to evaluate when an _Outer Click_ event happens.\n * @param {expression} uiOuterClickIf Condition to enable/disable the listener. Defaults to `true`.\n */\n .directive('uiOuterClick', [\n 'bindOuterClick',\n '$parse',\n function(bindOuterClick, $parse) {\n return {\n restrict: 'A',\n compile: function(elem, attrs) {\n var outerClickFn = $parse(attrs.uiOuterClick);\n var outerClickIf = attrs.uiOuterClickIf;\n return function(scope, elem) {\n bindOuterClick(scope, elem, outerClickFn, outerClickIf);\n };\n }\n };\n }\n ]);\n})();\n","(function() {\n 'use strict';\n /**\n * @module mobile-angular-ui.core.sharedState\n *\n * @description\n * `mobile-angular-ui.core.sharedState` is expose the homonymous service\n * `SharedState` and a group of directives to access it.\n *\n * `SharedState` allows to use elementary angular or angularish directives\n * to create interactive components.\n *\n * Ie.\n *\n * ``` html\n *
    \n * Tab1\n * Tab2\n * Tab3\n *
    \n *
    \n *
    Tab1
    \n *
    Tab2
    \n *
    Tab3
    \n *
    \n * ```\n *\n * Using `SharedState` you will be able to:\n *\n * - Create interactive components without having to write javascript code\n * - Have your controller free from UI logic\n * - Separe `ng-click` triggering application logic from those having a visual effect only\n * - Export state of components to urls\n * - Easily make components comunicate each other\n *\n * Also note that:\n *\n * Data structures retaining statuses will stay outside angular scopes\n * thus they are not evaluated against digest cycle until its necessary.\n * Also although statuses are sort of global variables `SharedState` will\n * take care of disposing them when no scopes are requiring them anymore.\n *\n * A set of `ui-*` directives are available to interact with `SharedState`\n * module and will hopefully var you spare your controllers and your time\n * for something that is more meaningful than this:\n *\n * ``` js\n * $scope.activeTab = 1;\n *\n * $scope.setActiveTab = function(n) {\n * $scope.activeTab = n;\n * };\n * ```\n *\n * ## Usage\n *\n * Declare it as a dependency to your app unless you have already included some\n * of its super-modules.\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core.sharedState']);\n * ```\n *\n * Use `ui-shared-state` directive to require/initialize a state from the target element scope\n *\n * **Example.** Tabs\n *\n * \n *\n * **Example.** Custom components\n *\n * \n *\n * NOTE: `ui-toggle/set/turnOn/turnOff` responds to `click/tap` without\n * stopping propagation so you can use them along with ng-click too.\n * You can also change events to respond to with `ui-triggers` attribute.\n *\n * Any `SharedState` method is exposed through `Ui` object in `$rootScope`.\n * So you could always do `ng-click=\"Ui.turnOn('myVar')\"`.\n *\n * Since `SharedState` is a service you can initialize/set statuses through\n * controllers too:\n *\n * ``` js\n * app.controller('myController', function($scope, SharedState){\n * SharedState.initialize($scope, \"activeTab\", 3);\n * });\n * ```\n *\n * As well as you can use `ui-default` for that:\n *\n * ``` html\n *
    \n * ```\n *\n */\n var module = angular.module('mobile-angular-ui.core.sharedState', []);\n\n /**\n * @ngdoc service\n * @class SharedState\n *\n * @description\n *\n * A `SharedState` state can be considered as a global variable identified by an `id`.\n *\n * `SharedState` service exposes methods to interact with statuses to create,\n * read and update states.\n *\n * It acts as a BUS between UI elements to share UI related state that is\n * automatically disposed when all scopes requiring it are destroyed.\n *\n * eg.\n *\n * ``` js\n * app.controller('controller1', function($scope, SharedState){\n * SharedState.initialize($scope, 'myId');\n * });\n *\n * app.controller('controller2', function(SharedState){\n * SharedState.toggle('myId');\n * });\n * ```\n *\n * Data structures retaining statuses will stay outside angular scopes thus\n * they are not evaluated against digest cycle until its necessary. Also\n * although statuses are sort of global variables `SharedState` will take\n * care of disposing them when no scopes are requiring them anymore.\n *\n * A set of `ui-*` directives are available to interact with `SharedState`\n * module and will hopefully var you spare your controllers and your time for\n * something that is more meaningful than this:\n *\n * ``` js\n * $scope.activeTab = 1;\n *\n * $scope.setActiveTab = function(n) {\n * $scope.activeTab = n;\n * };\n * ```\n *\n */\n\n /**\n * @event 'mobile-angular-ui.state.initialized.ID'\n * @shortname initialized\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` when `#initialize` is called for a new state not\n * referenced by any scope currently.\n *\n * @param {any} currentValue The value with which this state has been initialized\n *\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n\n /**\n * @event 'mobile-angular-ui.state.destroyed.ID'\n * @shortname destroyed\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` when a state is destroyed.\n *\n */\n\n /**\n * @event 'mobile-angular-ui.state.changed.ID'\n * @shortname changed\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` the value of a state changes.\n *\n * ``` js\n * $scope.$on('mobile-angular-ui.state.changed.uiSidebarLeft', function(e, newVal, oldVal) {\n * if (newVal === true) {\n * console.log('sidebar opened');\n * } else {\n * console.log('sidebar closed');\n * }\n * });\n * ```\n *\n * @param {any} newValue\n * @param {any} oldValue\n *\n */\n\n module.factory('SharedState', [\n '$rootScope', '$log',\n function($rootScope, $log) {\n var values = {}; // values, context object for evals\n var statusesMeta = {}; // status info\n var scopes = {}; // scopes references\n var exclusionGroups = {}; // support exclusive boolean sets\n\n return {\n /**\n * @function initialize\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Initialize, or require if already intialized, a state identified by `id` within the provided `scope`, making it available to the rest of application.\n *\n * A `SharedState` is bound to one or more scopes. Each time\n * `initialize` is called for an angular `scope` this will be bound to\n * the `SharedState` and a reference count is incremented to allow\n * garbage collection.\n *\n * Reference count is decremented once the scope is destroyed. When the counter reach 0 the state will be disposed.\n *\n * @param {scope} scope The scope to bound this state\n * @param {string} id The unique name of this state\n * @param {object} [options] Options\n * @param {object} [options.defaultValue] the initialization value, it is taken into account only if the state `id` is not already initialized\n * @param {string} [options.exclusionGroup] Specifies an exclusion group\n * for the state. This means that for boolean operations (ie. toggle,\n * turnOn, turnOf) when this state is set to `true`, any other state\n * that is in the same `exclusionGroup` will be set to `false`.\n */\n initialize: function(scope, id, options) {\n options = options || {};\n\n var isNewScope = scopes[scope] === undefined;\n var defaultValue = options.defaultValue;\n var exclusionGroup = options.exclusionGroup;\n\n scopes[scope.$id] = scopes[scope.$id] || [];\n scopes[scope.$id].push(id);\n\n if (!statusesMeta[id]) { // is a brand new state\n // not referenced by any\n // scope currently\n\n statusesMeta[id] = angular.extend({}, options, {references: 1});\n\n $rootScope.$broadcast('mobile-angular-ui.state.initialized.' + id, defaultValue);\n\n if (defaultValue !== undefined) {\n this.setOne(id, defaultValue);\n }\n\n if (exclusionGroup) {\n // Exclusion groups are sets of statuses references\n exclusionGroups[exclusionGroup] = exclusionGroups[exclusionGroup] || {};\n exclusionGroups[exclusionGroup][id] = true;\n }\n\n } else if (isNewScope) { // is a new reference from\n // a different scope\n statusesMeta[id].references++;\n }\n scope.$on('$destroy', function() {\n var ids = scopes[scope.$id] || [];\n for (var i = 0; i < ids.length; i++) {\n var status = statusesMeta[ids[i]];\n\n if (status.exclusionGroup) {\n delete exclusionGroups[status.exclusionGroup][ids[i]];\n if (Object.keys(exclusionGroups[status.exclusionGroup]).length === 0) {\n delete exclusionGroups[status.exclusionGroup];\n }\n }\n\n status.references--;\n if (status.references <= 0) {\n delete statusesMeta[ids[i]];\n delete values[ids[i]];\n $rootScope.$broadcast('mobile-angular-ui.state.destroyed.' + id);\n }\n }\n delete scopes[scope.$id];\n });\n },\n\n /**\n * @function setOne\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Set the value of the state identified by `id` to the `value` parameter.\n *\n * @param {string} id Unique identifier for state\n * @param {any} value New value for this state\n */\n setOne: function(id, value) {\n if (statusesMeta[id] !== undefined) {\n var prev = values[id];\n values[id] = value;\n if (prev !== value) {\n $rootScope.$broadcast('mobile-angular-ui.state.changed.' + id, value, prev);\n }\n return value;\n }\n $log.warn('Warning: Attempt to set uninitialized shared state: ' + id);\n },\n\n /**\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @function setMany\n * @description\n *\n * Set multiple statuses at once. ie.\n *\n * ```\n * SharedState.setMany({ activeTab: 'firstTab', sidebarIn: false });\n * ```\n *\n * @param {object} object An object of the form `{state1: value1, ..., stateN: valueN}`\n */\n setMany: function(map) {\n angular.forEach(map, function(value, id) {\n this.setOne(id, value);\n }, this);\n },\n\n /**\n * @function set\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * A shorthand for both `setOne` and `setMany`.\n * When called with only one parameter that is an object\n * it is the same of `setMany`, otherwise is the\n * same of `setOne`.\n *\n * @param {string|object} idOrMap A state id or a `{state: value}` map object.\n * @param {any} [value] The value to assign in case idOrMap is a string.\n */\n set: function(idOrMap, value) {\n if (!idOrMap) {\n return;\n } else if (angular.isObject(idOrMap)) {\n this.setMany(idOrMap);\n } else {\n this.setOne(idOrMap, value);\n }\n },\n\n /**\n * @function turnOn\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Set shared state identified by `id` to `true`. If the\n * shared state has been initialized with `exclusionGroup`\n * option it will also turn off (set to `false`) all other\n * statuses from the same exclusion group.\n *\n * @param {string} id The unique name of this state\n */\n turnOn: function(id) {\n // Turns off other statuses belonging to the same exclusion group.\n var eg = statusesMeta[id] && statusesMeta[id].exclusionGroup;\n if (eg) {\n var egStatuses = Object.keys(exclusionGroups[eg]);\n for (var i = 0; i < egStatuses.length; i++) {\n var item = egStatuses[i];\n if (item !== id) {\n this.turnOff(item);\n }\n }\n }\n return this.setOne(id, true);\n },\n\n /**\n * @function turnOff\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Set shared state identified by `id` to `false`.\n *\n * @param {string} id The unique name of this state\n */\n turnOff: function(id) {\n return this.setOne(id, false);\n },\n\n /**\n * @function toggle\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * If current value for shared state identified by `id` evaluates\n * to `true` it calls `turnOff` on it otherwise calls `turnOn`.\n * Be aware that it will take into account `exclusionGroup` option.\n * See `#turnOn` and `#initialize` for more.\n *\n * @param {string} id The unique name of this state\n */\n toggle: function(id) {\n return this.get(id) ? this.turnOff(id) : this.turnOn(id);\n },\n\n /**\n * @function get\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Returns the current value of the state identified by `id`.\n *\n * @param {string} id The unique name of this state\n * @returns {any}\n */\n get: function(id) {\n return statusesMeta[id] && values[id];\n },\n\n /**\n * @function isActive\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Return `true` if the boolean conversion of `#get(id)` evaluates to `true`.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n isActive: function(id) {\n return Boolean(this.get(id));\n },\n\n /**\n * @function active\n * @alias mobile-angular-ui.core.sharedState~SharedState.isActive\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Alias for `#isActive`.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n active: function(id) {\n return this.isActive(id);\n },\n\n /**\n * @function isUndefined\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Return `true` if state identified by `id` is not defined.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n isUndefined: function(id) {\n return statusesMeta[id] === undefined || this.get(id) === undefined;\n },\n\n /**\n * Returns `true` if state identified by `id` exsists.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n *\n * @function has\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n has: function(id) {\n return statusesMeta[id] !== undefined;\n },\n\n /**\n * Returns the number of references of a status.\n *\n * @param {string} id The unique name of this state\n * @returns {integer}\n *\n * @function referenceCount\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n referenceCount: function(id) {\n var status = statusesMeta[id];\n return status === undefined ? 0 : status.references;\n },\n\n /**\n * Returns `true` if `#get(id)` is exactly equal (`===`) to `value` param.\n *\n * @param {string} id The unique name of this state\n * @param {any} value The value for comparison\n * @returns {bool}\n *\n * @function equals\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n equals: function(id, value) {\n return this.get(id) === value;\n },\n\n /**\n * Alias for `#equals`\n *\n * @param {string} id The unique name of this state\n * @param {any} value The value for comparison\n * @returns {bool}\n *\n * @function eq\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @alias mobile-angular-ui.core.sharedState~SharedState.equals\n */\n eq: function(id, value) {\n return this.equals(id, value);\n },\n\n /**\n * Returns an object with all the status values currently stored.\n * It has the form of `{statusId: statusValue}`.\n *\n * Bear in mind that in order to spare resources it currently\n * returns just the internal object retaining statuses values.\n * Thus it is not intended to be modified and direct changes to it will be not tracked or notified.\n *\n * Just clone before apply any change to it.\n *\n * @returns {object}\n *\n * @function values\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n values: function() {\n return values;\n },\n\n exclusionGroups: function() {\n return exclusionGroups;\n }\n };\n }\n ]);\n\n var uiBindEvent = function(scope, element, eventNames, fn) {\n eventNames = eventNames || 'click tap';\n element.on(eventNames, function(event) {\n scope.$apply(function() {\n fn(scope, {$event: event});\n });\n });\n };\n\n /**\n * Calls `SharedState#initialize` on the scope relative to the element using it.\n *\n * @param {string} uiState The shared state id\n * @param {expression} [uiDefault] the default value\n *\n * @directive uiSharedState\n */\n module.directive('uiSharedState', [\n 'SharedState', function(SharedState) {\n return {\n restrict: 'EA',\n priority: 601, // more than ng-if\n link: function(scope, elem, attrs) {\n var id = attrs.uiSharedState || attrs.id;\n var defaultValueExpr = attrs.uiDefault || attrs.default;\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\n\n SharedState.initialize(scope, id, {\n defaultValue: defaultValue,\n exclusionGroup: attrs.uiExclusionGroup\n });\n }\n };\n }\n ]);\n\n /**\n * Alias for uiSharedState. **Deprecated** since it clashes with\n * [UI-Router](https://ui-router.github.io/) `uiState` directive.\n *\n * @deprecated\n * @param {string} uiState The shared state id\n * @param {expression} [uiDefault] the default value\n *\n * @directive uiState\n */\n module.directive('uiState', [\n 'SharedState', function(SharedState) {\n return {\n restrict: 'EA',\n priority: 601, // more than ng-if\n link: function(scope, elem, attrs) {\n var id = attrs.uiState || attrs.id;\n var defaultValueExpr = attrs.uiDefault || attrs.default;\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\n\n SharedState.initialize(scope, id, {\n defaultValue: defaultValue,\n exclusionGroup: attrs.uiExclusionGroup\n });\n }\n };\n }\n ]);\n\n angular.forEach(['toggle', 'turnOn', 'turnOff', 'set'],\n function(methodName) {\n var directiveName = 'ui' + methodName[0].toUpperCase() + methodName.slice(1);\n\n /**\n * Calls `SharedState#toggle` when triggering events happens on the element using it.\n *\n * @param {string} uiToggle the target shared state\n * @param {expression} uiDefault the default value\n *\n * @directive uiToggle\n */\n\n /**\n * @function uiTurnOn\n *\n * @description\n * Calls `SharedState#turnOn` when triggering events happens on the element using it.\n *\n *\n * @ngdoc directive\n *\n * @param {string} uiTurnOn the target shared state\n * @param {expression} uiDefault the default value\n */\n\n /**\n * @function uiTurnOff\n *\n * @description\n * Calls `SharedState#turnOff` when triggering events happens on the element using it.\n *\n * @ngdoc directive\n *\n * @param {string} uiTurnOff the target shared state\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\n */\n\n /**\n * @function uiSet\n *\n * @description\n * Calls `SharedState#set` when triggering events happens on the element using it.\n *\n * @ngdoc directive\n *\n * @param {object} uiSet The object to pass to SharedState#set\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\n */\n\n module.directive(directiveName, [\n '$parse',\n '$interpolate',\n 'SharedState',\n function($parse, $interpolate, SharedState) {\n var method = SharedState[methodName];\n return {\n restrict: 'A',\n priority: 1, // This would make postLink calls happen after ngClick\n // (and similar) ones, thus intercepting events after them.\n //\n // This will prevent eventual ng-if to detach elements\n // before ng-click fires.\n\n compile: function(elem, attrs) {\n var attr = attrs[directiveName];\n var needsInterpolation = attr.match(/\\{\\{/);\n\n var exprFn = function($scope) {\n var res = attr;\n if (needsInterpolation) {\n var interpolateFn = $interpolate(res);\n res = interpolateFn($scope);\n }\n if (methodName === 'set') {\n res = ($parse(res))($scope);\n }\n return res;\n };\n\n return function(scope, elem, attrs) {\n var callback = function() {\n var arg = exprFn(scope);\n return method.call(SharedState, arg);\n };\n uiBindEvent(scope, elem, attrs.uiTriggers, callback);\n };\n }\n };\n }\n ]);\n });\n\n /**\n * @name uiScopeContext\n * @inner\n * @description\n *\n * `uiScopeContext` is not a directive, but a parameter common to any of the\n * `ui-*` directives in this module.\n *\n * By default all `ui-*` conditions in this module evaluates in the context of\n * `SharedState` only, thus scope variable are not accessible. To use them you have\n * two options:\n *\n * #### 1. pre-interpolation\n *\n * You can use pre-interpolation in expression attribute. For instance the following syntax\n * is ligit:\n *\n * ``` html\n *
    \n * ```\n *\n * In this case `idx` value is taken from scope and embedded into\n * conditions before parse them.\n *\n * This works as expected and is fine for the most cases, but it has a little caveat:\n *\n * The condition has to be re-parsed at each digest loop and has to walk scopes\n * in watchers.\n *\n * #### 2. uiScopeContext\n *\n * If you are concerned about performance issues using the first approach\n * `uiScopeContext` is a more verbose but also lightweight alternative\n * to accomplish the same.\n *\n * It allows to use current scope vars inside `ui-*` conditions, leaving\n * other scope vars (or the entire scope if not present) apart from the\n * condition evaluation process.\n *\n * Hopefully this will keep evaluation running against a flat and small data\n * structure instead of taking into account the whole scope.\n *\n * It is a list `scopeVar[ as aliasName] [, ...]` specifing one of more scope\n * variables to take into account when evaluating conditions. ie:\n *\n * ``` html\n * \n *
    \n *
    \n * \n *
    \n *
    \n * ```\n *\n * ``` html\n *
    \n *
    \n * ```\n *\n * Be aware that scope vars will take precedence over sharedStates so,\n * in order to avoid name clashes you can use 'as' to refer to scope vars\n * with a different name in conditions:\n *\n * ``` html\n *
    \n *
    \n * ```\n */\n var parseScopeContext = function(attr) {\n if (!attr || attr === '') {\n return [];\n }\n var vars = attr ? attr.trim().split(/ *, */) : [];\n var res = [];\n for (var i = 0; i < vars.length; i++) {\n var item = vars[i].split(/ *as */);\n if (item.length > 2 || item.length < 1) {\n throw new Error('Error parsing uiScopeContext=\"' + attr + '\"');\n }\n res.push(item);\n }\n return res;\n };\n\n var mixScopeContext = function(context, scopeVars, scope) {\n for (var i = 0; i < scopeVars.length; i++) {\n var key = scopeVars[i][0];\n var alias = scopeVars[i][1] || key;\n context[alias] = key.split('.').reduce(function(scope, nextKey) {\n return scope[nextKey];\n }, scope);\n }\n };\n\n var parseUiCondition = function(name, attrs, $scope, SharedState, $parse, $interpolate) {\n var expr = attrs[name];\n var needsInterpolation = expr.match(/\\{\\{/);\n var exprFn;\n\n if (needsInterpolation) {\n exprFn = function(context) {\n var interpolateFn = $interpolate(expr);\n var parseFn = $parse(interpolateFn($scope));\n return parseFn(context);\n };\n } else {\n exprFn = $parse(expr);\n }\n\n var uiScopeContext = parseScopeContext(attrs.uiScopeContext);\n return function() {\n var context;\n if (uiScopeContext.length) {\n context = angular.extend({}, SharedState.values());\n mixScopeContext(context, uiScopeContext, $scope);\n } else {\n context = SharedState.values();\n }\n return exprFn(context);\n };\n };\n\n /**\n * @ngdoc directive\n * @function uiIf\n *\n * @description\n * Same as `ngIf` but evaluates condition against `SharedState` statuses too\n *\n * @param {expression} uiIf A condition to decide wether to attach the\n * element to the dom\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when\n * evaluating condition.\n */\n module.directive('uiIf', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\n function getBlockNodes(nodes) {\n var node = nodes[0];\n var endNode = nodes[nodes.length - 1];\n var blockNodes = [node];\n do {\n node = node.nextSibling;\n if (!node) {\n break;\n }\n blockNodes.push(node);\n } while (node !== endNode);\n\n return angular.element(blockNodes);\n }\n\n return {\n multiElement: true,\n transclude: 'element',\n priority: 600,\n terminal: true,\n restrict: 'A',\n $$tlb: true,\n link: function($scope, $element, $attr, ctrl, $transclude) {\n var block;\n var childScope;\n var previousElements;\n var uiIfFn = parseUiCondition('uiIf', $attr, $scope, SharedState, $parse, $interpolate);\n\n $scope.$watch(uiIfFn, function uiIfWatchAction(value) {\n if (value) {\n if (!childScope) {\n $transclude(function(clone, newScope) {\n childScope = newScope;\n clone[clone.length++] = document.createComment(' end uiIf: ' + $attr.uiIf + ' ');\n // Note: We only need the first/last node of the cloned nodes.\n // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n // by a directive with templateUrl when its template arrives.\n block = {\n clone: clone\n };\n $animate.enter(clone, $element.parent(), $element);\n });\n }\n } else {\n if (previousElements) {\n previousElements.remove();\n previousElements = null;\n }\n if (childScope) {\n childScope.$destroy();\n childScope = null;\n }\n if (block) {\n previousElements = getBlockNodes(block.clone);\n var done = function() {\n previousElements = null;\n };\n var nga = $animate.leave(previousElements, done);\n if (nga) {\n nga.then(done);\n }\n block = null;\n }\n }\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiHide\n *\n * @description\n * Same as `ngHide` but evaluates condition against `SharedState` statuses\n *\n * @param {expression} uiShow A condition to decide wether to hide the element\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating condition.\n */\n module.directive('uiHide', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\n var NG_HIDE_CLASS = 'ng-hide';\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n var uiHideFn = parseUiCondition('uiHide', attr, scope, SharedState, $parse, $interpolate);\n scope.$watch(uiHideFn, function uiHideWatchAction(value) {\n $animate[value ? 'addClass' : 'removeClass'](element, NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiShow\n *\n * @description\n * Same as `ngShow` but evaluates condition against `SharedState` statuses\n *\n * @param {expression} uiShow A condition to decide wether to show the element\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating condition.\n */\n module.directive('uiShow', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse) {\n var NG_HIDE_CLASS = 'ng-hide';\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n var uiShowFn = parseUiCondition('uiShow', attr, scope, SharedState, $parse);\n scope.$watch(uiShowFn, function uiShowWatchAction(value) {\n $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiClass\n *\n * @description\n * A simplified version of `ngClass` that evaluates in context of `SharedState`, it only suppors the `{'className': expr}` syntax.\n *\n * @param {expression} uiClass An expression that has to evaluate to an object\n * of the form `{'className': expr}`, where `expr` decides wether the class\n * should appear to element's class list.\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating\n * condition.\n */\n module.directive('uiClass', ['SharedState', '$parse', '$interpolate', function(SharedState, $parse) {\n return {\n restrict: 'A',\n link: function(scope, element, attr) {\n var uiClassFn = parseUiCondition('uiClass', attr, scope, SharedState, $parse);\n scope.$watch(uiClassFn, function uiClassWatchAction(value) {\n var classesToAdd = '';\n var classesToRemove = '';\n angular.forEach(value, function(expr, className) {\n if (expr) {\n classesToAdd += ' ' + className;\n } else {\n classesToRemove += ' ' + className;\n }\n classesToAdd = classesToAdd.trim();\n classesToRemove = classesToRemove.trim();\n if (classesToAdd.length) {\n element.addClass(classesToAdd);\n }\n if (classesToRemove.length) {\n element.removeClass(classesToRemove);\n }\n });\n }, true);\n }\n };\n }]);\n\n module.run([\n '$rootScope',\n 'SharedState',\n function($rootScope, SharedState) {\n $rootScope.Ui = SharedState;\n }\n ]);\n\n})();\n","/**\n * Provides directives and service to prevent touchmove default behaviour\n * for touch devices (ie. bounce on overscroll in IOS).\n *\n * #### Usage\n *\n * Use `ui-prevent-touchmove-defaults` directive on root element of your app:\n *\n * ``` html\n * \n * \n * \n * ```\n *\n * Doing so `touchmove.preventDefault` logic for inner elements is inverted,\n * so any `touchmove` default behaviour is automatically prevented.\n *\n * If you wish to allow the default behaviour, for example to allow\n * inner elements to scroll, you have to explicitly mark an event to allow\n * touchmove default.\n *\n * Mobile Angular UI already handles this for `scrollable` elements, so you don't have\n * to do anything in order to support scroll.\n *\n * If you wish to allow touchmove defaults for certain element under certain conditions\n * you can use the `allowTouchmoveDefault` service.\n *\n * ie.\n *\n * ``` js\n * // always allow touchmove default for an element\n * allowTouchmoveDefault(myelem);\n * ```\n *\n * ``` js\n * // allow touchmove default for an element only under certain conditions\n * allowTouchmoveDefault(myelem, function(touchmove){\n * return touchmove.pageY > 100;\n * });\n * ```\n *\n * @module mobile-angular-ui.core.touchmoveDefaults\n */\n(function() {\n 'use strict';\n var module = angular.module('mobile-angular-ui.core.touchmoveDefaults', []);\n\n module.directive('uiPreventTouchmoveDefaults', function() {\n var preventTouchmoveDefaultsCb = function(e) {\n // Get this flag from either the saved event if jQuery is being used, otherwise get it from the event itself.\n var allowTouchmoveEventFlag = e.originalEvent ? e.originalEvent.allowTouchmoveDefault : e.allowTouchmoveDefault;\n if (allowTouchmoveEventFlag !== true) {\n e.preventDefault();\n }\n };\n\n return {\n compile: function(element) {\n if ('ontouchmove' in document) {\n element.on('touchmove', preventTouchmoveDefaultsCb);\n }\n }\n };\n });\n\n /**\n * Bind a listener to an element to allow `touchmove` default behaviour\n * when `touchmove` happens inside the bound element.\n *\n * You can also provide a function to decide when to allow and\n * when to prevent it.\n *\n * ``` js\n * // always allow touchmove default\n * allowTouchmoveDefault(myelem);\n *\n * // allow touchmove default only under certain conditions\n * allowTouchmoveDefault(myelem, function(touchmove){\n * return touchmove.pageY > 100;\n * });\n * ```\n *\n * @param {Element|$element} element The element to bind.\n * @param {function} condition A `function(touchmove)⟶boolean` to decide\n * whether to allow default behavior or not.\n *\n * @service allowTouchmoveDefault\n * @as function\n * @returns function Function to unbind the listener\n */\n\n module.factory('allowTouchmoveDefault', function() {\n var fnTrue = function() {\n return true;\n };\n\n if ('ontouchmove' in document) {\n return function($element, condition) {\n condition = condition || fnTrue;\n\n var allowTouchmoveDefaultCallback = function(e) {\n if (condition(e)) {\n e.allowTouchmoveDefault = true;\n // jQuery normalizes the event object, need to put this property on the copied originalEvent.\n if (e.originalEvent) {\n e.originalEvent.allowTouchmoveDefault = true;\n }\n }\n };\n\n $element = angular.element($element);\n $element.on('touchmove', allowTouchmoveDefaultCallback);\n\n $element.on('$destroy', function() {\n $element.off('touchmove', allowTouchmoveDefaultCallback);\n $element = null;\n });\n\n return function() {\n if ($element) {\n $element.off('touchmove', allowTouchmoveDefaultCallback);\n }\n };\n };\n }\n\n return angular.noop;\n });\n\n})();\n","/**\n * @module mobile-angular-ui.core\n *\n * @description\n *\n * It has all the core functionalities of Mobile Angular UI. It aims to act as a common base\n * for an UI framework providing services and directives to create components and implement\n * UI interactions with angular.\n *\n *
    \n * NOTE\n *
      \n *
    • It has no dependency on Bootstrap.
    • \n *
    • It is not related to mobile apps only.
    • \n *
    • It is not requiring CSS support.
    • \n *
    • You can use it on any Angular Application and with any CSS framework.
    • \n *
    \n *
    \n *\n * ## Standalone Usage\n *\n * Although `.core` module is required by `mobile-angular-ui` by default you can use it alone.\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.core']);\n * ```\n */\n(function() {\n 'use strict';\n angular.module('mobile-angular-ui.core', [\n 'mobile-angular-ui.core.fastclick',\n 'mobile-angular-ui.core.activeLinks',\n 'mobile-angular-ui.core.capture',\n 'mobile-angular-ui.core.outerClick',\n 'mobile-angular-ui.core.sharedState',\n 'mobile-angular-ui.core.touchmoveDefaults'\n ]);\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["fastclick.js","activeLinks.js","capture.js","outerClick.js","sharedState.js","touchmoveDefaults.js","mobile-angular-ui.core.js"],"names":["FastClick","layer","options","bind","method","context","apply","arguments","oldOnClick","this","trackingClick","trackingClickStart","targetElement","touchStartX","touchStartY","lastTouchIdentifier","touchBoundary","tapDelay","tapTimeout","notNeeded","methods","i","l","length","deviceIsAndroid","addEventListener","onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","Event","prototype","stopImmediatePropagation","removeEventListener","type","callback","capture","rmv","Node","call","hijacked","adv","event","propagationStopped","onclick","deviceIsWindowsPhone","navigator","userAgent","indexOf","deviceIsIOS","test","deviceIsIOS4","deviceIsIOSWithBadTarget","deviceIsBlackBerry10","needsClick","target","nodeName","toLowerCase","disabled","className","needsFocus","readOnly","sendClick","clickEvent","touch","document","activeElement","blur","changedTouches","createEvent","initMouseEvent","determineEventType","window","screenX","screenY","clientX","clientY","forwardedTouchEvent","dispatchEvent","tagName","focus","setSelectionRange","value","updateScrollParent","scrollParent","parentElement","fastClickScrollParent","contains","scrollHeight","offsetHeight","fastClickLastScrollTop","scrollTop","getTargetElementFromEventTarget","eventTarget","nodeType","TEXT_NODE","parentNode","selection","targetTouches","getSelection","rangeCount","isCollapsed","identifier","preventDefault","timeStamp","pageX","pageY","lastClickTime","touchHasMoved","boundary","Math","abs","findControl","labelElement","undefined","control","htmlFor","getElementById","querySelector","forElement","targetTagName","cancelNextClick","elementFromPoint","pageXOffset","pageYOffset","top","cancelable","stopPropagation","permitted","detail","destroy","metaViewport","chromeVersion","blackberryVersion","firefoxVersion","ontouchstart","exec","content","documentElement","scrollWidth","outerWidth","match","style","msTouchAction","touchAction","attach","define","amd","module","exports","angular","provider","$locationProvider","$get","$document","$location","currentPath","path","links","link","element","href","attr","removeClass","html5Mode","enabled","linkPrefix","hashPrefix","slice","charAt","split","addClass","run","$rootScope","setupActiveLinks","$on","Capture","resetAll","factory","$compile","yielders","name","hasOwnProperty","resetYielder","b","setContentFor","defaultContent","defaultScope","putYielder","yielder","getYielder","removeYielder","scope","html","contents","directive","compile","tElem","tAttrs","rawContent","uiDuplicate","remove","elem","attrs","uiContentFor","uiYieldTo","on","Error","$window","orgHandler","body","forEach","directiveName","restrict","parent","$timeout","isAncestorOrSelf","outerClickFn","outerClickIf","handleOuterClick","$apply","$event","stopWatching","noop","t","$watch","cancel","unbind","bindOuterClick","$parse","uiOuterClick","uiOuterClickIf","$log","values","statusesMeta","scopes","exclusionGroups","initialize","id","isNewScope","defaultValue","exclusionGroup","$id","push","references","extend","$broadcast","setOne","ids","status","Object","keys","prev","warn","setMany","map","set","idOrMap","isObject","turnOn","eg","egStatuses","item","turnOff","toggle","get","isActive","Boolean","active","isUndefined","has","referenceCount","equals","eq","uiBindEvent","eventNames","fn","SharedState","priority","uiSharedState","defaultValueExpr","uiDefault","$eval","uiExclusionGroup","uiState","methodName","toUpperCase","$interpolate","needsInterpolation","exprFn","$scope","res","interpolateFn","arg","uiTriggers","parseScopeContext","vars","trim","mixScopeContext","scopeVars","key","alias","reduce","nextKey","parseUiCondition","expr","parseFn","uiScopeContext","$animate","getBlockNodes","nodes","node","endNode","blockNodes","nextSibling","multiElement","transclude","terminal","$$tlb","$element","$attr","ctrl","$transclude","block","childScope","previousElements","uiIfFn","clone","newScope","createComment","uiIf","enter","$destroy","done","nga","leave","then","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","uiHideFn","tempClasses","uiShowFn","uiClassFn","classesToAdd","classesToRemove","Ui","preventTouchmoveDefaultsCb","e","allowTouchmoveEventFlag","originalEvent","allowTouchmoveDefault","fnTrue","condition","allowTouchmoveDefaultCallback","off"],"mappings":"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","file":"mobile-angular-ui.core.min.js","sourcesContent":["if (typeof FastClick === 'undefined') {\n throw new Error('mobile-angular-ui\\'s JavaScript requires FastClick')\n}\n\n(function(FastClick) {\n 'use strict';\n var module = angular.module('mobile-angular-ui.core.fastclick', []);\n\n module.run(['$window', function($window) {\n\n // Temporarly bugfix in overthrow/fastclick:\n var orgHandler = FastClick.prototype.onTouchEnd;\n\n // Some old versions of Android don't have Function.prototype.bind\n function bind(method, context) {\n return function() {\n return method.apply(context, arguments);\n };\n }\n\n FastClick.prototype.onTouchEnd = function(event) {\n\n if (!event.changedTouches) {\n event.changedTouches = [{}];\n }\n\n orgHandler = bind(orgHandler, this);\n orgHandler(event);\n };\n\n FastClick.attach($window.document.body);\n\n }]);\n\n angular.forEach(['select', 'input', 'textarea'], function(directiveName) {\n\n module.directive(directiveName, function() {\n return {\n restrict: 'E',\n compile: function(elem) {\n elem.addClass('needsclick');\n }\n };\n });\n });\n})(FastClick);\n","/**\r\n * @module mobile-angular-ui.core.activeLinks\r\n * @description\r\n *\r\n * `mobile-angular-ui.activeLinks` module sets up `.active` class for `a`\r\n * elements those `href` attribute matches the current angular `$location` url.\r\n * It takes care of excluding both search part and hash part from comparison.\r\n *\r\n * `.active` classes are added/removed each time one of `$locationChangeSuccess`\r\n * or `$includeContentLoaded` is fired.\r\n *\r\n * ## Usage\r\n *\r\n * Just declare it as a dependency to your app unless you have already included\r\n * one of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.activeLinks']);\r\n * ```\r\n *\r\n * **NOTE:** if you are using it without Bootstrap you may need to add some css\r\n * to your stylesheets to reflect the activation state of links. I.e.\r\n *\r\n * ``` css\r\n * a.active {\r\n * color: blue;\r\n * }\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.activeLinks', [])\r\n .provider('setupActiveLinks', ['$locationProvider', function($locationProvider) {\r\n this.$get = [\r\n '$document',\r\n '$location',\r\n function($document, $location) {\r\n return function() {\r\n var currentPath = $location.path();\r\n var links = $document[0].links;\r\n\r\n for (var i = 0; i < links.length; i++) {\r\n var link = angular.element(links[i]);\r\n var href = link.attr('href');\r\n\r\n if (!href) {\r\n return link.removeClass('active');\r\n }\r\n\r\n var html5Mode = $locationProvider.html5Mode().enabled;\r\n if (!html5Mode) {\r\n var linkPrefix = '#' + $locationProvider.hashPrefix();\r\n if (href.slice(0, linkPrefix.length) === linkPrefix) {\r\n href = href.slice(linkPrefix.length);\r\n } else {\r\n return link.removeClass('active');\r\n }\r\n }\r\n\r\n if (href.charAt(0) !== '/') {\r\n return link.removeClass('active');\r\n }\r\n\r\n href = href.split('#')[0].split('?')[0];\r\n\r\n if (href === currentPath) {\r\n link.addClass('active');\r\n } else {\r\n link.removeClass('active');\r\n }\r\n }\r\n };\r\n }];\r\n }])\r\n .run(['$rootScope', 'setupActiveLinks', function($rootScope, setupActiveLinks) {\r\n $rootScope.$on('$locationChangeSuccess', setupActiveLinks);\r\n $rootScope.$on('$includeContentLoaded', setupActiveLinks);\r\n }]);\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.core.capture\r\n * @description\r\n *\r\n * The `capture` module exposes directives to var you extract markup which can\r\n * be used in other parts of a template using `uiContentFor` and `uiYieldTo`\r\n * directives.\r\n *\r\n * It provides a way to move or clone a block of markup to other parts of the document.\r\n *\r\n * This method is particularly useful to setup parts of the layout within an\r\n * angular view. Since blocks of html are transplanted within their original\r\n * `$scope` is easy to create layout interactions depending on the context.\r\n * Some tipical task you can accomplish with these directives are: _setup\r\n * the navbar title depending on the view_ or _place a submit button for a\r\n * form inside a navbar_.\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already included some\r\n * of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.capture']);\r\n * ```\r\n *\r\n * Use `ui-yield-to` as a placeholder.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *
    \r\n * Default Title\r\n *
    \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n *\r\n * Use `ui-content-for` inside any view to populate the `ui-yield-to` content.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n * My View Title\r\n *
    \r\n * ```\r\n *\r\n * Since the original scope is preserved you can use directives inside\r\n * `ui-content-for` blocks to interact with the current scope. In the following\r\n * example we will add a navbar button to submit a form inside a nested view.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * ```\r\n *\r\n * ``` javascript\r\n * app.controller('newCustomerController', function($scope, Store){\r\n * $scope.customer = {};\r\n * $scope.createCustomer = function(){\r\n * Store.create($scope.customer);\r\n * // ...\r\n * }\r\n * });\r\n * ```\r\n *\r\n * If you wish you can also duplicate markup instead of move it. Just add `duplicate` parameter to `uiContentFor` directive to specify this behaviour.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.capture', [])\r\n\r\n .run([\r\n 'Capture',\r\n '$rootScope',\r\n function(Capture, $rootScope) {\r\n $rootScope.$on('$routeChangeSuccess', function() {\r\n Capture.resetAll();\r\n });\r\n }\r\n ])\r\n\r\n .factory('Capture', [\r\n '$compile',\r\n function($compile) {\r\n var yielders = {};\r\n\r\n return {\r\n yielders: yielders,\r\n\r\n resetAll: function() {\r\n for (var name in yielders) {\r\n if (yielders.hasOwnProperty(name)) {\r\n this.resetYielder(name);\r\n }\r\n }\r\n },\r\n\r\n resetYielder: function(name) {\r\n var b = yielders[name];\r\n this.setContentFor(name, b.defaultContent, b.defaultScope);\r\n },\r\n\r\n putYielder: function(name, element, defaultScope, defaultContent) {\r\n var yielder = {};\r\n yielder.name = name;\r\n yielder.element = element;\r\n yielder.defaultContent = defaultContent || '';\r\n yielder.defaultScope = defaultScope;\r\n yielders[name] = yielder;\r\n },\r\n\r\n getYielder: function(name) {\r\n return yielders[name];\r\n },\r\n\r\n removeYielder: function(name) {\r\n delete yielders[name];\r\n },\r\n\r\n setContentFor: function(name, content, scope) {\r\n var b = yielders[name];\r\n if (!b) {\r\n return;\r\n }\r\n b.element.html(content);\r\n $compile(b.element.contents())(scope);\r\n }\r\n\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive uiContentFor\r\n * @restrict A\r\n * @description\r\n *\r\n * `ui-content-for` makes inner contents to replace the corresponding\r\n * `ui-yield-to` placeholder contents.\r\n *\r\n * `uiContentFor` is intended to be used inside a view in order to populate outer placeholders.\r\n * Any content you send to placeholders via `ui-content-for` is\r\n * reverted to placeholder defaults after view changes (ie. on `$routeChangeStart`).\r\n *\r\n * @param {string} uiContentFor The id of the placeholder to be replaced\r\n * @param {boolean} uiDuplicate If present duplicates the content instead of moving it (default to `false`)\r\n *\r\n */\r\n .directive('uiContentFor', [\r\n 'Capture',\r\n function(Capture) {\r\n return {\r\n compile: function(tElem, tAttrs) {\r\n var rawContent = tElem.html();\r\n if (tAttrs.uiDuplicate === null || tAttrs.uiDuplicate === undefined) {\r\n // no need to compile anything!\r\n tElem.html('');\r\n tElem.remove();\r\n }\r\n return function(scope, elem, attrs) {\r\n Capture.setContentFor(attrs.uiContentFor, rawContent, scope);\r\n };\r\n }\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive uiYieldTo\r\n * @restrict A\r\n * @description\r\n *\r\n * `ui-yield-to` defines a placeholder which contents will be further replaced by `ui-content-for` directive.\r\n *\r\n * Inner html is considered to be a default. Default is restored any time `$routeChangeStart` happens.\r\n *\r\n * @param {string} uiYieldTo The unique id of this placeholder.\r\n *\r\n */\r\n .directive('uiYieldTo', [\r\n '$compile', 'Capture', function($compile, Capture) {\r\n return {\r\n link: function(scope, element, attr) {\r\n Capture.putYielder(attr.uiYieldTo, element, scope, element.html());\r\n\r\n element.on('$destroy', function() {\r\n Capture.removeYielder(attr.uiYieldTo);\r\n });\r\n\r\n scope.$on('$destroy', function() {\r\n Capture.removeYielder(attr.uiYieldTo);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n})();\r\n","/**\r\n *\r\n * @module mobile-angular-ui.core.outerClick\r\n * @description\r\n *\r\n * Provides a directive to specifiy a behaviour when click/tap events\r\n * happen outside an element. This can be easily used\r\n * to implement eg. __close on outer click__ feature for a dropdown.\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already\r\n * included some of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.outerClick']);\r\n * ```\r\n *\r\n * Use `ui-outer-click` to define an expression to evaluate when an _Outer Click_ event happens.\r\n * Use `ui-outer-click-if` parameter to define a condition to enable/disable the listener.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n * \r\n * \r\n * \r\n *\r\n *
  • Action
  • \r\n *
  • Another action
  • \r\n *
  • Something else here
  • \r\n *
  • \r\n *
  • Separated link
  • \r\n * \r\n *
    \r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.outerClick', [])\r\n\r\n .factory('_mauiIsAncestorOrSelf', function() {\r\n return function(element, target) {\r\n var parent = element;\r\n while (parent.length > 0) {\r\n if (parent[0] === target[0]) {\r\n parent = null;\r\n return true;\r\n }\r\n parent = parent.parent();\r\n }\r\n parent = null;\r\n return false;\r\n };\r\n })\r\n\r\n /**\r\n * @service bindOuterClick\r\n * @as function\r\n *\r\n * @description\r\n * This is a service function that binds a callback to be conditionally executed\r\n * when a click event happens outside a specified element.\r\n *\r\n * Ie.\r\n *\r\n * ``` js\r\n * app.directive('myDirective', function('bindOuterClick'){\r\n * return {\r\n * link: function(scope, element) {\r\n * bindOuterClick(element, function(scope, extra){\r\n * alert('You clicked ouside me!');\r\n * }, function(e){\r\n * return element.hasClass('disabled') ? true : false;\r\n * });\r\n * }\r\n * };\r\n * });\r\n * ```\r\n * @scope {scope} the scope to eval callbacks\r\n * @param {DomElement|$element} element The element to bind to.\r\n * @param {function} callback A `function(scope, options)`, usually the result of `$parse`, that is called when an _outer click_ event happens.\r\n * @param {string|function} condition Angular `$watch` expression to decide whether to run `callback` or not.\r\n */\r\n .factory('bindOuterClick', [\r\n '$document',\r\n '$timeout',\r\n '_mauiIsAncestorOrSelf',\r\n function($document, $timeout, isAncestorOrSelf) {\r\n\r\n return function(scope, element, outerClickFn, outerClickIf) {\r\n var handleOuterClick = function(event) {\r\n if (!isAncestorOrSelf(angular.element(event.target), element)) {\r\n scope.$apply(function() {\r\n outerClickFn(scope, {$event: event});\r\n });\r\n }\r\n };\r\n\r\n var stopWatching = angular.noop;\r\n var t = null;\r\n\r\n if (outerClickIf) {\r\n stopWatching = scope.$watch(outerClickIf, function(value) {\r\n $timeout.cancel(t);\r\n\r\n if (value) {\r\n // prevents race conditions\r\n // activating with other click events\r\n t = $timeout(function() {\r\n $document.on('click tap', handleOuterClick);\r\n }, 0);\r\n\r\n } else {\r\n $document.unbind('click tap', handleOuterClick);\r\n }\r\n });\r\n } else {\r\n $timeout.cancel(t);\r\n $document.on('click tap', handleOuterClick);\r\n }\r\n\r\n scope.$on('$destroy', function() {\r\n stopWatching();\r\n $document.unbind('click tap', handleOuterClick);\r\n });\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive outerClick\r\n *\r\n * @description\r\n * Evaluates an expression when an _Outer Click_ event happens.\r\n *\r\n * @param {expression} uiOuterClick Expression to evaluate when an _Outer Click_ event happens.\r\n * @param {expression} uiOuterClickIf Condition to enable/disable the listener. Defaults to `true`.\r\n */\r\n .directive('uiOuterClick', [\r\n 'bindOuterClick',\r\n '$parse',\r\n function(bindOuterClick, $parse) {\r\n return {\r\n restrict: 'A',\r\n compile: function(elem, attrs) {\r\n var outerClickFn = $parse(attrs.uiOuterClick);\r\n var outerClickIf = attrs.uiOuterClickIf;\r\n return function(scope, elem) {\r\n bindOuterClick(scope, elem, outerClickFn, outerClickIf);\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n})();\r\n","(function() {\r\n 'use strict';\r\n /**\r\n * @module mobile-angular-ui.core.sharedState\r\n *\r\n * @description\r\n * `mobile-angular-ui.core.sharedState` is expose the homonymous service\r\n * `SharedState` and a group of directives to access it.\r\n *\r\n * `SharedState` allows to use elementary angular or angularish directives\r\n * to create interactive components.\r\n *\r\n * Ie.\r\n *\r\n * ``` html\r\n *
    \r\n * Tab1\r\n * Tab2\r\n * Tab3\r\n *
    \r\n *
    \r\n *
    Tab1
    \r\n *
    Tab2
    \r\n *
    Tab3
    \r\n *
    \r\n * ```\r\n *\r\n * Using `SharedState` you will be able to:\r\n *\r\n * - Create interactive components without having to write javascript code\r\n * - Have your controller free from UI logic\r\n * - Separe `ng-click` triggering application logic from those having a visual effect only\r\n * - Export state of components to urls\r\n * - Easily make components comunicate each other\r\n *\r\n * Also note that:\r\n *\r\n * Data structures retaining statuses will stay outside angular scopes\r\n * thus they are not evaluated against digest cycle until its necessary.\r\n * Also although statuses are sort of global variables `SharedState` will\r\n * take care of disposing them when no scopes are requiring them anymore.\r\n *\r\n * A set of `ui-*` directives are available to interact with `SharedState`\r\n * module and will hopefully var you spare your controllers and your time\r\n * for something that is more meaningful than this:\r\n *\r\n * ``` js\r\n * $scope.activeTab = 1;\r\n *\r\n * $scope.setActiveTab = function(n) {\r\n * $scope.activeTab = n;\r\n * };\r\n * ```\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already included some\r\n * of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.sharedState']);\r\n * ```\r\n *\r\n * Use `ui-shared-state` directive to require/initialize a state from the target element scope\r\n *\r\n * **Example.** Tabs\r\n *\r\n * \r\n *\r\n * **Example.** Custom components\r\n *\r\n * \r\n *\r\n * NOTE: `ui-toggle/set/turnOn/turnOff` responds to `click/tap` without\r\n * stopping propagation so you can use them along with ng-click too.\r\n * You can also change events to respond to with `ui-triggers` attribute.\r\n *\r\n * Any `SharedState` method is exposed through `Ui` object in `$rootScope`.\r\n * So you could always do `ng-click=\"Ui.turnOn('myVar')\"`.\r\n *\r\n * Since `SharedState` is a service you can initialize/set statuses through\r\n * controllers too:\r\n *\r\n * ``` js\r\n * app.controller('myController', function($scope, SharedState){\r\n * SharedState.initialize($scope, \"activeTab\", 3);\r\n * });\r\n * ```\r\n *\r\n * As well as you can use `ui-default` for that:\r\n *\r\n * ``` html\r\n *
    \r\n * ```\r\n *\r\n */\r\n var module = angular.module('mobile-angular-ui.core.sharedState', []);\r\n\r\n /**\r\n * @ngdoc service\r\n * @class SharedState\r\n *\r\n * @description\r\n *\r\n * A `SharedState` state can be considered as a global variable identified by an `id`.\r\n *\r\n * `SharedState` service exposes methods to interact with statuses to create,\r\n * read and update states.\r\n *\r\n * It acts as a BUS between UI elements to share UI related state that is\r\n * automatically disposed when all scopes requiring it are destroyed.\r\n *\r\n * eg.\r\n *\r\n * ``` js\r\n * app.controller('controller1', function($scope, SharedState){\r\n * SharedState.initialize($scope, 'myId');\r\n * });\r\n *\r\n * app.controller('controller2', function(SharedState){\r\n * SharedState.toggle('myId');\r\n * });\r\n * ```\r\n *\r\n * Data structures retaining statuses will stay outside angular scopes thus\r\n * they are not evaluated against digest cycle until its necessary. Also\r\n * although statuses are sort of global variables `SharedState` will take\r\n * care of disposing them when no scopes are requiring them anymore.\r\n *\r\n * A set of `ui-*` directives are available to interact with `SharedState`\r\n * module and will hopefully var you spare your controllers and your time for\r\n * something that is more meaningful than this:\r\n *\r\n * ``` js\r\n * $scope.activeTab = 1;\r\n *\r\n * $scope.setActiveTab = function(n) {\r\n * $scope.activeTab = n;\r\n * };\r\n * ```\r\n *\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.initialized.ID'\r\n * @shortname initialized\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` when `#initialize` is called for a new state not\r\n * referenced by any scope currently.\r\n *\r\n * @param {any} currentValue The value with which this state has been initialized\r\n *\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.destroyed.ID'\r\n * @shortname destroyed\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` when a state is destroyed.\r\n *\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.changed.ID'\r\n * @shortname changed\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` the value of a state changes.\r\n *\r\n * ``` js\r\n * $scope.$on('mobile-angular-ui.state.changed.uiSidebarLeft', function(e, newVal, oldVal) {\r\n * if (newVal === true) {\r\n * console.log('sidebar opened');\r\n * } else {\r\n * console.log('sidebar closed');\r\n * }\r\n * });\r\n * ```\r\n *\r\n * @param {any} newValue\r\n * @param {any} oldValue\r\n *\r\n */\r\n\r\n module.factory('SharedState', [\r\n '$rootScope', '$log',\r\n function($rootScope, $log) {\r\n var values = {}; // values, context object for evals\r\n var statusesMeta = {}; // status info\r\n var scopes = {}; // scopes references\r\n var exclusionGroups = {}; // support exclusive boolean sets\r\n\r\n return {\r\n /**\r\n * @function initialize\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Initialize, or require if already intialized, a state identified by `id` within the provided `scope`, making it available to the rest of application.\r\n *\r\n * A `SharedState` is bound to one or more scopes. Each time\r\n * `initialize` is called for an angular `scope` this will be bound to\r\n * the `SharedState` and a reference count is incremented to allow\r\n * garbage collection.\r\n *\r\n * Reference count is decremented once the scope is destroyed. When the counter reach 0 the state will be disposed.\r\n *\r\n * @param {scope} scope The scope to bound this state\r\n * @param {string} id The unique name of this state\r\n * @param {object} [options] Options\r\n * @param {object} [options.defaultValue] the initialization value, it is taken into account only if the state `id` is not already initialized\r\n * @param {string} [options.exclusionGroup] Specifies an exclusion group\r\n * for the state. This means that for boolean operations (ie. toggle,\r\n * turnOn, turnOf) when this state is set to `true`, any other state\r\n * that is in the same `exclusionGroup` will be set to `false`.\r\n */\r\n initialize: function(scope, id, options) {\r\n options = options || {};\r\n\r\n var isNewScope = scopes[scope] === undefined;\r\n var defaultValue = options.defaultValue;\r\n var exclusionGroup = options.exclusionGroup;\r\n\r\n scopes[scope.$id] = scopes[scope.$id] || [];\r\n scopes[scope.$id].push(id);\r\n\r\n if (!statusesMeta[id]) { // is a brand new state\r\n // not referenced by any\r\n // scope currently\r\n\r\n statusesMeta[id] = angular.extend({}, options, {references: 1});\r\n\r\n $rootScope.$broadcast('mobile-angular-ui.state.initialized.' + id, defaultValue);\r\n\r\n if (defaultValue !== undefined) {\r\n this.setOne(id, defaultValue);\r\n }\r\n\r\n if (exclusionGroup) {\r\n // Exclusion groups are sets of statuses references\r\n exclusionGroups[exclusionGroup] = exclusionGroups[exclusionGroup] || {};\r\n exclusionGroups[exclusionGroup][id] = true;\r\n }\r\n\r\n } else if (isNewScope) { // is a new reference from\r\n // a different scope\r\n statusesMeta[id].references++;\r\n }\r\n scope.$on('$destroy', function() {\r\n var ids = scopes[scope.$id] || [];\r\n for (var i = 0; i < ids.length; i++) {\r\n var status = statusesMeta[ids[i]];\r\n\r\n if (status.exclusionGroup) {\r\n delete exclusionGroups[status.exclusionGroup][ids[i]];\r\n if (Object.keys(exclusionGroups[status.exclusionGroup]).length === 0) {\r\n delete exclusionGroups[status.exclusionGroup];\r\n }\r\n }\r\n\r\n status.references--;\r\n if (status.references <= 0) {\r\n delete statusesMeta[ids[i]];\r\n delete values[ids[i]];\r\n $rootScope.$broadcast('mobile-angular-ui.state.destroyed.' + id);\r\n }\r\n }\r\n delete scopes[scope.$id];\r\n });\r\n },\r\n\r\n /**\r\n * @function setOne\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Set the value of the state identified by `id` to the `value` parameter.\r\n *\r\n * @param {string} id Unique identifier for state\r\n * @param {any} value New value for this state\r\n */\r\n setOne: function(id, value) {\r\n if (statusesMeta[id] !== undefined) {\r\n var prev = values[id];\r\n values[id] = value;\r\n if (prev !== value) {\r\n $rootScope.$broadcast('mobile-angular-ui.state.changed.' + id, value, prev);\r\n }\r\n return value;\r\n }\r\n $log.warn('Warning: Attempt to set uninitialized shared state: ' + id);\r\n },\r\n\r\n /**\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @function setMany\r\n * @description\r\n *\r\n * Set multiple statuses at once. ie.\r\n *\r\n * ```\r\n * SharedState.setMany({ activeTab: 'firstTab', sidebarIn: false });\r\n * ```\r\n *\r\n * @param {object} object An object of the form `{state1: value1, ..., stateN: valueN}`\r\n */\r\n setMany: function(map) {\r\n angular.forEach(map, function(value, id) {\r\n this.setOne(id, value);\r\n }, this);\r\n },\r\n\r\n /**\r\n * @function set\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * A shorthand for both `setOne` and `setMany`.\r\n * When called with only one parameter that is an object\r\n * it is the same of `setMany`, otherwise is the\r\n * same of `setOne`.\r\n *\r\n * @param {string|object} idOrMap A state id or a `{state: value}` map object.\r\n * @param {any} [value] The value to assign in case idOrMap is a string.\r\n */\r\n set: function(idOrMap, value) {\r\n if (!idOrMap) {\r\n return;\r\n } else if (angular.isObject(idOrMap)) {\r\n this.setMany(idOrMap);\r\n } else {\r\n this.setOne(idOrMap, value);\r\n }\r\n },\r\n\r\n /**\r\n * @function turnOn\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Set shared state identified by `id` to `true`. If the\r\n * shared state has been initialized with `exclusionGroup`\r\n * option it will also turn off (set to `false`) all other\r\n * statuses from the same exclusion group.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n turnOn: function(id) {\r\n // Turns off other statuses belonging to the same exclusion group.\r\n var eg = statusesMeta[id] && statusesMeta[id].exclusionGroup;\r\n if (eg) {\r\n var egStatuses = Object.keys(exclusionGroups[eg]);\r\n for (var i = 0; i < egStatuses.length; i++) {\r\n var item = egStatuses[i];\r\n if (item !== id) {\r\n this.turnOff(item);\r\n }\r\n }\r\n }\r\n return this.setOne(id, true);\r\n },\r\n\r\n /**\r\n * @function turnOff\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Set shared state identified by `id` to `false`.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n turnOff: function(id) {\r\n return this.setOne(id, false);\r\n },\r\n\r\n /**\r\n * @function toggle\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * If current value for shared state identified by `id` evaluates\r\n * to `true` it calls `turnOff` on it otherwise calls `turnOn`.\r\n * Be aware that it will take into account `exclusionGroup` option.\r\n * See `#turnOn` and `#initialize` for more.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n toggle: function(id) {\r\n return this.get(id) ? this.turnOff(id) : this.turnOn(id);\r\n },\r\n\r\n /**\r\n * @function get\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Returns the current value of the state identified by `id`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {any}\r\n */\r\n get: function(id) {\r\n return statusesMeta[id] && values[id];\r\n },\r\n\r\n /**\r\n * @function isActive\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Return `true` if the boolean conversion of `#get(id)` evaluates to `true`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n isActive: function(id) {\r\n return Boolean(this.get(id));\r\n },\r\n\r\n /**\r\n * @function active\r\n * @alias mobile-angular-ui.core.sharedState~SharedState.isActive\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Alias for `#isActive`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n active: function(id) {\r\n return this.isActive(id);\r\n },\r\n\r\n /**\r\n * @function isUndefined\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Return `true` if state identified by `id` is not defined.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n isUndefined: function(id) {\r\n return statusesMeta[id] === undefined || this.get(id) === undefined;\r\n },\r\n\r\n /**\r\n * Returns `true` if state identified by `id` exsists.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n *\r\n * @function has\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n has: function(id) {\r\n return statusesMeta[id] !== undefined;\r\n },\r\n\r\n /**\r\n * Returns the number of references of a status.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {integer}\r\n *\r\n * @function referenceCount\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n referenceCount: function(id) {\r\n var status = statusesMeta[id];\r\n return status === undefined ? 0 : status.references;\r\n },\r\n\r\n /**\r\n * Returns `true` if `#get(id)` is exactly equal (`===`) to `value` param.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @param {any} value The value for comparison\r\n * @returns {bool}\r\n *\r\n * @function equals\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n equals: function(id, value) {\r\n return this.get(id) === value;\r\n },\r\n\r\n /**\r\n * Alias for `#equals`\r\n *\r\n * @param {string} id The unique name of this state\r\n * @param {any} value The value for comparison\r\n * @returns {bool}\r\n *\r\n * @function eq\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @alias mobile-angular-ui.core.sharedState~SharedState.equals\r\n */\r\n eq: function(id, value) {\r\n return this.equals(id, value);\r\n },\r\n\r\n /**\r\n * Returns an object with all the status values currently stored.\r\n * It has the form of `{statusId: statusValue}`.\r\n *\r\n * Bear in mind that in order to spare resources it currently\r\n * returns just the internal object retaining statuses values.\r\n * Thus it is not intended to be modified and direct changes to it will be not tracked or notified.\r\n *\r\n * Just clone before apply any change to it.\r\n *\r\n * @returns {object}\r\n *\r\n * @function values\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n values: function() {\r\n return values;\r\n },\r\n\r\n exclusionGroups: function() {\r\n return exclusionGroups;\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n var uiBindEvent = function(scope, element, eventNames, fn) {\r\n eventNames = eventNames || 'click tap';\r\n element.on(eventNames, function(event) {\r\n scope.$apply(function() {\r\n fn(scope, {$event: event});\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Calls `SharedState#initialize` on the scope relative to the element using it.\r\n *\r\n * @param {string} uiState The shared state id\r\n * @param {expression} [uiDefault] the default value\r\n *\r\n * @directive uiSharedState\r\n */\r\n module.directive('uiSharedState', [\r\n 'SharedState', function(SharedState) {\r\n return {\r\n restrict: 'EA',\r\n priority: 601, // more than ng-if\r\n link: function(scope, elem, attrs) {\r\n var id = attrs.uiSharedState || attrs.id;\r\n var defaultValueExpr = attrs.uiDefault || attrs.default;\r\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\r\n\r\n SharedState.initialize(scope, id, {\r\n defaultValue: defaultValue,\r\n exclusionGroup: attrs.uiExclusionGroup\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n /**\r\n * Alias for uiSharedState. **Deprecated** since it clashes with\r\n * [UI-Router](https://ui-router.github.io/) `uiState` directive.\r\n *\r\n * @deprecated\r\n * @param {string} uiState The shared state id\r\n * @param {expression} [uiDefault] the default value\r\n *\r\n * @directive uiState\r\n */\r\n module.directive('uiState', [\r\n 'SharedState', function(SharedState) {\r\n return {\r\n restrict: 'EA',\r\n priority: 601, // more than ng-if\r\n link: function(scope, elem, attrs) {\r\n var id = attrs.uiState || attrs.id;\r\n var defaultValueExpr = attrs.uiDefault || attrs.default;\r\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\r\n\r\n SharedState.initialize(scope, id, {\r\n defaultValue: defaultValue,\r\n exclusionGroup: attrs.uiExclusionGroup\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n angular.forEach(['toggle', 'turnOn', 'turnOff', 'set'],\r\n function(methodName) {\r\n var directiveName = 'ui' + methodName[0].toUpperCase() + methodName.slice(1);\r\n\r\n /**\r\n * Calls `SharedState#toggle` when triggering events happens on the element using it.\r\n *\r\n * @param {string} uiToggle the target shared state\r\n * @param {expression} uiDefault the default value\r\n *\r\n * @directive uiToggle\r\n */\r\n\r\n /**\r\n * @function uiTurnOn\r\n *\r\n * @description\r\n * Calls `SharedState#turnOn` when triggering events happens on the element using it.\r\n *\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {string} uiTurnOn the target shared state\r\n * @param {expression} uiDefault the default value\r\n */\r\n\r\n /**\r\n * @function uiTurnOff\r\n *\r\n * @description\r\n * Calls `SharedState#turnOff` when triggering events happens on the element using it.\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {string} uiTurnOff the target shared state\r\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\r\n */\r\n\r\n /**\r\n * @function uiSet\r\n *\r\n * @description\r\n * Calls `SharedState#set` when triggering events happens on the element using it.\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {object} uiSet The object to pass to SharedState#set\r\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\r\n */\r\n\r\n module.directive(directiveName, [\r\n '$parse',\r\n '$interpolate',\r\n 'SharedState',\r\n function($parse, $interpolate, SharedState) {\r\n var method = SharedState[methodName];\r\n return {\r\n restrict: 'A',\r\n priority: 1, // This would make postLink calls happen after ngClick\r\n // (and similar) ones, thus intercepting events after them.\r\n //\r\n // This will prevent eventual ng-if to detach elements\r\n // before ng-click fires.\r\n\r\n compile: function(elem, attrs) {\r\n var attr = attrs[directiveName];\r\n var needsInterpolation = attr.match(/\\{\\{/);\r\n\r\n var exprFn = function($scope) {\r\n var res = attr;\r\n if (needsInterpolation) {\r\n var interpolateFn = $interpolate(res);\r\n res = interpolateFn($scope);\r\n }\r\n if (methodName === 'set') {\r\n res = ($parse(res))($scope);\r\n }\r\n return res;\r\n };\r\n\r\n return function(scope, elem, attrs) {\r\n var callback = function() {\r\n var arg = exprFn(scope);\r\n return method.call(SharedState, arg);\r\n };\r\n uiBindEvent(scope, elem, attrs.uiTriggers, callback);\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n });\r\n\r\n /**\r\n * @name uiScopeContext\r\n * @inner\r\n * @description\r\n *\r\n * `uiScopeContext` is not a directive, but a parameter common to any of the\r\n * `ui-*` directives in this module.\r\n *\r\n * By default all `ui-*` conditions in this module evaluates in the context of\r\n * `SharedState` only, thus scope variable are not accessible. To use them you have\r\n * two options:\r\n *\r\n * #### 1. pre-interpolation\r\n *\r\n * You can use pre-interpolation in expression attribute. For instance the following syntax\r\n * is ligit:\r\n *\r\n * ``` html\r\n *
    \r\n * ```\r\n *\r\n * In this case `idx` value is taken from scope and embedded into\r\n * conditions before parse them.\r\n *\r\n * This works as expected and is fine for the most cases, but it has a little caveat:\r\n *\r\n * The condition has to be re-parsed at each digest loop and has to walk scopes\r\n * in watchers.\r\n *\r\n * #### 2. uiScopeContext\r\n *\r\n * If you are concerned about performance issues using the first approach\r\n * `uiScopeContext` is a more verbose but also lightweight alternative\r\n * to accomplish the same.\r\n *\r\n * It allows to use current scope vars inside `ui-*` conditions, leaving\r\n * other scope vars (or the entire scope if not present) apart from the\r\n * condition evaluation process.\r\n *\r\n * Hopefully this will keep evaluation running against a flat and small data\r\n * structure instead of taking into account the whole scope.\r\n *\r\n * It is a list `scopeVar[ as aliasName] [, ...]` specifing one of more scope\r\n * variables to take into account when evaluating conditions. ie:\r\n *\r\n * ``` html\r\n * \r\n *
    \r\n *
    \r\n * \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * Be aware that scope vars will take precedence over sharedStates so,\r\n * in order to avoid name clashes you can use 'as' to refer to scope vars\r\n * with a different name in conditions:\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n * ```\r\n */\r\n var parseScopeContext = function(attr) {\r\n if (!attr || attr === '') {\r\n return [];\r\n }\r\n var vars = attr ? attr.trim().split(/ *, */) : [];\r\n var res = [];\r\n for (var i = 0; i < vars.length; i++) {\r\n var item = vars[i].split(/ *as */);\r\n if (item.length > 2 || item.length < 1) {\r\n throw new Error('Error parsing uiScopeContext=\"' + attr + '\"');\r\n }\r\n res.push(item);\r\n }\r\n return res;\r\n };\r\n\r\n var mixScopeContext = function(context, scopeVars, scope) {\r\n for (var i = 0; i < scopeVars.length; i++) {\r\n var key = scopeVars[i][0];\r\n var alias = scopeVars[i][1] || key;\r\n context[alias] = key.split('.').reduce(function(scope, nextKey) {\r\n return scope[nextKey];\r\n }, scope);\r\n }\r\n };\r\n\r\n var parseUiCondition = function(name, attrs, $scope, SharedState, $parse, $interpolate) {\r\n var expr = attrs[name];\r\n var needsInterpolation = expr.match(/\\{\\{/);\r\n var exprFn;\r\n\r\n if (needsInterpolation) {\r\n exprFn = function(context) {\r\n var interpolateFn = $interpolate(expr);\r\n var parseFn = $parse(interpolateFn($scope));\r\n return parseFn(context);\r\n };\r\n } else {\r\n exprFn = $parse(expr);\r\n }\r\n\r\n var uiScopeContext = parseScopeContext(attrs.uiScopeContext);\r\n return function() {\r\n var context;\r\n if (uiScopeContext.length) {\r\n context = angular.extend({}, SharedState.values());\r\n mixScopeContext(context, uiScopeContext, $scope);\r\n } else {\r\n context = SharedState.values();\r\n }\r\n return exprFn(context);\r\n };\r\n };\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiIf\r\n *\r\n * @description\r\n * Same as `ngIf` but evaluates condition against `SharedState` statuses too\r\n *\r\n * @param {expression} uiIf A condition to decide wether to attach the\r\n * element to the dom\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when\r\n * evaluating condition.\r\n */\r\n module.directive('uiIf', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\r\n function getBlockNodes(nodes) {\r\n var node = nodes[0];\r\n var endNode = nodes[nodes.length - 1];\r\n var blockNodes = [node];\r\n do {\r\n node = node.nextSibling;\r\n if (!node) {\r\n break;\r\n }\r\n blockNodes.push(node);\r\n } while (node !== endNode);\r\n\r\n return angular.element(blockNodes);\r\n }\r\n\r\n return {\r\n multiElement: true,\r\n transclude: 'element',\r\n priority: 600,\r\n terminal: true,\r\n restrict: 'A',\r\n $$tlb: true,\r\n link: function($scope, $element, $attr, ctrl, $transclude) {\r\n var block;\r\n var childScope;\r\n var previousElements;\r\n var uiIfFn = parseUiCondition('uiIf', $attr, $scope, SharedState, $parse, $interpolate);\r\n\r\n $scope.$watch(uiIfFn, function uiIfWatchAction(value) {\r\n if (value) {\r\n if (!childScope) {\r\n $transclude(function(clone, newScope) {\r\n childScope = newScope;\r\n clone[clone.length++] = document.createComment(' end uiIf: ' + $attr.uiIf + ' ');\r\n // Note: We only need the first/last node of the cloned nodes.\r\n // However, we need to keep the reference to the jqlite wrapper as it might be changed later\r\n // by a directive with templateUrl when its template arrives.\r\n block = {\r\n clone: clone\r\n };\r\n $animate.enter(clone, $element.parent(), $element);\r\n });\r\n }\r\n } else {\r\n if (previousElements) {\r\n previousElements.remove();\r\n previousElements = null;\r\n }\r\n if (childScope) {\r\n childScope.$destroy();\r\n childScope = null;\r\n }\r\n if (block) {\r\n previousElements = getBlockNodes(block.clone);\r\n var done = function() {\r\n previousElements = null;\r\n };\r\n var nga = $animate.leave(previousElements, done);\r\n if (nga) {\r\n nga.then(done);\r\n }\r\n block = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiHide\r\n *\r\n * @description\r\n * Same as `ngHide` but evaluates condition against `SharedState` statuses\r\n *\r\n * @param {expression} uiShow A condition to decide wether to hide the element\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating condition.\r\n */\r\n module.directive('uiHide', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\r\n var NG_HIDE_CLASS = 'ng-hide';\r\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\r\n\r\n return {\r\n restrict: 'A',\r\n multiElement: true,\r\n link: function(scope, element, attr) {\r\n var uiHideFn = parseUiCondition('uiHide', attr, scope, SharedState, $parse, $interpolate);\r\n scope.$watch(uiHideFn, function uiHideWatchAction(value) {\r\n $animate[value ? 'addClass' : 'removeClass'](element, NG_HIDE_CLASS, {\r\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\r\n });\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiShow\r\n *\r\n * @description\r\n * Same as `ngShow` but evaluates condition against `SharedState` statuses\r\n *\r\n * @param {expression} uiShow A condition to decide wether to show the element\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating condition.\r\n */\r\n module.directive('uiShow', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse) {\r\n var NG_HIDE_CLASS = 'ng-hide';\r\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\r\n\r\n return {\r\n restrict: 'A',\r\n multiElement: true,\r\n link: function(scope, element, attr) {\r\n var uiShowFn = parseUiCondition('uiShow', attr, scope, SharedState, $parse);\r\n scope.$watch(uiShowFn, function uiShowWatchAction(value) {\r\n $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\r\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\r\n });\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiClass\r\n *\r\n * @description\r\n * A simplified version of `ngClass` that evaluates in context of `SharedState`, it only suppors the `{'className': expr}` syntax.\r\n *\r\n * @param {expression} uiClass An expression that has to evaluate to an object\r\n * of the form `{'className': expr}`, where `expr` decides wether the class\r\n * should appear to element's class list.\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating\r\n * condition.\r\n */\r\n module.directive('uiClass', ['SharedState', '$parse', '$interpolate', function(SharedState, $parse) {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attr) {\r\n var uiClassFn = parseUiCondition('uiClass', attr, scope, SharedState, $parse);\r\n scope.$watch(uiClassFn, function uiClassWatchAction(value) {\r\n var classesToAdd = '';\r\n var classesToRemove = '';\r\n angular.forEach(value, function(expr, className) {\r\n if (expr) {\r\n classesToAdd += ' ' + className;\r\n } else {\r\n classesToRemove += ' ' + className;\r\n }\r\n classesToAdd = classesToAdd.trim();\r\n classesToRemove = classesToRemove.trim();\r\n if (classesToAdd.length) {\r\n element.addClass(classesToAdd);\r\n }\r\n if (classesToRemove.length) {\r\n element.removeClass(classesToRemove);\r\n }\r\n });\r\n }, true);\r\n }\r\n };\r\n }]);\r\n\r\n module.run([\r\n '$rootScope',\r\n 'SharedState',\r\n function($rootScope, SharedState) {\r\n $rootScope.Ui = SharedState;\r\n }\r\n ]);\r\n\r\n})();\r\n","/**\r\n * Provides directives and service to prevent touchmove default behaviour\r\n * for touch devices (ie. bounce on overscroll in IOS).\r\n *\r\n * #### Usage\r\n *\r\n * Use `ui-prevent-touchmove-defaults` directive on root element of your app:\r\n *\r\n * ``` html\r\n * \r\n * \r\n * \r\n * ```\r\n *\r\n * Doing so `touchmove.preventDefault` logic for inner elements is inverted,\r\n * so any `touchmove` default behaviour is automatically prevented.\r\n *\r\n * If you wish to allow the default behaviour, for example to allow\r\n * inner elements to scroll, you have to explicitly mark an event to allow\r\n * touchmove default.\r\n *\r\n * Mobile Angular UI already handles this for `scrollable` elements, so you don't have\r\n * to do anything in order to support scroll.\r\n *\r\n * If you wish to allow touchmove defaults for certain element under certain conditions\r\n * you can use the `allowTouchmoveDefault` service.\r\n *\r\n * ie.\r\n *\r\n * ``` js\r\n * // always allow touchmove default for an element\r\n * allowTouchmoveDefault(myelem);\r\n * ```\r\n *\r\n * ``` js\r\n * // allow touchmove default for an element only under certain conditions\r\n * allowTouchmoveDefault(myelem, function(touchmove){\r\n * return touchmove.pageY > 100;\r\n * });\r\n * ```\r\n *\r\n * @module mobile-angular-ui.core.touchmoveDefaults\r\n */\r\n(function() {\r\n 'use strict';\r\n var module = angular.module('mobile-angular-ui.core.touchmoveDefaults', []);\r\n\r\n module.directive('uiPreventTouchmoveDefaults', function() {\r\n var preventTouchmoveDefaultsCb = function(e) {\r\n // Get this flag from either the saved event if jQuery is being used, otherwise get it from the event itself.\r\n var allowTouchmoveEventFlag = e.originalEvent ? e.originalEvent.allowTouchmoveDefault : e.allowTouchmoveDefault;\r\n if (allowTouchmoveEventFlag !== true) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n return {\r\n compile: function(element) {\r\n if ('ontouchmove' in document) {\r\n element.on('touchmove', preventTouchmoveDefaultsCb);\r\n }\r\n }\r\n };\r\n });\r\n\r\n /**\r\n * Bind a listener to an element to allow `touchmove` default behaviour\r\n * when `touchmove` happens inside the bound element.\r\n *\r\n * You can also provide a function to decide when to allow and\r\n * when to prevent it.\r\n *\r\n * ``` js\r\n * // always allow touchmove default\r\n * allowTouchmoveDefault(myelem);\r\n *\r\n * // allow touchmove default only under certain conditions\r\n * allowTouchmoveDefault(myelem, function(touchmove){\r\n * return touchmove.pageY > 100;\r\n * });\r\n * ```\r\n *\r\n * @param {Element|$element} element The element to bind.\r\n * @param {function} condition A `function(touchmove)⟶boolean` to decide\r\n * whether to allow default behavior or not.\r\n *\r\n * @service allowTouchmoveDefault\r\n * @as function\r\n * @returns function Function to unbind the listener\r\n */\r\n\r\n module.factory('allowTouchmoveDefault', function() {\r\n var fnTrue = function() {\r\n return true;\r\n };\r\n\r\n if ('ontouchmove' in document) {\r\n return function($element, condition) {\r\n condition = condition || fnTrue;\r\n\r\n var allowTouchmoveDefaultCallback = function(e) {\r\n if (condition(e)) {\r\n e.allowTouchmoveDefault = true;\r\n // jQuery normalizes the event object, need to put this property on the copied originalEvent.\r\n if (e.originalEvent) {\r\n e.originalEvent.allowTouchmoveDefault = true;\r\n }\r\n }\r\n };\r\n\r\n $element = angular.element($element);\r\n $element.on('touchmove', allowTouchmoveDefaultCallback);\r\n\r\n $element.on('$destroy', function() {\r\n $element.off('touchmove', allowTouchmoveDefaultCallback);\r\n $element = null;\r\n });\r\n\r\n return function() {\r\n if ($element) {\r\n $element.off('touchmove', allowTouchmoveDefaultCallback);\r\n }\r\n };\r\n };\r\n }\r\n\r\n return angular.noop;\r\n });\r\n\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.core\r\n *\r\n * @description\r\n *\r\n * It has all the core functionalities of Mobile Angular UI. It aims to act as a common base\r\n * for an UI framework providing services and directives to create components and implement\r\n * UI interactions with angular.\r\n *\r\n *
    \r\n * NOTE\r\n *
      \r\n *
    • It has no dependency on Bootstrap.
    • \r\n *
    • It is not related to mobile apps only.
    • \r\n *
    • It is not requiring CSS support.
    • \r\n *
    • You can use it on any Angular Application and with any CSS framework.
    • \r\n *
    \r\n *
    \r\n *\r\n * ## Standalone Usage\r\n *\r\n * Although `.core` module is required by `mobile-angular-ui` by default you can use it alone.\r\n *\r\n * ``` js\r\n * angular.module('myApp', ['mobile-angular-ui.core']);\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n angular.module('mobile-angular-ui.core', [\r\n 'mobile-angular-ui.core.fastclick',\r\n 'mobile-angular-ui.core.activeLinks',\r\n 'mobile-angular-ui.core.capture',\r\n 'mobile-angular-ui.core.outerClick',\r\n 'mobile-angular-ui.core.sharedState',\r\n 'mobile-angular-ui.core.touchmoveDefaults'\r\n ]);\r\n})();\r\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/dist/js/mobile-angular-ui.gestures.min.js.map b/dist/js/mobile-angular-ui.gestures.min.js.map index f3c3485..9752c5f 100644 --- a/dist/js/mobile-angular-ui.gestures.min.js.map +++ b/dist/js/mobile-angular-ui.gestures.min.js.map @@ -1 +1 @@ -{"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 *

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

    \r\n * This module will not work with `ngTouch`\r\n * cause it is intended, among offering more features, to be a drop-in\r\n * replacement for it.\r\n *

    \r\n *

    \r\n * Be aware that `ngTouch` is still not playing well with `fastclick.js` and its usage with `mobile-angular-ui` is currently discouraged anyway.\r\n *

    \r\n *
    \r\n *\r\n * ## Usage\r\n *\r\n * `.gestures` module is not required by `mobile-angular-ui` module. It has no\r\n * dependency on other modules and is intended to be used alone with any other\r\n * angular framework.\r\n *\r\n * You have to include `mobile-angular-ui.gestures.min.js` to your project in order to use it. Ie.\r\n *\r\n * ``` html\r\n * \r\n * ```\r\n *\r\n * ``` js\r\n * angular.module('myApp', ['mobile-angular-ui.gestures']);\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.gestures', [\r\n 'mobile-angular-ui.gestures.drag',\r\n 'mobile-angular-ui.gestures.swipe',\r\n 'mobile-angular-ui.gestures.transform'\r\n ]);\r\n})();\r\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/dist/js/mobile-angular-ui.js b/dist/js/mobile-angular-ui.js index 9cef46a..75f676d 100644 --- a/dist/js/mobile-angular-ui.js +++ b/dist/js/mobile-angular-ui.js @@ -1173,7 +1173,11 @@ })(); -(function() { +if (typeof FastClick === 'undefined') { + throw new Error('mobile-angular-ui\'s JavaScript requires FastClick') +} + +(function(FastClick) { 'use strict'; var module = angular.module('mobile-angular-ui.core.fastclick', []); @@ -1214,7 +1218,7 @@ }; }); }); -})(); +})(FastClick); /** * diff --git a/dist/js/mobile-angular-ui.min.js b/dist/js/mobile-angular-ui.min.js index 443e094..394c33f 100644 --- a/dist/js/mobile-angular-ui.min.js +++ b/dist/js/mobile-angular-ui.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";function e(t,o){function r(e,t){return function(){return e.apply(t,arguments)}}var i;if(o=o||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=o.touchBoundary||10,this.layer=t,this.tapDelay=o.tapDelay||200,this.tapTimeout=o.tapTimeout||700,!e.notNeeded(t)){for(var a=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],c=this,u=0,l=a.length;l>u;u++)c[a[u]]=r(c[a[u]],c);n&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,o){var r=Node.prototype.removeEventListener;"click"===e?r.call(t,e,n.hijacked||n,o):r.call(t,e,n,o)},t.addEventListener=function(e,n,o){var r=Node.prototype.addEventListener;"click"===e?r.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),o):r.call(t,e,n,o)}),"function"==typeof t.onclick&&(i=t.onclick,t.addEventListener("click",function(e){i(e)},!1),t.onclick=null)}}var t=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!t,o=/iP(ad|hone|od)/.test(navigator.userAgent)&&!t,r=o&&/OS 4_\d(_\d)?/.test(navigator.userAgent),i=o&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(o&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,o;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),o=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return n&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;o&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,i;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],o){if(i=window.getSelection(),i.rangeCount&&!i.isCollapsed)return!0;if(!r){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,a,c,u,l,s=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,i&&(l=e.changedTouches[0],s=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),c=s.tagName.toLowerCase(),"label"===c){if(t=this.findControl(s)){if(this.focus(s),n)return!1;s=t}}else if(this.needsFocus(s))return e.timeStamp-a>100||o&&window.top!==window&&"input"===c?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,e),o&&"select"===c||(this.targetElement=null,e.preventDefault()),!1);return o&&!r&&(u=s.fastClickScrollParent,u&&u.fastClickLastScrollTop!==u.scrollTop)?!0:(this.needsClick(s)||(e.preventDefault(),this.sendClick(s,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;n&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,o,r,i;if("undefined"==typeof window.ontouchstart)return!0;if(o=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(o>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(i=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],i>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof module&&module.exports?(module.exports=e.attach,module.exports.FastClick=e):window.FastClick=e}(),function(){"use strict";angular.module("mobile-angular-ui.core.activeLinks",[]).provider("setupActiveLinks",["$locationProvider",function(e){this.$get=["$document","$location",function(t,n){return function(){for(var o=n.path(),r=t[0].links,i=0;i0;){if(n[0]===t[0])return n=null,!0;n=n.parent()}return n=null,!1}}).factory("bindOuterClick",["$document","$timeout","_mauiIsAncestorOrSelf",function(e,t,n){return function(o,r,i,a){var c=function(e){n(angular.element(e.target),r)||o.$apply(function(){i(o,{$event:e})})},u=angular.noop,l=null;a?u=o.$watch(a,function(n){t.cancel(l),n?l=t(function(){e.on("click tap",c)},0):e.unbind("click tap",c)}):(t.cancel(l),e.on("click tap",c)),o.$on("$destroy",function(){u(),e.unbind("click tap",c)})}}]).directive("uiOuterClick",["bindOuterClick","$parse",function(e,t){return{restrict:"A",compile:function(n,o){var r=t(o.uiOuterClick),i=o.uiOuterClickIf;return function(t,n){e(t,n,r,i)}}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.core.sharedState",[]);e.factory("SharedState",["$rootScope","$log",function(e,t){var n={},o={},r={},i={};return{initialize:function(t,a,c){c=c||{};var u=void 0===r[t],l=c.defaultValue,s=c.exclusionGroup;r[t.$id]=r[t.$id]||[],r[t.$id].push(a),o[a]?u&&o[a].references++:(o[a]=angular.extend({},c,{references:1}),e.$broadcast("mobile-angular-ui.state.initialized."+a,l),void 0!==l&&this.setOne(a,l),s&&(i[s]=i[s]||{},i[s][a]=!0)),t.$on("$destroy",function(){for(var c=r[t.$id]||[],u=0;u2||r.length<1)throw new Error('Error parsing uiScopeContext="'+e+'"');n.push(r)}return n},o=function(e,t,n){for(var o=0;o800||function(){var t=e.navigator.userAgent,n=t.match(/AppleWebKit\/([0-9]+)/),o=n&&n[1],r=n&&o>=534;return t.match(/Android ([0-9]+)/)&&RegExp.$1>=3&&r||t.match(/ Version\/([0-9]+)/)&&RegExp.$1>=0&&e.blackberry&&r||t.indexOf("PlayBook")>-1&&r&&-1===!t.indexOf("Android 2")||t.match(/Firefox\/([0-9]+)/)&&RegExp.$1>=4||t.match(/wOSBrowser\/([0-9]+)/)&&RegExp.$1>=233&&r||t.match(/NokiaBrowser\/([0-9\.]+)/)&&7.3===parseFloat(RegExp.$1)&&n&&o>=533}();e.overthrow={},e.overthrow.enabledClassName=r,e.overthrow.addClass=function(){-1===o.className.indexOf(e.overthrow.enabledClassName)&&(o.className+=" "+e.overthrow.enabledClassName)},e.overthrow.removeClass=function(){o.className=o.className.replace(e.overthrow.enabledClassName,"")},e.overthrow.set=function(){a&&e.overthrow.addClass()},e.overthrow.canBeFilledWithPoly=i,e.overthrow.forget=function(){e.overthrow.removeClass()},e.overthrow.support=a?"native":"none"}(this),function(e,t){e.overthrow.set()}(this),function(e,t,n){if(t!==n){t.scrollIndicatorClassName="overthrow";var o=e.document,r=o.documentElement,i="native"===t.support,a=t.canBeFilledWithPoly,c=(t.configure,t.set),u=t.forget,l=t.scrollIndicatorClassName;t.closest=function(e,n){return!n&&e.className&&e.className.indexOf(l)>-1&&e||t.closest(e.parentNode)};var s=!1;t.set=function(){if(c(),!s&&!i&&a){e.overthrow.addClass(),s=!0,t.support="polyfilled",t.forget=function(){u(),s=!1,o.removeEventListener&&o.removeEventListener("touchstart",E,!1)};var l,d,f,h,v=[],m=[],p=function(){v=[],d=null},g=function(){m=[],f=null},C=function(e){h=l.querySelectorAll("textarea, input");for(var t=0,n=h.length;n>t;t++)h[t].style.pointerEvents=e},k=function(e,t){if(o.createEvent){var r,i=(!t||t===n)&&l.parentNode||l.touchchild||l;i!==l&&(r=o.createEvent("HTMLEvents"),r.initEvent("touchend",!0,!0),l.dispatchEvent(r),i.touchchild=l,l=i,i.dispatchEvent(e))}},E=function(e){if(t.intercept&&t.intercept(),p(),g(),l=t.closest(e.target),l&&l!==r&&!(e.touches.length>1)){C("none");var n=e,o=l.scrollTop,i=l.scrollLeft,a=l.offsetHeight,c=l.offsetWidth,u=e.touches[0].pageY,s=e.touches[0].pageX,h=l.scrollHeight,E=l.scrollWidth,b=function(e){var t=o+u-e.touches[0].pageY,r=i+s-e.touches[0].pageX,C=t>=(v.length?v[0]:0),b=r>=(m.length?m[0]:0);t>0&&h-a>t||r>0&&E-c>r?e.preventDefault():k(n),d&&C!==d&&p(),f&&b!==f&&g(),d=C,f=b,l.scrollTop=t,l.scrollLeft=r,v.unshift(t),m.unshift(r),v.length>3&&v.pop(),m.length>3&&m.pop()},y=function(e){C("auto"),setTimeout(function(){C("none")},450),l.removeEventListener("touchmove",b,!1),l.removeEventListener("touchend",y,!1)};l.addEventListener("touchmove",b,!1),l.addEventListener("touchend",y,!1)}};o.addEventListener("touchstart",E,!1)}}}}(this,this.overthrow),function(){"use strict";angular.module("mobile-angular-ui.components.modals",[]).directive("modal",["$rootElement",function(e){return{restrict:"C",link:function(t,n){e.addClass("has-modal"),n.on("$destroy",function(){e.removeClass("has-modal")}),t.$on("$destroy",function(){e.removeClass("has-modal")}),n.hasClass("modal-overlay")&&(e.addClass("has-modal-overlay"),n.on("$destroy",function(){e.removeClass("has-modal-overlay")}),t.$on("$destroy",function(){e.removeClass("has-modal-overlay")}))}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.navbars",[]);angular.forEach(["top","bottom"],function(t){var n="navbarAbsolute"+t.charAt(0).toUpperCase()+t.slice(1);e.directive(n,["$rootElement",function(e){return{restrict:"C",link:function(n){e.addClass("has-navbar-"+t),n.$on("$destroy",function(){e.removeClass("has-navbar-"+t)})}}}])})}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.scrollable",["mobile-angular-ui.core.touchmoveDefaults"]),t=function(e){var t=e.touches&&e.touches.length?e.touches:[e],n=e.changedTouches&&e.changedTouches[0]||e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]||t[0].originalEvent||t[0];return n.clientY};e.directive("scrollableContent",function(){return{restrict:"C",controller:["$element","$document","allowTouchmoveDefault",function(e,n,o){var r=e[0],i=e.parent()[0];if("ontouchmove"in n[0]){var a,c,u,l=function(e){a=r.scrollTop>0,c=r.scrollTopu,r=!o;return u=n,o&&a||r&&c})}this.scrollableContent=r,this.scrollTo=function(e,t){if(t=t||0,angular.isNumber(e))r.scrollTop=e-t;else{var n=angular.element(e)[0];n.offsetParent&&n.offsetParent!==i?this.scrollTo(n.offsetParent,t-n.offsetTop):r.scrollTop=n.offsetTop-t}}}],link:function(e,t){"native"!==overthrow.support&&(t.addClass("overthrow"),overthrow.forget(),overthrow.set())}}}),angular.forEach(["input","textarea"],function(t){e.directive(t,["$rootScope","$timeout",function(e,t){return{require:"?^^scrollableContent",link:function(e,n,o,r){n.on("focus",function(){if(r&&r.scrollableContent){var e=r.scrollableContent.offsetHeight;t(function(){var t=r.scrollableContent.offsetHeight;if(e>t){var o=10,i=r.scrollableContent.parentElement.querySelector(".scrollable-header");i&&(o=i.getBoundingClientRect().bottom-i.getBoundingClientRect().top+o),r.scrollTo(n,o)}},500)}})}}}])}),angular.forEach({uiScrollTop:function(e){return 0===e.scrollTop},uiScrollBottom:function(e){return e.scrollHeight===e.scrollTop+e.clientHeight}},function(t,n){e.directive(n,[function(){return{restrict:"A",link:function(e,o,r){o.on("scroll",function(){t(o[0])&&e.$apply(function(){e.$eval(r[n])})})}}}])}),angular.forEach({Top:"scrollableHeader",Bottom:"scrollableFooter"},function(t,n){e.directive(t,["$window",function(e){return{restrict:"C",link:function(t,o){var r=o[0],i=o.parent()[0].style,a=function(){var t=e.getComputedStyle(r),o=parseInt(t.marginTop,10)+parseInt(t.marginBottom,10);i["padding"+n]=r.offsetHeight+o+"px"},c=setInterval(a,30);o.on("$destroy",function(){i["padding"+n]=null,clearInterval(c),c=a=o=null})}}}])})}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.sidebars",["mobile-angular-ui.core.sharedState","mobile-angular-ui.core.outerClick"]);angular.forEach(["left","right"],function(t){var n="sidebar"+t.charAt(0).toUpperCase()+t.slice(1),o="ui"+n.charAt(0).toUpperCase()+n.slice(1);e.directive(n,["$rootElement","SharedState","bindOuterClick","$location",function(e,n,r,i){return{restrict:"C",link:function(a,c,u){var l="has-sidebar-"+t,s="sidebar-"+t+"-visible",d="sidebar-"+t+"-in",f=u.id?u.id:o,h=""===u.uiTrackAsSearchParam||u.uiTrackAsSearchParam,v=function(){n.turnOff(f)},m=function(){return n.isActive(f)};e.addClass(l),a.$on("$destroy",function(){e.removeClass(l),e.removeClass(s),e.removeClass(d)});var p=void 0!==u.active&&"false"!==u.active;n.initialize(a,f,{defaultValue:p}),a.$on("mobile-angular-ui.state.changed."+f,function(t,n){h&&i.search(f,n||null),n?(e.addClass(s),e.addClass(d)):e.removeClass(d)}),a.$on("$routeChangeSuccess",function(){n.turnOff(f)}),a.$on("$routeUpdate",function(){h&&(i.search()[f]?n.turnOn(f):n.turnOff(f))}),a.$on("mobile-angular-ui.app.transitionend",function(){n.isActive(f)||e.removeClass(s)}),"false"!==u.closeOnOuterClicks&&r(a,c,v,m)}}}])}),e.directive("app",["$rootScope",function(e){return{restrict:"C",link:function(t,n){n.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend",function(){e.$broadcast("mobile-angular-ui.app.transitionend")})}}}])}(),function(){"use strict";angular.module("mobile-angular-ui.components.switch",[]).directive("uiSwitch",["$injector",function(e){var t=e.has("$drag")&&e.get("$drag");return{restrict:"EA",scope:{model:"=ngModel",changeExpr:"@ngChange"},link:function(e,n,o){n.addClass("switch");var r=o.disabled||n.attr("disabled"),i=e.$watch(function(){return o.disabled||n.attr("disabled")},function(e){r=!(!e||"false"===e||"0"===e)}),a=angular.element('
    ');n.append(a),e.model&&n.addClass("active"),n.addClass("switch-transition-enabled");var c=e.$watch("model",function(e){e?n.addClass("active"):n.removeClass("active")}),u=function(t){r||t===e.model||(e.model=t,e.$apply(),null!==e.changeExpr&&void 0!==e.changeExpr&&e.$parent.$eval(e.changeExpr))},l=function(){u(!e.model)};n.on("click tap",l);var s=angular.noop;t&&(s=t.bind(a,{transform:t.TRANSLATE_INSIDE(n),start:function(){n.off("click tap",l)},cancel:function(){a.removeAttr("style"),n.off("click tap",l),n.on("click tap",l)},end:function(){var e=a[0].getBoundingClientRect(),t=n[0].getBoundingClientRect();e.left-t.leftu;u++)c[a[u]]=r(c[a[u]],c);n&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,o){var r=Node.prototype.removeEventListener;"click"===e?r.call(t,e,n.hijacked||n,o):r.call(t,e,n,o)},t.addEventListener=function(e,n,o){var r=Node.prototype.addEventListener;"click"===e?r.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),o):r.call(t,e,n,o)}),"function"==typeof t.onclick&&(i=t.onclick,t.addEventListener("click",function(e){i(e)},!1),t.onclick=null)}}var t=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!t,o=/iP(ad|hone|od)/.test(navigator.userAgent)&&!t,r=o&&/OS 4_\d(_\d)?/.test(navigator.userAgent),i=o&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(o&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,o;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),o=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return n&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;o&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,i;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],o){if(i=window.getSelection(),i.rangeCount&&!i.isCollapsed)return!0;if(!r){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,a,c,u,l,s=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,i&&(l=e.changedTouches[0],s=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),c=s.tagName.toLowerCase(),"label"===c){if(t=this.findControl(s)){if(this.focus(s),n)return!1;s=t}}else if(this.needsFocus(s))return e.timeStamp-a>100||o&&window.top!==window&&"input"===c?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,e),o&&"select"===c||(this.targetElement=null,e.preventDefault()),!1);return o&&!r&&(u=s.fastClickScrollParent,u&&u.fastClickLastScrollTop!==u.scrollTop)?!0:(this.needsClick(s)||(e.preventDefault(),this.sendClick(s,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;n&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,o,r,i;if("undefined"==typeof window.ontouchstart)return!0;if(o=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(o>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(i=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],i>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof module&&module.exports?(module.exports=e.attach,module.exports.FastClick=e):window.FastClick=e}(),function(){"use strict";angular.module("mobile-angular-ui.core.activeLinks",[]).provider("setupActiveLinks",["$locationProvider",function(e){this.$get=["$document","$location",function(t,n){return function(){for(var o=n.path(),r=t[0].links,i=0;i0;){if(n[0]===t[0])return n=null,!0;n=n.parent()}return n=null,!1}}).factory("bindOuterClick",["$document","$timeout","_mauiIsAncestorOrSelf",function(e,t,n){return function(o,r,i,a){var c=function(e){n(angular.element(e.target),r)||o.$apply(function(){i(o,{$event:e})})},u=angular.noop,l=null;a?u=o.$watch(a,function(n){t.cancel(l),n?l=t(function(){e.on("click tap",c)},0):e.unbind("click tap",c)}):(t.cancel(l),e.on("click tap",c)),o.$on("$destroy",function(){u(),e.unbind("click tap",c)})}}]).directive("uiOuterClick",["bindOuterClick","$parse",function(e,t){return{restrict:"A",compile:function(n,o){var r=t(o.uiOuterClick),i=o.uiOuterClickIf;return function(t,n){e(t,n,r,i)}}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.core.sharedState",[]);e.factory("SharedState",["$rootScope","$log",function(e,t){var n={},o={},r={},i={};return{initialize:function(t,a,c){c=c||{};var u=void 0===r[t],l=c.defaultValue,s=c.exclusionGroup;r[t.$id]=r[t.$id]||[],r[t.$id].push(a),o[a]?u&&o[a].references++:(o[a]=angular.extend({},c,{references:1}),e.$broadcast("mobile-angular-ui.state.initialized."+a,l),void 0!==l&&this.setOne(a,l),s&&(i[s]=i[s]||{},i[s][a]=!0)),t.$on("$destroy",function(){for(var c=r[t.$id]||[],u=0;u2||r.length<1)throw new Error('Error parsing uiScopeContext="'+e+'"');n.push(r)}return n},o=function(e,t,n){for(var o=0;o800||function(){var t=e.navigator.userAgent,n=t.match(/AppleWebKit\/([0-9]+)/),o=n&&n[1],r=n&&o>=534;return t.match(/Android ([0-9]+)/)&&RegExp.$1>=3&&r||t.match(/ Version\/([0-9]+)/)&&RegExp.$1>=0&&e.blackberry&&r||t.indexOf("PlayBook")>-1&&r&&-1===!t.indexOf("Android 2")||t.match(/Firefox\/([0-9]+)/)&&RegExp.$1>=4||t.match(/wOSBrowser\/([0-9]+)/)&&RegExp.$1>=233&&r||t.match(/NokiaBrowser\/([0-9\.]+)/)&&7.3===parseFloat(RegExp.$1)&&n&&o>=533}();e.overthrow={},e.overthrow.enabledClassName=r,e.overthrow.addClass=function(){-1===o.className.indexOf(e.overthrow.enabledClassName)&&(o.className+=" "+e.overthrow.enabledClassName)},e.overthrow.removeClass=function(){o.className=o.className.replace(e.overthrow.enabledClassName,"")},e.overthrow.set=function(){a&&e.overthrow.addClass()},e.overthrow.canBeFilledWithPoly=i,e.overthrow.forget=function(){e.overthrow.removeClass()},e.overthrow.support=a?"native":"none"}(this),function(e,t){e.overthrow.set()}(this),function(e,t,n){if(t!==n){t.scrollIndicatorClassName="overthrow";var o=e.document,r=o.documentElement,i="native"===t.support,a=t.canBeFilledWithPoly,c=(t.configure,t.set),u=t.forget,l=t.scrollIndicatorClassName;t.closest=function(e,n){return!n&&e.className&&e.className.indexOf(l)>-1&&e||t.closest(e.parentNode)};var s=!1;t.set=function(){if(c(),!s&&!i&&a){e.overthrow.addClass(),s=!0,t.support="polyfilled",t.forget=function(){u(),s=!1,o.removeEventListener&&o.removeEventListener("touchstart",E,!1)};var l,d,f,h,v=[],m=[],p=function(){v=[],d=null},g=function(){m=[],f=null},C=function(e){h=l.querySelectorAll("textarea, input");for(var t=0,n=h.length;n>t;t++)h[t].style.pointerEvents=e},k=function(e,t){if(o.createEvent){var r,i=(!t||t===n)&&l.parentNode||l.touchchild||l;i!==l&&(r=o.createEvent("HTMLEvents"),r.initEvent("touchend",!0,!0),l.dispatchEvent(r),i.touchchild=l,l=i,i.dispatchEvent(e))}},E=function(e){if(t.intercept&&t.intercept(),p(),g(),l=t.closest(e.target),l&&l!==r&&!(e.touches.length>1)){C("none");var n=e,o=l.scrollTop,i=l.scrollLeft,a=l.offsetHeight,c=l.offsetWidth,u=e.touches[0].pageY,s=e.touches[0].pageX,h=l.scrollHeight,E=l.scrollWidth,b=function(e){var t=o+u-e.touches[0].pageY,r=i+s-e.touches[0].pageX,C=t>=(v.length?v[0]:0),b=r>=(m.length?m[0]:0);t>0&&h-a>t||r>0&&E-c>r?e.preventDefault():k(n),d&&C!==d&&p(),f&&b!==f&&g(),d=C,f=b,l.scrollTop=t,l.scrollLeft=r,v.unshift(t),m.unshift(r),v.length>3&&v.pop(),m.length>3&&m.pop()},y=function(e){C("auto"),setTimeout(function(){C("none")},450),l.removeEventListener("touchmove",b,!1),l.removeEventListener("touchend",y,!1)};l.addEventListener("touchmove",b,!1),l.addEventListener("touchend",y,!1)}};o.addEventListener("touchstart",E,!1)}}}}(this,this.overthrow),function(){"use strict";angular.module("mobile-angular-ui.components.modals",[]).directive("modal",["$rootElement",function(e){return{restrict:"C",link:function(t,n){e.addClass("has-modal"),n.on("$destroy",function(){e.removeClass("has-modal")}),t.$on("$destroy",function(){e.removeClass("has-modal")}),n.hasClass("modal-overlay")&&(e.addClass("has-modal-overlay"),n.on("$destroy",function(){e.removeClass("has-modal-overlay")}),t.$on("$destroy",function(){e.removeClass("has-modal-overlay")}))}}}])}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.navbars",[]);angular.forEach(["top","bottom"],function(t){var n="navbarAbsolute"+t.charAt(0).toUpperCase()+t.slice(1);e.directive(n,["$rootElement",function(e){return{restrict:"C",link:function(n){e.addClass("has-navbar-"+t),n.$on("$destroy",function(){e.removeClass("has-navbar-"+t)})}}}])})}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.scrollable",["mobile-angular-ui.core.touchmoveDefaults"]),t=function(e){var t=e.touches&&e.touches.length?e.touches:[e],n=e.changedTouches&&e.changedTouches[0]||e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]||t[0].originalEvent||t[0];return n.clientY};e.directive("scrollableContent",function(){return{restrict:"C",controller:["$element","$document","allowTouchmoveDefault",function(e,n,o){var r=e[0],i=e.parent()[0];if("ontouchmove"in n[0]){var a,c,u,l=function(e){a=r.scrollTop>0,c=r.scrollTopu,r=!o;return u=n,o&&a||r&&c})}this.scrollableContent=r,this.scrollTo=function(e,t){if(t=t||0,angular.isNumber(e))r.scrollTop=e-t;else{var n=angular.element(e)[0];n.offsetParent&&n.offsetParent!==i?this.scrollTo(n.offsetParent,t-n.offsetTop):r.scrollTop=n.offsetTop-t}}}],link:function(e,t){"native"!==overthrow.support&&(t.addClass("overthrow"),overthrow.forget(),overthrow.set())}}}),angular.forEach(["input","textarea"],function(t){e.directive(t,["$rootScope","$timeout",function(e,t){return{require:"?^^scrollableContent",link:function(e,n,o,r){n.on("focus",function(){if(r&&r.scrollableContent){var e=r.scrollableContent.offsetHeight;t(function(){var t=r.scrollableContent.offsetHeight;if(e>t){var o=10,i=r.scrollableContent.parentElement.querySelector(".scrollable-header");i&&(o=i.getBoundingClientRect().bottom-i.getBoundingClientRect().top+o),r.scrollTo(n,o)}},500)}})}}}])}),angular.forEach({uiScrollTop:function(e){return 0===e.scrollTop},uiScrollBottom:function(e){return e.scrollHeight===e.scrollTop+e.clientHeight}},function(t,n){e.directive(n,[function(){return{restrict:"A",link:function(e,o,r){o.on("scroll",function(){t(o[0])&&e.$apply(function(){e.$eval(r[n])})})}}}])}),angular.forEach({Top:"scrollableHeader",Bottom:"scrollableFooter"},function(t,n){e.directive(t,["$window",function(e){return{restrict:"C",link:function(t,o){var r=o[0],i=o.parent()[0].style,a=function(){var t=e.getComputedStyle(r),o=parseInt(t.marginTop,10)+parseInt(t.marginBottom,10);i["padding"+n]=r.offsetHeight+o+"px"},c=setInterval(a,30);o.on("$destroy",function(){i["padding"+n]=null,clearInterval(c),c=a=o=null})}}}])})}(),function(){"use strict";var e=angular.module("mobile-angular-ui.components.sidebars",["mobile-angular-ui.core.sharedState","mobile-angular-ui.core.outerClick"]);angular.forEach(["left","right"],function(t){var n="sidebar"+t.charAt(0).toUpperCase()+t.slice(1),o="ui"+n.charAt(0).toUpperCase()+n.slice(1);e.directive(n,["$rootElement","SharedState","bindOuterClick","$location",function(e,n,r,i){return{restrict:"C",link:function(a,c,u){var l="has-sidebar-"+t,s="sidebar-"+t+"-visible",d="sidebar-"+t+"-in",f=u.id?u.id:o,h=""===u.uiTrackAsSearchParam||u.uiTrackAsSearchParam,v=function(){n.turnOff(f)},m=function(){return n.isActive(f)};e.addClass(l),a.$on("$destroy",function(){e.removeClass(l),e.removeClass(s),e.removeClass(d)});var p=void 0!==u.active&&"false"!==u.active;n.initialize(a,f,{defaultValue:p}),a.$on("mobile-angular-ui.state.changed."+f,function(t,n){h&&i.search(f,n||null),n?(e.addClass(s),e.addClass(d)):e.removeClass(d)}),a.$on("$routeChangeSuccess",function(){n.turnOff(f)}),a.$on("$routeUpdate",function(){h&&(i.search()[f]?n.turnOn(f):n.turnOff(f))}),a.$on("mobile-angular-ui.app.transitionend",function(){n.isActive(f)||e.removeClass(s)}),"false"!==u.closeOnOuterClicks&&r(a,c,v,m)}}}])}),e.directive("app",["$rootScope",function(e){return{restrict:"C",link:function(t,n){n.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend",function(){e.$broadcast("mobile-angular-ui.app.transitionend")})}}}])}(),function(){"use strict";angular.module("mobile-angular-ui.components.switch",[]).directive("uiSwitch",["$injector",function(e){var t=e.has("$drag")&&e.get("$drag");return{restrict:"EA",scope:{model:"=ngModel",changeExpr:"@ngChange"},link:function(e,n,o){n.addClass("switch");var r=o.disabled||n.attr("disabled"),i=e.$watch(function(){return o.disabled||n.attr("disabled")},function(e){r=!(!e||"false"===e||"0"===e)}),a=angular.element('
    ');n.append(a),e.model&&n.addClass("active"),n.addClass("switch-transition-enabled");var c=e.$watch("model",function(e){e?n.addClass("active"):n.removeClass("active")}),u=function(t){r||t===e.model||(e.model=t,e.$apply(),null!==e.changeExpr&&void 0!==e.changeExpr&&e.$parent.$eval(e.changeExpr))},l=function(){u(!e.model)};n.on("click tap",l);var s=angular.noop;t&&(s=t.bind(a,{transform:t.TRANSLATE_INSIDE(n),start:function(){n.off("click tap",l)},cancel:function(){a.removeAttr("style"),n.off("click tap",l),n.on("click tap",l)},end:function(){var e=a[0].getBoundingClientRect(),t=n[0].getBoundingClientRect();e.left-t.left\n *\n *
    \n *
    \n * Default Title\n *
    \n *
    \n *\n *
    \n * \n *
    \n * ```\n *\n * Use `ui-content-for` inside any view to populate the `ui-yield-to` content.\n *\n * ``` html\n * \n *\n *
    \n * My View Title\n *
    \n * ```\n *\n * Since the original scope is preserved you can use directives inside\n * `ui-content-for` blocks to interact with the current scope. In the following\n * example we will add a navbar button to submit a form inside a nested view.\n *\n * ``` html\n * \n *\n *
    \n *
    \n *
    \n *
    \n *\n *
    \n * \n *
    \n * ```\n *\n * ``` html\n * \n *\n *
    \n *\n *
    \n * \n *
    \n *\n *
    \n * \n *
    \n *\n *
    \n * ```\n *\n * ``` javascript\n * app.controller('newCustomerController', function($scope, Store){\n * $scope.customer = {};\n * $scope.createCustomer = function(){\n * Store.create($scope.customer);\n * // ...\n * }\n * });\n * ```\n *\n * If you wish you can also duplicate markup instead of move it. Just add `duplicate` parameter to `uiContentFor` directive to specify this behaviour.\n *\n * ``` html\n *
    \n * \n *
    \n * ```\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.core.capture', [])\n\n .run([\n 'Capture',\n '$rootScope',\n function(Capture, $rootScope) {\n $rootScope.$on('$routeChangeSuccess', function() {\n Capture.resetAll();\n });\n }\n ])\n\n .factory('Capture', [\n '$compile',\n function($compile) {\n var yielders = {};\n\n return {\n yielders: yielders,\n\n resetAll: function() {\n for (var name in yielders) {\n if (yielders.hasOwnProperty(name)) {\n this.resetYielder(name);\n }\n }\n },\n\n resetYielder: function(name) {\n var b = yielders[name];\n this.setContentFor(name, b.defaultContent, b.defaultScope);\n },\n\n putYielder: function(name, element, defaultScope, defaultContent) {\n var yielder = {};\n yielder.name = name;\n yielder.element = element;\n yielder.defaultContent = defaultContent || '';\n yielder.defaultScope = defaultScope;\n yielders[name] = yielder;\n },\n\n getYielder: function(name) {\n return yielders[name];\n },\n\n removeYielder: function(name) {\n delete yielders[name];\n },\n\n setContentFor: function(name, content, scope) {\n var b = yielders[name];\n if (!b) {\n return;\n }\n b.element.html(content);\n $compile(b.element.contents())(scope);\n }\n\n };\n }\n ])\n\n /**\n * @directive uiContentFor\n * @restrict A\n * @description\n *\n * `ui-content-for` makes inner contents to replace the corresponding\n * `ui-yield-to` placeholder contents.\n *\n * `uiContentFor` is intended to be used inside a view in order to populate outer placeholders.\n * Any content you send to placeholders via `ui-content-for` is\n * reverted to placeholder defaults after view changes (ie. on `$routeChangeStart`).\n *\n * @param {string} uiContentFor The id of the placeholder to be replaced\n * @param {boolean} uiDuplicate If present duplicates the content instead of moving it (default to `false`)\n *\n */\n .directive('uiContentFor', [\n 'Capture',\n function(Capture) {\n return {\n compile: function(tElem, tAttrs) {\n var rawContent = tElem.html();\n if (tAttrs.uiDuplicate === null || tAttrs.uiDuplicate === undefined) {\n // no need to compile anything!\n tElem.html('');\n tElem.remove();\n }\n return function(scope, elem, attrs) {\n Capture.setContentFor(attrs.uiContentFor, rawContent, scope);\n };\n }\n };\n }\n ])\n\n /**\n * @directive uiYieldTo\n * @restrict A\n * @description\n *\n * `ui-yield-to` defines a placeholder which contents will be further replaced by `ui-content-for` directive.\n *\n * Inner html is considered to be a default. Default is restored any time `$routeChangeStart` happens.\n *\n * @param {string} uiYieldTo The unique id of this placeholder.\n *\n */\n .directive('uiYieldTo', [\n '$compile', 'Capture', function($compile, Capture) {\n return {\n link: function(scope, element, attr) {\n Capture.putYielder(attr.uiYieldTo, element, scope, element.html());\n\n element.on('$destroy', function() {\n Capture.removeYielder(attr.uiYieldTo);\n });\n\n scope.$on('$destroy', function() {\n Capture.removeYielder(attr.uiYieldTo);\n });\n }\n };\n }\n ]);\n\n})();\n","/**\n *\n * @module mobile-angular-ui.core.outerClick\n * @description\n *\n * Provides a directive to specifiy a behaviour when click/tap events\n * happen outside an element. This can be easily used\n * to implement eg. __close on outer click__ feature for a dropdown.\n *\n * ## Usage\n *\n * Declare it as a dependency to your app unless you have already\n * included some of its super-modules.\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui']);\n * ```\n *\n * Or\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core']);\n * ```\n *\n * Or\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core.outerClick']);\n * ```\n *\n * Use `ui-outer-click` to define an expression to evaluate when an _Outer Click_ event happens.\n * Use `ui-outer-click-if` parameter to define a condition to enable/disable the listener.\n *\n * ``` html\n *
    \n * \n * \n * \n * \n *\n *
  • Action
  • \n *
  • Another action
  • \n *
  • Something else here
  • \n *
  • \n *
  • Separated link
  • \n * \n *
    \n * ```\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.core.outerClick', [])\n\n .factory('_mauiIsAncestorOrSelf', function() {\n return function(element, target) {\n var parent = element;\n while (parent.length > 0) {\n if (parent[0] === target[0]) {\n parent = null;\n return true;\n }\n parent = parent.parent();\n }\n parent = null;\n return false;\n };\n })\n\n /**\n * @service bindOuterClick\n * @as function\n *\n * @description\n * This is a service function that binds a callback to be conditionally executed\n * when a click event happens outside a specified element.\n *\n * Ie.\n *\n * ``` js\n * app.directive('myDirective', function('bindOuterClick'){\n * return {\n * link: function(scope, element) {\n * bindOuterClick(element, function(scope, extra){\n * alert('You clicked ouside me!');\n * }, function(e){\n * return element.hasClass('disabled') ? true : false;\n * });\n * }\n * };\n * });\n * ```\n * @scope {scope} the scope to eval callbacks\n * @param {DomElement|$element} element The element to bind to.\n * @param {function} callback A `function(scope, options)`, usually the result of `$parse`, that is called when an _outer click_ event happens.\n * @param {string|function} condition Angular `$watch` expression to decide whether to run `callback` or not.\n */\n .factory('bindOuterClick', [\n '$document',\n '$timeout',\n '_mauiIsAncestorOrSelf',\n function($document, $timeout, isAncestorOrSelf) {\n\n return function(scope, element, outerClickFn, outerClickIf) {\n var handleOuterClick = function(event) {\n if (!isAncestorOrSelf(angular.element(event.target), element)) {\n scope.$apply(function() {\n outerClickFn(scope, {$event: event});\n });\n }\n };\n\n var stopWatching = angular.noop;\n var t = null;\n\n if (outerClickIf) {\n stopWatching = scope.$watch(outerClickIf, function(value) {\n $timeout.cancel(t);\n\n if (value) {\n // prevents race conditions\n // activating with other click events\n t = $timeout(function() {\n $document.on('click tap', handleOuterClick);\n }, 0);\n\n } else {\n $document.unbind('click tap', handleOuterClick);\n }\n });\n } else {\n $timeout.cancel(t);\n $document.on('click tap', handleOuterClick);\n }\n\n scope.$on('$destroy', function() {\n stopWatching();\n $document.unbind('click tap', handleOuterClick);\n });\n };\n }\n ])\n\n /**\n * @directive outerClick\n *\n * @description\n * Evaluates an expression when an _Outer Click_ event happens.\n *\n * @param {expression} uiOuterClick Expression to evaluate when an _Outer Click_ event happens.\n * @param {expression} uiOuterClickIf Condition to enable/disable the listener. Defaults to `true`.\n */\n .directive('uiOuterClick', [\n 'bindOuterClick',\n '$parse',\n function(bindOuterClick, $parse) {\n return {\n restrict: 'A',\n compile: function(elem, attrs) {\n var outerClickFn = $parse(attrs.uiOuterClick);\n var outerClickIf = attrs.uiOuterClickIf;\n return function(scope, elem) {\n bindOuterClick(scope, elem, outerClickFn, outerClickIf);\n };\n }\n };\n }\n ]);\n})();\n","(function() {\n 'use strict';\n /**\n * @module mobile-angular-ui.core.sharedState\n *\n * @description\n * `mobile-angular-ui.core.sharedState` is expose the homonymous service\n * `SharedState` and a group of directives to access it.\n *\n * `SharedState` allows to use elementary angular or angularish directives\n * to create interactive components.\n *\n * Ie.\n *\n * ``` html\n *
    \n * Tab1\n * Tab2\n * Tab3\n *
    \n *
    \n *
    Tab1
    \n *
    Tab2
    \n *
    Tab3
    \n *
    \n * ```\n *\n * Using `SharedState` you will be able to:\n *\n * - Create interactive components without having to write javascript code\n * - Have your controller free from UI logic\n * - Separe `ng-click` triggering application logic from those having a visual effect only\n * - Export state of components to urls\n * - Easily make components comunicate each other\n *\n * Also note that:\n *\n * Data structures retaining statuses will stay outside angular scopes\n * thus they are not evaluated against digest cycle until its necessary.\n * Also although statuses are sort of global variables `SharedState` will\n * take care of disposing them when no scopes are requiring them anymore.\n *\n * A set of `ui-*` directives are available to interact with `SharedState`\n * module and will hopefully var you spare your controllers and your time\n * for something that is more meaningful than this:\n *\n * ``` js\n * $scope.activeTab = 1;\n *\n * $scope.setActiveTab = function(n) {\n * $scope.activeTab = n;\n * };\n * ```\n *\n * ## Usage\n *\n * Declare it as a dependency to your app unless you have already included some\n * of its super-modules.\n *\n * ```\n * angular.module('myApp', ['mobile-angular-ui.core.sharedState']);\n * ```\n *\n * Use `ui-shared-state` directive to require/initialize a state from the target element scope\n *\n * **Example.** Tabs\n *\n * \n *\n * **Example.** Custom components\n *\n * \n *\n * NOTE: `ui-toggle/set/turnOn/turnOff` responds to `click/tap` without\n * stopping propagation so you can use them along with ng-click too.\n * You can also change events to respond to with `ui-triggers` attribute.\n *\n * Any `SharedState` method is exposed through `Ui` object in `$rootScope`.\n * So you could always do `ng-click=\"Ui.turnOn('myVar')\"`.\n *\n * Since `SharedState` is a service you can initialize/set statuses through\n * controllers too:\n *\n * ``` js\n * app.controller('myController', function($scope, SharedState){\n * SharedState.initialize($scope, \"activeTab\", 3);\n * });\n * ```\n *\n * As well as you can use `ui-default` for that:\n *\n * ``` html\n *
    \n * ```\n *\n */\n var module = angular.module('mobile-angular-ui.core.sharedState', []);\n\n /**\n * @ngdoc service\n * @class SharedState\n *\n * @description\n *\n * A `SharedState` state can be considered as a global variable identified by an `id`.\n *\n * `SharedState` service exposes methods to interact with statuses to create,\n * read and update states.\n *\n * It acts as a BUS between UI elements to share UI related state that is\n * automatically disposed when all scopes requiring it are destroyed.\n *\n * eg.\n *\n * ``` js\n * app.controller('controller1', function($scope, SharedState){\n * SharedState.initialize($scope, 'myId');\n * });\n *\n * app.controller('controller2', function(SharedState){\n * SharedState.toggle('myId');\n * });\n * ```\n *\n * Data structures retaining statuses will stay outside angular scopes thus\n * they are not evaluated against digest cycle until its necessary. Also\n * although statuses are sort of global variables `SharedState` will take\n * care of disposing them when no scopes are requiring them anymore.\n *\n * A set of `ui-*` directives are available to interact with `SharedState`\n * module and will hopefully var you spare your controllers and your time for\n * something that is more meaningful than this:\n *\n * ``` js\n * $scope.activeTab = 1;\n *\n * $scope.setActiveTab = function(n) {\n * $scope.activeTab = n;\n * };\n * ```\n *\n */\n\n /**\n * @event 'mobile-angular-ui.state.initialized.ID'\n * @shortname initialized\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` when `#initialize` is called for a new state not\n * referenced by any scope currently.\n *\n * @param {any} currentValue The value with which this state has been initialized\n *\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n\n /**\n * @event 'mobile-angular-ui.state.destroyed.ID'\n * @shortname destroyed\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` when a state is destroyed.\n *\n */\n\n /**\n * @event 'mobile-angular-ui.state.changed.ID'\n * @shortname changed\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Broadcasted on `$rootScope` the value of a state changes.\n *\n * ``` js\n * $scope.$on('mobile-angular-ui.state.changed.uiSidebarLeft', function(e, newVal, oldVal) {\n * if (newVal === true) {\n * console.log('sidebar opened');\n * } else {\n * console.log('sidebar closed');\n * }\n * });\n * ```\n *\n * @param {any} newValue\n * @param {any} oldValue\n *\n */\n\n module.factory('SharedState', [\n '$rootScope', '$log',\n function($rootScope, $log) {\n var values = {}; // values, context object for evals\n var statusesMeta = {}; // status info\n var scopes = {}; // scopes references\n var exclusionGroups = {}; // support exclusive boolean sets\n\n return {\n /**\n * @function initialize\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Initialize, or require if already intialized, a state identified by `id` within the provided `scope`, making it available to the rest of application.\n *\n * A `SharedState` is bound to one or more scopes. Each time\n * `initialize` is called for an angular `scope` this will be bound to\n * the `SharedState` and a reference count is incremented to allow\n * garbage collection.\n *\n * Reference count is decremented once the scope is destroyed. When the counter reach 0 the state will be disposed.\n *\n * @param {scope} scope The scope to bound this state\n * @param {string} id The unique name of this state\n * @param {object} [options] Options\n * @param {object} [options.defaultValue] the initialization value, it is taken into account only if the state `id` is not already initialized\n * @param {string} [options.exclusionGroup] Specifies an exclusion group\n * for the state. This means that for boolean operations (ie. toggle,\n * turnOn, turnOf) when this state is set to `true`, any other state\n * that is in the same `exclusionGroup` will be set to `false`.\n */\n initialize: function(scope, id, options) {\n options = options || {};\n\n var isNewScope = scopes[scope] === undefined;\n var defaultValue = options.defaultValue;\n var exclusionGroup = options.exclusionGroup;\n\n scopes[scope.$id] = scopes[scope.$id] || [];\n scopes[scope.$id].push(id);\n\n if (!statusesMeta[id]) { // is a brand new state\n // not referenced by any\n // scope currently\n\n statusesMeta[id] = angular.extend({}, options, {references: 1});\n\n $rootScope.$broadcast('mobile-angular-ui.state.initialized.' + id, defaultValue);\n\n if (defaultValue !== undefined) {\n this.setOne(id, defaultValue);\n }\n\n if (exclusionGroup) {\n // Exclusion groups are sets of statuses references\n exclusionGroups[exclusionGroup] = exclusionGroups[exclusionGroup] || {};\n exclusionGroups[exclusionGroup][id] = true;\n }\n\n } else if (isNewScope) { // is a new reference from\n // a different scope\n statusesMeta[id].references++;\n }\n scope.$on('$destroy', function() {\n var ids = scopes[scope.$id] || [];\n for (var i = 0; i < ids.length; i++) {\n var status = statusesMeta[ids[i]];\n\n if (status.exclusionGroup) {\n delete exclusionGroups[status.exclusionGroup][ids[i]];\n if (Object.keys(exclusionGroups[status.exclusionGroup]).length === 0) {\n delete exclusionGroups[status.exclusionGroup];\n }\n }\n\n status.references--;\n if (status.references <= 0) {\n delete statusesMeta[ids[i]];\n delete values[ids[i]];\n $rootScope.$broadcast('mobile-angular-ui.state.destroyed.' + id);\n }\n }\n delete scopes[scope.$id];\n });\n },\n\n /**\n * @function setOne\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Set the value of the state identified by `id` to the `value` parameter.\n *\n * @param {string} id Unique identifier for state\n * @param {any} value New value for this state\n */\n setOne: function(id, value) {\n if (statusesMeta[id] !== undefined) {\n var prev = values[id];\n values[id] = value;\n if (prev !== value) {\n $rootScope.$broadcast('mobile-angular-ui.state.changed.' + id, value, prev);\n }\n return value;\n }\n $log.warn('Warning: Attempt to set uninitialized shared state: ' + id);\n },\n\n /**\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @function setMany\n * @description\n *\n * Set multiple statuses at once. ie.\n *\n * ```\n * SharedState.setMany({ activeTab: 'firstTab', sidebarIn: false });\n * ```\n *\n * @param {object} object An object of the form `{state1: value1, ..., stateN: valueN}`\n */\n setMany: function(map) {\n angular.forEach(map, function(value, id) {\n this.setOne(id, value);\n }, this);\n },\n\n /**\n * @function set\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * A shorthand for both `setOne` and `setMany`.\n * When called with only one parameter that is an object\n * it is the same of `setMany`, otherwise is the\n * same of `setOne`.\n *\n * @param {string|object} idOrMap A state id or a `{state: value}` map object.\n * @param {any} [value] The value to assign in case idOrMap is a string.\n */\n set: function(idOrMap, value) {\n if (!idOrMap) {\n return;\n } else if (angular.isObject(idOrMap)) {\n this.setMany(idOrMap);\n } else {\n this.setOne(idOrMap, value);\n }\n },\n\n /**\n * @function turnOn\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Set shared state identified by `id` to `true`. If the\n * shared state has been initialized with `exclusionGroup`\n * option it will also turn off (set to `false`) all other\n * statuses from the same exclusion group.\n *\n * @param {string} id The unique name of this state\n */\n turnOn: function(id) {\n // Turns off other statuses belonging to the same exclusion group.\n var eg = statusesMeta[id] && statusesMeta[id].exclusionGroup;\n if (eg) {\n var egStatuses = Object.keys(exclusionGroups[eg]);\n for (var i = 0; i < egStatuses.length; i++) {\n var item = egStatuses[i];\n if (item !== id) {\n this.turnOff(item);\n }\n }\n }\n return this.setOne(id, true);\n },\n\n /**\n * @function turnOff\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Set shared state identified by `id` to `false`.\n *\n * @param {string} id The unique name of this state\n */\n turnOff: function(id) {\n return this.setOne(id, false);\n },\n\n /**\n * @function toggle\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * If current value for shared state identified by `id` evaluates\n * to `true` it calls `turnOff` on it otherwise calls `turnOn`.\n * Be aware that it will take into account `exclusionGroup` option.\n * See `#turnOn` and `#initialize` for more.\n *\n * @param {string} id The unique name of this state\n */\n toggle: function(id) {\n return this.get(id) ? this.turnOff(id) : this.turnOn(id);\n },\n\n /**\n * @function get\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n *\n * @description\n * Returns the current value of the state identified by `id`.\n *\n * @param {string} id The unique name of this state\n * @returns {any}\n */\n get: function(id) {\n return statusesMeta[id] && values[id];\n },\n\n /**\n * @function isActive\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Return `true` if the boolean conversion of `#get(id)` evaluates to `true`.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n isActive: function(id) {\n return Boolean(this.get(id));\n },\n\n /**\n * @function active\n * @alias mobile-angular-ui.core.sharedState~SharedState.isActive\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Alias for `#isActive`.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n active: function(id) {\n return this.isActive(id);\n },\n\n /**\n * @function isUndefined\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @description\n *\n * Return `true` if state identified by `id` is not defined.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n */\n isUndefined: function(id) {\n return statusesMeta[id] === undefined || this.get(id) === undefined;\n },\n\n /**\n * Returns `true` if state identified by `id` exsists.\n *\n * @param {string} id The unique name of this state\n * @returns {bool}\n *\n * @function has\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n has: function(id) {\n return statusesMeta[id] !== undefined;\n },\n\n /**\n * Returns the number of references of a status.\n *\n * @param {string} id The unique name of this state\n * @returns {integer}\n *\n * @function referenceCount\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n referenceCount: function(id) {\n var status = statusesMeta[id];\n return status === undefined ? 0 : status.references;\n },\n\n /**\n * Returns `true` if `#get(id)` is exactly equal (`===`) to `value` param.\n *\n * @param {string} id The unique name of this state\n * @param {any} value The value for comparison\n * @returns {bool}\n *\n * @function equals\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n equals: function(id, value) {\n return this.get(id) === value;\n },\n\n /**\n * Alias for `#equals`\n *\n * @param {string} id The unique name of this state\n * @param {any} value The value for comparison\n * @returns {bool}\n *\n * @function eq\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n * @alias mobile-angular-ui.core.sharedState~SharedState.equals\n */\n eq: function(id, value) {\n return this.equals(id, value);\n },\n\n /**\n * Returns an object with all the status values currently stored.\n * It has the form of `{statusId: statusValue}`.\n *\n * Bear in mind that in order to spare resources it currently\n * returns just the internal object retaining statuses values.\n * Thus it is not intended to be modified and direct changes to it will be not tracked or notified.\n *\n * Just clone before apply any change to it.\n *\n * @returns {object}\n *\n * @function values\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\n */\n values: function() {\n return values;\n },\n\n exclusionGroups: function() {\n return exclusionGroups;\n }\n };\n }\n ]);\n\n var uiBindEvent = function(scope, element, eventNames, fn) {\n eventNames = eventNames || 'click tap';\n element.on(eventNames, function(event) {\n scope.$apply(function() {\n fn(scope, {$event: event});\n });\n });\n };\n\n /**\n * Calls `SharedState#initialize` on the scope relative to the element using it.\n *\n * @param {string} uiState The shared state id\n * @param {expression} [uiDefault] the default value\n *\n * @directive uiSharedState\n */\n module.directive('uiSharedState', [\n 'SharedState', function(SharedState) {\n return {\n restrict: 'EA',\n priority: 601, // more than ng-if\n link: function(scope, elem, attrs) {\n var id = attrs.uiSharedState || attrs.id;\n var defaultValueExpr = attrs.uiDefault || attrs.default;\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\n\n SharedState.initialize(scope, id, {\n defaultValue: defaultValue,\n exclusionGroup: attrs.uiExclusionGroup\n });\n }\n };\n }\n ]);\n\n /**\n * Alias for uiSharedState. **Deprecated** since it clashes with\n * [UI-Router](https://ui-router.github.io/) `uiState` directive.\n *\n * @deprecated\n * @param {string} uiState The shared state id\n * @param {expression} [uiDefault] the default value\n *\n * @directive uiState\n */\n module.directive('uiState', [\n 'SharedState', function(SharedState) {\n return {\n restrict: 'EA',\n priority: 601, // more than ng-if\n link: function(scope, elem, attrs) {\n var id = attrs.uiState || attrs.id;\n var defaultValueExpr = attrs.uiDefault || attrs.default;\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\n\n SharedState.initialize(scope, id, {\n defaultValue: defaultValue,\n exclusionGroup: attrs.uiExclusionGroup\n });\n }\n };\n }\n ]);\n\n angular.forEach(['toggle', 'turnOn', 'turnOff', 'set'],\n function(methodName) {\n var directiveName = 'ui' + methodName[0].toUpperCase() + methodName.slice(1);\n\n /**\n * Calls `SharedState#toggle` when triggering events happens on the element using it.\n *\n * @param {string} uiToggle the target shared state\n * @param {expression} uiDefault the default value\n *\n * @directive uiToggle\n */\n\n /**\n * @function uiTurnOn\n *\n * @description\n * Calls `SharedState#turnOn` when triggering events happens on the element using it.\n *\n *\n * @ngdoc directive\n *\n * @param {string} uiTurnOn the target shared state\n * @param {expression} uiDefault the default value\n */\n\n /**\n * @function uiTurnOff\n *\n * @description\n * Calls `SharedState#turnOff` when triggering events happens on the element using it.\n *\n * @ngdoc directive\n *\n * @param {string} uiTurnOff the target shared state\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\n */\n\n /**\n * @function uiSet\n *\n * @description\n * Calls `SharedState#set` when triggering events happens on the element using it.\n *\n * @ngdoc directive\n *\n * @param {object} uiSet The object to pass to SharedState#set\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\n */\n\n module.directive(directiveName, [\n '$parse',\n '$interpolate',\n 'SharedState',\n function($parse, $interpolate, SharedState) {\n var method = SharedState[methodName];\n return {\n restrict: 'A',\n priority: 1, // This would make postLink calls happen after ngClick\n // (and similar) ones, thus intercepting events after them.\n //\n // This will prevent eventual ng-if to detach elements\n // before ng-click fires.\n\n compile: function(elem, attrs) {\n var attr = attrs[directiveName];\n var needsInterpolation = attr.match(/\\{\\{/);\n\n var exprFn = function($scope) {\n var res = attr;\n if (needsInterpolation) {\n var interpolateFn = $interpolate(res);\n res = interpolateFn($scope);\n }\n if (methodName === 'set') {\n res = ($parse(res))($scope);\n }\n return res;\n };\n\n return function(scope, elem, attrs) {\n var callback = function() {\n var arg = exprFn(scope);\n return method.call(SharedState, arg);\n };\n uiBindEvent(scope, elem, attrs.uiTriggers, callback);\n };\n }\n };\n }\n ]);\n });\n\n /**\n * @name uiScopeContext\n * @inner\n * @description\n *\n * `uiScopeContext` is not a directive, but a parameter common to any of the\n * `ui-*` directives in this module.\n *\n * By default all `ui-*` conditions in this module evaluates in the context of\n * `SharedState` only, thus scope variable are not accessible. To use them you have\n * two options:\n *\n * #### 1. pre-interpolation\n *\n * You can use pre-interpolation in expression attribute. For instance the following syntax\n * is ligit:\n *\n * ``` html\n *
    \n * ```\n *\n * In this case `idx` value is taken from scope and embedded into\n * conditions before parse them.\n *\n * This works as expected and is fine for the most cases, but it has a little caveat:\n *\n * The condition has to be re-parsed at each digest loop and has to walk scopes\n * in watchers.\n *\n * #### 2. uiScopeContext\n *\n * If you are concerned about performance issues using the first approach\n * `uiScopeContext` is a more verbose but also lightweight alternative\n * to accomplish the same.\n *\n * It allows to use current scope vars inside `ui-*` conditions, leaving\n * other scope vars (or the entire scope if not present) apart from the\n * condition evaluation process.\n *\n * Hopefully this will keep evaluation running against a flat and small data\n * structure instead of taking into account the whole scope.\n *\n * It is a list `scopeVar[ as aliasName] [, ...]` specifing one of more scope\n * variables to take into account when evaluating conditions. ie:\n *\n * ``` html\n * \n *
    \n *
    \n * \n *
    \n *
    \n * ```\n *\n * ``` html\n *
    \n *
    \n * ```\n *\n * Be aware that scope vars will take precedence over sharedStates so,\n * in order to avoid name clashes you can use 'as' to refer to scope vars\n * with a different name in conditions:\n *\n * ``` html\n *
    \n *
    \n * ```\n */\n var parseScopeContext = function(attr) {\n if (!attr || attr === '') {\n return [];\n }\n var vars = attr ? attr.trim().split(/ *, */) : [];\n var res = [];\n for (var i = 0; i < vars.length; i++) {\n var item = vars[i].split(/ *as */);\n if (item.length > 2 || item.length < 1) {\n throw new Error('Error parsing uiScopeContext=\"' + attr + '\"');\n }\n res.push(item);\n }\n return res;\n };\n\n var mixScopeContext = function(context, scopeVars, scope) {\n for (var i = 0; i < scopeVars.length; i++) {\n var key = scopeVars[i][0];\n var alias = scopeVars[i][1] || key;\n context[alias] = key.split('.').reduce(function(scope, nextKey) {\n return scope[nextKey];\n }, scope);\n }\n };\n\n var parseUiCondition = function(name, attrs, $scope, SharedState, $parse, $interpolate) {\n var expr = attrs[name];\n var needsInterpolation = expr.match(/\\{\\{/);\n var exprFn;\n\n if (needsInterpolation) {\n exprFn = function(context) {\n var interpolateFn = $interpolate(expr);\n var parseFn = $parse(interpolateFn($scope));\n return parseFn(context);\n };\n } else {\n exprFn = $parse(expr);\n }\n\n var uiScopeContext = parseScopeContext(attrs.uiScopeContext);\n return function() {\n var context;\n if (uiScopeContext.length) {\n context = angular.extend({}, SharedState.values());\n mixScopeContext(context, uiScopeContext, $scope);\n } else {\n context = SharedState.values();\n }\n return exprFn(context);\n };\n };\n\n /**\n * @ngdoc directive\n * @function uiIf\n *\n * @description\n * Same as `ngIf` but evaluates condition against `SharedState` statuses too\n *\n * @param {expression} uiIf A condition to decide wether to attach the\n * element to the dom\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when\n * evaluating condition.\n */\n module.directive('uiIf', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\n function getBlockNodes(nodes) {\n var node = nodes[0];\n var endNode = nodes[nodes.length - 1];\n var blockNodes = [node];\n do {\n node = node.nextSibling;\n if (!node) {\n break;\n }\n blockNodes.push(node);\n } while (node !== endNode);\n\n return angular.element(blockNodes);\n }\n\n return {\n multiElement: true,\n transclude: 'element',\n priority: 600,\n terminal: true,\n restrict: 'A',\n $$tlb: true,\n link: function($scope, $element, $attr, ctrl, $transclude) {\n var block;\n var childScope;\n var previousElements;\n var uiIfFn = parseUiCondition('uiIf', $attr, $scope, SharedState, $parse, $interpolate);\n\n $scope.$watch(uiIfFn, function uiIfWatchAction(value) {\n if (value) {\n if (!childScope) {\n $transclude(function(clone, newScope) {\n childScope = newScope;\n clone[clone.length++] = document.createComment(' end uiIf: ' + $attr.uiIf + ' ');\n // Note: We only need the first/last node of the cloned nodes.\n // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n // by a directive with templateUrl when its template arrives.\n block = {\n clone: clone\n };\n $animate.enter(clone, $element.parent(), $element);\n });\n }\n } else {\n if (previousElements) {\n previousElements.remove();\n previousElements = null;\n }\n if (childScope) {\n childScope.$destroy();\n childScope = null;\n }\n if (block) {\n previousElements = getBlockNodes(block.clone);\n var done = function() {\n previousElements = null;\n };\n var nga = $animate.leave(previousElements, done);\n if (nga) {\n nga.then(done);\n }\n block = null;\n }\n }\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiHide\n *\n * @description\n * Same as `ngHide` but evaluates condition against `SharedState` statuses\n *\n * @param {expression} uiShow A condition to decide wether to hide the element\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating condition.\n */\n module.directive('uiHide', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\n var NG_HIDE_CLASS = 'ng-hide';\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n var uiHideFn = parseUiCondition('uiHide', attr, scope, SharedState, $parse, $interpolate);\n scope.$watch(uiHideFn, function uiHideWatchAction(value) {\n $animate[value ? 'addClass' : 'removeClass'](element, NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiShow\n *\n * @description\n * Same as `ngShow` but evaluates condition against `SharedState` statuses\n *\n * @param {expression} uiShow A condition to decide wether to show the element\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating condition.\n */\n module.directive('uiShow', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse) {\n var NG_HIDE_CLASS = 'ng-hide';\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n var uiShowFn = parseUiCondition('uiShow', attr, scope, SharedState, $parse);\n scope.$watch(uiShowFn, function uiShowWatchAction(value) {\n $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n }]);\n\n /**\n * @ngdoc directive\n * @function uiClass\n *\n * @description\n * A simplified version of `ngClass` that evaluates in context of `SharedState`, it only suppors the `{'className': expr}` syntax.\n *\n * @param {expression} uiClass An expression that has to evaluate to an object\n * of the form `{'className': expr}`, where `expr` decides wether the class\n * should appear to element's class list.\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\n * specifing one of more scope variables to take into account when evaluating\n * condition.\n */\n module.directive('uiClass', ['SharedState', '$parse', '$interpolate', function(SharedState, $parse) {\n return {\n restrict: 'A',\n link: function(scope, element, attr) {\n var uiClassFn = parseUiCondition('uiClass', attr, scope, SharedState, $parse);\n scope.$watch(uiClassFn, function uiClassWatchAction(value) {\n var classesToAdd = '';\n var classesToRemove = '';\n angular.forEach(value, function(expr, className) {\n if (expr) {\n classesToAdd += ' ' + className;\n } else {\n classesToRemove += ' ' + className;\n }\n classesToAdd = classesToAdd.trim();\n classesToRemove = classesToRemove.trim();\n if (classesToAdd.length) {\n element.addClass(classesToAdd);\n }\n if (classesToRemove.length) {\n element.removeClass(classesToRemove);\n }\n });\n }, true);\n }\n };\n }]);\n\n module.run([\n '$rootScope',\n 'SharedState',\n function($rootScope, SharedState) {\n $rootScope.Ui = SharedState;\n }\n ]);\n\n})();\n","/**\n * Provides directives and service to prevent touchmove default behaviour\n * for touch devices (ie. bounce on overscroll in IOS).\n *\n * #### Usage\n *\n * Use `ui-prevent-touchmove-defaults` directive on root element of your app:\n *\n * ``` html\n * \n * \n * \n * ```\n *\n * Doing so `touchmove.preventDefault` logic for inner elements is inverted,\n * so any `touchmove` default behaviour is automatically prevented.\n *\n * If you wish to allow the default behaviour, for example to allow\n * inner elements to scroll, you have to explicitly mark an event to allow\n * touchmove default.\n *\n * Mobile Angular UI already handles this for `scrollable` elements, so you don't have\n * to do anything in order to support scroll.\n *\n * If you wish to allow touchmove defaults for certain element under certain conditions\n * you can use the `allowTouchmoveDefault` service.\n *\n * ie.\n *\n * ``` js\n * // always allow touchmove default for an element\n * allowTouchmoveDefault(myelem);\n * ```\n *\n * ``` js\n * // allow touchmove default for an element only under certain conditions\n * allowTouchmoveDefault(myelem, function(touchmove){\n * return touchmove.pageY > 100;\n * });\n * ```\n *\n * @module mobile-angular-ui.core.touchmoveDefaults\n */\n(function() {\n 'use strict';\n var module = angular.module('mobile-angular-ui.core.touchmoveDefaults', []);\n\n module.directive('uiPreventTouchmoveDefaults', function() {\n var preventTouchmoveDefaultsCb = function(e) {\n // Get this flag from either the saved event if jQuery is being used, otherwise get it from the event itself.\n var allowTouchmoveEventFlag = e.originalEvent ? e.originalEvent.allowTouchmoveDefault : e.allowTouchmoveDefault;\n if (allowTouchmoveEventFlag !== true) {\n e.preventDefault();\n }\n };\n\n return {\n compile: function(element) {\n if ('ontouchmove' in document) {\n element.on('touchmove', preventTouchmoveDefaultsCb);\n }\n }\n };\n });\n\n /**\n * Bind a listener to an element to allow `touchmove` default behaviour\n * when `touchmove` happens inside the bound element.\n *\n * You can also provide a function to decide when to allow and\n * when to prevent it.\n *\n * ``` js\n * // always allow touchmove default\n * allowTouchmoveDefault(myelem);\n *\n * // allow touchmove default only under certain conditions\n * allowTouchmoveDefault(myelem, function(touchmove){\n * return touchmove.pageY > 100;\n * });\n * ```\n *\n * @param {Element|$element} element The element to bind.\n * @param {function} condition A `function(touchmove)⟶boolean` to decide\n * whether to allow default behavior or not.\n *\n * @service allowTouchmoveDefault\n * @as function\n * @returns function Function to unbind the listener\n */\n\n module.factory('allowTouchmoveDefault', function() {\n var fnTrue = function() {\n return true;\n };\n\n if ('ontouchmove' in document) {\n return function($element, condition) {\n condition = condition || fnTrue;\n\n var allowTouchmoveDefaultCallback = function(e) {\n if (condition(e)) {\n e.allowTouchmoveDefault = true;\n // jQuery normalizes the event object, need to put this property on the copied originalEvent.\n if (e.originalEvent) {\n e.originalEvent.allowTouchmoveDefault = true;\n }\n }\n };\n\n $element = angular.element($element);\n $element.on('touchmove', allowTouchmoveDefaultCallback);\n\n $element.on('$destroy', function() {\n $element.off('touchmove', allowTouchmoveDefaultCallback);\n $element = null;\n });\n\n return function() {\n if ($element) {\n $element.off('touchmove', allowTouchmoveDefaultCallback);\n }\n };\n };\n }\n\n return angular.noop;\n });\n\n})();\n","/**\n * @module mobile-angular-ui.core\n *\n * @description\n *\n * It has all the core functionalities of Mobile Angular UI. It aims to act as a common base\n * for an UI framework providing services and directives to create components and implement\n * UI interactions with angular.\n *\n *
    \n * NOTE\n *
      \n *
    • It has no dependency on Bootstrap.
    • \n *
    • It is not related to mobile apps only.
    • \n *
    • It is not requiring CSS support.
    • \n *
    • You can use it on any Angular Application and with any CSS framework.
    • \n *
    \n *
    \n *\n * ## Standalone Usage\n *\n * Although `.core` module is required by `mobile-angular-ui` by default you can use it alone.\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.core']);\n * ```\n */\n(function() {\n 'use strict';\n angular.module('mobile-angular-ui.core', [\n 'mobile-angular-ui.core.fastclick',\n 'mobile-angular-ui.core.activeLinks',\n 'mobile-angular-ui.core.capture',\n 'mobile-angular-ui.core.outerClick',\n 'mobile-angular-ui.core.sharedState',\n 'mobile-angular-ui.core.touchmoveDefaults'\n ]);\n})();\n","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, undefined ){\n\t\n\tvar doc = w.document,\n\t\tdocElem = doc.documentElement,\n\t\tenabledClassName = \"overthrow-enabled\",\n\n\t\t// Touch events are used in the polyfill, and thus are a prerequisite\n\t\tcanBeFilledWithPoly = \"ontouchmove\" in doc,\n\t\t\n\t\t// The following attempts to determine whether the browser has native overflow support\n\t\t// so we can enable it but not polyfill\n\t\tnativeOverflow = \n\t\t\t// Features-first. iOS5 overflow scrolling property check - no UA needed here. thanks Apple :)\n\t\t\t\"WebkitOverflowScrolling\" in docElem.style ||\n\t\t\t// Test the windows scrolling property as well\n\t\t\t\"msOverflowStyle\" in docElem.style ||\n\t\t\t// Touch events aren't supported and screen width is greater than X\n\t\t\t// ...basically, this is a loose \"desktop browser\" check. \n\t\t\t// It may wrongly opt-in very large tablets with no touch support.\n\t\t\t( !canBeFilledWithPoly && w.screen.width > 800 ) ||\n\t\t\t// Hang on to your hats.\n\t\t\t// Whitelist some popular, overflow-supporting mobile browsers for now and the future\n\t\t\t// These browsers are known to get overlow support right, but give us no way of detecting it.\n\t\t\t(function(){\n\t\t\t\tvar ua = w.navigator.userAgent,\n\t\t\t\t\t// Webkit crosses platforms, and the browsers on our list run at least version 534\n\t\t\t\t\twebkit = ua.match( /AppleWebKit\\/([0-9]+)/ ),\n\t\t\t\t\twkversion = webkit && webkit[1],\n\t\t\t\t\twkLte534 = webkit && wkversion >= 534;\n\t\t\t\t\t\n\t\t\t\treturn (\n\t\t\t\t\t/* Android 3+ with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 */\n\t\t\t\t\tua.match( /Android ([0-9]+)/ ) && RegExp.$1 >= 3 && wkLte534 ||\n\t\t\t\t\t/* Blackberry 7+ with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0 Mobile Safari/534.11+ */\n\t\t\t\t\tua.match( / Version\\/([0-9]+)/ ) && RegExp.$1 >= 0 && w.blackberry && wkLte534 ||\n\t\t\t\t\t/* Blackberry Playbook with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+ */ \n\t\t\t\t\tua.indexOf( \"PlayBook\" ) > -1 && wkLte534 && !ua.indexOf( \"Android 2\" ) === -1 ||\n\t\t\t\t\t/* Firefox Mobile (Fennec) 4 and up\n\t\t\t\t\t~: Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0 */\n\t\t\t\t\tua.match(/Firefox\\/([0-9]+)/) && RegExp.$1 >= 4 ||\n\t\t\t\t\t/* WebOS 3 and up (TouchPad too)\n\t\t\t\t\t~: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.48 Safari/534.6 TouchPad/1.0 */\n\t\t\t\t\tua.match( /wOSBrowser\\/([0-9]+)/ ) && RegExp.$1 >= 233 && wkLte534 ||\n\t\t\t\t\t/* Nokia Browser N8\n\t\t\t\t\t~: Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba \n\t\t\t\t\t~: Note: the N9 doesn't have native overflow with one-finger touch. wtf */\n\t\t\t\t\tua.match( /NokiaBrowser\\/([0-9\\.]+)/ ) && parseFloat(RegExp.$1) === 7.3 && webkit && wkversion >= 533\n\t\t\t\t);\n\t\t\t})();\n\n\t// Expose overthrow API\n\tw.overthrow = {};\n\n\tw.overthrow.enabledClassName = enabledClassName;\n\n\tw.overthrow.addClass = function(){\n\t\tif( docElem.className.indexOf( w.overthrow.enabledClassName ) === -1 ){\n\t\t\tdocElem.className += \" \" + w.overthrow.enabledClassName;\n\t\t}\n\t};\n\n\tw.overthrow.removeClass = function(){\n\t\tdocElem.className = docElem.className.replace( w.overthrow.enabledClassName, \"\" );\n\t};\n\n\t// Enable and potentially polyfill overflow\n\tw.overthrow.set = function(){\n\t\t\t\n\t\t// If nativeOverflow or at least the element canBeFilledWithPoly, add a class to cue CSS that assumes overflow scrolling will work (setting height on elements and such)\n\t\tif( nativeOverflow ){\n\t\t\tw.overthrow.addClass();\n\t\t}\n\n\t};\n\n\t// expose polyfillable \n\tw.overthrow.canBeFilledWithPoly = canBeFilledWithPoly;\n\n\t// Destroy everything later. If you want to.\n\tw.overthrow.forget = function(){\n\n\t\tw.overthrow.removeClass();\n\t\t\n\t};\n\t\t\n\t// Expose overthrow API\n\tw.overthrow.support = nativeOverflow ? \"native\" : \"none\";\n\t\t\n})( this );\n","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, undefined ){\n\t\n\t// Auto-init\n\tw.overthrow.set();\n\n}( this ));","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, o, undefined ){\n\n\t// o is overthrow reference from overthrow-polyfill.js\n\tif( o === undefined ){\n\t\treturn;\n\t}\n\n\to.scrollIndicatorClassName = \"overthrow\";\n\t\n\tvar doc = w.document,\n\t\tdocElem = doc.documentElement,\n\t\t// o api\n\t\tnativeOverflow = o.support === \"native\",\n\t\tcanBeFilledWithPoly = o.canBeFilledWithPoly,\n\t\tconfigure = o.configure,\n\t\tset = o.set,\n\t\tforget = o.forget,\n\t\tscrollIndicatorClassName = o.scrollIndicatorClassName;\n\n\t// find closest overthrow (elem or a parent)\n\to.closest = function( target, ascend ){\n\t\treturn !ascend && target.className && target.className.indexOf( scrollIndicatorClassName ) > -1 && target || o.closest( target.parentNode );\n\t};\n\t\t\n\t// polyfill overflow\n\tvar enabled = false;\n\to.set = function(){\n\t\t\t\n\t\tset();\n\n\t\t// If nativeOverflow or it doesn't look like the browser canBeFilledWithPoly, our job is done here. Exit viewport left.\n\t\tif( enabled || nativeOverflow || !canBeFilledWithPoly ){\n\t\t\treturn;\n\t\t}\n\n\t\tw.overthrow.addClass();\n\n\t\tenabled = true;\n\n\t\to.support = \"polyfilled\";\n\n\t\to.forget = function(){\n\t\t\tforget();\n\t\t\tenabled = false;\n\t\t\t// Remove touch binding (check for method support since this part isn't qualified by touch support like the rest)\n\t\t\tif( doc.removeEventListener ){\n\t\t\t\tdoc.removeEventListener( \"touchstart\", start, false );\n\t\t\t}\n\t\t};\n\n\t\t// Fill 'er up!\n\t\t// From here down, all logic is associated with touch scroll handling\n\t\t\t// elem references the overthrow element in use\n\t\tvar elem,\n\t\t\t\n\t\t\t// The last several Y values are kept here\n\t\t\tlastTops = [],\n\t\n\t\t\t// The last several X values are kept here\n\t\t\tlastLefts = [],\n\t\t\t\n\t\t\t// lastDown will be true if the last scroll direction was down, false if it was up\n\t\t\tlastDown,\n\t\t\t\n\t\t\t// lastRight will be true if the last scroll direction was right, false if it was left\n\t\t\tlastRight,\n\t\t\t\n\t\t\t// For a new gesture, or change in direction, reset the values from last scroll\n\t\t\tresetVertTracking = function(){\n\t\t\t\tlastTops = [];\n\t\t\t\tlastDown = null;\n\t\t\t},\n\t\t\t\n\t\t\tresetHorTracking = function(){\n\t\t\t\tlastLefts = [];\n\t\t\t\tlastRight = null;\n\t\t\t},\n\t\t\n\t\t\t// On webkit, touch events hardly trickle through textareas and inputs\n\t\t\t// Disabling CSS pointer events makes sure they do, but it also makes the controls innaccessible\n\t\t\t// Toggling pointer events at the right moments seems to do the trick\n\t\t\t// Thanks Thomas Bachem http://stackoverflow.com/a/5798681 for the following\n\t\t\tinputs,\n\t\t\tsetPointers = function( val ){\n\t\t\t\tinputs = elem.querySelectorAll( \"textarea, input\" );\n\t\t\t\tfor( var i = 0, il = inputs.length; i < il; i++ ) {\n\t\t\t\t\tinputs[ i ].style.pointerEvents = val;\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t// For nested overthrows, changeScrollTarget restarts a touch event cycle on a parent or child overthrow\n\t\t\tchangeScrollTarget = function( startEvent, ascend ){\n\t\t\t\tif( doc.createEvent ){\n\t\t\t\t\tvar newTarget = ( !ascend || ascend === undefined ) && elem.parentNode || elem.touchchild || elem,\n\t\t\t\t\t\ttEnd;\n\t\t\t\t\t\t\t\n\t\t\t\t\tif( newTarget !== elem ){\n\t\t\t\t\t\ttEnd = doc.createEvent( \"HTMLEvents\" );\n\t\t\t\t\t\ttEnd.initEvent( \"touchend\", true, true );\n\t\t\t\t\t\telem.dispatchEvent( tEnd );\n\t\t\t\t\t\tnewTarget.touchchild = elem;\n\t\t\t\t\t\telem = newTarget;\n\t\t\t\t\t\tnewTarget.dispatchEvent( startEvent );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t// Touchstart handler\n\t\t\t// On touchstart, touchmove and touchend are freshly bound, and all three share a bunch of vars set by touchstart\n\t\t\t// Touchend unbinds them again, until next time\n\t\t\tstart = function( e ){\n\n\t\t\t\t// Stop any throw in progress\n\t\t\t\tif( o.intercept ){\n\t\t\t\t\to.intercept();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Reset the distance and direction tracking\n\t\t\t\tresetVertTracking();\n\t\t\t\tresetHorTracking();\n\t\t\t\t\n\t\t\t\telem = o.closest( e.target );\n\t\t\t\t\t\n\t\t\t\tif( !elem || elem === docElem || e.touches.length > 1 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\t\t\t\n\n\t\t\t\tsetPointers( \"none\" );\n\t\t\t\tvar touchStartE = e,\n\t\t\t\t\tscrollT = elem.scrollTop,\n\t\t\t\t\tscrollL = elem.scrollLeft,\n\t\t\t\t\theight = elem.offsetHeight,\n\t\t\t\t\twidth = elem.offsetWidth,\n\t\t\t\t\tstartY = e.touches[ 0 ].pageY,\n\t\t\t\t\tstartX = e.touches[ 0 ].pageX,\n\t\t\t\t\tscrollHeight = elem.scrollHeight,\n\t\t\t\t\tscrollWidth = elem.scrollWidth,\n\t\t\t\t\n\t\t\t\t\t// Touchmove handler\n\t\t\t\t\tmove = function( e ){\n\t\t\t\t\t\n\t\t\t\t\t\tvar ty = scrollT + startY - e.touches[ 0 ].pageY,\n\t\t\t\t\t\t\ttx = scrollL + startX - e.touches[ 0 ].pageX,\n\t\t\t\t\t\t\tdown = ty >= ( lastTops.length ? lastTops[ 0 ] : 0 ),\n\t\t\t\t\t\t\tright = tx >= ( lastLefts.length ? lastLefts[ 0 ] : 0 );\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t// If there's room to scroll the current container, prevent the default window scroll\n\t\t\t\t\t\tif( ( ty > 0 && ty < scrollHeight - height ) || ( tx > 0 && tx < scrollWidth - width ) ){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This bubbling is dumb. Needs a rethink.\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tchangeScrollTarget( touchStartE );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If down and lastDown are inequal, the y scroll has changed direction. Reset tracking.\n\t\t\t\t\t\tif( lastDown && down !== lastDown ){\n\t\t\t\t\t\t\tresetVertTracking();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If right and lastRight are inequal, the x scroll has changed direction. Reset tracking.\n\t\t\t\t\t\tif( lastRight && right !== lastRight ){\n\t\t\t\t\t\t\tresetHorTracking();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// remember the last direction in which we were headed\n\t\t\t\t\t\tlastDown = down;\n\t\t\t\t\t\tlastRight = right;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t// set the container's scroll\n\t\t\t\t\t\telem.scrollTop = ty;\n\t\t\t\t\t\telem.scrollLeft = tx;\n\t\t\t\t\t\n\t\t\t\t\t\tlastTops.unshift( ty );\n\t\t\t\t\t\tlastLefts.unshift( tx );\n\t\t\t\t\t\n\t\t\t\t\t\tif( lastTops.length > 3 ){\n\t\t\t\t\t\t\tlastTops.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( lastLefts.length > 3 ){\n\t\t\t\t\t\t\tlastLefts.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t\t// Touchend handler\n\t\t\t\t\tend = function( e ){\n\n\t\t\t\t\t\t// Bring the pointers back\n\t\t\t\t\t\tsetPointers( \"auto\" );\n\t\t\t\t\t\tsetTimeout( function(){\n\t\t\t\t\t\t\tsetPointers( \"none\" );\n\t\t\t\t\t\t}, 450 );\n\t\t\t\t\t\telem.removeEventListener( \"touchmove\", move, false );\n\t\t\t\t\t\telem.removeEventListener( \"touchend\", end, false );\n\t\t\t\t\t};\n\t\t\t\t\n\t\t\t\telem.addEventListener( \"touchmove\", move, false );\n\t\t\t\telem.addEventListener( \"touchend\", end, false );\n\t\t\t};\n\t\t\t\n\t\t// Bind to touch, handle move and end within\n\t\tdoc.addEventListener( \"touchstart\", start, false );\n\t};\n\t\t\n})( this, this.overthrow );\n","/**\n * This module will provide directives to create modals and overlays components.\n *\n * @module mobile-angular-ui.components.modals\n */\n(function() {\n 'use strict';\n angular.module('mobile-angular-ui.components.modals', [])\n\n /**\n * A directive to create modals and overlays components.\n *\n * Modals are basically the same of Bootstrap 3 but you have to use uiSharedState\n * with `ngIf/uiIf` or `ngHide/uiHide` to `activate/dismiss` it.\n *\n * By default both modals and overlay are made always showing up by\n * css rule `.modal {display:block}`, so you can use it with\n * `ngAnimate` and other angular directives in a simpler way.\n *\n * Overlay are a style of modal that looks more native in mobile devices providing a blurred\n * overlay as background.\n *\n * You can create an overlay adding `.modal-overlay` class to a modal.\n *\n * ### Note\n *\n * For modals and overlays to cover the entire page you have to attach them\n * as child of `body` element. To achieve this from a view is a common use for\n * `contentFor/yieldTo` directives contained from\n * [capture module](/docs/module:mobile-angular-ui/module:core/module:capture):\n *\n * ``` html\n * \n *\n * \n * \n *
    \n *\n * \n * ```\n *\n * Then you can wrap your modals and overlays in `contentFor`:\n *\n * ``` html\n *
    \n * *
    \n *
    \n * ```\n *\n * **Example.** Create a Modal.\n *\n * ``` html\n *
    \n *
    \n *
    \n *
    \n *
    \n *
    \n * \n *

    Modal title

    \n *
    \n *
    \n *

    Lorem ipsum ...

    \n *
    \n *
    \n * \n * \n *
    \n *
    \n *
    \n *
    \n *
    \n * ```\n *\n * **Example.** Create an Overlay.\n *\n * ``` html\n *
    \n *
    \n *
    \n *
    \n *
    \n * \n *

    Modal title

    \n *
    \n *
    \n *

    Lorem ipsum ...

    \n *
    \n *
    \n * \n * \n *
    \n *
    \n *
    \n *
    \n *
    \n * ```\n *\n * @directive modal\n * @restrict C\n */\n .directive('modal', [\n '$rootElement',\n function($rootElement) {\n return {\n restrict: 'C',\n link: function(scope, elem) {\n $rootElement.addClass('has-modal');\n elem.on('$destroy', function() {\n $rootElement.removeClass('has-modal');\n });\n scope.$on('$destroy', function() {\n $rootElement.removeClass('has-modal');\n });\n\n if (elem.hasClass('modal-overlay')) {\n $rootElement.addClass('has-modal-overlay');\n elem.on('$destroy', function() {\n $rootElement.removeClass('has-modal-overlay');\n });\n scope.$on('$destroy', function() {\n $rootElement.removeClass('has-modal-overlay');\n });\n }\n }\n };\n }]);\n})();\n","/**\n * @module mobile-angular-ui.components.navbars\n * @description\n *\n * Bootstrap default navbars are awesome for responsive websites, but are not the\n * best with a small screen. Also fixed positioning is yet not an option to create\n * navbars standing in top or bottom of the screen.\n *\n * Mobile Angular Ui offers an alternative to bootstrap navbars that is more\n * suitable for mobile.\n *\n * It uses scrollable areas to avoid scroll issues. In the following figure you can\n * see the difference between fixed navbars and navbars with absolute positioning.\n *\n *
    \n * \"\"/\n *
    \n *\n * Here is the basic markup to achieve this.\n *\n * ``` html\n *
    \n *
    \n * \n *
    \n *\n *
    \n * \n *
    \n *\n *
    \n * \n *
    \n *
    \n * ```\n *\n * As you can notice the base class is `.navbar-app` while the positioning is\n * obtained adding either `.navbar-absolute-top` or `.navbar-absolute-bottom`\n * class.\n *\n * ### Mobile Navbar Layout\n *\n * Top navbar in mobile design most of the times follows a clear pattern: a\n * centered title surrounded by one or two action buttons, the _back_ or the\n * _menu_ buttons are two common examples.\n *\n * Twitter Bootstrap ships with a different arrangement of components for navbars\n * since they are supposed to host an horizontal navigation menu.\n *\n * `.navbar-app` is specifically designed to support this different type of\n * `.interaction and arrangement.\n *\n * Consider the following example:\n *\n * ``` html\n *
    \n *\n *
    \n * Navbar Brand\n *
    \n *\n *
    \n *
    \n * Left Action\n *
    \n *
    \n *\n *
    \n *
    \n * Right Action\n *
    \n *
    \n *
    \n * ```\n *\n * `.navbar-brand-center` is a specialization of BS3's `.navbar-brand`. It will\n * render the title centered and below the two button groups. Note that `.navbar-\n * brand-center` will position the title with absolute positioning ensuring that\n * it will never cover the buttons, which would cause interaction problems.\n *\n */\n\n(function() {\n 'use strict';\n\n var module = angular.module('mobile-angular-ui.components.navbars', []);\n\n /**\n * @directive navbarAbsoluteTop\n * @restrict C\n * @description\n *\n * Setup absolute positioned top navbar.\n *\n * ``` html\n *
    \n * \n *
    \n * ```\n */\n\n /**\n * @directive navbarAbsoluteBottom\n * @restrict C\n * @description\n *\n * Setup absolute positioned bottom navbar.\n *\n * ``` html\n *
    \n * \n *
    \n * ```\n */\n angular.forEach(['top', 'bottom'], function(side) {\n var directiveName = 'navbarAbsolute' + side.charAt(0).toUpperCase() + side.slice(1);\n module.directive(directiveName, [\n '$rootElement',\n function($rootElement) {\n return {\n restrict: 'C',\n link: function(scope) {\n $rootElement.addClass('has-navbar-' + side);\n scope.$on('$destroy', function() {\n $rootElement.removeClass('has-navbar-' + side);\n });\n }\n };\n }\n ]);\n });\n})();\n","/**\n * @module mobile-angular-ui.components.scrollable\n * @description\n *\n * One thing you'll always have to deal with approaching mobile web app\n * development is scroll and `position:fixed` bugs.\n *\n * Due to the lack of support in some devices fixed positioned elements may\n * bounce or disappear during scroll. Also mobile interaction often leverages\n * horizontal scroll eg. in carousels or sliders.\n *\n * We use `overflow:auto` to create scrollable areas and solve any problems\n * related to scroll.\n *\n * Since `overflow:auto` is not always available in touch devices we use [Overthrow](http://filamentgroup.github.io/Overthrow/) to polyfill that.\n *\n * Markup for any scrollable areas is as simple as:\n *\n * ``` html\n *
    \n *
    ...
    \n *
    \n * ```\n *\n * This piece of code will trigger a directive that properly setup a new `Overthrow`\n * instance for the `.scrollable` node.\n *\n * #### Headers and footers\n *\n * `.scrollable-header/.scrollable-footer` can be used to add fixed header/footer\n * to a scrollable area without having to deal with css height and positioning to\n * avoid breaking scroll.\n *\n * ``` html\n *
    \n *
    \n *
    \n *
    \n *
    \n * ```\n *\n * #### scrollTo\n *\n * `.scrollable-content` controller exposes a `scrollTo` function: `scrollTo(offsetOrElement, margin)`\n *\n * You have to require it in your directives to use it or obtain through `element().controller`:\n *\n * ``` js\n * var elem = element(document.getElementById('myScrollableContent'));\n * var scrollableContentController = elem.controller('scrollableContent');\n *\n * // - Scroll to top of containedElement\n * scrollableContentController.scrollTo(containedElement);\n *\n * // - Scroll to top of containedElement with a margin of 10px;\n * scrollableContentController.scrollTo(containedElement, 10);\n *\n * // - Scroll top by 200px;\n * scrollableContentController.scrollTo(200);\n * ```\n *\n * #### `ui-scroll-bottom/ui-scroll-top`\n *\n * You can use `ui-scroll-bottom/ui-scroll-top` directives handle that events and implement features like _infinite scroll_.\n *\n * ``` html\n *
    \n *
    \n *
      \n *
    • \n * {{item.name}}\n *
    • \n *
    \n *
    \n *
    \n * ```\n */\n(function() {\n 'use strict';\n var module = angular.module('mobile-angular-ui.components.scrollable',\n ['mobile-angular-ui.core.touchmoveDefaults']);\n\n var getTouchY = 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 e.clientY;\n };\n\n module.directive('scrollableContent', function() {\n return {\n restrict: 'C',\n controller: ['$element', '$document', 'allowTouchmoveDefault', function($element, $document, allowTouchmoveDefault) {\n var scrollableContent = $element[0];\n var scrollable = $element.parent()[0];\n\n // Handle nobounce behaviour\n if ('ontouchmove' in $document[0]) {\n var allowUp;\n var allowDown;\n var lastY;\n var setupTouchstart = function(event) {\n allowUp = (scrollableContent.scrollTop > 0);\n\n allowDown = (scrollableContent.scrollTop < scrollableContent.scrollHeight - scrollableContent.clientHeight);\n lastY = getTouchY(event);\n };\n\n $element.on('touchstart', setupTouchstart);\n $element.on('$destroy', function() {\n $element.off('touchstart');\n });\n\n allowTouchmoveDefault($element, function(event) {\n var currY = getTouchY(event);\n var up = (currY > lastY);\n var down = !up;\n lastY = currY;\n return (up && allowUp) || (down && allowDown);\n });\n }\n\n this.scrollableContent = scrollableContent;\n\n this.scrollTo = function(elementOrNumber, marginTop) {\n marginTop = marginTop || 0;\n\n if (angular.isNumber(elementOrNumber)) {\n scrollableContent.scrollTop = elementOrNumber - marginTop;\n } else {\n var target = angular.element(elementOrNumber)[0];\n if ((!target.offsetParent) || target.offsetParent === scrollable) {\n scrollableContent.scrollTop = target.offsetTop - marginTop;\n } else {\n // recursively subtract offsetTop from marginTop until it reaches scrollable element.\n this.scrollTo(target.offsetParent, marginTop - target.offsetTop);\n }\n }\n };\n }],\n link: function(scope, element) {\n if (overthrow.support !== 'native') {\n element.addClass('overthrow');\n overthrow.forget();\n overthrow.set();\n }\n }\n };\n });\n\n angular.forEach(['input', 'textarea'], function(directiveName) {\n module.directive(directiveName, ['$rootScope', '$timeout', function($rootScope, $timeout) {\n return {\n require: '?^^scrollableContent',\n link: function(scope, elem, attrs, scrollable) {\n // Workaround to avoid soft keyboard hiding inputs\n elem.on('focus', function() {\n if (scrollable && scrollable.scrollableContent) {\n var h1 = scrollable.scrollableContent.offsetHeight;\n $timeout(function() {\n var h2 = scrollable.scrollableContent.offsetHeight;\n //\n // if scrollableContent height is reduced in half second\n // since an input got focus we assume soft keyboard is showing.\n //\n if (h1 > h2) {\n var marginTop = 10;\n // if scrollableHeader is present increase the marginTop to compensate for scrollableHeader's height.\n var scrollableHeader = scrollable.scrollableContent.parentElement.querySelector('.scrollable-header');\n if (scrollableHeader) {\n marginTop = (scrollableHeader.getBoundingClientRect().bottom - scrollableHeader.getBoundingClientRect().top) + marginTop;\n }\n scrollable.scrollTo(elem, marginTop);\n }\n }, 500);\n }\n });\n }\n };\n }]);\n });\n\n /**\n * @directive uiScrollTop\n * @restrict A\n *\n * @param {expression} uiScrollTop The expression to be evaluated when scroll\n * reaches top of element.\n */\n\n /**\n * @directive uiScrollBottom\n * @restrict A\n *\n * @param {expression} uiScrollBottom The expression to be evaluated when scroll\n * reaches bottom of element.\n */\n angular.forEach(\n {\n uiScrollTop: function(elem) {\n return elem.scrollTop === 0;\n },\n uiScrollBottom: function(elem) {\n return elem.scrollHeight === elem.scrollTop + elem.clientHeight;\n }\n },\n function(reached, directiveName) {\n module.directive(directiveName, [function() {\n return {\n restrict: 'A',\n link: function(scope, elem, attrs) {\n elem.on('scroll', function() {\n /* If reached bottom */\n if (reached(elem[0])) {\n /* Do what is specified by onScrollBottom */\n scope.$apply(function() {\n scope.$eval(attrs[directiveName]);\n });\n }\n });\n }\n };\n }]);\n });\n\n /**\n * @directive uiScrollableHeader\n * @restrict C\n */\n\n /**\n * @directive uiScrollableFooter\n * @restrict C\n */\n angular.forEach({Top: 'scrollableHeader', Bottom: 'scrollableFooter'},\n function(directiveName, side) {\n module.directive(directiveName, [\n '$window',\n function($window) {\n return {\n restrict: 'C',\n link: function(scope, element) {\n var el = element[0];\n var parentStyle = element.parent()[0].style;\n\n var adjustParentPadding = function() {\n var styles = $window.getComputedStyle(el);\n var margin = parseInt(styles.marginTop, 10) + parseInt(styles.marginBottom, 10);\n parentStyle['padding' + side] = el.offsetHeight + margin + 'px';\n };\n\n var interval = setInterval(adjustParentPadding, 30);\n\n element.on('$destroy', function() {\n parentStyle['padding' + side] = null;\n clearInterval(interval);\n interval = adjustParentPadding = element = null;\n });\n }\n };\n }\n ]);\n });\n})();\n","/**\n * @module mobile-angular-ui.components.sidebars\n *\n * @description\n *\n * Sidebars can be placed either in left side or right side adding respectively\n * `.sidebar-left` and `.sidebar-right` classes.\n *\n * ``` html\n *
    \n *
    \n *

    My App

    \n *
    \n *
    \n * Link 1\n * \n * Link 2\n * \n *
    \n *
    \n *
    \n *
    \n *\n *
    \n * \n *
    \n * ```\n *\n * #### Interacting with sidebars\n *\n * Under the hood sidebar uses `SharedState` exposing respective statuses:\n * `uiSidebarLeft` and `uiSidebarRight` unless you define different state name\n * through `id` attribute on sidebar elements.\n *\n * ``` html\n * Toggle sidebar left\n *\n * Toggle sidebar right\n * ```\n *\n * You can put `ui-turn-off='uiSidebarLeft'` or `ui-turn-off='uiSidebarLeft'`\n * inside the sidebar to make it close after clicking links inside them.\n *\n * By default sidebar are closed by clicking/tapping outside them.\n */\n(function() {\n 'use strict';\n\n var module = angular.module(\n 'mobile-angular-ui.components.sidebars', [\n 'mobile-angular-ui.core.sharedState',\n 'mobile-angular-ui.core.outerClick'\n ]\n );\n\n angular.forEach(['left', 'right'], function(side) {\n var directiveName = 'sidebar' + side.charAt(0).toUpperCase() + side.slice(1);\n var defaultStateName = 'ui' + directiveName.charAt(0).toUpperCase() + directiveName.slice(1);\n\n module.directive(directiveName, [\n '$rootElement',\n 'SharedState',\n 'bindOuterClick',\n '$location',\n function(\n $rootElement,\n SharedState,\n bindOuterClick,\n $location\n ) {\n return {\n restrict: 'C',\n link: function(scope, elem, attrs) {\n var parentClass = 'has-sidebar-' + side;\n var visibleClass = 'sidebar-' + side + '-visible';\n var activeClass = 'sidebar-' + side + '-in';\n var stateName = attrs.id ? attrs.id : defaultStateName;\n var trackAsSearchParam = attrs.uiTrackAsSearchParam === '' || attrs.uiTrackAsSearchParam;\n\n var outerClickCb = function() {\n SharedState.turnOff(stateName);\n };\n\n var outerClickIf = function() {\n return SharedState.isActive(stateName);\n };\n\n $rootElement.addClass(parentClass);\n scope.$on('$destroy', function() {\n $rootElement\n .removeClass(parentClass);\n $rootElement\n .removeClass(visibleClass);\n $rootElement\n .removeClass(activeClass);\n });\n\n var defaultActive = attrs.active !== undefined && attrs.active !== 'false';\n SharedState.initialize(scope, stateName, {defaultValue: defaultActive});\n\n scope.$on('mobile-angular-ui.state.changed.' + stateName, function(e, active) {\n if (trackAsSearchParam) {\n $location.search(stateName, active || null);\n }\n\n if (active) {\n $rootElement\n .addClass(visibleClass);\n $rootElement\n .addClass(activeClass);\n } else {\n $rootElement\n .removeClass(activeClass);\n // Note: .removeClass(visibleClass) is called on 'mobile-angular-ui.app.transitionend'\n }\n });\n\n scope.$on('$routeChangeSuccess', function() {\n SharedState.turnOff(stateName);\n });\n\n scope.$on('$routeUpdate', function() {\n if (trackAsSearchParam) {\n if (($location.search())[stateName]) {\n SharedState.turnOn(stateName);\n } else {\n SharedState.turnOff(stateName);\n }\n }\n });\n\n scope.$on('mobile-angular-ui.app.transitionend', function() {\n if (!SharedState.isActive(stateName)) {\n $rootElement.removeClass(visibleClass);\n }\n });\n\n if (attrs.closeOnOuterClicks !== 'false') {\n bindOuterClick(scope, elem, outerClickCb, outerClickIf);\n }\n }\n };\n }\n ]);\n });\n\n module.directive('app', ['$rootScope', function($rootScope) {\n return {\n restrict: 'C',\n link: function(scope, element) {\n\n element.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend', function() {\n $rootScope.$broadcast('mobile-angular-ui.app.transitionend');\n });\n\n }\n };\n }]);\n})();\n","/**\n * A module with just a directive to create a switch input component.\n *\n * @module mobile-angular-ui.components.switch\n */\n(function() {\n 'use strict';\n angular.module('mobile-angular-ui.components.switch', [])\n\n /**\n * @directive uiSwitch\n * @restrict EA\n * @requires ngModel\n * @description\n *\n * The `ui-switch` directive (not to be confused with `ng-switch`) lets\n * you create a toggle switch control bound to a boolean `ngModel` value.\n *\n *
    \n * \"\"/\n *
    \n *\n * It requires `ngModel`. It supports `ngChange` and `ngDisabled`.\n *\n * ``` html\n * \n * ```\n *\n * ``` html\n * \n * ```\n *\n * ``` html\n * \n * ```\n *\n * Note that if `$drag` service from `mobile-angular-ui.gestures` is available\n * `ui-switch` will support drag too.\n *\n * @param {expression} ngModel The model bound to this component.\n * @param {boolean} [disabled] Whether this component should be disabled.\n * @param {expression} [ngChange] An expression to be evaluated when model changes.\n */\n .directive('uiSwitch', ['$injector', function($injector) {\n var $drag = $injector.has('$drag') && $injector.get('$drag');\n\n return {\n restrict: 'EA',\n scope: {\n model: '=ngModel',\n changeExpr: '@ngChange'\n },\n link: function(scope, elem, attrs) {\n elem.addClass('switch');\n\n var disabled = attrs.disabled || elem.attr('disabled');\n\n var unwatchDisabled = scope.$watch(\n function() {\n return attrs.disabled || elem.attr('disabled');\n },\n function(value) {\n if (!value || value === 'false' || value === '0') {\n disabled = false;\n } else {\n disabled = true;\n }\n }\n );\n\n var handle = angular.element('
    ');\n elem.append(handle);\n\n if (scope.model) {\n elem.addClass('active');\n }\n elem.addClass('switch-transition-enabled');\n\n var unwatch = scope.$watch('model', function(value) {\n if (value) {\n elem.addClass('active');\n } else {\n elem.removeClass('active');\n }\n });\n\n var setModel = function(value) {\n if (!disabled && (value !== scope.model)) {\n scope.model = value;\n scope.$apply();\n if (scope.changeExpr !== null && scope.changeExpr !== undefined) {\n scope.$parent.$eval(scope.changeExpr);\n }\n }\n };\n\n var clickCb = function() {\n setModel(!scope.model);\n };\n\n elem.on('click tap', clickCb);\n\n var unbind = angular.noop;\n\n if ($drag) {\n unbind = $drag.bind(handle, {\n transform: $drag.TRANSLATE_INSIDE(elem),\n start: function() {\n elem.off('click tap', clickCb);\n },\n cancel: function() {\n handle.removeAttr('style');\n elem.off('click tap', clickCb);\n elem.on('click tap', clickCb);\n },\n end: function() {\n var rh = handle[0].getBoundingClientRect();\n var re = elem[0].getBoundingClientRect();\n if (rh.left - re.left < rh.width / 3) {\n setModel(false);\n handle.removeAttr('style');\n } else if (re.right - rh.right < rh.width / 3) {\n setModel(true);\n handle.removeAttr('style');\n } else {\n handle.removeAttr('style');\n }\n elem.on('click tap', clickCb);\n }\n });\n }\n\n elem.on('$destroy', function() {\n unbind();\n unwatchDisabled();\n unwatch();\n setModel = unbind = unwatch = unwatchDisabled = clickCb = null;\n });\n }\n };\n }]);\n})();\n","/**\n * @module mobile-angular-ui.components\n *\n * @description\n *\n * It has directives and services providing mobile friendly\n * components like navbars and sidebars.\n * It requires `mobile-angular-ui.base.css`\n * in order to work properly.\n *\n * ## Standalone Usage\n *\n * Although `.components` module is required by `mobile-angular-ui` by default\n * you can use it alone. Some submodules requires `mobile-angular-ui.core` to work,\n * so be sure its sources are available.\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui.components']);\n * ```\n *\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui.components', [\n 'mobile-angular-ui.components.modals',\n 'mobile-angular-ui.components.navbars',\n 'mobile-angular-ui.components.sidebars',\n 'mobile-angular-ui.components.scrollable',\n 'mobile-angular-ui.components.switch'\n ]);\n})();\n","/**\n * @module mobile-angular-ui\n * @position 0\n * @description\n *\n * This is the main angular module of `mobile-angular-ui` framework.\n *\n * By requiring this module you will have all `mobile-angular-ui.core`\n * and `mobile-angular-ui.components` features required as well.\n *\n * ## Usage\n *\n * Declare it as a dependency for your application:\n *\n * ``` js\n * angular.module('myApp', ['mobile-angular-ui']);\n * ```\n */\n(function() {\n 'use strict';\n\n angular.module('mobile-angular-ui', [\n 'mobile-angular-ui.core',\n 'mobile-angular-ui.components'\n ]);\n\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["fastclick.js","activeLinks.js","capture.js","outerClick.js","sharedState.js","touchmoveDefaults.js","mobile-angular-ui.core.js","overthrow-detect.js","overthrow-init.js","overthrow-polyfill.js","modals.js","navbars.js","scrollable.js","sidebars.js","switch.js","mobile-angular-ui.components.js","mobile-angular-ui.js"],"names":["FastClick","layer","options","bind","method","context","apply","arguments","oldOnClick","this","trackingClick","trackingClickStart","targetElement","touchStartX","touchStartY","lastTouchIdentifier","touchBoundary","tapDelay","tapTimeout","notNeeded","methods","i","l","length","deviceIsAndroid","addEventListener","onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","Event","prototype","stopImmediatePropagation","removeEventListener","type","callback","capture","rmv","Node","call","hijacked","adv","event","propagationStopped","onclick","deviceIsWindowsPhone","navigator","userAgent","indexOf","deviceIsIOS","test","deviceIsIOS4","deviceIsIOSWithBadTarget","deviceIsBlackBerry10","needsClick","target","nodeName","toLowerCase","disabled","className","needsFocus","readOnly","sendClick","clickEvent","touch","document","activeElement","blur","changedTouches","createEvent","initMouseEvent","determineEventType","window","screenX","screenY","clientX","clientY","forwardedTouchEvent","dispatchEvent","tagName","focus","setSelectionRange","value","updateScrollParent","scrollParent","parentElement","fastClickScrollParent","contains","scrollHeight","offsetHeight","fastClickLastScrollTop","scrollTop","getTargetElementFromEventTarget","eventTarget","nodeType","TEXT_NODE","parentNode","selection","targetTouches","getSelection","rangeCount","isCollapsed","identifier","preventDefault","timeStamp","pageX","pageY","lastClickTime","touchHasMoved","boundary","Math","abs","findControl","labelElement","undefined","control","htmlFor","getElementById","querySelector","forElement","targetTagName","cancelNextClick","elementFromPoint","pageXOffset","pageYOffset","top","cancelable","stopPropagation","permitted","detail","destroy","metaViewport","chromeVersion","blackberryVersion","firefoxVersion","ontouchstart","exec","content","documentElement","scrollWidth","outerWidth","match","style","msTouchAction","touchAction","attach","define","amd","module","exports","angular","provider","$locationProvider","$get","$document","$location","currentPath","path","links","link","element","href","attr","removeClass","html5Mode","enabled","linkPrefix","hashPrefix","slice","charAt","split","addClass","run","$rootScope","setupActiveLinks","$on","Capture","resetAll","factory","$compile","yielders","name","hasOwnProperty","resetYielder","b","setContentFor","defaultContent","defaultScope","putYielder","yielder","getYielder","removeYielder","scope","html","contents","directive","compile","tElem","tAttrs","rawContent","uiDuplicate","remove","elem","attrs","uiContentFor","uiYieldTo","on","Error","$window","orgHandler","body","forEach","directiveName","restrict","parent","$timeout","isAncestorOrSelf","outerClickFn","outerClickIf","handleOuterClick","$apply","$event","stopWatching","noop","t","$watch","cancel","unbind","bindOuterClick","$parse","uiOuterClick","uiOuterClickIf","$log","values","statusesMeta","scopes","exclusionGroups","initialize","id","isNewScope","defaultValue","exclusionGroup","$id","push","references","extend","$broadcast","setOne","ids","status","Object","keys","prev","warn","setMany","map","set","idOrMap","isObject","turnOn","eg","egStatuses","item","turnOff","toggle","get","isActive","Boolean","active","isUndefined","has","referenceCount","equals","eq","uiBindEvent","eventNames","fn","SharedState","priority","uiSharedState","defaultValueExpr","uiDefault","$eval","uiExclusionGroup","uiState","methodName","toUpperCase","$interpolate","needsInterpolation","exprFn","$scope","res","interpolateFn","arg","uiTriggers","parseScopeContext","vars","trim","mixScopeContext","scopeVars","key","alias","reduce","nextKey","parseUiCondition","expr","parseFn","uiScopeContext","$animate","getBlockNodes","nodes","node","endNode","blockNodes","nextSibling","multiElement","transclude","terminal","$$tlb","$element","$attr","ctrl","$transclude","block","childScope","previousElements","uiIfFn","clone","newScope","createComment","uiIf","enter","$destroy","done","nga","leave","then","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","uiHideFn","tempClasses","uiShowFn","uiClassFn","classesToAdd","classesToRemove","Ui","preventTouchmoveDefaultsCb","e","allowTouchmoveEventFlag","originalEvent","allowTouchmoveDefault","fnTrue","condition","allowTouchmoveDefaultCallback","off","w","doc","docElem","enabledClassName","canBeFilledWithPoly","nativeOverflow","screen","width","ua","webkit","wkversion","wkLte534","RegExp","$1","blackberry","parseFloat","overthrow","replace","forget","support","o","scrollIndicatorClassName","configure","closest","ascend","start","lastDown","lastRight","inputs","lastTops","lastLefts","resetVertTracking","resetHorTracking","setPointers","val","querySelectorAll","il","pointerEvents","changeScrollTarget","startEvent","tEnd","newTarget","touchchild","initEvent","intercept","touches","touchStartE","scrollT","scrollL","scrollLeft","height","offsetWidth","startY","startX","move","ty","tx","down","right","unshift","pop","end","setTimeout","$rootElement","hasClass","side","getTouchY","controller","scrollableContent","scrollable","allowUp","allowDown","lastY","setupTouchstart","clientHeight","currY","up","scrollTo","elementOrNumber","marginTop","isNumber","offsetParent","offsetTop","require","h1","h2","scrollableHeader","getBoundingClientRect","bottom","uiScrollTop","uiScrollBottom","reached","Top","Bottom","el","parentStyle","adjustParentPadding","styles","getComputedStyle","margin","parseInt","marginBottom","interval","setInterval","clearInterval","defaultStateName","parentClass","visibleClass","activeClass","stateName","trackAsSearchParam","uiTrackAsSearchParam","outerClickCb","defaultActive","search","closeOnOuterClicks","$injector","$drag","model","changeExpr","unwatchDisabled","handle","append","unwatch","setModel","$parent","clickCb","transform","TRANSLATE_INSIDE","removeAttr","rh","re","left"],"mappings":"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","file":"mobile-angular-ui.min.js","sourcesContent":["if (typeof FastClick === 'undefined') {\n throw new Error('mobile-angular-ui\\'s JavaScript requires FastClick')\n}\n\n(function(FastClick) {\n 'use strict';\n var module = angular.module('mobile-angular-ui.core.fastclick', []);\n\n module.run(['$window', function($window) {\n\n // Temporarly bugfix in overthrow/fastclick:\n var orgHandler = FastClick.prototype.onTouchEnd;\n\n // Some old versions of Android don't have Function.prototype.bind\n function bind(method, context) {\n return function() {\n return method.apply(context, arguments);\n };\n }\n\n FastClick.prototype.onTouchEnd = function(event) {\n\n if (!event.changedTouches) {\n event.changedTouches = [{}];\n }\n\n orgHandler = bind(orgHandler, this);\n orgHandler(event);\n };\n\n FastClick.attach($window.document.body);\n\n }]);\n\n angular.forEach(['select', 'input', 'textarea'], function(directiveName) {\n\n module.directive(directiveName, function() {\n return {\n restrict: 'E',\n compile: function(elem) {\n elem.addClass('needsclick');\n }\n };\n });\n });\n})(FastClick);\n","/**\r\n * @module mobile-angular-ui.core.activeLinks\r\n * @description\r\n *\r\n * `mobile-angular-ui.activeLinks` module sets up `.active` class for `a`\r\n * elements those `href` attribute matches the current angular `$location` url.\r\n * It takes care of excluding both search part and hash part from comparison.\r\n *\r\n * `.active` classes are added/removed each time one of `$locationChangeSuccess`\r\n * or `$includeContentLoaded` is fired.\r\n *\r\n * ## Usage\r\n *\r\n * Just declare it as a dependency to your app unless you have already included\r\n * one of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.activeLinks']);\r\n * ```\r\n *\r\n * **NOTE:** if you are using it without Bootstrap you may need to add some css\r\n * to your stylesheets to reflect the activation state of links. I.e.\r\n *\r\n * ``` css\r\n * a.active {\r\n * color: blue;\r\n * }\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.activeLinks', [])\r\n .provider('setupActiveLinks', ['$locationProvider', function($locationProvider) {\r\n this.$get = [\r\n '$document',\r\n '$location',\r\n function($document, $location) {\r\n return function() {\r\n var currentPath = $location.path();\r\n var links = $document[0].links;\r\n\r\n for (var i = 0; i < links.length; i++) {\r\n var link = angular.element(links[i]);\r\n var href = link.attr('href');\r\n\r\n if (!href) {\r\n return link.removeClass('active');\r\n }\r\n\r\n var html5Mode = $locationProvider.html5Mode().enabled;\r\n if (!html5Mode) {\r\n var linkPrefix = '#' + $locationProvider.hashPrefix();\r\n if (href.slice(0, linkPrefix.length) === linkPrefix) {\r\n href = href.slice(linkPrefix.length);\r\n } else {\r\n return link.removeClass('active');\r\n }\r\n }\r\n\r\n if (href.charAt(0) !== '/') {\r\n return link.removeClass('active');\r\n }\r\n\r\n href = href.split('#')[0].split('?')[0];\r\n\r\n if (href === currentPath) {\r\n link.addClass('active');\r\n } else {\r\n link.removeClass('active');\r\n }\r\n }\r\n };\r\n }];\r\n }])\r\n .run(['$rootScope', 'setupActiveLinks', function($rootScope, setupActiveLinks) {\r\n $rootScope.$on('$locationChangeSuccess', setupActiveLinks);\r\n $rootScope.$on('$includeContentLoaded', setupActiveLinks);\r\n }]);\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.core.capture\r\n * @description\r\n *\r\n * The `capture` module exposes directives to var you extract markup which can\r\n * be used in other parts of a template using `uiContentFor` and `uiYieldTo`\r\n * directives.\r\n *\r\n * It provides a way to move or clone a block of markup to other parts of the document.\r\n *\r\n * This method is particularly useful to setup parts of the layout within an\r\n * angular view. Since blocks of html are transplanted within their original\r\n * `$scope` is easy to create layout interactions depending on the context.\r\n * Some tipical task you can accomplish with these directives are: _setup\r\n * the navbar title depending on the view_ or _place a submit button for a\r\n * form inside a navbar_.\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already included some\r\n * of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.capture']);\r\n * ```\r\n *\r\n * Use `ui-yield-to` as a placeholder.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *
    \r\n * Default Title\r\n *
    \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n *\r\n * Use `ui-content-for` inside any view to populate the `ui-yield-to` content.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n * My View Title\r\n *
    \r\n * ```\r\n *\r\n * Since the original scope is preserved you can use directives inside\r\n * `ui-content-for` blocks to interact with the current scope. In the following\r\n * example we will add a navbar button to submit a form inside a nested view.\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n *\r\n * ``` html\r\n * \r\n *\r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * ```\r\n *\r\n * ``` javascript\r\n * app.controller('newCustomerController', function($scope, Store){\r\n * $scope.customer = {};\r\n * $scope.createCustomer = function(){\r\n * Store.create($scope.customer);\r\n * // ...\r\n * }\r\n * });\r\n * ```\r\n *\r\n * If you wish you can also duplicate markup instead of move it. Just add `duplicate` parameter to `uiContentFor` directive to specify this behaviour.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.capture', [])\r\n\r\n .run([\r\n 'Capture',\r\n '$rootScope',\r\n function(Capture, $rootScope) {\r\n $rootScope.$on('$routeChangeSuccess', function() {\r\n Capture.resetAll();\r\n });\r\n }\r\n ])\r\n\r\n .factory('Capture', [\r\n '$compile',\r\n function($compile) {\r\n var yielders = {};\r\n\r\n return {\r\n yielders: yielders,\r\n\r\n resetAll: function() {\r\n for (var name in yielders) {\r\n if (yielders.hasOwnProperty(name)) {\r\n this.resetYielder(name);\r\n }\r\n }\r\n },\r\n\r\n resetYielder: function(name) {\r\n var b = yielders[name];\r\n this.setContentFor(name, b.defaultContent, b.defaultScope);\r\n },\r\n\r\n putYielder: function(name, element, defaultScope, defaultContent) {\r\n var yielder = {};\r\n yielder.name = name;\r\n yielder.element = element;\r\n yielder.defaultContent = defaultContent || '';\r\n yielder.defaultScope = defaultScope;\r\n yielders[name] = yielder;\r\n },\r\n\r\n getYielder: function(name) {\r\n return yielders[name];\r\n },\r\n\r\n removeYielder: function(name) {\r\n delete yielders[name];\r\n },\r\n\r\n setContentFor: function(name, content, scope) {\r\n var b = yielders[name];\r\n if (!b) {\r\n return;\r\n }\r\n b.element.html(content);\r\n $compile(b.element.contents())(scope);\r\n }\r\n\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive uiContentFor\r\n * @restrict A\r\n * @description\r\n *\r\n * `ui-content-for` makes inner contents to replace the corresponding\r\n * `ui-yield-to` placeholder contents.\r\n *\r\n * `uiContentFor` is intended to be used inside a view in order to populate outer placeholders.\r\n * Any content you send to placeholders via `ui-content-for` is\r\n * reverted to placeholder defaults after view changes (ie. on `$routeChangeStart`).\r\n *\r\n * @param {string} uiContentFor The id of the placeholder to be replaced\r\n * @param {boolean} uiDuplicate If present duplicates the content instead of moving it (default to `false`)\r\n *\r\n */\r\n .directive('uiContentFor', [\r\n 'Capture',\r\n function(Capture) {\r\n return {\r\n compile: function(tElem, tAttrs) {\r\n var rawContent = tElem.html();\r\n if (tAttrs.uiDuplicate === null || tAttrs.uiDuplicate === undefined) {\r\n // no need to compile anything!\r\n tElem.html('');\r\n tElem.remove();\r\n }\r\n return function(scope, elem, attrs) {\r\n Capture.setContentFor(attrs.uiContentFor, rawContent, scope);\r\n };\r\n }\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive uiYieldTo\r\n * @restrict A\r\n * @description\r\n *\r\n * `ui-yield-to` defines a placeholder which contents will be further replaced by `ui-content-for` directive.\r\n *\r\n * Inner html is considered to be a default. Default is restored any time `$routeChangeStart` happens.\r\n *\r\n * @param {string} uiYieldTo The unique id of this placeholder.\r\n *\r\n */\r\n .directive('uiYieldTo', [\r\n '$compile', 'Capture', function($compile, Capture) {\r\n return {\r\n link: function(scope, element, attr) {\r\n Capture.putYielder(attr.uiYieldTo, element, scope, element.html());\r\n\r\n element.on('$destroy', function() {\r\n Capture.removeYielder(attr.uiYieldTo);\r\n });\r\n\r\n scope.$on('$destroy', function() {\r\n Capture.removeYielder(attr.uiYieldTo);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n})();\r\n","/**\r\n *\r\n * @module mobile-angular-ui.core.outerClick\r\n * @description\r\n *\r\n * Provides a directive to specifiy a behaviour when click/tap events\r\n * happen outside an element. This can be easily used\r\n * to implement eg. __close on outer click__ feature for a dropdown.\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already\r\n * included some of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core']);\r\n * ```\r\n *\r\n * Or\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.outerClick']);\r\n * ```\r\n *\r\n * Use `ui-outer-click` to define an expression to evaluate when an _Outer Click_ event happens.\r\n * Use `ui-outer-click-if` parameter to define a condition to enable/disable the listener.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n * \r\n * \r\n * \r\n *\r\n *
  • Action
  • \r\n *
  • Another action
  • \r\n *
  • Something else here
  • \r\n *
  • \r\n *
  • Separated link
  • \r\n * \r\n *
    \r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.core.outerClick', [])\r\n\r\n .factory('_mauiIsAncestorOrSelf', function() {\r\n return function(element, target) {\r\n var parent = element;\r\n while (parent.length > 0) {\r\n if (parent[0] === target[0]) {\r\n parent = null;\r\n return true;\r\n }\r\n parent = parent.parent();\r\n }\r\n parent = null;\r\n return false;\r\n };\r\n })\r\n\r\n /**\r\n * @service bindOuterClick\r\n * @as function\r\n *\r\n * @description\r\n * This is a service function that binds a callback to be conditionally executed\r\n * when a click event happens outside a specified element.\r\n *\r\n * Ie.\r\n *\r\n * ``` js\r\n * app.directive('myDirective', function('bindOuterClick'){\r\n * return {\r\n * link: function(scope, element) {\r\n * bindOuterClick(element, function(scope, extra){\r\n * alert('You clicked ouside me!');\r\n * }, function(e){\r\n * return element.hasClass('disabled') ? true : false;\r\n * });\r\n * }\r\n * };\r\n * });\r\n * ```\r\n * @scope {scope} the scope to eval callbacks\r\n * @param {DomElement|$element} element The element to bind to.\r\n * @param {function} callback A `function(scope, options)`, usually the result of `$parse`, that is called when an _outer click_ event happens.\r\n * @param {string|function} condition Angular `$watch` expression to decide whether to run `callback` or not.\r\n */\r\n .factory('bindOuterClick', [\r\n '$document',\r\n '$timeout',\r\n '_mauiIsAncestorOrSelf',\r\n function($document, $timeout, isAncestorOrSelf) {\r\n\r\n return function(scope, element, outerClickFn, outerClickIf) {\r\n var handleOuterClick = function(event) {\r\n if (!isAncestorOrSelf(angular.element(event.target), element)) {\r\n scope.$apply(function() {\r\n outerClickFn(scope, {$event: event});\r\n });\r\n }\r\n };\r\n\r\n var stopWatching = angular.noop;\r\n var t = null;\r\n\r\n if (outerClickIf) {\r\n stopWatching = scope.$watch(outerClickIf, function(value) {\r\n $timeout.cancel(t);\r\n\r\n if (value) {\r\n // prevents race conditions\r\n // activating with other click events\r\n t = $timeout(function() {\r\n $document.on('click tap', handleOuterClick);\r\n }, 0);\r\n\r\n } else {\r\n $document.unbind('click tap', handleOuterClick);\r\n }\r\n });\r\n } else {\r\n $timeout.cancel(t);\r\n $document.on('click tap', handleOuterClick);\r\n }\r\n\r\n scope.$on('$destroy', function() {\r\n stopWatching();\r\n $document.unbind('click tap', handleOuterClick);\r\n });\r\n };\r\n }\r\n ])\r\n\r\n /**\r\n * @directive outerClick\r\n *\r\n * @description\r\n * Evaluates an expression when an _Outer Click_ event happens.\r\n *\r\n * @param {expression} uiOuterClick Expression to evaluate when an _Outer Click_ event happens.\r\n * @param {expression} uiOuterClickIf Condition to enable/disable the listener. Defaults to `true`.\r\n */\r\n .directive('uiOuterClick', [\r\n 'bindOuterClick',\r\n '$parse',\r\n function(bindOuterClick, $parse) {\r\n return {\r\n restrict: 'A',\r\n compile: function(elem, attrs) {\r\n var outerClickFn = $parse(attrs.uiOuterClick);\r\n var outerClickIf = attrs.uiOuterClickIf;\r\n return function(scope, elem) {\r\n bindOuterClick(scope, elem, outerClickFn, outerClickIf);\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n})();\r\n","(function() {\r\n 'use strict';\r\n /**\r\n * @module mobile-angular-ui.core.sharedState\r\n *\r\n * @description\r\n * `mobile-angular-ui.core.sharedState` is expose the homonymous service\r\n * `SharedState` and a group of directives to access it.\r\n *\r\n * `SharedState` allows to use elementary angular or angularish directives\r\n * to create interactive components.\r\n *\r\n * Ie.\r\n *\r\n * ``` html\r\n *
    \r\n * Tab1\r\n * Tab2\r\n * Tab3\r\n *
    \r\n *
    \r\n *
    Tab1
    \r\n *
    Tab2
    \r\n *
    Tab3
    \r\n *
    \r\n * ```\r\n *\r\n * Using `SharedState` you will be able to:\r\n *\r\n * - Create interactive components without having to write javascript code\r\n * - Have your controller free from UI logic\r\n * - Separe `ng-click` triggering application logic from those having a visual effect only\r\n * - Export state of components to urls\r\n * - Easily make components comunicate each other\r\n *\r\n * Also note that:\r\n *\r\n * Data structures retaining statuses will stay outside angular scopes\r\n * thus they are not evaluated against digest cycle until its necessary.\r\n * Also although statuses are sort of global variables `SharedState` will\r\n * take care of disposing them when no scopes are requiring them anymore.\r\n *\r\n * A set of `ui-*` directives are available to interact with `SharedState`\r\n * module and will hopefully var you spare your controllers and your time\r\n * for something that is more meaningful than this:\r\n *\r\n * ``` js\r\n * $scope.activeTab = 1;\r\n *\r\n * $scope.setActiveTab = function(n) {\r\n * $scope.activeTab = n;\r\n * };\r\n * ```\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency to your app unless you have already included some\r\n * of its super-modules.\r\n *\r\n * ```\r\n * angular.module('myApp', ['mobile-angular-ui.core.sharedState']);\r\n * ```\r\n *\r\n * Use `ui-shared-state` directive to require/initialize a state from the target element scope\r\n *\r\n * **Example.** Tabs\r\n *\r\n * \r\n *\r\n * **Example.** Custom components\r\n *\r\n * \r\n *\r\n * NOTE: `ui-toggle/set/turnOn/turnOff` responds to `click/tap` without\r\n * stopping propagation so you can use them along with ng-click too.\r\n * You can also change events to respond to with `ui-triggers` attribute.\r\n *\r\n * Any `SharedState` method is exposed through `Ui` object in `$rootScope`.\r\n * So you could always do `ng-click=\"Ui.turnOn('myVar')\"`.\r\n *\r\n * Since `SharedState` is a service you can initialize/set statuses through\r\n * controllers too:\r\n *\r\n * ``` js\r\n * app.controller('myController', function($scope, SharedState){\r\n * SharedState.initialize($scope, \"activeTab\", 3);\r\n * });\r\n * ```\r\n *\r\n * As well as you can use `ui-default` for that:\r\n *\r\n * ``` html\r\n *
    \r\n * ```\r\n *\r\n */\r\n var module = angular.module('mobile-angular-ui.core.sharedState', []);\r\n\r\n /**\r\n * @ngdoc service\r\n * @class SharedState\r\n *\r\n * @description\r\n *\r\n * A `SharedState` state can be considered as a global variable identified by an `id`.\r\n *\r\n * `SharedState` service exposes methods to interact with statuses to create,\r\n * read and update states.\r\n *\r\n * It acts as a BUS between UI elements to share UI related state that is\r\n * automatically disposed when all scopes requiring it are destroyed.\r\n *\r\n * eg.\r\n *\r\n * ``` js\r\n * app.controller('controller1', function($scope, SharedState){\r\n * SharedState.initialize($scope, 'myId');\r\n * });\r\n *\r\n * app.controller('controller2', function(SharedState){\r\n * SharedState.toggle('myId');\r\n * });\r\n * ```\r\n *\r\n * Data structures retaining statuses will stay outside angular scopes thus\r\n * they are not evaluated against digest cycle until its necessary. Also\r\n * although statuses are sort of global variables `SharedState` will take\r\n * care of disposing them when no scopes are requiring them anymore.\r\n *\r\n * A set of `ui-*` directives are available to interact with `SharedState`\r\n * module and will hopefully var you spare your controllers and your time for\r\n * something that is more meaningful than this:\r\n *\r\n * ``` js\r\n * $scope.activeTab = 1;\r\n *\r\n * $scope.setActiveTab = function(n) {\r\n * $scope.activeTab = n;\r\n * };\r\n * ```\r\n *\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.initialized.ID'\r\n * @shortname initialized\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` when `#initialize` is called for a new state not\r\n * referenced by any scope currently.\r\n *\r\n * @param {any} currentValue The value with which this state has been initialized\r\n *\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.destroyed.ID'\r\n * @shortname destroyed\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` when a state is destroyed.\r\n *\r\n */\r\n\r\n /**\r\n * @event 'mobile-angular-ui.state.changed.ID'\r\n * @shortname changed\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Broadcasted on `$rootScope` the value of a state changes.\r\n *\r\n * ``` js\r\n * $scope.$on('mobile-angular-ui.state.changed.uiSidebarLeft', function(e, newVal, oldVal) {\r\n * if (newVal === true) {\r\n * console.log('sidebar opened');\r\n * } else {\r\n * console.log('sidebar closed');\r\n * }\r\n * });\r\n * ```\r\n *\r\n * @param {any} newValue\r\n * @param {any} oldValue\r\n *\r\n */\r\n\r\n module.factory('SharedState', [\r\n '$rootScope', '$log',\r\n function($rootScope, $log) {\r\n var values = {}; // values, context object for evals\r\n var statusesMeta = {}; // status info\r\n var scopes = {}; // scopes references\r\n var exclusionGroups = {}; // support exclusive boolean sets\r\n\r\n return {\r\n /**\r\n * @function initialize\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Initialize, or require if already intialized, a state identified by `id` within the provided `scope`, making it available to the rest of application.\r\n *\r\n * A `SharedState` is bound to one or more scopes. Each time\r\n * `initialize` is called for an angular `scope` this will be bound to\r\n * the `SharedState` and a reference count is incremented to allow\r\n * garbage collection.\r\n *\r\n * Reference count is decremented once the scope is destroyed. When the counter reach 0 the state will be disposed.\r\n *\r\n * @param {scope} scope The scope to bound this state\r\n * @param {string} id The unique name of this state\r\n * @param {object} [options] Options\r\n * @param {object} [options.defaultValue] the initialization value, it is taken into account only if the state `id` is not already initialized\r\n * @param {string} [options.exclusionGroup] Specifies an exclusion group\r\n * for the state. This means that for boolean operations (ie. toggle,\r\n * turnOn, turnOf) when this state is set to `true`, any other state\r\n * that is in the same `exclusionGroup` will be set to `false`.\r\n */\r\n initialize: function(scope, id, options) {\r\n options = options || {};\r\n\r\n var isNewScope = scopes[scope] === undefined;\r\n var defaultValue = options.defaultValue;\r\n var exclusionGroup = options.exclusionGroup;\r\n\r\n scopes[scope.$id] = scopes[scope.$id] || [];\r\n scopes[scope.$id].push(id);\r\n\r\n if (!statusesMeta[id]) { // is a brand new state\r\n // not referenced by any\r\n // scope currently\r\n\r\n statusesMeta[id] = angular.extend({}, options, {references: 1});\r\n\r\n $rootScope.$broadcast('mobile-angular-ui.state.initialized.' + id, defaultValue);\r\n\r\n if (defaultValue !== undefined) {\r\n this.setOne(id, defaultValue);\r\n }\r\n\r\n if (exclusionGroup) {\r\n // Exclusion groups are sets of statuses references\r\n exclusionGroups[exclusionGroup] = exclusionGroups[exclusionGroup] || {};\r\n exclusionGroups[exclusionGroup][id] = true;\r\n }\r\n\r\n } else if (isNewScope) { // is a new reference from\r\n // a different scope\r\n statusesMeta[id].references++;\r\n }\r\n scope.$on('$destroy', function() {\r\n var ids = scopes[scope.$id] || [];\r\n for (var i = 0; i < ids.length; i++) {\r\n var status = statusesMeta[ids[i]];\r\n\r\n if (status.exclusionGroup) {\r\n delete exclusionGroups[status.exclusionGroup][ids[i]];\r\n if (Object.keys(exclusionGroups[status.exclusionGroup]).length === 0) {\r\n delete exclusionGroups[status.exclusionGroup];\r\n }\r\n }\r\n\r\n status.references--;\r\n if (status.references <= 0) {\r\n delete statusesMeta[ids[i]];\r\n delete values[ids[i]];\r\n $rootScope.$broadcast('mobile-angular-ui.state.destroyed.' + id);\r\n }\r\n }\r\n delete scopes[scope.$id];\r\n });\r\n },\r\n\r\n /**\r\n * @function setOne\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Set the value of the state identified by `id` to the `value` parameter.\r\n *\r\n * @param {string} id Unique identifier for state\r\n * @param {any} value New value for this state\r\n */\r\n setOne: function(id, value) {\r\n if (statusesMeta[id] !== undefined) {\r\n var prev = values[id];\r\n values[id] = value;\r\n if (prev !== value) {\r\n $rootScope.$broadcast('mobile-angular-ui.state.changed.' + id, value, prev);\r\n }\r\n return value;\r\n }\r\n $log.warn('Warning: Attempt to set uninitialized shared state: ' + id);\r\n },\r\n\r\n /**\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @function setMany\r\n * @description\r\n *\r\n * Set multiple statuses at once. ie.\r\n *\r\n * ```\r\n * SharedState.setMany({ activeTab: 'firstTab', sidebarIn: false });\r\n * ```\r\n *\r\n * @param {object} object An object of the form `{state1: value1, ..., stateN: valueN}`\r\n */\r\n setMany: function(map) {\r\n angular.forEach(map, function(value, id) {\r\n this.setOne(id, value);\r\n }, this);\r\n },\r\n\r\n /**\r\n * @function set\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * A shorthand for both `setOne` and `setMany`.\r\n * When called with only one parameter that is an object\r\n * it is the same of `setMany`, otherwise is the\r\n * same of `setOne`.\r\n *\r\n * @param {string|object} idOrMap A state id or a `{state: value}` map object.\r\n * @param {any} [value] The value to assign in case idOrMap is a string.\r\n */\r\n set: function(idOrMap, value) {\r\n if (!idOrMap) {\r\n return;\r\n } else if (angular.isObject(idOrMap)) {\r\n this.setMany(idOrMap);\r\n } else {\r\n this.setOne(idOrMap, value);\r\n }\r\n },\r\n\r\n /**\r\n * @function turnOn\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Set shared state identified by `id` to `true`. If the\r\n * shared state has been initialized with `exclusionGroup`\r\n * option it will also turn off (set to `false`) all other\r\n * statuses from the same exclusion group.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n turnOn: function(id) {\r\n // Turns off other statuses belonging to the same exclusion group.\r\n var eg = statusesMeta[id] && statusesMeta[id].exclusionGroup;\r\n if (eg) {\r\n var egStatuses = Object.keys(exclusionGroups[eg]);\r\n for (var i = 0; i < egStatuses.length; i++) {\r\n var item = egStatuses[i];\r\n if (item !== id) {\r\n this.turnOff(item);\r\n }\r\n }\r\n }\r\n return this.setOne(id, true);\r\n },\r\n\r\n /**\r\n * @function turnOff\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Set shared state identified by `id` to `false`.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n turnOff: function(id) {\r\n return this.setOne(id, false);\r\n },\r\n\r\n /**\r\n * @function toggle\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * If current value for shared state identified by `id` evaluates\r\n * to `true` it calls `turnOff` on it otherwise calls `turnOn`.\r\n * Be aware that it will take into account `exclusionGroup` option.\r\n * See `#turnOn` and `#initialize` for more.\r\n *\r\n * @param {string} id The unique name of this state\r\n */\r\n toggle: function(id) {\r\n return this.get(id) ? this.turnOff(id) : this.turnOn(id);\r\n },\r\n\r\n /**\r\n * @function get\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n *\r\n * @description\r\n * Returns the current value of the state identified by `id`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {any}\r\n */\r\n get: function(id) {\r\n return statusesMeta[id] && values[id];\r\n },\r\n\r\n /**\r\n * @function isActive\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Return `true` if the boolean conversion of `#get(id)` evaluates to `true`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n isActive: function(id) {\r\n return Boolean(this.get(id));\r\n },\r\n\r\n /**\r\n * @function active\r\n * @alias mobile-angular-ui.core.sharedState~SharedState.isActive\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Alias for `#isActive`.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n active: function(id) {\r\n return this.isActive(id);\r\n },\r\n\r\n /**\r\n * @function isUndefined\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @description\r\n *\r\n * Return `true` if state identified by `id` is not defined.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n */\r\n isUndefined: function(id) {\r\n return statusesMeta[id] === undefined || this.get(id) === undefined;\r\n },\r\n\r\n /**\r\n * Returns `true` if state identified by `id` exsists.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {bool}\r\n *\r\n * @function has\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n has: function(id) {\r\n return statusesMeta[id] !== undefined;\r\n },\r\n\r\n /**\r\n * Returns the number of references of a status.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @returns {integer}\r\n *\r\n * @function referenceCount\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n referenceCount: function(id) {\r\n var status = statusesMeta[id];\r\n return status === undefined ? 0 : status.references;\r\n },\r\n\r\n /**\r\n * Returns `true` if `#get(id)` is exactly equal (`===`) to `value` param.\r\n *\r\n * @param {string} id The unique name of this state\r\n * @param {any} value The value for comparison\r\n * @returns {bool}\r\n *\r\n * @function equals\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n equals: function(id, value) {\r\n return this.get(id) === value;\r\n },\r\n\r\n /**\r\n * Alias for `#equals`\r\n *\r\n * @param {string} id The unique name of this state\r\n * @param {any} value The value for comparison\r\n * @returns {bool}\r\n *\r\n * @function eq\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n * @alias mobile-angular-ui.core.sharedState~SharedState.equals\r\n */\r\n eq: function(id, value) {\r\n return this.equals(id, value);\r\n },\r\n\r\n /**\r\n * Returns an object with all the status values currently stored.\r\n * It has the form of `{statusId: statusValue}`.\r\n *\r\n * Bear in mind that in order to spare resources it currently\r\n * returns just the internal object retaining statuses values.\r\n * Thus it is not intended to be modified and direct changes to it will be not tracked or notified.\r\n *\r\n * Just clone before apply any change to it.\r\n *\r\n * @returns {object}\r\n *\r\n * @function values\r\n * @memberOf mobile-angular-ui.core.sharedState~SharedState\r\n */\r\n values: function() {\r\n return values;\r\n },\r\n\r\n exclusionGroups: function() {\r\n return exclusionGroups;\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n var uiBindEvent = function(scope, element, eventNames, fn) {\r\n eventNames = eventNames || 'click tap';\r\n element.on(eventNames, function(event) {\r\n scope.$apply(function() {\r\n fn(scope, {$event: event});\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Calls `SharedState#initialize` on the scope relative to the element using it.\r\n *\r\n * @param {string} uiState The shared state id\r\n * @param {expression} [uiDefault] the default value\r\n *\r\n * @directive uiSharedState\r\n */\r\n module.directive('uiSharedState', [\r\n 'SharedState', function(SharedState) {\r\n return {\r\n restrict: 'EA',\r\n priority: 601, // more than ng-if\r\n link: function(scope, elem, attrs) {\r\n var id = attrs.uiSharedState || attrs.id;\r\n var defaultValueExpr = attrs.uiDefault || attrs.default;\r\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\r\n\r\n SharedState.initialize(scope, id, {\r\n defaultValue: defaultValue,\r\n exclusionGroup: attrs.uiExclusionGroup\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n /**\r\n * Alias for uiSharedState. **Deprecated** since it clashes with\r\n * [UI-Router](https://ui-router.github.io/) `uiState` directive.\r\n *\r\n * @deprecated\r\n * @param {string} uiState The shared state id\r\n * @param {expression} [uiDefault] the default value\r\n *\r\n * @directive uiState\r\n */\r\n module.directive('uiState', [\r\n 'SharedState', function(SharedState) {\r\n return {\r\n restrict: 'EA',\r\n priority: 601, // more than ng-if\r\n link: function(scope, elem, attrs) {\r\n var id = attrs.uiState || attrs.id;\r\n var defaultValueExpr = attrs.uiDefault || attrs.default;\r\n var defaultValue = defaultValueExpr ? scope.$eval(defaultValueExpr) : undefined;\r\n\r\n SharedState.initialize(scope, id, {\r\n defaultValue: defaultValue,\r\n exclusionGroup: attrs.uiExclusionGroup\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n angular.forEach(['toggle', 'turnOn', 'turnOff', 'set'],\r\n function(methodName) {\r\n var directiveName = 'ui' + methodName[0].toUpperCase() + methodName.slice(1);\r\n\r\n /**\r\n * Calls `SharedState#toggle` when triggering events happens on the element using it.\r\n *\r\n * @param {string} uiToggle the target shared state\r\n * @param {expression} uiDefault the default value\r\n *\r\n * @directive uiToggle\r\n */\r\n\r\n /**\r\n * @function uiTurnOn\r\n *\r\n * @description\r\n * Calls `SharedState#turnOn` when triggering events happens on the element using it.\r\n *\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {string} uiTurnOn the target shared state\r\n * @param {expression} uiDefault the default value\r\n */\r\n\r\n /**\r\n * @function uiTurnOff\r\n *\r\n * @description\r\n * Calls `SharedState#turnOff` when triggering events happens on the element using it.\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {string} uiTurnOff the target shared state\r\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\r\n */\r\n\r\n /**\r\n * @function uiSet\r\n *\r\n * @description\r\n * Calls `SharedState#set` when triggering events happens on the element using it.\r\n *\r\n * @ngdoc directive\r\n *\r\n * @param {object} uiSet The object to pass to SharedState#set\r\n * @param {string} [uiTriggers='click tap'] the event triggering the call.\r\n */\r\n\r\n module.directive(directiveName, [\r\n '$parse',\r\n '$interpolate',\r\n 'SharedState',\r\n function($parse, $interpolate, SharedState) {\r\n var method = SharedState[methodName];\r\n return {\r\n restrict: 'A',\r\n priority: 1, // This would make postLink calls happen after ngClick\r\n // (and similar) ones, thus intercepting events after them.\r\n //\r\n // This will prevent eventual ng-if to detach elements\r\n // before ng-click fires.\r\n\r\n compile: function(elem, attrs) {\r\n var attr = attrs[directiveName];\r\n var needsInterpolation = attr.match(/\\{\\{/);\r\n\r\n var exprFn = function($scope) {\r\n var res = attr;\r\n if (needsInterpolation) {\r\n var interpolateFn = $interpolate(res);\r\n res = interpolateFn($scope);\r\n }\r\n if (methodName === 'set') {\r\n res = ($parse(res))($scope);\r\n }\r\n return res;\r\n };\r\n\r\n return function(scope, elem, attrs) {\r\n var callback = function() {\r\n var arg = exprFn(scope);\r\n return method.call(SharedState, arg);\r\n };\r\n uiBindEvent(scope, elem, attrs.uiTriggers, callback);\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n });\r\n\r\n /**\r\n * @name uiScopeContext\r\n * @inner\r\n * @description\r\n *\r\n * `uiScopeContext` is not a directive, but a parameter common to any of the\r\n * `ui-*` directives in this module.\r\n *\r\n * By default all `ui-*` conditions in this module evaluates in the context of\r\n * `SharedState` only, thus scope variable are not accessible. To use them you have\r\n * two options:\r\n *\r\n * #### 1. pre-interpolation\r\n *\r\n * You can use pre-interpolation in expression attribute. For instance the following syntax\r\n * is ligit:\r\n *\r\n * ``` html\r\n *
    \r\n * ```\r\n *\r\n * In this case `idx` value is taken from scope and embedded into\r\n * conditions before parse them.\r\n *\r\n * This works as expected and is fine for the most cases, but it has a little caveat:\r\n *\r\n * The condition has to be re-parsed at each digest loop and has to walk scopes\r\n * in watchers.\r\n *\r\n * #### 2. uiScopeContext\r\n *\r\n * If you are concerned about performance issues using the first approach\r\n * `uiScopeContext` is a more verbose but also lightweight alternative\r\n * to accomplish the same.\r\n *\r\n * It allows to use current scope vars inside `ui-*` conditions, leaving\r\n * other scope vars (or the entire scope if not present) apart from the\r\n * condition evaluation process.\r\n *\r\n * Hopefully this will keep evaluation running against a flat and small data\r\n * structure instead of taking into account the whole scope.\r\n *\r\n * It is a list `scopeVar[ as aliasName] [, ...]` specifing one of more scope\r\n * variables to take into account when evaluating conditions. ie:\r\n *\r\n * ``` html\r\n * \r\n *
    \r\n *
    \r\n * \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * Be aware that scope vars will take precedence over sharedStates so,\r\n * in order to avoid name clashes you can use 'as' to refer to scope vars\r\n * with a different name in conditions:\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n * ```\r\n */\r\n var parseScopeContext = function(attr) {\r\n if (!attr || attr === '') {\r\n return [];\r\n }\r\n var vars = attr ? attr.trim().split(/ *, */) : [];\r\n var res = [];\r\n for (var i = 0; i < vars.length; i++) {\r\n var item = vars[i].split(/ *as */);\r\n if (item.length > 2 || item.length < 1) {\r\n throw new Error('Error parsing uiScopeContext=\"' + attr + '\"');\r\n }\r\n res.push(item);\r\n }\r\n return res;\r\n };\r\n\r\n var mixScopeContext = function(context, scopeVars, scope) {\r\n for (var i = 0; i < scopeVars.length; i++) {\r\n var key = scopeVars[i][0];\r\n var alias = scopeVars[i][1] || key;\r\n context[alias] = key.split('.').reduce(function(scope, nextKey) {\r\n return scope[nextKey];\r\n }, scope);\r\n }\r\n };\r\n\r\n var parseUiCondition = function(name, attrs, $scope, SharedState, $parse, $interpolate) {\r\n var expr = attrs[name];\r\n var needsInterpolation = expr.match(/\\{\\{/);\r\n var exprFn;\r\n\r\n if (needsInterpolation) {\r\n exprFn = function(context) {\r\n var interpolateFn = $interpolate(expr);\r\n var parseFn = $parse(interpolateFn($scope));\r\n return parseFn(context);\r\n };\r\n } else {\r\n exprFn = $parse(expr);\r\n }\r\n\r\n var uiScopeContext = parseScopeContext(attrs.uiScopeContext);\r\n return function() {\r\n var context;\r\n if (uiScopeContext.length) {\r\n context = angular.extend({}, SharedState.values());\r\n mixScopeContext(context, uiScopeContext, $scope);\r\n } else {\r\n context = SharedState.values();\r\n }\r\n return exprFn(context);\r\n };\r\n };\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiIf\r\n *\r\n * @description\r\n * Same as `ngIf` but evaluates condition against `SharedState` statuses too\r\n *\r\n * @param {expression} uiIf A condition to decide wether to attach the\r\n * element to the dom\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when\r\n * evaluating condition.\r\n */\r\n module.directive('uiIf', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\r\n function getBlockNodes(nodes) {\r\n var node = nodes[0];\r\n var endNode = nodes[nodes.length - 1];\r\n var blockNodes = [node];\r\n do {\r\n node = node.nextSibling;\r\n if (!node) {\r\n break;\r\n }\r\n blockNodes.push(node);\r\n } while (node !== endNode);\r\n\r\n return angular.element(blockNodes);\r\n }\r\n\r\n return {\r\n multiElement: true,\r\n transclude: 'element',\r\n priority: 600,\r\n terminal: true,\r\n restrict: 'A',\r\n $$tlb: true,\r\n link: function($scope, $element, $attr, ctrl, $transclude) {\r\n var block;\r\n var childScope;\r\n var previousElements;\r\n var uiIfFn = parseUiCondition('uiIf', $attr, $scope, SharedState, $parse, $interpolate);\r\n\r\n $scope.$watch(uiIfFn, function uiIfWatchAction(value) {\r\n if (value) {\r\n if (!childScope) {\r\n $transclude(function(clone, newScope) {\r\n childScope = newScope;\r\n clone[clone.length++] = document.createComment(' end uiIf: ' + $attr.uiIf + ' ');\r\n // Note: We only need the first/last node of the cloned nodes.\r\n // However, we need to keep the reference to the jqlite wrapper as it might be changed later\r\n // by a directive with templateUrl when its template arrives.\r\n block = {\r\n clone: clone\r\n };\r\n $animate.enter(clone, $element.parent(), $element);\r\n });\r\n }\r\n } else {\r\n if (previousElements) {\r\n previousElements.remove();\r\n previousElements = null;\r\n }\r\n if (childScope) {\r\n childScope.$destroy();\r\n childScope = null;\r\n }\r\n if (block) {\r\n previousElements = getBlockNodes(block.clone);\r\n var done = function() {\r\n previousElements = null;\r\n };\r\n var nga = $animate.leave(previousElements, done);\r\n if (nga) {\r\n nga.then(done);\r\n }\r\n block = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiHide\r\n *\r\n * @description\r\n * Same as `ngHide` but evaluates condition against `SharedState` statuses\r\n *\r\n * @param {expression} uiShow A condition to decide wether to hide the element\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating condition.\r\n */\r\n module.directive('uiHide', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse, $interpolate) {\r\n var NG_HIDE_CLASS = 'ng-hide';\r\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\r\n\r\n return {\r\n restrict: 'A',\r\n multiElement: true,\r\n link: function(scope, element, attr) {\r\n var uiHideFn = parseUiCondition('uiHide', attr, scope, SharedState, $parse, $interpolate);\r\n scope.$watch(uiHideFn, function uiHideWatchAction(value) {\r\n $animate[value ? 'addClass' : 'removeClass'](element, NG_HIDE_CLASS, {\r\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\r\n });\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiShow\r\n *\r\n * @description\r\n * Same as `ngShow` but evaluates condition against `SharedState` statuses\r\n *\r\n * @param {expression} uiShow A condition to decide wether to show the element\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating condition.\r\n */\r\n module.directive('uiShow', ['$animate', 'SharedState', '$parse', '$interpolate', function($animate, SharedState, $parse) {\r\n var NG_HIDE_CLASS = 'ng-hide';\r\n var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\r\n\r\n return {\r\n restrict: 'A',\r\n multiElement: true,\r\n link: function(scope, element, attr) {\r\n var uiShowFn = parseUiCondition('uiShow', attr, scope, SharedState, $parse);\r\n scope.$watch(uiShowFn, function uiShowWatchAction(value) {\r\n $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\r\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\r\n });\r\n });\r\n }\r\n };\r\n }]);\r\n\r\n /**\r\n * @ngdoc directive\r\n * @function uiClass\r\n *\r\n * @description\r\n * A simplified version of `ngClass` that evaluates in context of `SharedState`, it only suppors the `{'className': expr}` syntax.\r\n *\r\n * @param {expression} uiClass An expression that has to evaluate to an object\r\n * of the form `{'className': expr}`, where `expr` decides wether the class\r\n * should appear to element's class list.\r\n * @param {list} [uiScopeContext] A list `scopeVar[ as aliasName] [, ...]`\r\n * specifing one of more scope variables to take into account when evaluating\r\n * condition.\r\n */\r\n module.directive('uiClass', ['SharedState', '$parse', '$interpolate', function(SharedState, $parse) {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attr) {\r\n var uiClassFn = parseUiCondition('uiClass', attr, scope, SharedState, $parse);\r\n scope.$watch(uiClassFn, function uiClassWatchAction(value) {\r\n var classesToAdd = '';\r\n var classesToRemove = '';\r\n angular.forEach(value, function(expr, className) {\r\n if (expr) {\r\n classesToAdd += ' ' + className;\r\n } else {\r\n classesToRemove += ' ' + className;\r\n }\r\n classesToAdd = classesToAdd.trim();\r\n classesToRemove = classesToRemove.trim();\r\n if (classesToAdd.length) {\r\n element.addClass(classesToAdd);\r\n }\r\n if (classesToRemove.length) {\r\n element.removeClass(classesToRemove);\r\n }\r\n });\r\n }, true);\r\n }\r\n };\r\n }]);\r\n\r\n module.run([\r\n '$rootScope',\r\n 'SharedState',\r\n function($rootScope, SharedState) {\r\n $rootScope.Ui = SharedState;\r\n }\r\n ]);\r\n\r\n})();\r\n","/**\r\n * Provides directives and service to prevent touchmove default behaviour\r\n * for touch devices (ie. bounce on overscroll in IOS).\r\n *\r\n * #### Usage\r\n *\r\n * Use `ui-prevent-touchmove-defaults` directive on root element of your app:\r\n *\r\n * ``` html\r\n * \r\n * \r\n * \r\n * ```\r\n *\r\n * Doing so `touchmove.preventDefault` logic for inner elements is inverted,\r\n * so any `touchmove` default behaviour is automatically prevented.\r\n *\r\n * If you wish to allow the default behaviour, for example to allow\r\n * inner elements to scroll, you have to explicitly mark an event to allow\r\n * touchmove default.\r\n *\r\n * Mobile Angular UI already handles this for `scrollable` elements, so you don't have\r\n * to do anything in order to support scroll.\r\n *\r\n * If you wish to allow touchmove defaults for certain element under certain conditions\r\n * you can use the `allowTouchmoveDefault` service.\r\n *\r\n * ie.\r\n *\r\n * ``` js\r\n * // always allow touchmove default for an element\r\n * allowTouchmoveDefault(myelem);\r\n * ```\r\n *\r\n * ``` js\r\n * // allow touchmove default for an element only under certain conditions\r\n * allowTouchmoveDefault(myelem, function(touchmove){\r\n * return touchmove.pageY > 100;\r\n * });\r\n * ```\r\n *\r\n * @module mobile-angular-ui.core.touchmoveDefaults\r\n */\r\n(function() {\r\n 'use strict';\r\n var module = angular.module('mobile-angular-ui.core.touchmoveDefaults', []);\r\n\r\n module.directive('uiPreventTouchmoveDefaults', function() {\r\n var preventTouchmoveDefaultsCb = function(e) {\r\n // Get this flag from either the saved event if jQuery is being used, otherwise get it from the event itself.\r\n var allowTouchmoveEventFlag = e.originalEvent ? e.originalEvent.allowTouchmoveDefault : e.allowTouchmoveDefault;\r\n if (allowTouchmoveEventFlag !== true) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n return {\r\n compile: function(element) {\r\n if ('ontouchmove' in document) {\r\n element.on('touchmove', preventTouchmoveDefaultsCb);\r\n }\r\n }\r\n };\r\n });\r\n\r\n /**\r\n * Bind a listener to an element to allow `touchmove` default behaviour\r\n * when `touchmove` happens inside the bound element.\r\n *\r\n * You can also provide a function to decide when to allow and\r\n * when to prevent it.\r\n *\r\n * ``` js\r\n * // always allow touchmove default\r\n * allowTouchmoveDefault(myelem);\r\n *\r\n * // allow touchmove default only under certain conditions\r\n * allowTouchmoveDefault(myelem, function(touchmove){\r\n * return touchmove.pageY > 100;\r\n * });\r\n * ```\r\n *\r\n * @param {Element|$element} element The element to bind.\r\n * @param {function} condition A `function(touchmove)⟶boolean` to decide\r\n * whether to allow default behavior or not.\r\n *\r\n * @service allowTouchmoveDefault\r\n * @as function\r\n * @returns function Function to unbind the listener\r\n */\r\n\r\n module.factory('allowTouchmoveDefault', function() {\r\n var fnTrue = function() {\r\n return true;\r\n };\r\n\r\n if ('ontouchmove' in document) {\r\n return function($element, condition) {\r\n condition = condition || fnTrue;\r\n\r\n var allowTouchmoveDefaultCallback = function(e) {\r\n if (condition(e)) {\r\n e.allowTouchmoveDefault = true;\r\n // jQuery normalizes the event object, need to put this property on the copied originalEvent.\r\n if (e.originalEvent) {\r\n e.originalEvent.allowTouchmoveDefault = true;\r\n }\r\n }\r\n };\r\n\r\n $element = angular.element($element);\r\n $element.on('touchmove', allowTouchmoveDefaultCallback);\r\n\r\n $element.on('$destroy', function() {\r\n $element.off('touchmove', allowTouchmoveDefaultCallback);\r\n $element = null;\r\n });\r\n\r\n return function() {\r\n if ($element) {\r\n $element.off('touchmove', allowTouchmoveDefaultCallback);\r\n }\r\n };\r\n };\r\n }\r\n\r\n return angular.noop;\r\n });\r\n\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.core\r\n *\r\n * @description\r\n *\r\n * It has all the core functionalities of Mobile Angular UI. It aims to act as a common base\r\n * for an UI framework providing services and directives to create components and implement\r\n * UI interactions with angular.\r\n *\r\n *
    \r\n * NOTE\r\n *
      \r\n *
    • It has no dependency on Bootstrap.
    • \r\n *
    • It is not related to mobile apps only.
    • \r\n *
    • It is not requiring CSS support.
    • \r\n *
    • You can use it on any Angular Application and with any CSS framework.
    • \r\n *
    \r\n *
    \r\n *\r\n * ## Standalone Usage\r\n *\r\n * Although `.core` module is required by `mobile-angular-ui` by default you can use it alone.\r\n *\r\n * ``` js\r\n * angular.module('myApp', ['mobile-angular-ui.core']);\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n angular.module('mobile-angular-ui.core', [\r\n 'mobile-angular-ui.core.fastclick',\r\n 'mobile-angular-ui.core.activeLinks',\r\n 'mobile-angular-ui.core.capture',\r\n 'mobile-angular-ui.core.outerClick',\r\n 'mobile-angular-ui.core.sharedState',\r\n 'mobile-angular-ui.core.touchmoveDefaults'\r\n ]);\r\n})();\r\n","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, undefined ){\n\t\n\tvar doc = w.document,\n\t\tdocElem = doc.documentElement,\n\t\tenabledClassName = \"overthrow-enabled\",\n\n\t\t// Touch events are used in the polyfill, and thus are a prerequisite\n\t\tcanBeFilledWithPoly = \"ontouchmove\" in doc,\n\t\t\n\t\t// The following attempts to determine whether the browser has native overflow support\n\t\t// so we can enable it but not polyfill\n\t\tnativeOverflow = \n\t\t\t// Features-first. iOS5 overflow scrolling property check - no UA needed here. thanks Apple :)\n\t\t\t\"WebkitOverflowScrolling\" in docElem.style ||\n\t\t\t// Test the windows scrolling property as well\n\t\t\t\"msOverflowStyle\" in docElem.style ||\n\t\t\t// Touch events aren't supported and screen width is greater than X\n\t\t\t// ...basically, this is a loose \"desktop browser\" check. \n\t\t\t// It may wrongly opt-in very large tablets with no touch support.\n\t\t\t( !canBeFilledWithPoly && w.screen.width > 800 ) ||\n\t\t\t// Hang on to your hats.\n\t\t\t// Whitelist some popular, overflow-supporting mobile browsers for now and the future\n\t\t\t// These browsers are known to get overlow support right, but give us no way of detecting it.\n\t\t\t(function(){\n\t\t\t\tvar ua = w.navigator.userAgent,\n\t\t\t\t\t// Webkit crosses platforms, and the browsers on our list run at least version 534\n\t\t\t\t\twebkit = ua.match( /AppleWebKit\\/([0-9]+)/ ),\n\t\t\t\t\twkversion = webkit && webkit[1],\n\t\t\t\t\twkLte534 = webkit && wkversion >= 534;\n\t\t\t\t\t\n\t\t\t\treturn (\n\t\t\t\t\t/* Android 3+ with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 */\n\t\t\t\t\tua.match( /Android ([0-9]+)/ ) && RegExp.$1 >= 3 && wkLte534 ||\n\t\t\t\t\t/* Blackberry 7+ with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0 Mobile Safari/534.11+ */\n\t\t\t\t\tua.match( / Version\\/([0-9]+)/ ) && RegExp.$1 >= 0 && w.blackberry && wkLte534 ||\n\t\t\t\t\t/* Blackberry Playbook with webkit gte 534\n\t\t\t\t\t~: Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+ */ \n\t\t\t\t\tua.indexOf( \"PlayBook\" ) > -1 && wkLte534 && !ua.indexOf( \"Android 2\" ) === -1 ||\n\t\t\t\t\t/* Firefox Mobile (Fennec) 4 and up\n\t\t\t\t\t~: Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0 */\n\t\t\t\t\tua.match(/Firefox\\/([0-9]+)/) && RegExp.$1 >= 4 ||\n\t\t\t\t\t/* WebOS 3 and up (TouchPad too)\n\t\t\t\t\t~: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.48 Safari/534.6 TouchPad/1.0 */\n\t\t\t\t\tua.match( /wOSBrowser\\/([0-9]+)/ ) && RegExp.$1 >= 233 && wkLte534 ||\n\t\t\t\t\t/* Nokia Browser N8\n\t\t\t\t\t~: Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba \n\t\t\t\t\t~: Note: the N9 doesn't have native overflow with one-finger touch. wtf */\n\t\t\t\t\tua.match( /NokiaBrowser\\/([0-9\\.]+)/ ) && parseFloat(RegExp.$1) === 7.3 && webkit && wkversion >= 533\n\t\t\t\t);\n\t\t\t})();\n\n\t// Expose overthrow API\n\tw.overthrow = {};\n\n\tw.overthrow.enabledClassName = enabledClassName;\n\n\tw.overthrow.addClass = function(){\n\t\tif( docElem.className.indexOf( w.overthrow.enabledClassName ) === -1 ){\n\t\t\tdocElem.className += \" \" + w.overthrow.enabledClassName;\n\t\t}\n\t};\n\n\tw.overthrow.removeClass = function(){\n\t\tdocElem.className = docElem.className.replace( w.overthrow.enabledClassName, \"\" );\n\t};\n\n\t// Enable and potentially polyfill overflow\n\tw.overthrow.set = function(){\n\t\t\t\n\t\t// If nativeOverflow or at least the element canBeFilledWithPoly, add a class to cue CSS that assumes overflow scrolling will work (setting height on elements and such)\n\t\tif( nativeOverflow ){\n\t\t\tw.overthrow.addClass();\n\t\t}\n\n\t};\n\n\t// expose polyfillable \n\tw.overthrow.canBeFilledWithPoly = canBeFilledWithPoly;\n\n\t// Destroy everything later. If you want to.\n\tw.overthrow.forget = function(){\n\n\t\tw.overthrow.removeClass();\n\t\t\n\t};\n\t\t\n\t// Expose overthrow API\n\tw.overthrow.support = nativeOverflow ? \"native\" : \"none\";\n\t\t\n})( this );\n","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, undefined ){\n\t\n\t// Auto-init\n\tw.overthrow.set();\n\n}( this ));","/*! Overthrow. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\n(function( w, o, undefined ){\n\n\t// o is overthrow reference from overthrow-polyfill.js\n\tif( o === undefined ){\n\t\treturn;\n\t}\n\n\to.scrollIndicatorClassName = \"overthrow\";\n\t\n\tvar doc = w.document,\n\t\tdocElem = doc.documentElement,\n\t\t// o api\n\t\tnativeOverflow = o.support === \"native\",\n\t\tcanBeFilledWithPoly = o.canBeFilledWithPoly,\n\t\tconfigure = o.configure,\n\t\tset = o.set,\n\t\tforget = o.forget,\n\t\tscrollIndicatorClassName = o.scrollIndicatorClassName;\n\n\t// find closest overthrow (elem or a parent)\n\to.closest = function( target, ascend ){\n\t\treturn !ascend && target.className && target.className.indexOf( scrollIndicatorClassName ) > -1 && target || o.closest( target.parentNode );\n\t};\n\t\t\n\t// polyfill overflow\n\tvar enabled = false;\n\to.set = function(){\n\t\t\t\n\t\tset();\n\n\t\t// If nativeOverflow or it doesn't look like the browser canBeFilledWithPoly, our job is done here. Exit viewport left.\n\t\tif( enabled || nativeOverflow || !canBeFilledWithPoly ){\n\t\t\treturn;\n\t\t}\n\n\t\tw.overthrow.addClass();\n\n\t\tenabled = true;\n\n\t\to.support = \"polyfilled\";\n\n\t\to.forget = function(){\n\t\t\tforget();\n\t\t\tenabled = false;\n\t\t\t// Remove touch binding (check for method support since this part isn't qualified by touch support like the rest)\n\t\t\tif( doc.removeEventListener ){\n\t\t\t\tdoc.removeEventListener( \"touchstart\", start, false );\n\t\t\t}\n\t\t};\n\n\t\t// Fill 'er up!\n\t\t// From here down, all logic is associated with touch scroll handling\n\t\t\t// elem references the overthrow element in use\n\t\tvar elem,\n\t\t\t\n\t\t\t// The last several Y values are kept here\n\t\t\tlastTops = [],\n\t\n\t\t\t// The last several X values are kept here\n\t\t\tlastLefts = [],\n\t\t\t\n\t\t\t// lastDown will be true if the last scroll direction was down, false if it was up\n\t\t\tlastDown,\n\t\t\t\n\t\t\t// lastRight will be true if the last scroll direction was right, false if it was left\n\t\t\tlastRight,\n\t\t\t\n\t\t\t// For a new gesture, or change in direction, reset the values from last scroll\n\t\t\tresetVertTracking = function(){\n\t\t\t\tlastTops = [];\n\t\t\t\tlastDown = null;\n\t\t\t},\n\t\t\t\n\t\t\tresetHorTracking = function(){\n\t\t\t\tlastLefts = [];\n\t\t\t\tlastRight = null;\n\t\t\t},\n\t\t\n\t\t\t// On webkit, touch events hardly trickle through textareas and inputs\n\t\t\t// Disabling CSS pointer events makes sure they do, but it also makes the controls innaccessible\n\t\t\t// Toggling pointer events at the right moments seems to do the trick\n\t\t\t// Thanks Thomas Bachem http://stackoverflow.com/a/5798681 for the following\n\t\t\tinputs,\n\t\t\tsetPointers = function( val ){\n\t\t\t\tinputs = elem.querySelectorAll( \"textarea, input\" );\n\t\t\t\tfor( var i = 0, il = inputs.length; i < il; i++ ) {\n\t\t\t\t\tinputs[ i ].style.pointerEvents = val;\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t// For nested overthrows, changeScrollTarget restarts a touch event cycle on a parent or child overthrow\n\t\t\tchangeScrollTarget = function( startEvent, ascend ){\n\t\t\t\tif( doc.createEvent ){\n\t\t\t\t\tvar newTarget = ( !ascend || ascend === undefined ) && elem.parentNode || elem.touchchild || elem,\n\t\t\t\t\t\ttEnd;\n\t\t\t\t\t\t\t\n\t\t\t\t\tif( newTarget !== elem ){\n\t\t\t\t\t\ttEnd = doc.createEvent( \"HTMLEvents\" );\n\t\t\t\t\t\ttEnd.initEvent( \"touchend\", true, true );\n\t\t\t\t\t\telem.dispatchEvent( tEnd );\n\t\t\t\t\t\tnewTarget.touchchild = elem;\n\t\t\t\t\t\telem = newTarget;\n\t\t\t\t\t\tnewTarget.dispatchEvent( startEvent );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t// Touchstart handler\n\t\t\t// On touchstart, touchmove and touchend are freshly bound, and all three share a bunch of vars set by touchstart\n\t\t\t// Touchend unbinds them again, until next time\n\t\t\tstart = function( e ){\n\n\t\t\t\t// Stop any throw in progress\n\t\t\t\tif( o.intercept ){\n\t\t\t\t\to.intercept();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Reset the distance and direction tracking\n\t\t\t\tresetVertTracking();\n\t\t\t\tresetHorTracking();\n\t\t\t\t\n\t\t\t\telem = o.closest( e.target );\n\t\t\t\t\t\n\t\t\t\tif( !elem || elem === docElem || e.touches.length > 1 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\t\t\t\n\n\t\t\t\tsetPointers( \"none\" );\n\t\t\t\tvar touchStartE = e,\n\t\t\t\t\tscrollT = elem.scrollTop,\n\t\t\t\t\tscrollL = elem.scrollLeft,\n\t\t\t\t\theight = elem.offsetHeight,\n\t\t\t\t\twidth = elem.offsetWidth,\n\t\t\t\t\tstartY = e.touches[ 0 ].pageY,\n\t\t\t\t\tstartX = e.touches[ 0 ].pageX,\n\t\t\t\t\tscrollHeight = elem.scrollHeight,\n\t\t\t\t\tscrollWidth = elem.scrollWidth,\n\t\t\t\t\n\t\t\t\t\t// Touchmove handler\n\t\t\t\t\tmove = function( e ){\n\t\t\t\t\t\n\t\t\t\t\t\tvar ty = scrollT + startY - e.touches[ 0 ].pageY,\n\t\t\t\t\t\t\ttx = scrollL + startX - e.touches[ 0 ].pageX,\n\t\t\t\t\t\t\tdown = ty >= ( lastTops.length ? lastTops[ 0 ] : 0 ),\n\t\t\t\t\t\t\tright = tx >= ( lastLefts.length ? lastLefts[ 0 ] : 0 );\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t// If there's room to scroll the current container, prevent the default window scroll\n\t\t\t\t\t\tif( ( ty > 0 && ty < scrollHeight - height ) || ( tx > 0 && tx < scrollWidth - width ) ){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This bubbling is dumb. Needs a rethink.\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tchangeScrollTarget( touchStartE );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If down and lastDown are inequal, the y scroll has changed direction. Reset tracking.\n\t\t\t\t\t\tif( lastDown && down !== lastDown ){\n\t\t\t\t\t\t\tresetVertTracking();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If right and lastRight are inequal, the x scroll has changed direction. Reset tracking.\n\t\t\t\t\t\tif( lastRight && right !== lastRight ){\n\t\t\t\t\t\t\tresetHorTracking();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// remember the last direction in which we were headed\n\t\t\t\t\t\tlastDown = down;\n\t\t\t\t\t\tlastRight = right;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t// set the container's scroll\n\t\t\t\t\t\telem.scrollTop = ty;\n\t\t\t\t\t\telem.scrollLeft = tx;\n\t\t\t\t\t\n\t\t\t\t\t\tlastTops.unshift( ty );\n\t\t\t\t\t\tlastLefts.unshift( tx );\n\t\t\t\t\t\n\t\t\t\t\t\tif( lastTops.length > 3 ){\n\t\t\t\t\t\t\tlastTops.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( lastLefts.length > 3 ){\n\t\t\t\t\t\t\tlastLefts.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t\t// Touchend handler\n\t\t\t\t\tend = function( e ){\n\n\t\t\t\t\t\t// Bring the pointers back\n\t\t\t\t\t\tsetPointers( \"auto\" );\n\t\t\t\t\t\tsetTimeout( function(){\n\t\t\t\t\t\t\tsetPointers( \"none\" );\n\t\t\t\t\t\t}, 450 );\n\t\t\t\t\t\telem.removeEventListener( \"touchmove\", move, false );\n\t\t\t\t\t\telem.removeEventListener( \"touchend\", end, false );\n\t\t\t\t\t};\n\t\t\t\t\n\t\t\t\telem.addEventListener( \"touchmove\", move, false );\n\t\t\t\telem.addEventListener( \"touchend\", end, false );\n\t\t\t};\n\t\t\t\n\t\t// Bind to touch, handle move and end within\n\t\tdoc.addEventListener( \"touchstart\", start, false );\n\t};\n\t\t\n})( this, this.overthrow );\n","/**\r\n * This module will provide directives to create modals and overlays components.\r\n *\r\n * @module mobile-angular-ui.components.modals\r\n */\r\n(function() {\r\n 'use strict';\r\n angular.module('mobile-angular-ui.components.modals', [])\r\n\r\n /**\r\n * A directive to create modals and overlays components.\r\n *\r\n * Modals are basically the same of Bootstrap 3 but you have to use uiSharedState\r\n * with `ngIf/uiIf` or `ngHide/uiHide` to `activate/dismiss` it.\r\n *\r\n * By default both modals and overlay are made always showing up by\r\n * css rule `.modal {display:block}`, so you can use it with\r\n * `ngAnimate` and other angular directives in a simpler way.\r\n *\r\n * Overlay are a style of modal that looks more native in mobile devices providing a blurred\r\n * overlay as background.\r\n *\r\n * You can create an overlay adding `.modal-overlay` class to a modal.\r\n *\r\n * ### Note\r\n *\r\n * For modals and overlays to cover the entire page you have to attach them\r\n * as child of `body` element. To achieve this from a view is a common use for\r\n * `contentFor/yieldTo` directives contained from\r\n * [capture module](/docs/module:mobile-angular-ui/module:core/module:capture):\r\n *\r\n * ``` html\r\n * \r\n *\r\n * \r\n * \r\n *
    \r\n *\r\n * \r\n * ```\r\n *\r\n * Then you can wrap your modals and overlays in `contentFor`:\r\n *\r\n * ``` html\r\n *
    \r\n * *
    \r\n *
    \r\n * ```\r\n *\r\n * **Example.** Create a Modal.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n * \r\n *

    Modal title

    \r\n *
    \r\n *
    \r\n *

    Lorem ipsum ...

    \r\n *
    \r\n *
    \r\n * \r\n * \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * **Example.** Create an Overlay.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n * \r\n *

    Modal title

    \r\n *
    \r\n *
    \r\n *

    Lorem ipsum ...

    \r\n *
    \r\n *
    \r\n * \r\n * \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * @directive modal\r\n * @restrict C\r\n */\r\n .directive('modal', [\r\n '$rootElement',\r\n function($rootElement) {\r\n return {\r\n restrict: 'C',\r\n link: function(scope, elem) {\r\n $rootElement.addClass('has-modal');\r\n elem.on('$destroy', function() {\r\n $rootElement.removeClass('has-modal');\r\n });\r\n scope.$on('$destroy', function() {\r\n $rootElement.removeClass('has-modal');\r\n });\r\n\r\n if (elem.hasClass('modal-overlay')) {\r\n $rootElement.addClass('has-modal-overlay');\r\n elem.on('$destroy', function() {\r\n $rootElement.removeClass('has-modal-overlay');\r\n });\r\n scope.$on('$destroy', function() {\r\n $rootElement.removeClass('has-modal-overlay');\r\n });\r\n }\r\n }\r\n };\r\n }]);\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.components.navbars\r\n * @description\r\n *\r\n * Bootstrap default navbars are awesome for responsive websites, but are not the\r\n * best with a small screen. Also fixed positioning is yet not an option to create\r\n * navbars standing in top or bottom of the screen.\r\n *\r\n * Mobile Angular Ui offers an alternative to bootstrap navbars that is more\r\n * suitable for mobile.\r\n *\r\n * It uses scrollable areas to avoid scroll issues. In the following figure you can\r\n * see the difference between fixed navbars and navbars with absolute positioning.\r\n *\r\n *
    \r\n * \"\"/\r\n *
    \r\n *\r\n * Here is the basic markup to achieve this.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * As you can notice the base class is `.navbar-app` while the positioning is\r\n * obtained adding either `.navbar-absolute-top` or `.navbar-absolute-bottom`\r\n * class.\r\n *\r\n * ### Mobile Navbar Layout\r\n *\r\n * Top navbar in mobile design most of the times follows a clear pattern: a\r\n * centered title surrounded by one or two action buttons, the _back_ or the\r\n * _menu_ buttons are two common examples.\r\n *\r\n * Twitter Bootstrap ships with a different arrangement of components for navbars\r\n * since they are supposed to host an horizontal navigation menu.\r\n *\r\n * `.navbar-app` is specifically designed to support this different type of\r\n * `.interaction and arrangement.\r\n *\r\n * Consider the following example:\r\n *\r\n * ``` html\r\n *
    \r\n *\r\n *
    \r\n * Navbar Brand\r\n *
    \r\n *\r\n *
    \r\n *
    \r\n * Left Action\r\n *
    \r\n *
    \r\n *\r\n *
    \r\n *
    \r\n * Right Action\r\n *
    \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * `.navbar-brand-center` is a specialization of BS3's `.navbar-brand`. It will\r\n * render the title centered and below the two button groups. Note that `.navbar-\r\n * brand-center` will position the title with absolute positioning ensuring that\r\n * it will never cover the buttons, which would cause interaction problems.\r\n *\r\n */\r\n\r\n(function() {\r\n 'use strict';\r\n\r\n var module = angular.module('mobile-angular-ui.components.navbars', []);\r\n\r\n /**\r\n * @directive navbarAbsoluteTop\r\n * @restrict C\r\n * @description\r\n *\r\n * Setup absolute positioned top navbar.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n */\r\n\r\n /**\r\n * @directive navbarAbsoluteBottom\r\n * @restrict C\r\n * @description\r\n *\r\n * Setup absolute positioned bottom navbar.\r\n *\r\n * ``` html\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n */\r\n angular.forEach(['top', 'bottom'], function(side) {\r\n var directiveName = 'navbarAbsolute' + side.charAt(0).toUpperCase() + side.slice(1);\r\n module.directive(directiveName, [\r\n '$rootElement',\r\n function($rootElement) {\r\n return {\r\n restrict: 'C',\r\n link: function(scope) {\r\n $rootElement.addClass('has-navbar-' + side);\r\n scope.$on('$destroy', function() {\r\n $rootElement.removeClass('has-navbar-' + side);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n });\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.components.scrollable\r\n * @description\r\n *\r\n * One thing you'll always have to deal with approaching mobile web app\r\n * development is scroll and `position:fixed` bugs.\r\n *\r\n * Due to the lack of support in some devices fixed positioned elements may\r\n * bounce or disappear during scroll. Also mobile interaction often leverages\r\n * horizontal scroll eg. in carousels or sliders.\r\n *\r\n * We use `overflow:auto` to create scrollable areas and solve any problems\r\n * related to scroll.\r\n *\r\n * Since `overflow:auto` is not always available in touch devices we use [Overthrow](http://filamentgroup.github.io/Overthrow/) to polyfill that.\r\n *\r\n * Markup for any scrollable areas is as simple as:\r\n *\r\n * ``` html\r\n *
    \r\n *
    ...
    \r\n *
    \r\n * ```\r\n *\r\n * This piece of code will trigger a directive that properly setup a new `Overthrow`\r\n * instance for the `.scrollable` node.\r\n *\r\n * #### Headers and footers\r\n *\r\n * `.scrollable-header/.scrollable-footer` can be used to add fixed header/footer\r\n * to a scrollable area without having to deal with css height and positioning to\r\n * avoid breaking scroll.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n * ```\r\n *\r\n * #### scrollTo\r\n *\r\n * `.scrollable-content` controller exposes a `scrollTo` function: `scrollTo(offsetOrElement, margin)`\r\n *\r\n * You have to require it in your directives to use it or obtain through `element().controller`:\r\n *\r\n * ``` js\r\n * var elem = element(document.getElementById('myScrollableContent'));\r\n * var scrollableContentController = elem.controller('scrollableContent');\r\n *\r\n * // - Scroll to top of containedElement\r\n * scrollableContentController.scrollTo(containedElement);\r\n *\r\n * // - Scroll to top of containedElement with a margin of 10px;\r\n * scrollableContentController.scrollTo(containedElement, 10);\r\n *\r\n * // - Scroll top by 200px;\r\n * scrollableContentController.scrollTo(200);\r\n * ```\r\n *\r\n * #### `ui-scroll-bottom/ui-scroll-top`\r\n *\r\n * You can use `ui-scroll-bottom/ui-scroll-top` directives handle that events and implement features like _infinite scroll_.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n *
      \r\n *
    • \r\n * {{item.name}}\r\n *
    • \r\n *
    \r\n *
    \r\n *
    \r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n var module = angular.module('mobile-angular-ui.components.scrollable',\r\n ['mobile-angular-ui.core.touchmoveDefaults']);\r\n\r\n var getTouchY = function(event) {\r\n var touches = event.touches && event.touches.length ? event.touches : [event];\r\n var e = (event.changedTouches && event.changedTouches[0]) ||\r\n (event.originalEvent && event.originalEvent.changedTouches &&\r\n event.originalEvent.changedTouches[0]) ||\r\n touches[0].originalEvent || touches[0];\r\n\r\n return e.clientY;\r\n };\r\n\r\n module.directive('scrollableContent', function() {\r\n return {\r\n restrict: 'C',\r\n controller: ['$element', '$document', 'allowTouchmoveDefault', function($element, $document, allowTouchmoveDefault) {\r\n var scrollableContent = $element[0];\r\n var scrollable = $element.parent()[0];\r\n\r\n // Handle nobounce behaviour\r\n if ('ontouchmove' in $document[0]) {\r\n var allowUp;\r\n var allowDown;\r\n var lastY;\r\n var setupTouchstart = function(event) {\r\n allowUp = (scrollableContent.scrollTop > 0);\r\n\r\n allowDown = (scrollableContent.scrollTop < scrollableContent.scrollHeight - scrollableContent.clientHeight);\r\n lastY = getTouchY(event);\r\n };\r\n\r\n $element.on('touchstart', setupTouchstart);\r\n $element.on('$destroy', function() {\r\n $element.off('touchstart');\r\n });\r\n\r\n allowTouchmoveDefault($element, function(event) {\r\n var currY = getTouchY(event);\r\n var up = (currY > lastY);\r\n var down = !up;\r\n lastY = currY;\r\n return (up && allowUp) || (down && allowDown);\r\n });\r\n }\r\n\r\n this.scrollableContent = scrollableContent;\r\n\r\n this.scrollTo = function(elementOrNumber, marginTop) {\r\n marginTop = marginTop || 0;\r\n\r\n if (angular.isNumber(elementOrNumber)) {\r\n scrollableContent.scrollTop = elementOrNumber - marginTop;\r\n } else {\r\n var target = angular.element(elementOrNumber)[0];\r\n if ((!target.offsetParent) || target.offsetParent === scrollable) {\r\n scrollableContent.scrollTop = target.offsetTop - marginTop;\r\n } else {\r\n // recursively subtract offsetTop from marginTop until it reaches scrollable element.\r\n this.scrollTo(target.offsetParent, marginTop - target.offsetTop);\r\n }\r\n }\r\n };\r\n }],\r\n link: function(scope, element) {\r\n if (overthrow.support !== 'native') {\r\n element.addClass('overthrow');\r\n overthrow.forget();\r\n overthrow.set();\r\n }\r\n }\r\n };\r\n });\r\n\r\n angular.forEach(['input', 'textarea'], function(directiveName) {\r\n module.directive(directiveName, ['$rootScope', '$timeout', function($rootScope, $timeout) {\r\n return {\r\n require: '?^^scrollableContent',\r\n link: function(scope, elem, attrs, scrollable) {\r\n // Workaround to avoid soft keyboard hiding inputs\r\n elem.on('focus', function() {\r\n if (scrollable && scrollable.scrollableContent) {\r\n var h1 = scrollable.scrollableContent.offsetHeight;\r\n $timeout(function() {\r\n var h2 = scrollable.scrollableContent.offsetHeight;\r\n //\r\n // if scrollableContent height is reduced in half second\r\n // since an input got focus we assume soft keyboard is showing.\r\n //\r\n if (h1 > h2) {\r\n var marginTop = 10;\r\n // if scrollableHeader is present increase the marginTop to compensate for scrollableHeader's height.\r\n var scrollableHeader = scrollable.scrollableContent.parentElement.querySelector('.scrollable-header');\r\n if (scrollableHeader) {\r\n marginTop = (scrollableHeader.getBoundingClientRect().bottom - scrollableHeader.getBoundingClientRect().top) + marginTop;\r\n }\r\n scrollable.scrollTo(elem, marginTop);\r\n }\r\n }, 500);\r\n }\r\n });\r\n }\r\n };\r\n }]);\r\n });\r\n\r\n /**\r\n * @directive uiScrollTop\r\n * @restrict A\r\n *\r\n * @param {expression} uiScrollTop The expression to be evaluated when scroll\r\n * reaches top of element.\r\n */\r\n\r\n /**\r\n * @directive uiScrollBottom\r\n * @restrict A\r\n *\r\n * @param {expression} uiScrollBottom The expression to be evaluated when scroll\r\n * reaches bottom of element.\r\n */\r\n angular.forEach(\r\n {\r\n uiScrollTop: function(elem) {\r\n return elem.scrollTop === 0;\r\n },\r\n uiScrollBottom: function(elem) {\r\n return elem.scrollHeight === elem.scrollTop + elem.clientHeight;\r\n }\r\n },\r\n function(reached, directiveName) {\r\n module.directive(directiveName, [function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, elem, attrs) {\r\n elem.on('scroll', function() {\r\n /* If reached bottom */\r\n if (reached(elem[0])) {\r\n /* Do what is specified by onScrollBottom */\r\n scope.$apply(function() {\r\n scope.$eval(attrs[directiveName]);\r\n });\r\n }\r\n });\r\n }\r\n };\r\n }]);\r\n });\r\n\r\n /**\r\n * @directive uiScrollableHeader\r\n * @restrict C\r\n */\r\n\r\n /**\r\n * @directive uiScrollableFooter\r\n * @restrict C\r\n */\r\n angular.forEach({Top: 'scrollableHeader', Bottom: 'scrollableFooter'},\r\n function(directiveName, side) {\r\n module.directive(directiveName, [\r\n '$window',\r\n function($window) {\r\n return {\r\n restrict: 'C',\r\n link: function(scope, element) {\r\n var el = element[0];\r\n var parentStyle = element.parent()[0].style;\r\n\r\n var adjustParentPadding = function() {\r\n var styles = $window.getComputedStyle(el);\r\n var margin = parseInt(styles.marginTop, 10) + parseInt(styles.marginBottom, 10);\r\n parentStyle['padding' + side] = el.offsetHeight + margin + 'px';\r\n };\r\n\r\n var interval = setInterval(adjustParentPadding, 30);\r\n\r\n element.on('$destroy', function() {\r\n parentStyle['padding' + side] = null;\r\n clearInterval(interval);\r\n interval = adjustParentPadding = element = null;\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n });\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.components.sidebars\r\n *\r\n * @description\r\n *\r\n * Sidebars can be placed either in left side or right side adding respectively\r\n * `.sidebar-left` and `.sidebar-right` classes.\r\n *\r\n * ``` html\r\n *
    \r\n *
    \r\n *

    My App

    \r\n *
    \r\n *
    \r\n * Link 1\r\n * \r\n * Link 2\r\n * \r\n *
    \r\n *
    \r\n *
    \r\n *
    \r\n *\r\n *
    \r\n * \r\n *
    \r\n * ```\r\n *\r\n * #### Interacting with sidebars\r\n *\r\n * Under the hood sidebar uses `SharedState` exposing respective statuses:\r\n * `uiSidebarLeft` and `uiSidebarRight` unless you define different state name\r\n * through `id` attribute on sidebar elements.\r\n *\r\n * ``` html\r\n * Toggle sidebar left\r\n *\r\n * Toggle sidebar right\r\n * ```\r\n *\r\n * You can put `ui-turn-off='uiSidebarLeft'` or `ui-turn-off='uiSidebarLeft'`\r\n * inside the sidebar to make it close after clicking links inside them.\r\n *\r\n * By default sidebar are closed by clicking/tapping outside them.\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n var module = angular.module(\r\n 'mobile-angular-ui.components.sidebars', [\r\n 'mobile-angular-ui.core.sharedState',\r\n 'mobile-angular-ui.core.outerClick'\r\n ]\r\n );\r\n\r\n angular.forEach(['left', 'right'], function(side) {\r\n var directiveName = 'sidebar' + side.charAt(0).toUpperCase() + side.slice(1);\r\n var defaultStateName = 'ui' + directiveName.charAt(0).toUpperCase() + directiveName.slice(1);\r\n\r\n module.directive(directiveName, [\r\n '$rootElement',\r\n 'SharedState',\r\n 'bindOuterClick',\r\n '$location',\r\n function(\r\n $rootElement,\r\n SharedState,\r\n bindOuterClick,\r\n $location\r\n ) {\r\n return {\r\n restrict: 'C',\r\n link: function(scope, elem, attrs) {\r\n var parentClass = 'has-sidebar-' + side;\r\n var visibleClass = 'sidebar-' + side + '-visible';\r\n var activeClass = 'sidebar-' + side + '-in';\r\n var stateName = attrs.id ? attrs.id : defaultStateName;\r\n var trackAsSearchParam = attrs.uiTrackAsSearchParam === '' || attrs.uiTrackAsSearchParam;\r\n\r\n var outerClickCb = function() {\r\n SharedState.turnOff(stateName);\r\n };\r\n\r\n var outerClickIf = function() {\r\n return SharedState.isActive(stateName);\r\n };\r\n\r\n $rootElement.addClass(parentClass);\r\n scope.$on('$destroy', function() {\r\n $rootElement\r\n .removeClass(parentClass);\r\n $rootElement\r\n .removeClass(visibleClass);\r\n $rootElement\r\n .removeClass(activeClass);\r\n });\r\n\r\n var defaultActive = attrs.active !== undefined && attrs.active !== 'false';\r\n SharedState.initialize(scope, stateName, {defaultValue: defaultActive});\r\n\r\n scope.$on('mobile-angular-ui.state.changed.' + stateName, function(e, active) {\r\n if (trackAsSearchParam) {\r\n $location.search(stateName, active || null);\r\n }\r\n\r\n if (active) {\r\n $rootElement\r\n .addClass(visibleClass);\r\n $rootElement\r\n .addClass(activeClass);\r\n } else {\r\n $rootElement\r\n .removeClass(activeClass);\r\n // Note: .removeClass(visibleClass) is called on 'mobile-angular-ui.app.transitionend'\r\n }\r\n });\r\n\r\n scope.$on('$routeChangeSuccess', function() {\r\n SharedState.turnOff(stateName);\r\n });\r\n\r\n scope.$on('$routeUpdate', function() {\r\n if (trackAsSearchParam) {\r\n if (($location.search())[stateName]) {\r\n SharedState.turnOn(stateName);\r\n } else {\r\n SharedState.turnOff(stateName);\r\n }\r\n }\r\n });\r\n\r\n scope.$on('mobile-angular-ui.app.transitionend', function() {\r\n if (!SharedState.isActive(stateName)) {\r\n $rootElement.removeClass(visibleClass);\r\n }\r\n });\r\n\r\n if (attrs.closeOnOuterClicks !== 'false') {\r\n bindOuterClick(scope, elem, outerClickCb, outerClickIf);\r\n }\r\n }\r\n };\r\n }\r\n ]);\r\n });\r\n\r\n module.directive('app', ['$rootScope', function($rootScope) {\r\n return {\r\n restrict: 'C',\r\n link: function(scope, element) {\r\n\r\n element.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend', function() {\r\n $rootScope.$broadcast('mobile-angular-ui.app.transitionend');\r\n });\r\n\r\n }\r\n };\r\n }]);\r\n})();\r\n","/**\r\n * A module with just a directive to create a switch input component.\r\n *\r\n * @module mobile-angular-ui.components.switch\r\n */\r\n(function() {\r\n 'use strict';\r\n angular.module('mobile-angular-ui.components.switch', [])\r\n\r\n /**\r\n * @directive uiSwitch\r\n * @restrict EA\r\n * @requires ngModel\r\n * @description\r\n *\r\n * The `ui-switch` directive (not to be confused with `ng-switch`) lets\r\n * you create a toggle switch control bound to a boolean `ngModel` value.\r\n *\r\n *
    \r\n * \"\"/\r\n *
    \r\n *\r\n * It requires `ngModel`. It supports `ngChange` and `ngDisabled`.\r\n *\r\n * ``` html\r\n * \r\n * ```\r\n *\r\n * ``` html\r\n * \r\n * ```\r\n *\r\n * ``` html\r\n * \r\n * ```\r\n *\r\n * Note that if `$drag` service from `mobile-angular-ui.gestures` is available\r\n * `ui-switch` will support drag too.\r\n *\r\n * @param {expression} ngModel The model bound to this component.\r\n * @param {boolean} [disabled] Whether this component should be disabled.\r\n * @param {expression} [ngChange] An expression to be evaluated when model changes.\r\n */\r\n .directive('uiSwitch', ['$injector', function($injector) {\r\n var $drag = $injector.has('$drag') && $injector.get('$drag');\r\n\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n model: '=ngModel',\r\n changeExpr: '@ngChange'\r\n },\r\n link: function(scope, elem, attrs) {\r\n elem.addClass('switch');\r\n\r\n var disabled = attrs.disabled || elem.attr('disabled');\r\n\r\n var unwatchDisabled = scope.$watch(\r\n function() {\r\n return attrs.disabled || elem.attr('disabled');\r\n },\r\n function(value) {\r\n if (!value || value === 'false' || value === '0') {\r\n disabled = false;\r\n } else {\r\n disabled = true;\r\n }\r\n }\r\n );\r\n\r\n var handle = angular.element('
    ');\r\n elem.append(handle);\r\n\r\n if (scope.model) {\r\n elem.addClass('active');\r\n }\r\n elem.addClass('switch-transition-enabled');\r\n\r\n var unwatch = scope.$watch('model', function(value) {\r\n if (value) {\r\n elem.addClass('active');\r\n } else {\r\n elem.removeClass('active');\r\n }\r\n });\r\n\r\n var setModel = function(value) {\r\n if (!disabled && (value !== scope.model)) {\r\n scope.model = value;\r\n scope.$apply();\r\n if (scope.changeExpr !== null && scope.changeExpr !== undefined) {\r\n scope.$parent.$eval(scope.changeExpr);\r\n }\r\n }\r\n };\r\n\r\n var clickCb = function() {\r\n setModel(!scope.model);\r\n };\r\n\r\n elem.on('click tap', clickCb);\r\n\r\n var unbind = angular.noop;\r\n\r\n if ($drag) {\r\n unbind = $drag.bind(handle, {\r\n transform: $drag.TRANSLATE_INSIDE(elem),\r\n start: function() {\r\n elem.off('click tap', clickCb);\r\n },\r\n cancel: function() {\r\n handle.removeAttr('style');\r\n elem.off('click tap', clickCb);\r\n elem.on('click tap', clickCb);\r\n },\r\n end: function() {\r\n var rh = handle[0].getBoundingClientRect();\r\n var re = elem[0].getBoundingClientRect();\r\n if (rh.left - re.left < rh.width / 3) {\r\n setModel(false);\r\n handle.removeAttr('style');\r\n } else if (re.right - rh.right < rh.width / 3) {\r\n setModel(true);\r\n handle.removeAttr('style');\r\n } else {\r\n handle.removeAttr('style');\r\n }\r\n elem.on('click tap', clickCb);\r\n }\r\n });\r\n }\r\n\r\n elem.on('$destroy', function() {\r\n unbind();\r\n unwatchDisabled();\r\n unwatch();\r\n setModel = unbind = unwatch = unwatchDisabled = clickCb = null;\r\n });\r\n }\r\n };\r\n }]);\r\n})();\r\n","/**\r\n * @module mobile-angular-ui.components\r\n *\r\n * @description\r\n *\r\n * It has directives and services providing mobile friendly\r\n * components like navbars and sidebars.\r\n * It requires `mobile-angular-ui.base.css`\r\n * in order to work properly.\r\n *\r\n * ## Standalone Usage\r\n *\r\n * Although `.components` module is required by `mobile-angular-ui` by default\r\n * you can use it alone. Some submodules requires `mobile-angular-ui.core` to work,\r\n * so be sure its sources are available.\r\n *\r\n * ``` js\r\n * angular.module('myApp', ['mobile-angular-ui.components']);\r\n * ```\r\n *\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui.components', [\r\n 'mobile-angular-ui.components.modals',\r\n 'mobile-angular-ui.components.navbars',\r\n 'mobile-angular-ui.components.sidebars',\r\n 'mobile-angular-ui.components.scrollable',\r\n 'mobile-angular-ui.components.switch'\r\n ]);\r\n})();\r\n","/**\r\n * @module mobile-angular-ui\r\n * @position 0\r\n * @description\r\n *\r\n * This is the main angular module of `mobile-angular-ui` framework.\r\n *\r\n * By requiring this module you will have all `mobile-angular-ui.core`\r\n * and `mobile-angular-ui.components` features required as well.\r\n *\r\n * ## Usage\r\n *\r\n * Declare it as a dependency for your application:\r\n *\r\n * ``` js\r\n * angular.module('myApp', ['mobile-angular-ui']);\r\n * ```\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n angular.module('mobile-angular-ui', [\r\n 'mobile-angular-ui.core',\r\n 'mobile-angular-ui.components'\r\n ]);\r\n\r\n})();\r\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/src/js/core/fastclick.js b/src/js/core/fastclick.js index 3d46b03..ec5f956 100644 --- a/src/js/core/fastclick.js +++ b/src/js/core/fastclick.js @@ -1,4 +1,8 @@ -(function() { +if (typeof FastClick === 'undefined') { + throw new Error('mobile-angular-ui\'s JavaScript requires FastClick') +} + +(function(FastClick) { 'use strict'; var module = angular.module('mobile-angular-ui.core.fastclick', []); @@ -39,4 +43,4 @@ }; }); }); -})(); +})(FastClick);