From 86d6889628d125486278d5352cbb2b4448f492e3 Mon Sep 17 00:00:00 2001 From: Max Lynch Date: Mon, 13 Jan 2014 10:46:41 -0600 Subject: [PATCH] Fixed #380 - rename ionic services to use $ionic prefix --- dist/js/ionic-angular.js | 93 ++++++++++--------- dist/js/ionic-angular.min.js | 4 +- js/ext/angular/src/directive/ionicBar.js | 6 +- js/ext/angular/src/directive/ionicContent.js | 6 +- js/ext/angular/src/directive/ionicSideMenu.js | 22 ++--- js/ext/angular/src/directive/ionicSlideBox.js | 4 +- js/ext/angular/src/directive/ionicTabBar.js | 8 +- .../angular/src/directive/ionicViewState.js | 22 ++--- .../service/delegates/ionicScrollDelegate.js | 2 +- .../delegates/ionicSlideBoxDelegate.js | 2 +- .../angular/src/service/ionicActionSheet.js | 4 +- js/ext/angular/src/service/ionicGesture.js | 2 +- js/ext/angular/src/service/ionicLoading.js | 2 +- js/ext/angular/src/service/ionicModal.js | 4 +- js/ext/angular/src/service/ionicPlatform.js | 2 +- js/ext/angular/src/service/ionicPopup.js | 2 +- .../angular/src/service/ionicTemplateLoad.js | 2 +- js/ext/angular/src/service/ionicView.js | 2 +- js/ext/angular/test/actionSheet.html | 4 +- .../test/directive/ionicSlideBox.unit.js | 4 +- js/ext/angular/test/gesture.html | 26 +++--- js/ext/angular/test/loading.html | 4 +- js/ext/angular/test/modal.html | 4 +- .../angular/test/service/ionicGesture.unit.js | 4 +- .../angular/test/service/ionicModal.unit.js | 4 +- ...cView.unit.js => ionicViewService.unit.js} | 4 +- js/ext/angular/test/slideBoxDynamic.html | 4 +- js/ext/angular/test/tabs.html | 6 +- js/ext/angular/test/viewState.html | 4 +- 29 files changed, 129 insertions(+), 128 deletions(-) rename js/ext/angular/test/service/{ionicView.unit.js => ionicViewService.unit.js} (99%) diff --git a/dist/js/ionic-angular.js b/dist/js/ionic-angular.js index 8a922cca66..ef37b28e80 100644 --- a/dist/js/ionic-angular.js +++ b/dist/js/ionic-angular.js @@ -64,7 +64,7 @@ angular.module('ionic', [ angular.module('ionic.ui.service.scrollDelegate', []) -.factory('ScrollDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { +.factory('$ionicScrollDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { return { /** * Trigger a scroll-to-top event on child scrollers. @@ -128,7 +128,7 @@ angular.module('ionic.ui.service.scrollDelegate', []) angular.module('ionic.ui.service.slideBoxDelegate', []) -.factory('SlideBoxDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { +.factory('$ionicSlideBoxDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { return { /** * Trigger a slidebox to update and resize itself @@ -155,8 +155,8 @@ angular.module('ionic.ui.service.slideBoxDelegate', []) ; angular.module('ionic.service.actionSheet', ['ionic.service.templateLoad', 'ionic.ui.actionSheet', 'ngAnimate']) -.factory('ActionSheet', ['$rootScope', '$document', '$compile', '$animate', '$timeout', 'TemplateLoader', - function($rootScope, $document, $compile, $animate, $timeout, TemplateLoader) { +.factory('$ionicActionSheet', ['$rootScope', '$document', '$compile', '$animate', '$timeout', '$ionicTemplateLoader', + function($rootScope, $document, $compile, $animate, $timeout, $ionicTemplateLoader) { return { /** @@ -228,7 +228,7 @@ angular.module('ionic.service.actionSheet', ['ionic.service.templateLoad', 'ioni ; angular.module('ionic.service.gesture', []) -.factory('Gesture', [function() { +.factory('$ionicGesture', [function() { return { on: function(eventType, cb, $element) { return window.ionic.onGesture(eventType, cb, $element[0]); @@ -241,7 +241,7 @@ angular.module('ionic.service.gesture', []) ; angular.module('ionic.service.loading', ['ionic.ui.loading']) -.factory('Loading', ['$rootScope', '$document', '$compile', function($rootScope, $document, $compile) { +.factory('$ionicLoading', ['$rootScope', '$document', '$compile', function($rootScope, $document, $compile) { return { /** * Load an action sheet with the given template string. @@ -298,7 +298,7 @@ angular.module('ionic.service.loading', ['ionic.ui.loading']) angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ngAnimate']) -.factory('Modal', ['$rootScope', '$document', '$compile', '$animate', '$q', 'TemplateLoader', function($rootScope, $document, $compile, $animate, $q, TemplateLoader) { +.factory('$ionicModal', ['$rootScope', '$document', '$compile', '$animate', '$q', '$ionicTemplateLoader', function($rootScope, $document, $compile, $animate, $q, $ionicTemplateLoader) { var ModalView = ionic.views.Modal.inherit({ initialize: function(opts) { ionic.views.Modal.prototype.initialize.call(this, opts); @@ -366,7 +366,7 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ngAnimate' return modal; }, fromTemplateUrl: function(url, cb, options) { - return TemplateLoader.load(url).then(function(templateString) { + return $ionicTemplateLoader.load(url).then(function(templateString) { var modal = createModal(templateString, options || {}); cb ? cb(modal) : null; return modal; @@ -387,7 +387,7 @@ angular.module('ionic.service.platform', []) * initializing some defaults that depend on the platform, such as the * height of header bars on iOS 7. */ -.provider('Platform', function() { +.provider('$ionicPlatform', function() { var platform = 'web'; var isPlatformReady = false; @@ -477,7 +477,7 @@ angular.module('ionic.service.platform', []) angular.module('ionic.service.popup', ['ionic.service.templateLoad']) -.factory('Popup', ['$rootScope', '$document', '$compile', 'TemplateLoader', function($rootScope, $document, $compile, TemplateLoader) { +.factory('$ionicPopup', ['$rootScope', '$document', '$compile', 'TemplateLoader', function($rootScope, $document, $compile, TemplateLoader) { var getPopup = function() { // Make sure there is only one loading element on the page at one point in time @@ -534,7 +534,7 @@ angular.module('ionic.service.popup', ['ionic.service.templateLoad']) ; angular.module('ionic.service.templateLoad', []) -.factory('TemplateLoader', ['$q', '$http', '$templateCache', function($q, $http, $templateCache) { +.factory('$ionicTemplateLoader', ['$q', '$http', '$templateCache', function($q, $http, $templateCache) { return { load: function(url) { var deferred = $q.defer(); @@ -606,7 +606,7 @@ angular.module('ionic.service.view', ['ui.router']) }]) -.factory('ViewService', ['$rootScope', '$state', '$location', '$window', '$injector', +.factory('$ionicViewService', ['$rootScope', '$state', '$location', '$window', '$injector', function( $rootScope, $state, $location, $window, $injector) { var $animate = $injector.has('$animate') ? $injector.get('$animate') : false; @@ -1025,17 +1025,17 @@ angular.module('ionic.ui.actionSheet', []) angular.module('ionic.ui.header', ['ngAnimate']) -.directive('barHeader', ['ScrollDelegate', function(ScrollDelegate) { +.directive('barHeader', ['$ionicScrollDelegate', function($ionicScrollDelegate) { return { restrict: 'C', link: function($scope, $element, $attr) { // We want to scroll to top when the top of this element is clicked - ScrollDelegate.tapScrollToTop($element); + $ionicScrollDelegate.tapScrollToTop($element); } }; }]) -.directive('headerBar', [function(ScrollDelegate) { +.directive('headerBar', ['$ionicScrollDelegate', function($ionicScrollDelegate) { return { restrict: 'E', replace: true, @@ -1177,7 +1177,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // The content directive is a core scrollable content area // that is part of many View hierarchies -.directive('content', ['$parse', '$timeout', 'Platform', 'ScrollDelegate', function($parse, $timeout, Platform, ScrollDelegate) { +.directive('content', ['$parse', '$timeout', '$ionicPlatform', '$ionicScrollDelegate', function($parse, $timeout, $ionicPlatform, $ionicScrollDelegate) { return { restrict: 'E', replace: true, @@ -1241,7 +1241,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // Otherwise, supercharge this baby! $timeout(function() { var hasBouncing = $scope.$eval($scope.hasBouncing); - var enableBouncing = !Platform.is('Android') && hasBouncing !== false; + var enableBouncing = !$ionicPlatform.is('Android') && hasBouncing !== false; // No bouncing by default for Android users, lest they take up pitchforks // to our bouncing goodness sv = new ionic.views.Scroll({ @@ -1275,7 +1275,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) } // Register for scroll delegate event handling - ScrollDelegate.register($scope, $element); + $ionicScrollDelegate.register($scope, $element); // Let child scopes access this $scope.$parent.scrollView = sv; @@ -1822,7 +1822,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) }; }) -.directive('sideMenuContent', ['$timeout', 'Gesture', function($timeout, Gesture) { +.directive('sideMenuContent', ['$timeout', '$ionicGesture', function($timeout, $ionicGesture) { return { restrict: 'AC', require: '^sideMenus', @@ -1862,10 +1862,10 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) }; //var dragGesture = Gesture.on('drag', dragFn, $element); - var dragRightGesture = Gesture.on('dragright', dragFn, $element); - var dragLeftGesture = Gesture.on('dragleft', dragFn, $element); - var dragUpGesture = Gesture.on('dragup', dragVertFn, $element); - var dragDownGesture = Gesture.on('dragdown', dragVertFn, $element); + var dragRightGesture = $ionicGesture.on('dragright', dragFn, $element); + var dragLeftGesture = $ionicGesture.on('dragleft', dragFn, $element); + var dragUpGesture = $ionicGesture.on('dragup', dragVertFn, $element); + var dragDownGesture = $ionicGesture.on('dragdown', dragVertFn, $element); var dragReleaseFn = function(e) { isDragging = false; @@ -1875,7 +1875,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) defaultPrevented = false; }; - var releaseGesture = Gesture.on('release', dragReleaseFn, $element); + var releaseGesture = $ionicGesture.on('release', dragReleaseFn, $element); sideMenuCtrl.setContent({ onDrag: function(e) {}, @@ -1903,11 +1903,11 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) // Cleanup $scope.$on('$destroy', function() { - Gesture.off(dragLeftGesture, 'dragleft', dragFn); - Gesture.off(dragRightGesture, 'dragright', dragFn); - Gesture.off(dragUpGesture, 'dragup', dragFn); - Gesture.off(dragDownGesture, 'dragdown', dragFn); - Gesture.off(releaseGesture, 'release', dragReleaseFn); + $ionicGesture.off(dragLeftGesture, 'dragleft', dragFn); + $ionicGesture.off(dragRightGesture, 'dragright', dragFn); + $ionicGesture.off(dragUpGesture, 'dragup', dragFn); + $ionicGesture.off(dragDownGesture, 'dragdown', dragFn); + $ionicGesture.off(releaseGesture, 'release', dragReleaseFn); }); }; } @@ -1967,7 +1967,7 @@ angular.module('ionic.ui.slideBox', []) * The internal controller for the slide box controller. */ -.directive('slideBox', ['$timeout', '$compile', 'SlideBoxDelegate', function($timeout, $compile, SlideBoxDelegate) { +.directive('slideBox', ['$timeout', '$compile', '$ionicSlideBoxDelegate', function($timeout, $compile, $ionicSlideBoxDelegate) { return { restrict: 'E', replace: true, @@ -2027,7 +2027,7 @@ angular.module('ionic.ui.slideBox', []) $scope.$parent.slideBox = slider; - SlideBoxDelegate.register($scope, $element); + $ionicSlideBoxDelegate.register($scope, $element); this.getNumSlides = function() { return slider.getNumSlides(); @@ -2224,7 +2224,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) }]) // Generic controller directive -.directive('tab', ['ViewService', '$rootScope', '$parse', function(ViewService, $rootScope, $parse) { +.directive('tab', ['$ionicViewService', '$rootScope', '$parse', function($ionicViewService, $rootScope, $parse) { return { restrict: 'E', require: '^tabs', @@ -2235,7 +2235,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) return function link($scope, $element, $attr, tabsCtrl) { var childScope, childElement; - ViewService.registerHistory($scope); + $ionicViewService.registerHistory($scope); $scope.title = $attr.title; $scope.icon = $attr.icon; @@ -2302,7 +2302,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) if($scope.hasNavView) { // this tab has a ui-view $scope.navViewName = navViewEle[0].getAttribute('name'); - if( ViewService.isCurrentStateNavView( $scope.navViewName ) ) { + if( $ionicViewService.isCurrentStateNavView( $scope.navViewName ) ) { // this tab's ui-view is the current one, go to it! tabsCtrl.select($scope.tabIndex); } @@ -2310,7 +2310,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) }); $rootScope.$on('$stateChangeSuccess', function(value){ - if( ViewService.isCurrentStateNavView($scope.navViewName) && + if( $ionicViewService.isCurrentStateNavView($scope.navViewName) && $scope.tabIndex !== tabsCtrl.selectedIndex) { tabsCtrl.select($scope.tabIndex); } @@ -2450,8 +2450,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu /** * Our Nav Bar directive which updates as the controller state changes. */ -.directive('navBar', ['ViewService', '$rootScope', '$animate', '$compile', - function( ViewService, $rootScope, $animate, $compile) { +.directive('navBar', ['$ionicViewService', '$rootScope', '$animate', '$compile', + function( $ionicViewService, $rootScope, $animate, $compile) { /** * Perform an animation between one tab bar state and the next. @@ -2578,8 +2578,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('view', ['ViewService', '$rootScope', '$animate', - function( ViewService, $rootScope, $animate) { +.directive('view', ['$ionicViewService', '$rootScope', '$animate', + function( $ionicViewService, $rootScope, $animate) { return { restrict: 'EA', priority: 1000, @@ -2638,9 +2638,9 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('viewBack', ['ViewService', '$rootScope', function(ViewService, $rootScope) { +.directive('viewBack', ['$ionicViewService', '$rootScope', function($ionicViewService, $rootScope) { var goBack = function(e) { - var backView = ViewService.getBackView(); + var backView = $ionicViewService.getBackView(); backView && backView.go(); e.alreadyHandled = true; return false; @@ -2677,8 +2677,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('navView', ['ViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', - function( ViewService, $state, $anchorScroll, $compile, $controller, $animate) { +.directive('navView', ['$ionicViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', + function( $ionicViewService, $state, $anchorScroll, $compile, $controller, $animate) { var viewIsUpdating = false; var animation; @@ -2743,7 +2743,7 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu var registerData = {}; if(currentElement[0].tagName !== 'TABS') { // the tabs directive shouldn't register in the view history (its tab will) - registerData = ViewService.register(scope); + registerData = $ionicViewService.register(scope); transitionOptions.navDirection = registerData.navDirection; } @@ -2776,7 +2776,7 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu transitionOptions.enteringElement = currentElement; } - ViewService.transition(transitionOptions); + $ionicViewService.transition(transitionOptions); } } }; @@ -2784,7 +2784,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]); -})();; +})(); +; (function() { 'use strict'; diff --git a/dist/js/ionic-angular.min.js b/dist/js/ionic-angular.min.js index 7466e0f25c..da769a50ab 100644 --- a/dist/js/ionic-angular.min.js +++ b/dist/js/ionic-angular.min.js @@ -11,5 +11,5 @@ * Licensed under the MIT license. Please see LICENSE for more information. * */ -angular.module("ionic.service",["ionic.service.platform","ionic.service.actionSheet","ionic.service.gesture","ionic.service.loading","ionic.service.modal","ionic.service.popup","ionic.service.templateLoad","ionic.service.view"]),angular.module("ionic.ui.service",["ionic.ui.service.scrollDelegate","ionic.ui.service.slideBoxDelegate"]),angular.module("ionic.ui",["ionic.ui.content","ionic.ui.scroll","ionic.ui.tabs","ionic.ui.viewState","ionic.ui.header","ionic.ui.sideMenu","ionic.ui.slideBox","ionic.ui.list","ionic.ui.checkbox","ionic.ui.toggle","ionic.ui.radio"]),angular.module("ionic",["ionic.service","ionic.ui.service","ionic.ui","ngAnimate","ngTouch","ngSanitize","ui.router"]),function(){"use strict";angular.module("ionic.ui.service.scrollDelegate",[]).factory("ScrollDelegate",["$rootScope","$timeout",function(a,b){return{scrollTop:function(b){a.$broadcast("scroll.scrollTop",b)},tapScrollToTop:function(a){var b=this;ionic.on("tap",function(c){var d=a[0],e=d.getBoundingClientRect();ionic.DomUtil.rectContains(c.gesture.touches[0].pageX,c.gesture.touches[0].pageY,e.left,e.top,e.left+e.width,e.top+20)&&b.scrollTop()},a[0])},register:function(a,c){c.bind("scroll",function(b){a.onScroll({event:b,scrollTop:b.detail?b.detail.scrollTop:b.originalEvent?b.originalEvent.detail.scrollTop:0,scrollLeft:b.detail?b.detail.scrollLeft:b.originalEvent?b.originalEvent.detail.scrollLeft:0})}),a.$parent.$on("scroll.resize",function(){b(function(){a.$parent.scrollView&&a.$parent.scrollView.resize()})}),a.$parent.$on("scroll.refreshComplete",function(){a.$parent.scrollView&&a.$parent.scrollView.finishPullToRefresh()}),a.$parent.$on("scroll.scrollTop",function(b,c){a.$parent.scrollView&&a.$parent.scrollView.scrollTo(0,0,c===!1?!1:!0)})}}}])}(ionic),function(){"use strict";angular.module("ionic.ui.service.slideBoxDelegate",[]).factory("SlideBoxDelegate",["$rootScope","$timeout",function(a,b){return{update:function(){a.$broadcast("slideBox.update")},register:function(a){a.$parent.$on("slideBox.update",function(c){c.defaultPrevented||(b(function(){a.$parent.slideBox.setup()}),c.preventDefault())})}}}])}(ionic),angular.module("ionic.service.actionSheet",["ionic.service.templateLoad","ionic.ui.actionSheet","ngAnimate"]).factory("ActionSheet",["$rootScope","$document","$compile","$animate","$timeout","TemplateLoader",function(a,b,c,d){return{show:function(e){var f=a.$new(!0);angular.extend(f,e);var g=c('')(f),h=angular.element(g[0].querySelector(".action-sheet")),i=function(a){d.leave(h,function(){a&&e.cancel()}),d.removeClass(g,"active",function(){f.$destroy()})};f.cancel=function(){i(!0)},f.buttonClicked=function(a){(e.buttonClicked&&e.buttonClicked(a))===!0&&i(!1)},f.destructiveButtonClicked=function(){(e.destructiveButtonClicked&&e.destructiveButtonClicked())===!0&&i(!1)},b[0].body.appendChild(g[0]);var j=new ionic.views.ActionSheet({el:g[0]});return f.sheet=j,d.addClass(g,"active"),d.enter(h,g,null,function(){}),j}}}]),angular.module("ionic.service.gesture",[]).factory("Gesture",[function(){return{on:function(a,b,c){return window.ionic.onGesture(a,b,c[0])},off:function(a,b,c){return window.ionic.offGesture(a,b,c)}}}]),angular.module("ionic.service.loading",["ionic.ui.loading"]).factory("Loading",["$rootScope","$document","$compile",function(a,b,c){return{show:function(d){var e={content:"",animation:"fade-in",showBackdrop:!0,maxWidth:200,showDelay:2e3};d=angular.extend(e,d);var f=a.$new(!0);angular.extend(f,d);var g=angular.element(b[0].querySelector(".loading-backdrop"));if(g.length&&(f=g.scope(),f.loading))return f.loading.show(),f.loading;var h=c(""+d.content+"")(f);b[0].body.appendChild(h[0]);var i=new ionic.views.Loading({el:h[0],maxWidth:d.maxWidth,showDelay:d.showDelay});return i.show(),f.loading=i,i}}}]),angular.module("ionic.service.modal",["ionic.service.templateLoad","ngAnimate"]).factory("Modal",["$rootScope","$document","$compile","$animate","$q","TemplateLoader",function(a,b,c,d,e,f){var g=ionic.views.Modal.inherit({initialize:function(a){ionic.views.Modal.prototype.initialize.call(this,a),this.animation=a.animation||"slide-in-up"},show:function(){var a=this,c=angular.element(this.el);c.parent().length||(angular.element(b[0].body).append(c),ionic.views.Modal.prototype.show.call(a)),d.addClass(c,this.animation,function(){})},hide:function(){var a=angular.element(this.el);d.removeClass(a,this.animation),ionic.views.Modal.prototype.hide.call(this)},remove:function(){var a=this;angular.element(this.el),d.leave(angular.element(this.el),function(){a.scope.$destroy()})}}),h=function(b,d){var e=d.scope&&d.scope.$new()||a.$new(!0),f=c(b)(e);d.el=f[0];var h=new g(d);return h.scope=e,d.scope||(e.modal=h),h};return{fromTemplate:function(a,b){var c=h(a,b||{});return c},fromTemplateUrl:function(a,b,c){return f.load(a).then(function(a){var d=h(a,c||{});return b?b(d):null,d})}}}]),function(){"use strict";angular.module("ionic.service.platform",[]).provider("Platform",function(){var a="web",b=!1;(window.cordova||window.PhoneGap||window.phonegap)&&(a="cordova");var c=function(){return"cordova"==a?window.device||window.Cordova:!0};return setTimeout(function d(){c()&&ionic.Platform.detect()||setTimeout(d,50)},10),{setPlatform:function(b){a=b},$get:["$q","$timeout",function(a,d){return{onHardwareBackButton:function(a){this.ready(function(){document.addEventListener("backbutton",a,!1)})},offHardwareBackButton:function(a){this.ready(function(){document.removeEventListener("backbutton",a)})},is:function(a){return ionic.Platform.is(a)},ready:function(e){var f=a.defer();return d(function g(){c()?(b=!0,f.resolve(),e()):d(g,50)},50),f.promise}}}]}})}(ionic),angular.module("ionic.service.popup",["ionic.service.templateLoad"]).factory("Popup",["$rootScope","$document","$compile","TemplateLoader",function(a,b,c){var d=function(){var a=angular.element(b[0].querySelector(".popup"));if(a.length){var c=a.scope();if(c.popup)return c}};return{alert:function(e,f){var g=d();if(g)return g.popup.alert(e);var h={title:e,animation:"fade-in"};opts=angular.extend(h,opts);var i=f&&f.$new()||a.$new(!0);angular.extend(i,opts);var j=c(""+opts.content+"")(i);b[0].body.appendChild(j[0]);var k=new ionic.views.Popup({el:j[0]});return k.alert(e),i.popup=k,k},confirm:function(){},prompt:function(){},show:function(){}}}]),angular.module("ionic.service.templateLoad",[]).factory("TemplateLoader",["$q","$http","$templateCache",function(a,b,c){return{load:function(d){var e=a.defer();return b({method:"GET",url:d,cache:c}).success(function(a){e.resolve(a&&a.trim())}).error(function(a){e.reject(a)}),e.promise}}}]),angular.module("ionic.service.view",["ui.router"]).run(["$rootScope","$state","$location","$document",function(a,b,c,d){a.$viewHistory={histories:{root:{historyId:"root",parentHistoryId:null,stack:[],cursor:-1}},backView:null,forwardView:null,currentView:null},a.$on("viewState.changeHistory",function(d,e){if(e){var f=e.historyId?a.$viewHistory.histories[e.historyId]:null;if(f&&f.cursor>-1&&f.cursor-1&&g.stack.length>0&&g.cursor=j.index;n--)m.stack[n].destory(),m.stack.splice(n)}}else k.navAction="initialView";d.histories[k.viewId]=this.createView({viewId:k.viewId,index:g.stack.length,historyId:g.historyId,backViewId:h&&h.viewId?h.viewId:null,forwardViewId:null,stateId:e,stateName:this.getCurrentStateName(),stateParams:this.getCurrentStateParams(),url:c.url()}),g.stack.push(d.histories[k.viewId])}return this.setNavViews(k.viewId),g.cursor=d.currentView.index,k},setNavViews:function(b){var c=a.$viewHistory;c.currentView=this._getView(b),c.backView=this._getBackView(c.currentView),c.forwardView=this._getForwardView(c.currentView),a.$broadcast("$viewHistory.historyChange",{showBack:c.backView&&c.backView.historyId===c.currentView.historyId})},registerHistory:function(a){a.$historyId="h"+Math.round(99999999999*Math.random())},createView:function(a){var b=new h;return b.initialize(a)},getCurrentView:function(){return a.$viewHistory.currentView},getBackView:function(){return a.$viewHistory.backView},getForwardView:function(){return a.$viewHistory.forwardView},getNavDirection:function(){return a.$viewHistory.navDirection},getCurrentStateName:function(){return b&&b.current?b.current.name:null},isCurrentStateNavView:function(a){return b&&b.current&&b.current.views&&b.current.views[a]?!0:!1},getCurrentStateParams:function(){var a;if(b&&b.params)for(var c in b.params)b.params.hasOwnProperty(c)&&(a=a||{},a[c]=b.params[c]);return a},getCurrentStateId:function(){var a;if(b&&b.current&&b.current.name){if(a=b.current.name,b.params)for(var c in b.params)b.params.hasOwnProperty(c)&&b.params[c]&&(a+="_"+c+"="+b.params[c]);return a}return"r"+Math.round(9999999*Math.random())},_getView:function(b){return b?a.$viewHistory.histories[b]:null},_getBackView:function(a){return a?this._getView(a.backViewId):null},_getForwardView:function(a){return a?this._getView(a.forwardViewId):null},_getHistory:function(b){var c=this._getParentHistoryObj(b);return a.$viewHistory.histories[c.historyId]||(a.$viewHistory.histories[c.historyId]={historyId:c.historyId,parentHistoryId:this._getParentHistoryObj(c.scope.$parent).historyId,stack:[],cursor:-1}),a.$viewHistory.histories[c.historyId]},_getParentHistoryObj:function(b){for(var c=b;c;){if(c.hasOwnProperty("$historyId"))return{historyId:c.$historyId,scope:c};c=c.$parent}return{historyId:"root",scope:a}},transition:function(a){function b(){for(var b=a.enteringScope;b;){if(b.animation)return b.animation;b=b.$parent}}if(a&&a.enteringElement){a.leavingScope&&(a.leavingScope.$destroy(),a.leavingScope=null);var c=a.animation||b();g&&c&&a.doAnimation!==!1&&a.navDirection?(this.setAnimationClass(a.parentElement,c,a.navDirection),a.leavingElement&&g.leave(a.leavingElement),g.enter(a.enteringElement,a.parentElement)):(a.leavingElement&&a.leavingElement.remove(),a.parentElement.append(a.enteringElement))}},setAnimationClass:function(a,b,c){a[0].classList.add(b),"back"===c?a[0].classList.add("reverse"):a[0].classList.remove("reverse")},clearHistory:function(){var b,c=a.$viewHistory.histories,d=a.$viewHistory.currentView;for(b in c)c[b].stack&&(c[b].stack=[],c[b].cursor=-1),d.historyId===b?(d.backViewId=null,d.forwardViewId=null,c[b].stack.push(d)):c[b].destroy&&c[b].destroy();this.setNavViews(d.viewId)}}}]),function(){"use strict";angular.module("ionic.ui.actionSheet",[]).directive("actionSheet",["$document",function(a){return{restrict:"E",scope:!0,replace:!0,link:function(b,c){var d=function(a){27==a.which&&(b.cancel(),b.$apply())},e=function(a){a.target==c[0]&&(b.cancel(),b.$apply())};b.$on("$destroy",function(){c.remove(),a.unbind("keyup",d)}),a.bind("keyup",d),c.bind("click",e)},template:'
{{titleText}}
'}}])}(),function(a){"use strict";angular.module("ionic.ui.header",["ngAnimate"]).directive("barHeader",["ScrollDelegate",function(a){return{restrict:"C",link:function(b,c){a.tapScrollToTop(c)}}}]).directive("headerBar",[function(){return{restrict:"E",replace:!0,transclude:!0,template:'

',scope:{leftButtons:"=",rightButtons:"=",title:"=",type:"@",alignTitle:"@"},link:function(b,c){var d=new a.views.HeaderBar({el:c[0],alignTitle:b.alignTitle||"center"});c.addClass(b.type),b.headerBarView=d,b.$watch("leftButtons",function(){d.align()}),b.$watch("rightButtons",function(){console.log("Right buttons changed"),d.align()}),b.$watch("title",function(){d.align()})}}}]).directive("footerBar",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
',scope:{type:"@"},link:function(a,b){b.addClass(a.type)}}})}(ionic),function(){"use strict";angular.module("ionic.ui.checkbox",[]).directive("checkbox",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{},transclude:!0,template:'
  • ',link:function(a,b,c,d){var e;d&&(e=angular.element(b[0].querySelector('input[type="checkbox"]')),e.length&&(e.bind("change",function(b){d.$setViewValue(e[0].checked),a.$apply(function(){b.alreadyHandled=!0})}),d&&(d.$render=function(){e[0].checked=d.$viewValue})))}}})}(),function(){"use strict";angular.module("ionic.ui.content",["ionic.ui.service"]).directive("pane",function(){return{restrict:"E",link:function(a,b){b.addClass("pane")}}}).directive("content",["$parse","$timeout","Platform","ScrollDelegate",function(a,b,c,d){return{restrict:"E",replace:!0,template:'
    ',transclude:!0,scope:{onRefresh:"&",onRefreshOpening:"&",onScroll:"&",onScrollComplete:"&",refreshComplete:"=",onInfiniteScroll:"=",infiniteScrollDistance:"@",hasBouncing:"@",scroll:"@",padding:"@",hasScrollX:"@",hasScrollY:"@",scrollbarX:"@",scrollbarY:"@",scrollEventInterval:"@"},compile:function(a,e){return"true"==e.hasHeader&&a.addClass("has-header"),"true"==e.hasSubheader&&a.addClass("has-subheader"),"true"==e.hasFooter&&a.addClass("has-footer"),"true"==e.hasTabs&&a.addClass("has-tabs"),function(a,f){var g,h=angular.element(f.children()[0]);if(a.$eval(a.padding)===!0&&h.addClass("padding"),"false"!==a.scroll)if("true"===e.overflowScroll)f.addClass("overflow-scroll");else{var i=f[0].querySelector(".scroll-refresher");i&&i.clientHeight||0,e.refreshComplete&&(a.refreshComplete=function(){a.scrollView&&(i&&i.classList.remove("active"),a.scrollView.finishPullToRefresh(),a.$parent.$broadcast("scroll.onRefreshComplete"))}),b(function(){var b=a.$eval(a.hasBouncing),e=!c.is("Android")&&b!==!1;g=new ionic.views.Scroll({el:f[0],bouncing:e,scrollbarX:a.$eval(a.scrollbarX)!==!1,scrollbarY:a.$eval(a.scrollbarY)!==!1,scrollingX:a.$eval(a.hasScrollX)===!0,scrollingY:a.$eval(a.hasScrollY)!==!1,scrollEventInterval:parseInt(a.scrollEventInterval,10)||20,scrollingComplete:function(){a.onScrollComplete({scrollTop:this.__scrollTop,scrollLeft:this.__scrollLeft})}}),i&&g.activatePullToRefresh(50,function(){i.classList.add("active")},function(){i.classList.remove("refreshing"),i.classList.remove("active")},function(){i.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),d.register(a,f),a.$parent.scrollView=g});var j=f.find("infinite-scroll"),k=!1;if(j){var l,m=e.infiniteScrollDistance||"1%";l=m.indexOf("%")?function(){return g.getScrollMax().top*(1-parseInt(m,10)/100)}:function(){return g.getScrollMax().top-parseInt(m,10)},f.bind("scroll",function(){if(g&&!k&&g.getValues().top>l()){k=!0,j.addClass("active");var b=function(){g.resize(),k=!1,j.removeClass("active")};a.$apply(angular.bind(a,a.onInfiniteScroll,b))}})}}}}}}]).directive("refresher",function(){return{restrict:"E",replace:!0,require:["^?content","^?list"],template:'
    ',scope:!0}}).directive("scrollRefresher",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
    '}}).directive("infiniteScroll",function(){return{restrict:"E",replace:!1,template:'
    '}})}(),function(){"use strict";angular.module("ionic.ui.list",["ngAnimate"]).directive("item",["$timeout","$parse",function(){return{restrict:"E",require:"?^list",replace:!0,transclude:!0,scope:{item:"=",itemType:"@",canDelete:"@",canReorder:"@",canSwipe:"@",onDelete:"&",optionButtons:"&",deleteIcon:"@",reorderIcon:"@"},template:'
    ',link:function(a,b,c,d){if(d){var e=d.scope,f=d.attrs;c.$observe("href",function(b){b&&(a.href=b.trim())}),a.itemType||(a.itemType=e.itemType),b.addClass(a.itemType||e.itemType),a.itemClass=a.itemType,"false"!==(c.canDelete?a.canDelete:e.canDelete)&&(c.onDelete||f.onDelete)&&(a.deleteClick=function(){c.onDelete?a.onDelete({item:a.item}):f.onDelete&&e.onDelete({item:a.item})},a.deleteIconClass=a.deleteIcon||e.deleteIcon||"ion-minus-circled"),"true"===(c.canReorder?a.canReorder:e.canReorder)&&(a.reorderIconClass=a.reorderIcon||e.reorderIcon||"ion-navicon"),"false"!==(c.canSwipe?a.canSwipe:e.canSwipe)&&(a.itemOptionButtons=a.optionButtons(),"undefined"==typeof a.itemOptionButtons&&(a.itemOptionButtons=e.optionButtons()))}}}}]).directive("list",["$timeout",function(a){return{restrict:"E",replace:!0,transclude:!0,scope:{itemType:"@",canDelete:"@",canReorder:"@",canSwipe:"@",showDelete:"=",showReorder:"=",onDelete:"&",onReorder:"&",optionButtons:"&",deleteIcon:"@",reorderIcon:"@"},template:"
    ",controller:["$scope","$attrs",function(a,b){this.scope=a,this.attrs=b}],link:function(b,c,d){b.listView=new ionic.views.ListView({el:c[0],listEl:c[0].children[0]}),d.animation&&c[0].classList.add(d.animation);var e=b.$watch("showReorder",function(b){b?c[0].classList.add("item-options-hide"):b===!1&&a(function(){c[0].classList.remove("item-options-hide")},250)});b.$on("$destroy",function(){e()})}}}])}(),function(){"use strict";angular.module("ionic.ui.loading",[]).directive("loading",function(){return{restrict:"E",replace:!0,transclude:!0,link:function(a,b){b.addClass(a.animation||"")},template:'
    '}})}(),function(a){"use strict";angular.module("ionic.ui.radio",[]).directive("radio",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{value:"@"},transclude:!0,template:'',link:function(a,b,c,d){var e;d&&(e=b.children().eq(0),e.length&&d&&(e.bind("click",function(b){console.log("RADIO CLICK"),a.$apply(function(){d.$setViewValue(a.$eval(c.ngValue))}),b.alreadyHandled=!0}),d.$render=function(){var b=a.$eval(c.ngValue);b===d.$viewValue?e.attr("checked","checked"):e.removeAttr("checked")}))}}}).directive("radioButtons",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{value:"@"},transclude:!0,template:'
    ',controller:["$scope","$element",function(a,b){this.select=function(a){for(var c,d=b.children(),e=0;e',transclude:!0,scope:{direction:"@",paging:"@",onRefresh:"&",onScroll:"&",refreshComplete:"=",scroll:"@",scrollbarX:"@",scrollbarY:"@"},controller:function(){},compile:function(a,c,d){return function(a,e){var f,g,h=document.createElement("div");h.className="scroll","true"==c.padding&&h.classList.add("padding"),a.$eval(a.paging)===!0&&h.classList.add("scroll-paging"),e.append(h),f=d(a.$parent),angular.element(e[0].firstElementChild).append(f);var i=e[0].querySelector(".scroll-refresher"),j=i&&i.clientHeight||0;a.direction||(a.direction="y");var k=a.direction.indexOf("x")>=0,l=a.direction.indexOf("y")>=0;b(function(){var c={el:e[0],paging:a.$eval(a.paging)===!0,scrollbarX:a.$eval(a.scrollbarX)!==!1,scrollbarY:a.$eval(a.scrollbarY)!==!1,scrollingX:k,scrollingY:l};c.paging&&(c.speedMultiplier=.8,c.bouncing=!1),g=new ionic.views.Scroll(c),i&&g.activatePullToRefresh(j,function(){i.classList.add("active")},function(){i.classList.remove("refreshing"),i.classList.remove("active")},function(){i.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),e.bind("scroll",function(b){a.onScroll({event:b,scrollTop:b.detail?b.detail.scrollTop:b.originalEvent?b.originalEvent.detail.scrollTop:0,scrollLeft:b.detail?b.detail.scrollLeft:b.originalEvent?b.originalEvent.detail.scrollLeft:0})}),a.$parent.$on("scroll.resize",function(){b(function(){g&&g.resize()})}),a.$parent.$on("scroll.refreshComplete",function(){g&&g.finishPullToRefresh()}),a.$parent.scrollView=g})}}}}])}(),function(){"use strict";angular.module("ionic.ui.sideMenu",["ionic.service.gesture"]).directive("sideMenus",function(){return{restrict:"ECA",controller:["$scope",function(a){angular.extend(this,ionic.controllers.SideMenuController.prototype),ionic.controllers.SideMenuController.call(this,{left:{width:275},right:{width:275}}),a.sideMenuContentTranslateX=0,a.sideMenuController=this}],replace:!0,transclude:!0,template:'
    '}}).directive("sideMenuContent",["$timeout","Gesture",function(a,b){return{restrict:"AC",require:"^sideMenus",scope:!0,compile:function(){return function(c,d,e,f){d.addClass("menu-content"),c.dragContent=c.$eval(e.dragContent)===!1?!1:!0;var g=!1,h=!1,i=function(a){if(c.dragContent){if(g||a.gesture.srcEvent.defaultPrevented)return;h=!0,f._handleDrag(a),a.gesture.srcEvent.preventDefault()}},j=function(a){h&&a.gesture.srcEvent.preventDefault()},k=b.on("dragright",i,d),l=b.on("dragleft",i,d),m=b.on("dragup",j,d),n=b.on("dragdown",j,d),o=function(a){h=!1,g||f._endDrag(a),g=!1},p=b.on("release",o,d);f.setContent({onDrag:function(){},endDrag:function(){},getTranslateX:function(){return c.sideMenuContentTranslateX||0},setTranslateX:function(b){d[0].style.webkitTransform="translate3d("+b+"px, 0, 0)",a(function(){c.sideMenuContentTranslateX=b})},enableAnimation:function(){c.animationEnabled=!0,d[0].classList.add("menu-animated")},disableAnimation:function(){c.animationEnabled=!1,d[0].classList.remove("menu-animated")}}),c.$on("$destroy",function(){b.off(l,"dragleft",i),b.off(k,"dragright",i),b.off(m,"dragup",i),b.off(n,"dragdown",i),b.off(p,"release",o)})}}}}]).directive("sideMenu",function(){return{restrict:"E",require:"^sideMenus",replace:!0,transclude:!0,scope:!0,template:'',compile:function(a,b,c){return function(a,b,d,e){a.side=d.side,"left"==a.side?(e.left.isEnabled=!0,e.left.pushDown=function(){b[0].style.zIndex=-1},e.left.bringUp=function(){b[0].style.zIndex=0}):"right"==a.side&&(e.right.isEnabled=!0,e.right.pushDown=function(){b[0].style.zIndex=-1},e.right.bringUp=function(){b[0].style.zIndex=0}),b.append(c(a))}}}})}(),function(){"use strict";angular.module("ionic.ui.slideBox",[]).directive("slideBox",["$timeout","$compile","SlideBoxDelegate",function(a,b,c){return{restrict:"E",replace:!0,transclude:!0,scope:{doesContinue:"@",slideInterval:"@",showPager:"@",disableScroll:"@",onSlideChanged:"&",activeSlide:"=?"},controller:["$scope","$element",function(b,d){var e=b.$eval(b.doesContinue)===!0,f=e?b.$eval(b.slideInterval)||4e3:0,g=new ionic.views.Slider({el:d[0],auto:f,disableScroll:b.$eval(b.disableScroll)===!0||!1,continuous:e,slidesChanged:function(){b.currentSlide=g.getPos(),a(function(){})},callback:function(c){b.currentSlide=c,b.onSlideChanged({index:b.currentSlide}),b.$parent.$broadcast("slideBox.slideChanged",c),b.activeSlide=c,a(function(){})}});b.$watch("activeSlide",function(a){angular.isDefined(a)&&g.slide(a)}),b.$on("slideBox.nextSlide",function(){g.next()}),b.$on("slideBox.prevSlide",function(){g.prev()}),b.$on("slideBox.setSlide",function(a,b){g.slide(b)}),b.$parent.slideBox=g,c.register(b,d),this.getNumSlides=function(){return g.getNumSlides()},a(function(){g.load()})}],template:'
    ',link:function(a,c){if(a.$eval(a.showPager)!==!1){var d=a.$new(),e=angular.element("");c.append(e),b(e)(d)}}}}]).directive("slide",function(){return{restrict:"E",require:"^slideBox",compile:function(a){return a.addClass("slider-slide"),function(){}}}}).directive("pager",function(){return{restrict:"E",replace:!0,require:"^slideBox",template:'
    ',link:function(a,b,c,d){var e=function(a){for(var c=b[0].children,d=c.length,e=0;d>e;e++)e==a?c[e].classList.add("active"):c[e].classList.remove("active")};a.numSlides=function(){return new Array(d.getNumSlides())},a.$watch("currentSlide",function(a){e(a)})}}})}(),angular.module("ionic.ui.tabs",["ionic.service.view"]).directive("tabs",[function(){return{restrict:"E",replace:!0,scope:!0,transclude:!0,controller:["$scope","$element",function(a){var b=this;a.tabCount=0,a.selectedIndex=-1,a.$enableViewRegister=!1,angular.extend(this,ionic.controllers.TabBarController.prototype),ionic.controllers.TabBarController.call(this,{controllerChanged:function(b,c,d,e){a.controllerChanged&&a.controllerChanged({oldController:b,oldIndex:c,newController:d,newIndex:e})},tabBar:{tryTabSelect:function(){},setSelectedItem:function(){},addItem:function(){}}}),this.add=function(b){b.tabIndex=a.tabCount,this.addController(b),0===b.tabIndex&&this.select(0),a.tabCount++},this.select=function(c,d){if(c!==a.selectedIndex){a.selectedIndex=c,a.activeAnimation=a.animation,b.selectController(c);for(var e={type:"tab",typeIndex:c},f=0;f',compile:function(a,b,c){return function(a,b,d){var e=b[0].querySelector(".tabs");a.tabsType=d.tabsType||"tabs-positive",a.tabsStyle=d.tabsStyle,a.animation=d.animation,a.animateNav=a.$eval(d.animateNav),a.animateNav!==!1&&(a.animateNav=!0),d.$observe("tabsStyle",function(){e&&angular.element(e).addClass(d.tabsStyle)}),d.$observe("tabsType",function(){e&&angular.element(e).addClass(d.tabsType)}),a.$watch("activeAnimation",function(){b.addClass(a.activeAnimation)}),c(a,function(a){b.prepend(a)})}}}}]).directive("tab",["ViewService","$rootScope","$parse",function(a,b,c){return{restrict:"E",require:"^tabs",scope:!0,transclude:"element",compile:function(d,e,f){return function(d,e,g,h){var i,j;a.registerHistory(d),d.title=g.title,d.icon=g.icon,d.iconOn=g.iconOn,d.iconOff=g.iconOff,d.viewSref=g.uiSref,d.url=g.href,d.url&&0===d.url.indexOf("#")&&(d.url=d.url.replace("#","")),d.hideBackButton=d.$eval(g.hideBackButton),d.hideBackButton!==!0&&(d.hideBackButton=!1),d.animate=d.$eval(g.animate);var k=c(g.leftButtons);d.$watch(k,function(a){d.leftButtons=a,d.doesUpdateNavRouter&&d.$emit("viewState.leftButtonsChanged",d.rightButtons)});var l=c(g.rightButtons);d.$watch(l,function(a){d.rightButtons=a}),h.add(d),d.$watch("isVisible",function(a){j&&(j.remove(),j=null,d.$broadcast("tab.hidden")),i&&(i.$destroy(),i=null),a&&(i=d.$new(),f(i,function(a){a.addClass("pane"),a.removeAttr("title"),j=a,e.parent().append(j),d.$broadcast("tab.shown")}))}),f(d.$new(),function(b){var c=b[0].getElementsByTagName("nav-view"); -d.hasNavView=c.length>0,d.hasNavView&&(d.navViewName=c[0].getAttribute("name"),a.isCurrentStateNavView(d.navViewName)&&h.select(d.tabIndex))}),b.$on("$stateChangeSuccess",function(){a.isCurrentStateNavView(d.navViewName)&&d.tabIndex!==h.selectedIndex&&h.select(d.tabIndex)})}}}}]).directive("tabControllerBar",function(){return{restrict:"E",require:"^tabs",transclude:!0,replace:!0,scope:!0,template:'
    ',link:function(a,b){b.addClass(a.tabsType),b.addClass(a.tabsStyle)}}}).directive("tabControllerItem",["$window",function(){return{restrict:"E",replace:!0,require:"^tabs",scope:{iconTitle:"@",icon:"@",iconOn:"@",iconOff:"@",active:"=",tabSelected:"@",index:"="},link:function(a,b,c,d){c.icon&&(a.iconOn=a.iconOff=c.icon),a.selectTab=function(){d.select(a.index,!0)}},template:' {{iconTitle}}'}}]).directive("tabBar",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
    '}}),function(a){"use strict";angular.module("ionic.ui.toggle",[]).directive("toggle",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{},template:'
    ',link:function(b,c,d,e){var f,g;e&&(f=c.children().eq(0),g=c.children().eq(1),f.length&&g.length&&(b.toggle=new a.views.Toggle({el:c[0],checkbox:f[0],handle:g[0]}),b.toggleIt=function(a){b.toggle.tap(a),e.$setViewValue(f[0].checked)},e.$render=function(){b.toggle.val(e.$viewValue)}))}}})}(window.ionic),function(){"use strict";angular.module("ionic.ui.viewState",["ionic.service.view","ionic.service.gesture"]).directive("navBar",["ViewService","$rootScope","$animate","$compile",function(a,b,c,d){var e=function(a,b,e,f,g){var h,i,j,k=b[0].querySelectorAll(".title"),l=f.title;if(!e||e===l)return g(),void 0;h=angular.element(k[0]),j=d('

    ')(a),h.replaceWith(j),i=d('

    ')(a);var m=b[0].firstElementChild||null;c.enter(i,b,m&&angular.element(m),function(){g()}),c.leave(angular.element(j),function(){})};return{restrict:"E",replace:!0,scope:{type:"@",backButtonType:"@",backButtonLabel:"@",backButtonIcon:"@",alignTitle:"@"},template:'',link:function(a,c,d){a.enableBackButton=!0,a.backButtonClass=d.backButtonType,d.backButtonIcon&&(a.backButtonClass+=" icon "+d.backButtonIcon),b.$on("viewState.showNavBar",function(a,b){b===!1?c[0].classList.add("invisible"):c[0].classList.remove("invisible")});var f=new ionic.views.HeaderBar({el:c[0],alignTitle:a.alignTitle||"center"});a.headerBarView=f,c.addClass(a.type);var g=function(b){a.oldTitle=a.currentTitle,a.currentTitle=b&&b.title?b.title:"",a.leftButtons=b.leftButtons,a.rightButtons=b.rightButtons,"undefined"!=typeof b.hideBackButton&&(a.enableBackButton=b.hideBackButton!==!0),b.animate!==!1&&d.animation&&b.title&&b.navDirection?(c[0].classList.add(d.animation),"back"===b.navDirection?c[0].classList.add("reverse"):c[0].classList.remove("reverse"),e(a,c,a.oldTitle,b,function(){f.align()})):f.align()};b.$on("viewState.viewEnter",function(a,b){g(b)}),a.$parent.$on("viewState.leftButtonsChanged",function(b,c){a.leftButtons=c}),a.$parent.$on("viewState.rightButtonsChanged",function(b,c){a.rightButtons=c})}}}]).directive("view",["ViewService","$rootScope","$animate",function(a,b){return{restrict:"EA",priority:1e3,scope:{leftButtons:"=",rightButtons:"=",title:"=",icon:"@",iconOn:"@",iconOff:"@",type:"@",alignTitle:"@",hideBackButton:"@",hideNavBar:"@",animation:"@"},compile:function(a){return a.addClass("pane"),a[0].removeAttribute("title"),function(a){b.$broadcast("viewState.viewEnter",{title:a.title,navDirection:a.$navDirection||a.$parent.$navDirection}),a.hideBackButton=a.$eval(a.hideBackButton),a.hideBackButton&&b.$broadcast("viewState.showBackButton",!1),b.$broadcast("viewState.showNavBar","true"!==a.hideNavBar);var c=a.$watch("leftButtons",function(){a.$emit("viewState.leftButtonsChanged",a.leftButtons)}),d=a.$watch("rightButtons",function(){a.$emit("viewState.rightButtonsChanged",a.rightButtons)});a.$on("$destroy",function(){c(),d()})}}}}]).directive("viewBack",["ViewService","$rootScope",function(a,b){var c=function(b){var c=a.getBackView();return c&&c.go(),b.alreadyHandled=!0,!1};return{restrict:"AC",compile:function(a){return a.addClass("hide"),function(a,d){d.bind("tap",c),a.showButton=function(a){a?d[0].classList.remove("hide"):d[0].classList.add("hide")},b.$on("$viewHistory.historyChange",function(b,c){a.showButton(c.showBack)}),b.$on("viewState.showBackButton",function(b,c){a.showButton(c)})}}}}]).directive("navView",["ViewService","$state","$anchorScroll","$compile","$controller","$animate",function(a,b,c,d,e){var f,g=!1,h={restrict:"E",terminal:!0,priority:2e3,transclude:!0,link:function(c,i,j){function k(g){var h=b.$current&&b.$current.locals[p],j=h&&h.$template?h.$template:null;if(h!==m){var k={parentElement:i,doAnimation:g,leavingScope:n,leavingElement:l,navDirection:null};if(j){l=angular.element(j.trim());var q={};"TABS"!==l[0].tagName&&(q=a.register(c),k.navDirection=q.navDirection),m=h,r.state=h.$$state;var s=d(l),t=b.current;if(n=t.scope=c.$new(),n.$navDirection=k.navDirection,h.$$controller){h.$scope=n;var u=e(h.$$controller,h);t.controllerAs&&(n[t.controllerAs]=u),l.data("$ngControllerController",u),l.children().data("$ngControllerController",u)}s(n),n.$emit("$viewContentLoaded"),n.$eval(o),n.animation=f,k.enteringScope=n,k.enteringElement=l}a.transition(k)}}var l,m,n,o=(j.autoscroll,j.onload||""),p=j[h.name]||j.name||"",q=i.parent().inheritedData("$uiView");p.indexOf("@")<0&&(p=p+"@"+(q?q.state.name:""));var r={name:p,state:null,animation:null};i.data("$uiView",r);for(var s=i[0];!f&&s;)f=s.getAttribute("animation"),s=s.parentElement;var t=function(){if(!g){g=!0;try{k(!0)}catch(a){throw g=!1,a}g=!1}};c.$on("$stateChangeSuccess",t),c.$on("$viewContentLoading",t),k(!1)}};return h}])}(),function(){"use strict";angular.module("ionic.ui.virtRepeat",[]).directive("virtRepeat",function(){return{require:["?ngModel","^virtualList"],transclude:"element",priority:1e3,terminal:!0,compile:function(){return function(a,b,c,d){var e=d[1];e.listView.renderViewport=function(){}}}}})}(ionic),function(){"use strict";function a(a){var b=a.match(/^\s*([\$\w]+)\s+in\s+(\S*)\s*$/);if(!b)throw new Error("Expected sfVirtualRepeat in form of '_item_ in _collection_' but got '"+a+"'.");return{value:b[1],collection:b[2]}}function b(a){var b={overflow:"auto"},c=window.getComputedStyle?window.getComputedStyle(a[0]):a[0].currentStyle,d=c&&c.getPropertyValue("max-height"),e=c&&c.getPropertyValue("height");d&&"0px"!==d?b.maxHeight=d:b.height=e&&"0px"!==e?e:window.innerHeight,a.css(b)}function c(a){var b={margin:0,padding:0,border:0,"box-sizing":"border-box"};a.css(b)}function d(a){var b=window.getComputedStyle?window.getComputedStyle(a):a.currentStyle,c=b&&b.getPropertyValue("max-height"),d=b&&b.getPropertyValue("height");if(d&&"0px"!==d&&"auto"!==d)$log.info('Row height is "%s" from css height',d);else if(c&&"0px"!==c&&"none"!==c)d=c,$log.info('Row height is "%s" from css max-height',d);else{if(!a.clientHeight)throw new Error("Unable to compute height of row");d=a.clientHeight+"px",$log.info('Row height is "%s" from client height',d)}return angular.element(a).css("height",d),parseInt(d,10)}angular.module("ionic.ui.virtualRepeat",[]).directive("virtualRepeat",["$log",function(e){return{require:["?ngModel, ^virtualList"],transclude:"element",priority:1e3,terminal:!0,compile:function(f,g){var h=a(g.sfVirtualRepeat);return function(a,f,g,i){function j(a,b,c){var d=c.$new();return d[h.value]=b[a],d.$index=a,d.$first=0===a,d.$last=a===b.length-1,d.$middle=!(d.$first||d.$last),d.$watch(function(){d[h.value]=b[a]}),d}function k(a,b,c,d,e){var f,g,h,i=document.createDocumentFragment(),k=[];for(g=a;g!==b;g++)h=j(g,c,d),f=linker(h,angular.noop),k.push(f),i.appendChild(f[0]);return e.after(i),k}function l(){var a=clip(v.firstActive,v.firstVisible-v.lowWater,v.firstVisible-v.highWater),b=clip(v.firstActive+v.active,v.firstVisible+v.visible+v.lowWater,v.firstVisible+v.visible+v.highWater);v.firstActive=Math.max(0,a),v.active=Math.min(b,v.total)-v.firstActive}function m(b){s&&a.$apply(function(){v.firstVisible=Math.floor(b.target.scrollTop/s),v.visible=Math.ceil(u.viewport[0].clientHeight/s),e.log("scroll to row %o",v.firstVisible),t=b.target.scrollTop+b.target.clientHeight>=b.target.scrollHeight,l(),e.log(" state is now %o",v),e.log(" sticky = %o",t)})}function n(a){var b=a.$eval(h.collection);return b.length!==v.total&&(v.total=b.length,l()),{start:v.firstActive,active:v.active,len:b.length}}function o(a,b){var c,d,e=Array.prototype[a];for(d=0;b>d;d++)c=e.call(r),c.scope().$destroy(),c.remove()}function p(a,b,c){var g,i=b.start+b.active,j=c.$eval(h.collection);if(a===b)e.info("initial listen"),g=k(a.start,i,j,c,f),r=g,r.length&&(s=d(g[0][0]));else{var l=a.start+a.active,m=a.start>=b.start,n=m?a.start-b.start:b.start-a.start,p=l>=i?l-i:i-l,q=n<(m?b.active:a.active);if(e.info("change by %o,%o rows %s",n,p,m?"forward":"backward"),q){if(m?(e.info("need to remove from the top"),o("shift",n)):n&&(e.info("need to add at the top"),g=k(a.start,b.start,j,c,f),r=g.concat(r)),i>l)e.info("need to remove from the bottom"),o("pop",i-l);else if(p){var v=r[r.length-1];e.info("need to add to the bottom"),g=k(i,l,j,c,v),r=r.concat(g)}}else e.info("non-contiguous change"),o("pop",r.length),r=k(a.start,l,j,c,f);!s&&r.length&&(s=d(r[0][0])),u.content.css({"padding-top":a.start*s+"px"})}u.content.css({height:a.len*s+"px"}),t&&(u.viewport[0].scrollTop=u.viewport[0].clientHeight+u.viewport[0].scrollHeight)}var q=i[1],r=[],s=0,t=!1,u=q.element,v="ngModel"in g?a.$eval(g.ngModel):{};v.firstActive=0,v.firstVisible=0,v.visible=0,v.active=0,v.total=0,v.lowWater=v.lowWater||100,v.highWater=v.highWater||300,c(u.content),b(u.viewport),u.bind("momentumScrolled",m),a.$on("$destroy",function(){u.unbind("momentumScrolled",m)}),a.$watch(n,p,!0)}}}}])}(ionic); \ No newline at end of file +angular.module("ionic.service",["ionic.service.platform","ionic.service.actionSheet","ionic.service.gesture","ionic.service.loading","ionic.service.modal","ionic.service.popup","ionic.service.templateLoad","ionic.service.view"]),angular.module("ionic.ui.service",["ionic.ui.service.scrollDelegate","ionic.ui.service.slideBoxDelegate"]),angular.module("ionic.ui",["ionic.ui.content","ionic.ui.scroll","ionic.ui.tabs","ionic.ui.viewState","ionic.ui.header","ionic.ui.sideMenu","ionic.ui.slideBox","ionic.ui.list","ionic.ui.checkbox","ionic.ui.toggle","ionic.ui.radio"]),angular.module("ionic",["ionic.service","ionic.ui.service","ionic.ui","ngAnimate","ngTouch","ngSanitize","ui.router"]),function(){"use strict";angular.module("ionic.ui.service.scrollDelegate",[]).factory("$ionicScrollDelegate",["$rootScope","$timeout",function(a,b){return{scrollTop:function(b){a.$broadcast("scroll.scrollTop",b)},tapScrollToTop:function(a){var b=this;ionic.on("tap",function(c){var d=a[0],e=d.getBoundingClientRect();ionic.DomUtil.rectContains(c.gesture.touches[0].pageX,c.gesture.touches[0].pageY,e.left,e.top,e.left+e.width,e.top+20)&&b.scrollTop()},a[0])},register:function(a,c){c.bind("scroll",function(b){a.onScroll({event:b,scrollTop:b.detail?b.detail.scrollTop:b.originalEvent?b.originalEvent.detail.scrollTop:0,scrollLeft:b.detail?b.detail.scrollLeft:b.originalEvent?b.originalEvent.detail.scrollLeft:0})}),a.$parent.$on("scroll.resize",function(){b(function(){a.$parent.scrollView&&a.$parent.scrollView.resize()})}),a.$parent.$on("scroll.refreshComplete",function(){a.$parent.scrollView&&a.$parent.scrollView.finishPullToRefresh()}),a.$parent.$on("scroll.scrollTop",function(b,c){a.$parent.scrollView&&a.$parent.scrollView.scrollTo(0,0,c===!1?!1:!0)})}}}])}(ionic),function(){"use strict";angular.module("ionic.ui.service.slideBoxDelegate",[]).factory("$ionicSlideBoxDelegate",["$rootScope","$timeout",function(a,b){return{update:function(){a.$broadcast("slideBox.update")},register:function(a){a.$parent.$on("slideBox.update",function(c){c.defaultPrevented||(b(function(){a.$parent.slideBox.setup()}),c.preventDefault())})}}}])}(ionic),angular.module("ionic.service.actionSheet",["ionic.service.templateLoad","ionic.ui.actionSheet","ngAnimate"]).factory("$ionicActionSheet",["$rootScope","$document","$compile","$animate","$timeout","$ionicTemplateLoader",function(a,b,c,d){return{show:function(e){var f=a.$new(!0);angular.extend(f,e);var g=c('')(f),h=angular.element(g[0].querySelector(".action-sheet")),i=function(a){d.leave(h,function(){a&&e.cancel()}),d.removeClass(g,"active",function(){f.$destroy()})};f.cancel=function(){i(!0)},f.buttonClicked=function(a){(e.buttonClicked&&e.buttonClicked(a))===!0&&i(!1)},f.destructiveButtonClicked=function(){(e.destructiveButtonClicked&&e.destructiveButtonClicked())===!0&&i(!1)},b[0].body.appendChild(g[0]);var j=new ionic.views.ActionSheet({el:g[0]});return f.sheet=j,d.addClass(g,"active"),d.enter(h,g,null,function(){}),j}}}]),angular.module("ionic.service.gesture",[]).factory("$ionicGesture",[function(){return{on:function(a,b,c){return window.ionic.onGesture(a,b,c[0])},off:function(a,b,c){return window.ionic.offGesture(a,b,c)}}}]),angular.module("ionic.service.loading",["ionic.ui.loading"]).factory("$ionicLoading",["$rootScope","$document","$compile",function(a,b,c){return{show:function(d){var e={content:"",animation:"fade-in",showBackdrop:!0,maxWidth:200,showDelay:2e3};d=angular.extend(e,d);var f=a.$new(!0);angular.extend(f,d);var g=angular.element(b[0].querySelector(".loading-backdrop"));if(g.length&&(f=g.scope(),f.loading))return f.loading.show(),f.loading;var h=c(""+d.content+"")(f);b[0].body.appendChild(h[0]);var i=new ionic.views.Loading({el:h[0],maxWidth:d.maxWidth,showDelay:d.showDelay});return i.show(),f.loading=i,i}}}]),angular.module("ionic.service.modal",["ionic.service.templateLoad","ngAnimate"]).factory("$ionicModal",["$rootScope","$document","$compile","$animate","$q","$ionicTemplateLoader",function(a,b,c,d,e,f){var g=ionic.views.Modal.inherit({initialize:function(a){ionic.views.Modal.prototype.initialize.call(this,a),this.animation=a.animation||"slide-in-up"},show:function(){var a=this,c=angular.element(this.el);c.parent().length||(angular.element(b[0].body).append(c),ionic.views.Modal.prototype.show.call(a)),d.addClass(c,this.animation,function(){})},hide:function(){var a=angular.element(this.el);d.removeClass(a,this.animation),ionic.views.Modal.prototype.hide.call(this)},remove:function(){var a=this;angular.element(this.el),d.leave(angular.element(this.el),function(){a.scope.$destroy()})}}),h=function(b,d){var e=d.scope&&d.scope.$new()||a.$new(!0),f=c(b)(e);d.el=f[0];var h=new g(d);return h.scope=e,d.scope||(e.modal=h),h};return{fromTemplate:function(a,b){var c=h(a,b||{});return c},fromTemplateUrl:function(a,b,c){return f.load(a).then(function(a){var d=h(a,c||{});return b?b(d):null,d})}}}]),function(){"use strict";angular.module("ionic.service.platform",[]).provider("$ionicPlatform",function(){var a="web",b=!1;(window.cordova||window.PhoneGap||window.phonegap)&&(a="cordova");var c=function(){return"cordova"==a?window.device||window.Cordova:!0};return setTimeout(function d(){c()&&ionic.Platform.detect()||setTimeout(d,50)},10),{setPlatform:function(b){a=b},$get:["$q","$timeout",function(a,d){return{onHardwareBackButton:function(a){this.ready(function(){document.addEventListener("backbutton",a,!1)})},offHardwareBackButton:function(a){this.ready(function(){document.removeEventListener("backbutton",a)})},is:function(a){return ionic.Platform.is(a)},ready:function(e){var f=a.defer();return d(function g(){c()?(b=!0,f.resolve(),e()):d(g,50)},50),f.promise}}}]}})}(ionic),angular.module("ionic.service.popup",["ionic.service.templateLoad"]).factory("$ionicPopup",["$rootScope","$document","$compile","TemplateLoader",function(a,b,c){var d=function(){var a=angular.element(b[0].querySelector(".popup"));if(a.length){var c=a.scope();if(c.popup)return c}};return{alert:function(e,f){var g=d();if(g)return g.popup.alert(e);var h={title:e,animation:"fade-in"};opts=angular.extend(h,opts);var i=f&&f.$new()||a.$new(!0);angular.extend(i,opts);var j=c(""+opts.content+"")(i);b[0].body.appendChild(j[0]);var k=new ionic.views.Popup({el:j[0]});return k.alert(e),i.popup=k,k},confirm:function(){},prompt:function(){},show:function(){}}}]),angular.module("ionic.service.templateLoad",[]).factory("$ionicTemplateLoader",["$q","$http","$templateCache",function(a,b,c){return{load:function(d){var e=a.defer();return b({method:"GET",url:d,cache:c}).success(function(a){e.resolve(a&&a.trim())}).error(function(a){e.reject(a)}),e.promise}}}]),angular.module("ionic.service.view",["ui.router"]).run(["$rootScope","$state","$location","$document",function(a,b,c,d){a.$viewHistory={histories:{root:{historyId:"root",parentHistoryId:null,stack:[],cursor:-1}},backView:null,forwardView:null,currentView:null},a.$on("viewState.changeHistory",function(d,e){if(e){var f=e.historyId?a.$viewHistory.histories[e.historyId]:null;if(f&&f.cursor>-1&&f.cursor-1&&g.stack.length>0&&g.cursor=j.index;n--)m.stack[n].destory(),m.stack.splice(n)}}else k.navAction="initialView";d.histories[k.viewId]=this.createView({viewId:k.viewId,index:g.stack.length,historyId:g.historyId,backViewId:h&&h.viewId?h.viewId:null,forwardViewId:null,stateId:e,stateName:this.getCurrentStateName(),stateParams:this.getCurrentStateParams(),url:c.url()}),g.stack.push(d.histories[k.viewId])}return this.setNavViews(k.viewId),g.cursor=d.currentView.index,k},setNavViews:function(b){var c=a.$viewHistory;c.currentView=this._getView(b),c.backView=this._getBackView(c.currentView),c.forwardView=this._getForwardView(c.currentView),a.$broadcast("$viewHistory.historyChange",{showBack:c.backView&&c.backView.historyId===c.currentView.historyId})},registerHistory:function(a){a.$historyId="h"+Math.round(99999999999*Math.random())},createView:function(a){var b=new h;return b.initialize(a)},getCurrentView:function(){return a.$viewHistory.currentView},getBackView:function(){return a.$viewHistory.backView},getForwardView:function(){return a.$viewHistory.forwardView},getNavDirection:function(){return a.$viewHistory.navDirection},getCurrentStateName:function(){return b&&b.current?b.current.name:null},isCurrentStateNavView:function(a){return b&&b.current&&b.current.views&&b.current.views[a]?!0:!1},getCurrentStateParams:function(){var a;if(b&&b.params)for(var c in b.params)b.params.hasOwnProperty(c)&&(a=a||{},a[c]=b.params[c]);return a},getCurrentStateId:function(){var a;if(b&&b.current&&b.current.name){if(a=b.current.name,b.params)for(var c in b.params)b.params.hasOwnProperty(c)&&b.params[c]&&(a+="_"+c+"="+b.params[c]);return a}return"r"+Math.round(9999999*Math.random())},_getView:function(b){return b?a.$viewHistory.histories[b]:null},_getBackView:function(a){return a?this._getView(a.backViewId):null},_getForwardView:function(a){return a?this._getView(a.forwardViewId):null},_getHistory:function(b){var c=this._getParentHistoryObj(b);return a.$viewHistory.histories[c.historyId]||(a.$viewHistory.histories[c.historyId]={historyId:c.historyId,parentHistoryId:this._getParentHistoryObj(c.scope.$parent).historyId,stack:[],cursor:-1}),a.$viewHistory.histories[c.historyId]},_getParentHistoryObj:function(b){for(var c=b;c;){if(c.hasOwnProperty("$historyId"))return{historyId:c.$historyId,scope:c};c=c.$parent}return{historyId:"root",scope:a}},transition:function(a){function b(){for(var b=a.enteringScope;b;){if(b.animation)return b.animation;b=b.$parent}}if(a&&a.enteringElement){a.leavingScope&&(a.leavingScope.$destroy(),a.leavingScope=null);var c=a.animation||b();g&&c&&a.doAnimation!==!1&&a.navDirection?(this.setAnimationClass(a.parentElement,c,a.navDirection),a.leavingElement&&g.leave(a.leavingElement),g.enter(a.enteringElement,a.parentElement)):(a.leavingElement&&a.leavingElement.remove(),a.parentElement.append(a.enteringElement))}},setAnimationClass:function(a,b,c){a[0].classList.add(b),"back"===c?a[0].classList.add("reverse"):a[0].classList.remove("reverse")},clearHistory:function(){var b,c=a.$viewHistory.histories,d=a.$viewHistory.currentView;for(b in c)c[b].stack&&(c[b].stack=[],c[b].cursor=-1),d.historyId===b?(d.backViewId=null,d.forwardViewId=null,c[b].stack.push(d)):c[b].destroy&&c[b].destroy();this.setNavViews(d.viewId)}}}]),function(){"use strict";angular.module("ionic.ui.actionSheet",[]).directive("actionSheet",["$document",function(a){return{restrict:"E",scope:!0,replace:!0,link:function(b,c){var d=function(a){27==a.which&&(b.cancel(),b.$apply())},e=function(a){a.target==c[0]&&(b.cancel(),b.$apply())};b.$on("$destroy",function(){c.remove(),a.unbind("keyup",d)}),a.bind("keyup",d),c.bind("click",e)},template:'
    {{titleText}}
    '}}])}(),function(a){"use strict";angular.module("ionic.ui.header",["ngAnimate"]).directive("barHeader",["$ionicScrollDelegate",function(a){return{restrict:"C",link:function(b,c){a.tapScrollToTop(c)}}}]).directive("headerBar",["$ionicScrollDelegate",function(){return{restrict:"E",replace:!0,transclude:!0,template:'

    ',scope:{leftButtons:"=",rightButtons:"=",title:"=",type:"@",alignTitle:"@"},link:function(b,c){var d=new a.views.HeaderBar({el:c[0],alignTitle:b.alignTitle||"center"});c.addClass(b.type),b.headerBarView=d,b.$watch("leftButtons",function(){d.align()}),b.$watch("rightButtons",function(){console.log("Right buttons changed"),d.align()}),b.$watch("title",function(){d.align()})}}}]).directive("footerBar",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
    ',scope:{type:"@"},link:function(a,b){b.addClass(a.type)}}})}(ionic),function(){"use strict";angular.module("ionic.ui.checkbox",[]).directive("checkbox",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{},transclude:!0,template:'
  • ',link:function(a,b,c,d){var e;d&&(e=angular.element(b[0].querySelector('input[type="checkbox"]')),e.length&&(e.bind("change",function(b){d.$setViewValue(e[0].checked),a.$apply(function(){b.alreadyHandled=!0})}),d&&(d.$render=function(){e[0].checked=d.$viewValue})))}}})}(),function(){"use strict";angular.module("ionic.ui.content",["ionic.ui.service"]).directive("pane",function(){return{restrict:"E",link:function(a,b){b.addClass("pane")}}}).directive("content",["$parse","$timeout","$ionicPlatform","$ionicScrollDelegate",function(a,b,c,d){return{restrict:"E",replace:!0,template:'
    ',transclude:!0,scope:{onRefresh:"&",onRefreshOpening:"&",onScroll:"&",onScrollComplete:"&",refreshComplete:"=",onInfiniteScroll:"=",infiniteScrollDistance:"@",hasBouncing:"@",scroll:"@",padding:"@",hasScrollX:"@",hasScrollY:"@",scrollbarX:"@",scrollbarY:"@",scrollEventInterval:"@"},compile:function(a,e){return"true"==e.hasHeader&&a.addClass("has-header"),"true"==e.hasSubheader&&a.addClass("has-subheader"),"true"==e.hasFooter&&a.addClass("has-footer"),"true"==e.hasTabs&&a.addClass("has-tabs"),function(a,f){var g,h=angular.element(f.children()[0]);if(a.$eval(a.padding)===!0&&h.addClass("padding"),"false"!==a.scroll)if("true"===e.overflowScroll)f.addClass("overflow-scroll");else{var i=f[0].querySelector(".scroll-refresher");i&&i.clientHeight||0,e.refreshComplete&&(a.refreshComplete=function(){a.scrollView&&(i&&i.classList.remove("active"),a.scrollView.finishPullToRefresh(),a.$parent.$broadcast("scroll.onRefreshComplete"))}),b(function(){var b=a.$eval(a.hasBouncing),e=!c.is("Android")&&b!==!1;g=new ionic.views.Scroll({el:f[0],bouncing:e,scrollbarX:a.$eval(a.scrollbarX)!==!1,scrollbarY:a.$eval(a.scrollbarY)!==!1,scrollingX:a.$eval(a.hasScrollX)===!0,scrollingY:a.$eval(a.hasScrollY)!==!1,scrollEventInterval:parseInt(a.scrollEventInterval,10)||20,scrollingComplete:function(){a.onScrollComplete({scrollTop:this.__scrollTop,scrollLeft:this.__scrollLeft})}}),i&&g.activatePullToRefresh(50,function(){i.classList.add("active")},function(){i.classList.remove("refreshing"),i.classList.remove("active")},function(){i.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),d.register(a,f),a.$parent.scrollView=g});var j=f.find("infinite-scroll"),k=!1;if(j){var l,m=e.infiniteScrollDistance||"1%";l=m.indexOf("%")?function(){return g.getScrollMax().top*(1-parseInt(m,10)/100)}:function(){return g.getScrollMax().top-parseInt(m,10)},f.bind("scroll",function(){if(g&&!k&&g.getValues().top>l()){k=!0,j.addClass("active");var b=function(){g.resize(),k=!1,j.removeClass("active")};a.$apply(angular.bind(a,a.onInfiniteScroll,b))}})}}}}}}]).directive("refresher",function(){return{restrict:"E",replace:!0,require:["^?content","^?list"],template:'
    ',scope:!0}}).directive("scrollRefresher",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
    '}}).directive("infiniteScroll",function(){return{restrict:"E",replace:!1,template:'
    '}})}(),function(){"use strict";angular.module("ionic.ui.list",["ngAnimate"]).directive("item",["$timeout","$parse",function(){return{restrict:"E",require:"?^list",replace:!0,transclude:!0,scope:{item:"=",itemType:"@",canDelete:"@",canReorder:"@",canSwipe:"@",onDelete:"&",optionButtons:"&",deleteIcon:"@",reorderIcon:"@"},template:'
    ',link:function(a,b,c,d){if(d){var e=d.scope,f=d.attrs;c.$observe("href",function(b){b&&(a.href=b.trim())}),a.itemType||(a.itemType=e.itemType),b.addClass(a.itemType||e.itemType),a.itemClass=a.itemType,"false"!==(c.canDelete?a.canDelete:e.canDelete)&&(c.onDelete||f.onDelete)&&(a.deleteClick=function(){c.onDelete?a.onDelete({item:a.item}):f.onDelete&&e.onDelete({item:a.item})},a.deleteIconClass=a.deleteIcon||e.deleteIcon||"ion-minus-circled"),"true"===(c.canReorder?a.canReorder:e.canReorder)&&(a.reorderIconClass=a.reorderIcon||e.reorderIcon||"ion-navicon"),"false"!==(c.canSwipe?a.canSwipe:e.canSwipe)&&(a.itemOptionButtons=a.optionButtons(),"undefined"==typeof a.itemOptionButtons&&(a.itemOptionButtons=e.optionButtons()))}}}}]).directive("list",["$timeout",function(a){return{restrict:"E",replace:!0,transclude:!0,scope:{itemType:"@",canDelete:"@",canReorder:"@",canSwipe:"@",showDelete:"=",showReorder:"=",onDelete:"&",onReorder:"&",optionButtons:"&",deleteIcon:"@",reorderIcon:"@"},template:"
    ",controller:["$scope","$attrs",function(a,b){this.scope=a,this.attrs=b}],link:function(b,c,d){b.listView=new ionic.views.ListView({el:c[0],listEl:c[0].children[0]}),d.animation&&c[0].classList.add(d.animation);var e=b.$watch("showReorder",function(b){b?c[0].classList.add("item-options-hide"):b===!1&&a(function(){c[0].classList.remove("item-options-hide")},250)});b.$on("$destroy",function(){e()})}}}])}(),function(){"use strict";angular.module("ionic.ui.loading",[]).directive("loading",function(){return{restrict:"E",replace:!0,transclude:!0,link:function(a,b){b.addClass(a.animation||"")},template:'
    '}})}(),function(a){"use strict";angular.module("ionic.ui.radio",[]).directive("radio",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{value:"@"},transclude:!0,template:'',link:function(a,b,c,d){var e;d&&(e=b.children().eq(0),e.length&&d&&(e.bind("click",function(b){console.log("RADIO CLICK"),a.$apply(function(){d.$setViewValue(a.$eval(c.ngValue))}),b.alreadyHandled=!0}),d.$render=function(){var b=a.$eval(c.ngValue);b===d.$viewValue?e.attr("checked","checked"):e.removeAttr("checked")}))}}}).directive("radioButtons",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{value:"@"},transclude:!0,template:'
    ',controller:["$scope","$element",function(a,b){this.select=function(a){for(var c,d=b.children(),e=0;e',transclude:!0,scope:{direction:"@",paging:"@",onRefresh:"&",onScroll:"&",refreshComplete:"=",scroll:"@",scrollbarX:"@",scrollbarY:"@"},controller:function(){},compile:function(a,c,d){return function(a,e){var f,g,h=document.createElement("div");h.className="scroll","true"==c.padding&&h.classList.add("padding"),a.$eval(a.paging)===!0&&h.classList.add("scroll-paging"),e.append(h),f=d(a.$parent),angular.element(e[0].firstElementChild).append(f);var i=e[0].querySelector(".scroll-refresher"),j=i&&i.clientHeight||0;a.direction||(a.direction="y");var k=a.direction.indexOf("x")>=0,l=a.direction.indexOf("y")>=0;b(function(){var c={el:e[0],paging:a.$eval(a.paging)===!0,scrollbarX:a.$eval(a.scrollbarX)!==!1,scrollbarY:a.$eval(a.scrollbarY)!==!1,scrollingX:k,scrollingY:l};c.paging&&(c.speedMultiplier=.8,c.bouncing=!1),g=new ionic.views.Scroll(c),i&&g.activatePullToRefresh(j,function(){i.classList.add("active")},function(){i.classList.remove("refreshing"),i.classList.remove("active")},function(){i.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),e.bind("scroll",function(b){a.onScroll({event:b,scrollTop:b.detail?b.detail.scrollTop:b.originalEvent?b.originalEvent.detail.scrollTop:0,scrollLeft:b.detail?b.detail.scrollLeft:b.originalEvent?b.originalEvent.detail.scrollLeft:0})}),a.$parent.$on("scroll.resize",function(){b(function(){g&&g.resize()})}),a.$parent.$on("scroll.refreshComplete",function(){g&&g.finishPullToRefresh()}),a.$parent.scrollView=g})}}}}])}(),function(){"use strict";angular.module("ionic.ui.sideMenu",["ionic.service.gesture"]).directive("sideMenus",function(){return{restrict:"ECA",controller:["$scope",function(a){angular.extend(this,ionic.controllers.SideMenuController.prototype),ionic.controllers.SideMenuController.call(this,{left:{width:275},right:{width:275}}),a.sideMenuContentTranslateX=0,a.sideMenuController=this}],replace:!0,transclude:!0,template:'
    '}}).directive("sideMenuContent",["$timeout","$ionicGesture",function(a,b){return{restrict:"AC",require:"^sideMenus",scope:!0,compile:function(){return function(c,d,e,f){d.addClass("menu-content"),c.dragContent=c.$eval(e.dragContent)===!1?!1:!0;var g=!1,h=!1,i=function(a){if(c.dragContent){if(g||a.gesture.srcEvent.defaultPrevented)return;h=!0,f._handleDrag(a),a.gesture.srcEvent.preventDefault()}},j=function(a){h&&a.gesture.srcEvent.preventDefault()},k=b.on("dragright",i,d),l=b.on("dragleft",i,d),m=b.on("dragup",j,d),n=b.on("dragdown",j,d),o=function(a){h=!1,g||f._endDrag(a),g=!1},p=b.on("release",o,d);f.setContent({onDrag:function(){},endDrag:function(){},getTranslateX:function(){return c.sideMenuContentTranslateX||0},setTranslateX:function(b){d[0].style.webkitTransform="translate3d("+b+"px, 0, 0)",a(function(){c.sideMenuContentTranslateX=b})},enableAnimation:function(){c.animationEnabled=!0,d[0].classList.add("menu-animated")},disableAnimation:function(){c.animationEnabled=!1,d[0].classList.remove("menu-animated")}}),c.$on("$destroy",function(){b.off(l,"dragleft",i),b.off(k,"dragright",i),b.off(m,"dragup",i),b.off(n,"dragdown",i),b.off(p,"release",o)})}}}}]).directive("sideMenu",function(){return{restrict:"E",require:"^sideMenus",replace:!0,transclude:!0,scope:!0,template:'',compile:function(a,b,c){return function(a,b,d,e){a.side=d.side,"left"==a.side?(e.left.isEnabled=!0,e.left.pushDown=function(){b[0].style.zIndex=-1},e.left.bringUp=function(){b[0].style.zIndex=0}):"right"==a.side&&(e.right.isEnabled=!0,e.right.pushDown=function(){b[0].style.zIndex=-1},e.right.bringUp=function(){b[0].style.zIndex=0}),b.append(c(a))}}}})}(),function(){"use strict";angular.module("ionic.ui.slideBox",[]).directive("slideBox",["$timeout","$compile","$ionicSlideBoxDelegate",function(a,b,c){return{restrict:"E",replace:!0,transclude:!0,scope:{doesContinue:"@",slideInterval:"@",showPager:"@",disableScroll:"@",onSlideChanged:"&",activeSlide:"=?"},controller:["$scope","$element",function(b,d){var e=b.$eval(b.doesContinue)===!0,f=e?b.$eval(b.slideInterval)||4e3:0,g=new ionic.views.Slider({el:d[0],auto:f,disableScroll:b.$eval(b.disableScroll)===!0||!1,continuous:e,slidesChanged:function(){b.currentSlide=g.getPos(),a(function(){})},callback:function(c){b.currentSlide=c,b.onSlideChanged({index:b.currentSlide}),b.$parent.$broadcast("slideBox.slideChanged",c),b.activeSlide=c,a(function(){})}});b.$watch("activeSlide",function(a){angular.isDefined(a)&&g.slide(a)}),b.$on("slideBox.nextSlide",function(){g.next()}),b.$on("slideBox.prevSlide",function(){g.prev()}),b.$on("slideBox.setSlide",function(a,b){g.slide(b)}),b.$parent.slideBox=g,c.register(b,d),this.getNumSlides=function(){return g.getNumSlides()},a(function(){g.load()})}],template:'
    ',link:function(a,c){if(a.$eval(a.showPager)!==!1){var d=a.$new(),e=angular.element("");c.append(e),b(e)(d)}}}}]).directive("slide",function(){return{restrict:"E",require:"^slideBox",compile:function(a){return a.addClass("slider-slide"),function(){}}}}).directive("pager",function(){return{restrict:"E",replace:!0,require:"^slideBox",template:'
    ',link:function(a,b,c,d){var e=function(a){for(var c=b[0].children,d=c.length,e=0;d>e;e++)e==a?c[e].classList.add("active"):c[e].classList.remove("active")};a.numSlides=function(){return new Array(d.getNumSlides())},a.$watch("currentSlide",function(a){e(a)})}}})}(),angular.module("ionic.ui.tabs",["ionic.service.view"]).directive("tabs",[function(){return{restrict:"E",replace:!0,scope:!0,transclude:!0,controller:["$scope","$element",function(a){var b=this;a.tabCount=0,a.selectedIndex=-1,a.$enableViewRegister=!1,angular.extend(this,ionic.controllers.TabBarController.prototype),ionic.controllers.TabBarController.call(this,{controllerChanged:function(b,c,d,e){a.controllerChanged&&a.controllerChanged({oldController:b,oldIndex:c,newController:d,newIndex:e})},tabBar:{tryTabSelect:function(){},setSelectedItem:function(){},addItem:function(){}}}),this.add=function(b){b.tabIndex=a.tabCount,this.addController(b),0===b.tabIndex&&this.select(0),a.tabCount++},this.select=function(c,d){if(c!==a.selectedIndex){a.selectedIndex=c,a.activeAnimation=a.animation,b.selectController(c);for(var e={type:"tab",typeIndex:c},f=0;f',compile:function(a,b,c){return function(a,b,d){var e=b[0].querySelector(".tabs");a.tabsType=d.tabsType||"tabs-positive",a.tabsStyle=d.tabsStyle,a.animation=d.animation,a.animateNav=a.$eval(d.animateNav),a.animateNav!==!1&&(a.animateNav=!0),d.$observe("tabsStyle",function(){e&&angular.element(e).addClass(d.tabsStyle)}),d.$observe("tabsType",function(){e&&angular.element(e).addClass(d.tabsType)}),a.$watch("activeAnimation",function(){b.addClass(a.activeAnimation)}),c(a,function(a){b.prepend(a)})}}}}]).directive("tab",["$ionicViewService","$rootScope","$parse",function(a,b,c){return{restrict:"E",require:"^tabs",scope:!0,transclude:"element",compile:function(d,e,f){return function(d,e,g,h){var i,j;a.registerHistory(d),d.title=g.title,d.icon=g.icon,d.iconOn=g.iconOn,d.iconOff=g.iconOff,d.viewSref=g.uiSref,d.url=g.href,d.url&&0===d.url.indexOf("#")&&(d.url=d.url.replace("#","")),d.hideBackButton=d.$eval(g.hideBackButton),d.hideBackButton!==!0&&(d.hideBackButton=!1),d.animate=d.$eval(g.animate);var k=c(g.leftButtons);d.$watch(k,function(a){d.leftButtons=a,d.doesUpdateNavRouter&&d.$emit("viewState.leftButtonsChanged",d.rightButtons)});var l=c(g.rightButtons);d.$watch(l,function(a){d.rightButtons=a}),h.add(d),d.$watch("isVisible",function(a){j&&(j.remove(),j=null,d.$broadcast("tab.hidden")),i&&(i.$destroy(),i=null),a&&(i=d.$new(),f(i,function(a){a.addClass("pane"),a.removeAttr("title"),j=a,e.parent().append(j),d.$broadcast("tab.shown") +}))}),f(d.$new(),function(b){var c=b[0].getElementsByTagName("nav-view");d.hasNavView=c.length>0,d.hasNavView&&(d.navViewName=c[0].getAttribute("name"),a.isCurrentStateNavView(d.navViewName)&&h.select(d.tabIndex))}),b.$on("$stateChangeSuccess",function(){a.isCurrentStateNavView(d.navViewName)&&d.tabIndex!==h.selectedIndex&&h.select(d.tabIndex)})}}}}]).directive("tabControllerBar",function(){return{restrict:"E",require:"^tabs",transclude:!0,replace:!0,scope:!0,template:'
    ',link:function(a,b){b.addClass(a.tabsType),b.addClass(a.tabsStyle)}}}).directive("tabControllerItem",["$window",function(){return{restrict:"E",replace:!0,require:"^tabs",scope:{iconTitle:"@",icon:"@",iconOn:"@",iconOff:"@",active:"=",tabSelected:"@",index:"="},link:function(a,b,c,d){c.icon&&(a.iconOn=a.iconOff=c.icon),a.selectTab=function(){d.select(a.index,!0)}},template:' {{iconTitle}}'}}]).directive("tabBar",function(){return{restrict:"E",replace:!0,transclude:!0,template:'
    '}}),function(a){"use strict";angular.module("ionic.ui.toggle",[]).directive("toggle",function(){return{restrict:"E",replace:!0,require:"?ngModel",scope:{},template:'
    ',link:function(b,c,d,e){var f,g;e&&(f=c.children().eq(0),g=c.children().eq(1),f.length&&g.length&&(b.toggle=new a.views.Toggle({el:c[0],checkbox:f[0],handle:g[0]}),b.toggleIt=function(a){b.toggle.tap(a),e.$setViewValue(f[0].checked)},e.$render=function(){b.toggle.val(e.$viewValue)}))}}})}(window.ionic),function(){"use strict";angular.module("ionic.ui.viewState",["ionic.service.view","ionic.service.gesture"]).directive("navBar",["$ionicViewService","$rootScope","$animate","$compile",function(a,b,c,d){var e=function(a,b,e,f,g){var h,i,j,k=b[0].querySelectorAll(".title"),l=f.title;if(!e||e===l)return g(),void 0;h=angular.element(k[0]),j=d('

    ')(a),h.replaceWith(j),i=d('

    ')(a);var m=b[0].firstElementChild||null;c.enter(i,b,m&&angular.element(m),function(){g()}),c.leave(angular.element(j),function(){})};return{restrict:"E",replace:!0,scope:{type:"@",backButtonType:"@",backButtonLabel:"@",backButtonIcon:"@",alignTitle:"@"},template:'',link:function(a,c,d){a.enableBackButton=!0,a.backButtonClass=d.backButtonType,d.backButtonIcon&&(a.backButtonClass+=" icon "+d.backButtonIcon),b.$on("viewState.showNavBar",function(a,b){b===!1?c[0].classList.add("invisible"):c[0].classList.remove("invisible")});var f=new ionic.views.HeaderBar({el:c[0],alignTitle:a.alignTitle||"center"});a.headerBarView=f,c.addClass(a.type);var g=function(b){a.oldTitle=a.currentTitle,a.currentTitle=b&&b.title?b.title:"",a.leftButtons=b.leftButtons,a.rightButtons=b.rightButtons,"undefined"!=typeof b.hideBackButton&&(a.enableBackButton=b.hideBackButton!==!0),b.animate!==!1&&d.animation&&b.title&&b.navDirection?(c[0].classList.add(d.animation),"back"===b.navDirection?c[0].classList.add("reverse"):c[0].classList.remove("reverse"),e(a,c,a.oldTitle,b,function(){f.align()})):f.align()};b.$on("viewState.viewEnter",function(a,b){g(b)}),a.$parent.$on("viewState.leftButtonsChanged",function(b,c){a.leftButtons=c}),a.$parent.$on("viewState.rightButtonsChanged",function(b,c){a.rightButtons=c})}}}]).directive("view",["$ionicViewService","$rootScope","$animate",function(a,b){return{restrict:"EA",priority:1e3,scope:{leftButtons:"=",rightButtons:"=",title:"=",icon:"@",iconOn:"@",iconOff:"@",type:"@",alignTitle:"@",hideBackButton:"@",hideNavBar:"@",animation:"@"},compile:function(a){return a.addClass("pane"),a[0].removeAttribute("title"),function(a){b.$broadcast("viewState.viewEnter",{title:a.title,navDirection:a.$navDirection||a.$parent.$navDirection}),a.hideBackButton=a.$eval(a.hideBackButton),a.hideBackButton&&b.$broadcast("viewState.showBackButton",!1),b.$broadcast("viewState.showNavBar","true"!==a.hideNavBar);var c=a.$watch("leftButtons",function(){a.$emit("viewState.leftButtonsChanged",a.leftButtons)}),d=a.$watch("rightButtons",function(){a.$emit("viewState.rightButtonsChanged",a.rightButtons)});a.$on("$destroy",function(){c(),d()})}}}}]).directive("viewBack",["$ionicViewService","$rootScope",function(a,b){var c=function(b){var c=a.getBackView();return c&&c.go(),b.alreadyHandled=!0,!1};return{restrict:"AC",compile:function(a){return a.addClass("hide"),function(a,d){d.bind("tap",c),a.showButton=function(a){a?d[0].classList.remove("hide"):d[0].classList.add("hide")},b.$on("$viewHistory.historyChange",function(b,c){a.showButton(c.showBack)}),b.$on("viewState.showBackButton",function(b,c){a.showButton(c)})}}}}]).directive("navView",["$ionicViewService","$state","$anchorScroll","$compile","$controller","$animate",function(a,b,c,d,e){var f,g=!1,h={restrict:"E",terminal:!0,priority:2e3,transclude:!0,link:function(c,i,j){function k(g){var h=b.$current&&b.$current.locals[p],j=h&&h.$template?h.$template:null;if(h!==m){var k={parentElement:i,doAnimation:g,leavingScope:n,leavingElement:l,navDirection:null};if(j){l=angular.element(j.trim());var q={};"TABS"!==l[0].tagName&&(q=a.register(c),k.navDirection=q.navDirection),m=h,r.state=h.$$state;var s=d(l),t=b.current;if(n=t.scope=c.$new(),n.$navDirection=k.navDirection,h.$$controller){h.$scope=n;var u=e(h.$$controller,h);t.controllerAs&&(n[t.controllerAs]=u),l.data("$ngControllerController",u),l.children().data("$ngControllerController",u)}s(n),n.$emit("$viewContentLoaded"),n.$eval(o),n.animation=f,k.enteringScope=n,k.enteringElement=l}a.transition(k)}}var l,m,n,o=(j.autoscroll,j.onload||""),p=j[h.name]||j.name||"",q=i.parent().inheritedData("$uiView");p.indexOf("@")<0&&(p=p+"@"+(q?q.state.name:""));var r={name:p,state:null,animation:null};i.data("$uiView",r);for(var s=i[0];!f&&s;)f=s.getAttribute("animation"),s=s.parentElement;var t=function(){if(!g){g=!0;try{k(!0)}catch(a){throw g=!1,a}g=!1}};c.$on("$stateChangeSuccess",t),c.$on("$viewContentLoading",t),k(!1)}};return h}])}(),function(){"use strict";angular.module("ionic.ui.virtRepeat",[]).directive("virtRepeat",function(){return{require:["?ngModel","^virtualList"],transclude:"element",priority:1e3,terminal:!0,compile:function(){return function(a,b,c,d){var e=d[1];e.listView.renderViewport=function(){}}}}})}(ionic),function(){"use strict";function a(a){var b=a.match(/^\s*([\$\w]+)\s+in\s+(\S*)\s*$/);if(!b)throw new Error("Expected sfVirtualRepeat in form of '_item_ in _collection_' but got '"+a+"'.");return{value:b[1],collection:b[2]}}function b(a){var b={overflow:"auto"},c=window.getComputedStyle?window.getComputedStyle(a[0]):a[0].currentStyle,d=c&&c.getPropertyValue("max-height"),e=c&&c.getPropertyValue("height");d&&"0px"!==d?b.maxHeight=d:b.height=e&&"0px"!==e?e:window.innerHeight,a.css(b)}function c(a){var b={margin:0,padding:0,border:0,"box-sizing":"border-box"};a.css(b)}function d(a){var b=window.getComputedStyle?window.getComputedStyle(a):a.currentStyle,c=b&&b.getPropertyValue("max-height"),d=b&&b.getPropertyValue("height");if(d&&"0px"!==d&&"auto"!==d)$log.info('Row height is "%s" from css height',d);else if(c&&"0px"!==c&&"none"!==c)d=c,$log.info('Row height is "%s" from css max-height',d);else{if(!a.clientHeight)throw new Error("Unable to compute height of row");d=a.clientHeight+"px",$log.info('Row height is "%s" from client height',d)}return angular.element(a).css("height",d),parseInt(d,10)}angular.module("ionic.ui.virtualRepeat",[]).directive("virtualRepeat",["$log",function(e){return{require:["?ngModel, ^virtualList"],transclude:"element",priority:1e3,terminal:!0,compile:function(f,g){var h=a(g.sfVirtualRepeat);return function(a,f,g,i){function j(a,b,c){var d=c.$new();return d[h.value]=b[a],d.$index=a,d.$first=0===a,d.$last=a===b.length-1,d.$middle=!(d.$first||d.$last),d.$watch(function(){d[h.value]=b[a]}),d}function k(a,b,c,d,e){var f,g,h,i=document.createDocumentFragment(),k=[];for(g=a;g!==b;g++)h=j(g,c,d),f=linker(h,angular.noop),k.push(f),i.appendChild(f[0]);return e.after(i),k}function l(){var a=clip(v.firstActive,v.firstVisible-v.lowWater,v.firstVisible-v.highWater),b=clip(v.firstActive+v.active,v.firstVisible+v.visible+v.lowWater,v.firstVisible+v.visible+v.highWater);v.firstActive=Math.max(0,a),v.active=Math.min(b,v.total)-v.firstActive}function m(b){s&&a.$apply(function(){v.firstVisible=Math.floor(b.target.scrollTop/s),v.visible=Math.ceil(u.viewport[0].clientHeight/s),e.log("scroll to row %o",v.firstVisible),t=b.target.scrollTop+b.target.clientHeight>=b.target.scrollHeight,l(),e.log(" state is now %o",v),e.log(" sticky = %o",t)})}function n(a){var b=a.$eval(h.collection);return b.length!==v.total&&(v.total=b.length,l()),{start:v.firstActive,active:v.active,len:b.length}}function o(a,b){var c,d,e=Array.prototype[a];for(d=0;b>d;d++)c=e.call(r),c.scope().$destroy(),c.remove()}function p(a,b,c){var g,i=b.start+b.active,j=c.$eval(h.collection);if(a===b)e.info("initial listen"),g=k(a.start,i,j,c,f),r=g,r.length&&(s=d(g[0][0]));else{var l=a.start+a.active,m=a.start>=b.start,n=m?a.start-b.start:b.start-a.start,p=l>=i?l-i:i-l,q=n<(m?b.active:a.active);if(e.info("change by %o,%o rows %s",n,p,m?"forward":"backward"),q){if(m?(e.info("need to remove from the top"),o("shift",n)):n&&(e.info("need to add at the top"),g=k(a.start,b.start,j,c,f),r=g.concat(r)),i>l)e.info("need to remove from the bottom"),o("pop",i-l);else if(p){var v=r[r.length-1];e.info("need to add to the bottom"),g=k(i,l,j,c,v),r=r.concat(g)}}else e.info("non-contiguous change"),o("pop",r.length),r=k(a.start,l,j,c,f);!s&&r.length&&(s=d(r[0][0])),u.content.css({"padding-top":a.start*s+"px"})}u.content.css({height:a.len*s+"px"}),t&&(u.viewport[0].scrollTop=u.viewport[0].clientHeight+u.viewport[0].scrollHeight)}var q=i[1],r=[],s=0,t=!1,u=q.element,v="ngModel"in g?a.$eval(g.ngModel):{};v.firstActive=0,v.firstVisible=0,v.visible=0,v.active=0,v.total=0,v.lowWater=v.lowWater||100,v.highWater=v.highWater||300,c(u.content),b(u.viewport),u.bind("momentumScrolled",m),a.$on("$destroy",function(){u.unbind("momentumScrolled",m)}),a.$watch(n,p,!0)}}}}])}(ionic); \ No newline at end of file diff --git a/js/ext/angular/src/directive/ionicBar.js b/js/ext/angular/src/directive/ionicBar.js index cadb64f6b9..995dae52cf 100644 --- a/js/ext/angular/src/directive/ionicBar.js +++ b/js/ext/angular/src/directive/ionicBar.js @@ -3,17 +3,17 @@ angular.module('ionic.ui.header', ['ngAnimate']) -.directive('barHeader', ['ScrollDelegate', function(ScrollDelegate) { +.directive('barHeader', ['$ionicScrollDelegate', function($ionicScrollDelegate) { return { restrict: 'C', link: function($scope, $element, $attr) { // We want to scroll to top when the top of this element is clicked - ScrollDelegate.tapScrollToTop($element); + $ionicScrollDelegate.tapScrollToTop($element); } }; }]) -.directive('headerBar', [function(ScrollDelegate) { +.directive('headerBar', ['$ionicScrollDelegate', function($ionicScrollDelegate) { return { restrict: 'E', replace: true, diff --git a/js/ext/angular/src/directive/ionicContent.js b/js/ext/angular/src/directive/ionicContent.js index 5ae358f27e..aadbfd5e97 100644 --- a/js/ext/angular/src/directive/ionicContent.js +++ b/js/ext/angular/src/directive/ionicContent.js @@ -18,7 +18,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // The content directive is a core scrollable content area // that is part of many View hierarchies -.directive('content', ['$parse', '$timeout', 'Platform', 'ScrollDelegate', function($parse, $timeout, Platform, ScrollDelegate) { +.directive('content', ['$parse', '$timeout', '$ionicPlatform', '$ionicScrollDelegate', function($parse, $timeout, $ionicPlatform, $ionicScrollDelegate) { return { restrict: 'E', replace: true, @@ -82,7 +82,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // Otherwise, supercharge this baby! $timeout(function() { var hasBouncing = $scope.$eval($scope.hasBouncing); - var enableBouncing = !Platform.is('Android') && hasBouncing !== false; + var enableBouncing = !$ionicPlatform.is('Android') && hasBouncing !== false; // No bouncing by default for Android users, lest they take up pitchforks // to our bouncing goodness sv = new ionic.views.Scroll({ @@ -116,7 +116,7 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) } // Register for scroll delegate event handling - ScrollDelegate.register($scope, $element); + $ionicScrollDelegate.register($scope, $element); // Let child scopes access this $scope.$parent.scrollView = sv; diff --git a/js/ext/angular/src/directive/ionicSideMenu.js b/js/ext/angular/src/directive/ionicSideMenu.js index f660c035f0..86da6b06eb 100644 --- a/js/ext/angular/src/directive/ionicSideMenu.js +++ b/js/ext/angular/src/directive/ionicSideMenu.js @@ -45,7 +45,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) }; }) -.directive('sideMenuContent', ['$timeout', 'Gesture', function($timeout, Gesture) { +.directive('sideMenuContent', ['$timeout', '$ionicGesture', function($timeout, $ionicGesture) { return { restrict: 'AC', require: '^sideMenus', @@ -85,10 +85,10 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) }; //var dragGesture = Gesture.on('drag', dragFn, $element); - var dragRightGesture = Gesture.on('dragright', dragFn, $element); - var dragLeftGesture = Gesture.on('dragleft', dragFn, $element); - var dragUpGesture = Gesture.on('dragup', dragVertFn, $element); - var dragDownGesture = Gesture.on('dragdown', dragVertFn, $element); + var dragRightGesture = $ionicGesture.on('dragright', dragFn, $element); + var dragLeftGesture = $ionicGesture.on('dragleft', dragFn, $element); + var dragUpGesture = $ionicGesture.on('dragup', dragVertFn, $element); + var dragDownGesture = $ionicGesture.on('dragdown', dragVertFn, $element); var dragReleaseFn = function(e) { isDragging = false; @@ -98,7 +98,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) defaultPrevented = false; }; - var releaseGesture = Gesture.on('release', dragReleaseFn, $element); + var releaseGesture = $ionicGesture.on('release', dragReleaseFn, $element); sideMenuCtrl.setContent({ onDrag: function(e) {}, @@ -126,11 +126,11 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture']) // Cleanup $scope.$on('$destroy', function() { - Gesture.off(dragLeftGesture, 'dragleft', dragFn); - Gesture.off(dragRightGesture, 'dragright', dragFn); - Gesture.off(dragUpGesture, 'dragup', dragFn); - Gesture.off(dragDownGesture, 'dragdown', dragFn); - Gesture.off(releaseGesture, 'release', dragReleaseFn); + $ionicGesture.off(dragLeftGesture, 'dragleft', dragFn); + $ionicGesture.off(dragRightGesture, 'dragright', dragFn); + $ionicGesture.off(dragUpGesture, 'dragup', dragFn); + $ionicGesture.off(dragDownGesture, 'dragdown', dragFn); + $ionicGesture.off(releaseGesture, 'release', dragReleaseFn); }); }; } diff --git a/js/ext/angular/src/directive/ionicSlideBox.js b/js/ext/angular/src/directive/ionicSlideBox.js index 4cbdc0053a..46fa597391 100644 --- a/js/ext/angular/src/directive/ionicSlideBox.js +++ b/js/ext/angular/src/directive/ionicSlideBox.js @@ -13,7 +13,7 @@ angular.module('ionic.ui.slideBox', []) * The internal controller for the slide box controller. */ -.directive('slideBox', ['$timeout', '$compile', 'SlideBoxDelegate', function($timeout, $compile, SlideBoxDelegate) { +.directive('slideBox', ['$timeout', '$compile', '$ionicSlideBoxDelegate', function($timeout, $compile, $ionicSlideBoxDelegate) { return { restrict: 'E', replace: true, @@ -73,7 +73,7 @@ angular.module('ionic.ui.slideBox', []) $scope.$parent.slideBox = slider; - SlideBoxDelegate.register($scope, $element); + $ionicSlideBoxDelegate.register($scope, $element); this.getNumSlides = function() { return slider.getNumSlides(); diff --git a/js/ext/angular/src/directive/ionicTabBar.js b/js/ext/angular/src/directive/ionicTabBar.js index 52c0164259..43d46dcfbb 100644 --- a/js/ext/angular/src/directive/ionicTabBar.js +++ b/js/ext/angular/src/directive/ionicTabBar.js @@ -124,7 +124,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) }]) // Generic controller directive -.directive('tab', ['ViewService', '$rootScope', '$parse', function(ViewService, $rootScope, $parse) { +.directive('tab', ['$ionicViewService', '$rootScope', '$parse', function($ionicViewService, $rootScope, $parse) { return { restrict: 'E', require: '^tabs', @@ -135,7 +135,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) return function link($scope, $element, $attr, tabsCtrl) { var childScope, childElement; - ViewService.registerHistory($scope); + $ionicViewService.registerHistory($scope); $scope.title = $attr.title; $scope.icon = $attr.icon; @@ -202,7 +202,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) if($scope.hasNavView) { // this tab has a ui-view $scope.navViewName = navViewEle[0].getAttribute('name'); - if( ViewService.isCurrentStateNavView( $scope.navViewName ) ) { + if( $ionicViewService.isCurrentStateNavView( $scope.navViewName ) ) { // this tab's ui-view is the current one, go to it! tabsCtrl.select($scope.tabIndex); } @@ -210,7 +210,7 @@ angular.module('ionic.ui.tabs', ['ionic.service.view']) }); $rootScope.$on('$stateChangeSuccess', function(value){ - if( ViewService.isCurrentStateNavView($scope.navViewName) && + if( $ionicViewService.isCurrentStateNavView($scope.navViewName) && $scope.tabIndex !== tabsCtrl.selectedIndex) { tabsCtrl.select($scope.tabIndex); } diff --git a/js/ext/angular/src/directive/ionicViewState.js b/js/ext/angular/src/directive/ionicViewState.js index 2b81a49fb3..27639fb4c9 100644 --- a/js/ext/angular/src/directive/ionicViewState.js +++ b/js/ext/angular/src/directive/ionicViewState.js @@ -22,8 +22,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu /** * Our Nav Bar directive which updates as the controller state changes. */ -.directive('navBar', ['ViewService', '$rootScope', '$animate', '$compile', - function( ViewService, $rootScope, $animate, $compile) { +.directive('navBar', ['$ionicViewService', '$rootScope', '$animate', '$compile', + function( $ionicViewService, $rootScope, $animate, $compile) { /** * Perform an animation between one tab bar state and the next. @@ -150,8 +150,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('view', ['ViewService', '$rootScope', '$animate', - function( ViewService, $rootScope, $animate) { +.directive('view', ['$ionicViewService', '$rootScope', '$animate', + function( $ionicViewService, $rootScope, $animate) { return { restrict: 'EA', priority: 1000, @@ -210,9 +210,9 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('viewBack', ['ViewService', '$rootScope', function(ViewService, $rootScope) { +.directive('viewBack', ['$ionicViewService', '$rootScope', function($ionicViewService, $rootScope) { var goBack = function(e) { - var backView = ViewService.getBackView(); + var backView = $ionicViewService.getBackView(); backView && backView.go(); e.alreadyHandled = true; return false; @@ -249,8 +249,8 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]) -.directive('navView', ['ViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', - function( ViewService, $state, $anchorScroll, $compile, $controller, $animate) { +.directive('navView', ['$ionicViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', + function( $ionicViewService, $state, $anchorScroll, $compile, $controller, $animate) { var viewIsUpdating = false; var animation; @@ -315,7 +315,7 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu var registerData = {}; if(currentElement[0].tagName !== 'TABS') { // the tabs directive shouldn't register in the view history (its tab will) - registerData = ViewService.register(scope); + registerData = $ionicViewService.register(scope); transitionOptions.navDirection = registerData.navDirection; } @@ -348,7 +348,7 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu transitionOptions.enteringElement = currentElement; } - ViewService.transition(transitionOptions); + $ionicViewService.transition(transitionOptions); } } }; @@ -356,4 +356,4 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu }]); -})(); \ No newline at end of file +})(); diff --git a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js index dec0e54546..5233146c1b 100644 --- a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js +++ b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js @@ -3,7 +3,7 @@ angular.module('ionic.ui.service.scrollDelegate', []) -.factory('ScrollDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { +.factory('$ionicScrollDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { return { /** * Trigger a scroll-to-top event on child scrollers. diff --git a/js/ext/angular/src/service/delegates/ionicSlideBoxDelegate.js b/js/ext/angular/src/service/delegates/ionicSlideBoxDelegate.js index 246b716692..f6b6d7edfe 100644 --- a/js/ext/angular/src/service/delegates/ionicSlideBoxDelegate.js +++ b/js/ext/angular/src/service/delegates/ionicSlideBoxDelegate.js @@ -3,7 +3,7 @@ angular.module('ionic.ui.service.slideBoxDelegate', []) -.factory('SlideBoxDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { +.factory('$ionicSlideBoxDelegate', ['$rootScope', '$timeout', function($rootScope, $timeout) { return { /** * Trigger a slidebox to update and resize itself diff --git a/js/ext/angular/src/service/ionicActionSheet.js b/js/ext/angular/src/service/ionicActionSheet.js index 6e34ebdee9..b263dd2994 100644 --- a/js/ext/angular/src/service/ionicActionSheet.js +++ b/js/ext/angular/src/service/ionicActionSheet.js @@ -1,7 +1,7 @@ angular.module('ionic.service.actionSheet', ['ionic.service.templateLoad', 'ionic.ui.actionSheet', 'ngAnimate']) -.factory('ActionSheet', ['$rootScope', '$document', '$compile', '$animate', '$timeout', 'TemplateLoader', - function($rootScope, $document, $compile, $animate, $timeout, TemplateLoader) { +.factory('$ionicActionSheet', ['$rootScope', '$document', '$compile', '$animate', '$timeout', '$ionicTemplateLoader', + function($rootScope, $document, $compile, $animate, $timeout, $ionicTemplateLoader) { return { /** diff --git a/js/ext/angular/src/service/ionicGesture.js b/js/ext/angular/src/service/ionicGesture.js index a3d7d9650c..0c222b6483 100644 --- a/js/ext/angular/src/service/ionicGesture.js +++ b/js/ext/angular/src/service/ionicGesture.js @@ -1,6 +1,6 @@ angular.module('ionic.service.gesture', []) -.factory('Gesture', [function() { +.factory('$ionicGesture', [function() { return { on: function(eventType, cb, $element) { return window.ionic.onGesture(eventType, cb, $element[0]); diff --git a/js/ext/angular/src/service/ionicLoading.js b/js/ext/angular/src/service/ionicLoading.js index 98cea67eea..b758485ca5 100644 --- a/js/ext/angular/src/service/ionicLoading.js +++ b/js/ext/angular/src/service/ionicLoading.js @@ -1,6 +1,6 @@ angular.module('ionic.service.loading', ['ionic.ui.loading']) -.factory('Loading', ['$rootScope', '$document', '$compile', function($rootScope, $document, $compile) { +.factory('$ionicLoading', ['$rootScope', '$document', '$compile', function($rootScope, $document, $compile) { return { /** * Load an action sheet with the given template string. diff --git a/js/ext/angular/src/service/ionicModal.js b/js/ext/angular/src/service/ionicModal.js index f95e3109f6..5f6db25a63 100644 --- a/js/ext/angular/src/service/ionicModal.js +++ b/js/ext/angular/src/service/ionicModal.js @@ -1,7 +1,7 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ngAnimate']) -.factory('Modal', ['$rootScope', '$document', '$compile', '$animate', '$q', 'TemplateLoader', function($rootScope, $document, $compile, $animate, $q, TemplateLoader) { +.factory('$ionicModal', ['$rootScope', '$document', '$compile', '$animate', '$q', '$ionicTemplateLoader', function($rootScope, $document, $compile, $animate, $q, $ionicTemplateLoader) { var ModalView = ionic.views.Modal.inherit({ initialize: function(opts) { ionic.views.Modal.prototype.initialize.call(this, opts); @@ -69,7 +69,7 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ngAnimate' return modal; }, fromTemplateUrl: function(url, cb, options) { - return TemplateLoader.load(url).then(function(templateString) { + return $ionicTemplateLoader.load(url).then(function(templateString) { var modal = createModal(templateString, options || {}); cb ? cb(modal) : null; return modal; diff --git a/js/ext/angular/src/service/ionicPlatform.js b/js/ext/angular/src/service/ionicPlatform.js index 50d64c993a..e3fda7ddaf 100644 --- a/js/ext/angular/src/service/ionicPlatform.js +++ b/js/ext/angular/src/service/ionicPlatform.js @@ -10,7 +10,7 @@ angular.module('ionic.service.platform', []) * initializing some defaults that depend on the platform, such as the * height of header bars on iOS 7. */ -.provider('Platform', function() { +.provider('$ionicPlatform', function() { var platform = 'web'; var isPlatformReady = false; diff --git a/js/ext/angular/src/service/ionicPopup.js b/js/ext/angular/src/service/ionicPopup.js index e771a24bae..1139f77319 100644 --- a/js/ext/angular/src/service/ionicPopup.js +++ b/js/ext/angular/src/service/ionicPopup.js @@ -1,7 +1,7 @@ angular.module('ionic.service.popup', ['ionic.service.templateLoad']) -.factory('Popup', ['$rootScope', '$document', '$compile', 'TemplateLoader', function($rootScope, $document, $compile, TemplateLoader) { +.factory('$ionicPopup', ['$rootScope', '$document', '$compile', 'TemplateLoader', function($rootScope, $document, $compile, TemplateLoader) { var getPopup = function() { // Make sure there is only one loading element on the page at one point in time diff --git a/js/ext/angular/src/service/ionicTemplateLoad.js b/js/ext/angular/src/service/ionicTemplateLoad.js index 65a401f275..2139a034ee 100644 --- a/js/ext/angular/src/service/ionicTemplateLoad.js +++ b/js/ext/angular/src/service/ionicTemplateLoad.js @@ -1,6 +1,6 @@ angular.module('ionic.service.templateLoad', []) -.factory('TemplateLoader', ['$q', '$http', '$templateCache', function($q, $http, $templateCache) { +.factory('$ionicTemplateLoader', ['$q', '$http', '$templateCache', function($q, $http, $templateCache) { return { load: function(url) { var deferred = $q.defer(); diff --git a/js/ext/angular/src/service/ionicView.js b/js/ext/angular/src/service/ionicView.js index 72fbfeabbf..20f864c0f7 100644 --- a/js/ext/angular/src/service/ionicView.js +++ b/js/ext/angular/src/service/ionicView.js @@ -50,7 +50,7 @@ angular.module('ionic.service.view', ['ui.router']) }]) -.factory('ViewService', ['$rootScope', '$state', '$location', '$window', '$injector', +.factory('$ionicViewService', ['$rootScope', '$state', '$location', '$window', '$injector', function( $rootScope, $state, $location, $window, $injector) { var $animate = $injector.has('$animate') ? $injector.get('$animate') : false; diff --git a/js/ext/angular/test/actionSheet.html b/js/ext/angular/test/actionSheet.html index 00df79006d..7b170eb64b 100644 --- a/js/ext/angular/test/actionSheet.html +++ b/js/ext/angular/test/actionSheet.html @@ -139,9 +139,9 @@