diff --git a/CHANGELOG.md b/CHANGELOG.md index ae5c1cdd25..877297bd4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,55 @@ -2013-11-29 - Changelog created -2013-11-26 - v0.9.13-alpha: nav router back button fixes (remove back button on first route, fix forward/back transition on iOS devices which lack history.state) +## 0.9.19 "Alpha Koala" (2014-01-09) + - Created ViewState Service to track navigation history + - Created navView directive + - Removed navPage and navRouter directives + - Using AngularUI Router instead of $route + - Update examples to use $stateProvider instead $routeProvider + + +## 0.9.18 "Alpha Jaguar" (2013-12-18) + - Slide box bug fixes + - Fixed issues with minification + - Small tweaks + + +## 0.9.17 "Alpha Iguana" (2013-12-16) + - Nav bar button fixes + - New slide box overhaul + - New list overhaul + - Radio button and checkbox fixes + + +## 0.9.16 "Alpha Hippo" (2013-12-12) + - Scrollbars + - Scroll bug fixes + + +## 0.9.15 "Alpha Giraffe" (2013-12-08) + - Scroll view fixes + - Radio button and checkbox fixes + - Slide box fixes + + +## 0.9.14 "Alpha Fox" (2013-12-04) + - Massive scroll performance improvements + - Android fixes and perf improvements + - Header and nav bar button fixes + - Animation performance improvements + + +## 0.9.13 "Alpha Elephant" (2013-11-26) + - nav router back button fixes + - Remove back button on first route + - Fix forward/back transition on iOS devices which lack history.state + + +## 0.9.12 "Alpha Dog" (2013-11-24) + - Fixed some overflow scrolling issues. + + +## 0.9.11 "Alpha Cat Dog" (2013-11-23) + + +## 0.9.10 "Alpha Cat" (2013-11-23) + diff --git a/LICENSE b/LICENSE index 62a1461e21..5f742a7cf6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2013 Drifty Co. +Copyright 2014 Drifty Co. http://drifty.com/ MIT License diff --git a/bower.json b/bower.json index 7ae6198825..ccf7cb018a 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "ionic", - "version": "0.9.18", + "version": "0.9.19", "homepage": "https://github.com/driftyco/ionic", "authors": [ "Max Lynch ", diff --git a/component.json b/component.json index 47b3b79347..1edf5d0023 100644 --- a/component.json +++ b/component.json @@ -1,7 +1,7 @@ { "repo": "driftyco/ionic", "development": {}, - "version": "0.9.18", + "version": "0.9.19", "styles": [ "dist/css/ionic.css" ], diff --git a/dist/css/ionic.css b/dist/css/ionic.css index 2eafa53147..8ee22a135f 100644 --- a/dist/css/ionic.css +++ b/dist/css/ionic.css @@ -1,9 +1,8 @@ -@charset "UTF-8"; /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -6146,9 +6145,9 @@ a.button { */ .nav-title-slide-ios7 > .ng-enter, .nav-title-slide-ios7.ng-enter, .nav-title-slide-ios7 > .ng-leave, .nav-title-slide-ios7.ng-leave { - -webkit-transition: all 350ms; - -moz-transition: all 350ms; - transition: all 350ms; + -webkit-transition: all 250ms; + -moz-transition: all 250ms; + transition: all 250ms; -webkit-transition-timing-function: ease-in-out; -moz-transition-timing-function: ease-in-out; transition-timing-function: ease-in-out; @@ -6168,27 +6167,23 @@ a.button { -moz-transform: translate3d(-30%, 0, 0); transform: translate3d(-30%, 0, 0); opacity: 0; } - -.reverse .nav-title-slide-ios7 > .ng-enter, .reverse .nav-title-slide-ios7.ng-enter, -.reverse .nav-title-slide-ios7 > .ng-leave, .reverse .nav-title-slide-ios7.ng-leave { - -webkit-transition: all 350ms; - -moz-transition: all 350ms; - transition: all 350ms; - -webkit-transition-timing-function: ease-in-out; - -moz-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; +.nav-title-slide-ios7.reverse > .ng-enter, .nav-title-slide-ios7.reverse.ng-enter, +.nav-title-slide-ios7.reverse > .ng-leave, .nav-title-slide-ios7.reverse.ng-leave { + -webkit-transition: all ease-in-out 250ms; + -moz-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; opacity: 1; } -.reverse .nav-title-slide-ios7 > .ng-enter, .reverse .nav-title-slide-ios7.ng-enter { +.nav-title-slide-ios7.reverse > .ng-enter, .nav-title-slide-ios7.reverse.ng-enter { -webkit-transform: translate3d(-30%, 0, 0); -moz-transform: translate3d(-30%, 0, 0); transform: translate3d(-30%, 0, 0); opacity: 0; } -.reverse .nav-title-slide-ios7 > .ng-enter.ng-enter-active, .reverse .nav-title-slide-ios7.ng-enter.ng-enter-active { +.nav-title-slide-ios7.reverse > .ng-enter.ng-enter-active, .nav-title-slide-ios7.reverse.ng-enter.ng-enter-active { -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); opacity: 1; } -.reverse .nav-title-slide-ios7 > .ng-leave.ng-leave-active, .reverse .nav-title-slide-ios7.ng-leave.ng-leave-active { +.nav-title-slide-ios7.reverse > .ng-leave.ng-leave-active, .nav-title-slide-ios7.reverse.ng-leave.ng-leave-active { -webkit-transform: translate3d(30%, 0, 0); -moz-transform: translate3d(30%, 0, 0); transform: translate3d(30%, 0, 0); diff --git a/dist/css/ionic.min.css b/dist/css/ionic.min.css index 8eebb2c3c6..e48515c3e9 100644 --- a/dist/css/ionic.min.css +++ b/dist/css/ionic.min.css @@ -1,8 +1,8 @@ -@charset "UTF-8";/*! - * Copyright 2013 Drifty Co. +/*! + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -15,4 +15,4 @@ Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ https://twitter.com/helloimben https://twitter.com/ionicframework MIT License: https://github.com/driftyco/ionicons -*/@font-face{font-family:Ionicons;src:url(../fonts/ionicons.eot?v=1.4.0);src:url(../fonts/ionicons.eot?v=1.4.0#iefix) format("embedded-opentype"),url(../fonts/ionicons.ttf?v=1.4.0) format("truetype"),url(../fonts/ionicons.woff?v=1.4.0) format("woff"),url(../fonts/ionicons.svg?v=1.4.0#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert,.ion-alert-circled,.ion-android-add,.ion-android-add-contact,.ion-android-alarm,.ion-android-archive,.ion-android-arrow-back,.ion-android-arrow-down-left,.ion-android-arrow-down-right,.ion-android-arrow-up-left,.ion-android-arrow-up-right,.ion-android-battery,.ion-android-book,.ion-android-calendar,.ion-android-call,.ion-android-camera,.ion-android-chat,.ion-android-checkmark,.ion-android-clock,.ion-android-close,.ion-android-contact,.ion-android-contacts,.ion-android-data,.ion-android-developer,.ion-android-display,.ion-android-download,.ion-android-dropdown,.ion-android-earth,.ion-android-folder,.ion-android-forums,.ion-android-friends,.ion-android-hand,.ion-android-image,.ion-android-inbox,.ion-android-information,.ion-android-keypad,.ion-android-lightbulb,.ion-android-locate,.ion-android-location,.ion-android-mail,.ion-android-microphone,.ion-android-mixer,.ion-android-more,.ion-android-note,.ion-android-playstore,.ion-android-printer,.ion-android-promotion,.ion-android-reminder,.ion-android-remove,.ion-android-search,.ion-android-send,.ion-android-settings,.ion-android-share,.ion-android-social,.ion-android-social-user,.ion-android-sort,.ion-android-star,.ion-android-stopwatch,.ion-android-storage,.ion-android-system-back,.ion-android-system-home,.ion-android-system-windows,.ion-android-timer,.ion-android-trash,.ion-android-volume,.ion-android-wifi,.ion-archive,.ion-arrow-down-a,.ion-arrow-down-b,.ion-arrow-down-c,.ion-arrow-expand,.ion-arrow-graph-down-left,.ion-arrow-graph-down-right,.ion-arrow-graph-up-left,.ion-arrow-graph-up-right,.ion-arrow-left-a,.ion-arrow-left-b,.ion-arrow-left-c,.ion-arrow-move,.ion-arrow-resize,.ion-arrow-return-left,.ion-arrow-return-right,.ion-arrow-right-a,.ion-arrow-right-b,.ion-arrow-right-c,.ion-arrow-shrink,.ion-arrow-swap,.ion-arrow-up-a,.ion-arrow-up-b,.ion-arrow-up-c,.ion-at,.ion-bag,.ion-battery-charging,.ion-battery-empty,.ion-battery-full,.ion-battery-half,.ion-battery-low,.ion-beaker,.ion-beer,.ion-bluetooth,.ion-bookmark,.ion-briefcase,.ion-bug,.ion-calculator,.ion-calendar,.ion-camera,.ion-card,.ion-chatbox,.ion-chatbox-working,.ion-chatboxes,.ion-chatbubble,.ion-chatbubble-working,.ion-chatbubbles,.ion-checkmark,.ion-checkmark-circled,.ion-checkmark-round,.ion-chevron-down,.ion-chevron-left,.ion-chevron-right,.ion-chevron-up,.ion-clipboard,.ion-clock,.ion-close,.ion-close-circled,.ion-close-round,.ion-cloud,.ion-code,.ion-code-download,.ion-code-working,.ion-coffee,.ion-compass,.ion-compose,.ion-connection-bars,.ion-contrast,.ion-disc,.ion-document,.ion-document-text,.ion-drag,.ion-earth,.ion-edit,.ion-egg,.ion-eject,.ion-email,.ion-eye,.ion-eye-disabled,.ion-female,.ion-filing,.ion-film-marker,.ion-flag,.ion-flash,.ion-flash-off,.ion-flask,.ion-folder,.ion-fork,.ion-fork-repo,.ion-forward,.ion-game-controller-a,.ion-game-controller-b,.ion-gear-a,.ion-gear-b,.ion-grid,.ion-hammer,.ion-headphone,.ion-heart,.ion-help,.ion-help-buoy,.ion-help-circled,.ion-home,.ion-icecream,.ion-icon-social-google-plus,.ion-icon-social-google-plus-outline,.ion-image,.ion-images,.ion-information,.ion-information-circled,.ion-ionic,.ion-ios7-alarm,.ion-ios7-alarm-outline,.ion-ios7-albums,.ion-ios7-albums-outline,.ion-ios7-arrow-back,.ion-ios7-arrow-down,.ion-ios7-arrow-forward,.ion-ios7-arrow-left,.ion-ios7-arrow-right,.ion-ios7-arrow-thin-down,.ion-ios7-arrow-thin-left,.ion-ios7-arrow-thin-right,.ion-ios7-arrow-thin-up,.ion-ios7-arrow-up,.ion-ios7-at,.ion-ios7-at-outline,.ion-ios7-bell,.ion-ios7-bell-outline,.ion-ios7-bolt,.ion-ios7-bolt-outline,.ion-ios7-bookmarks,.ion-ios7-bookmarks-outline,.ion-ios7-box,.ion-ios7-box-outline,.ion-ios7-briefcase,.ion-ios7-briefcase-outline,.ion-ios7-browsers,.ion-ios7-browsers-outline,.ion-ios7-calculator,.ion-ios7-calculator-outline,.ion-ios7-calendar,.ion-ios7-calendar-outline,.ion-ios7-camera,.ion-ios7-camera-outline,.ion-ios7-cart,.ion-ios7-cart-outline,.ion-ios7-chatboxes,.ion-ios7-chatboxes-outline,.ion-ios7-chatbubble,.ion-ios7-chatbubble-outline,.ion-ios7-checkmark,.ion-ios7-checkmark-empty,.ion-ios7-checkmark-outline,.ion-ios7-circle-filled,.ion-ios7-circle-outline,.ion-ios7-clock,.ion-ios7-clock-outline,.ion-ios7-close,.ion-ios7-close-empty,.ion-ios7-close-outline,.ion-ios7-cloud,.ion-ios7-cloud-download,.ion-ios7-cloud-download-outline,.ion-ios7-cloud-outline,.ion-ios7-cloud-upload,.ion-ios7-cloud-upload-outline,.ion-ios7-cloudy,.ion-ios7-cloudy-night,.ion-ios7-cloudy-night-outline,.ion-ios7-cloudy-outline,.ion-ios7-cog,.ion-ios7-cog-outline,.ion-ios7-compose,.ion-ios7-compose-outline,.ion-ios7-contact,.ion-ios7-contact-outline,.ion-ios7-copy,.ion-ios7-copy-outline,.ion-ios7-download,.ion-ios7-download-outline,.ion-ios7-drag,.ion-ios7-email,.ion-ios7-email-outline,.ion-ios7-eye,.ion-ios7-eye-outline,.ion-ios7-fastforward,.ion-ios7-fastforward-outline,.ion-ios7-filing,.ion-ios7-filing-outline,.ion-ios7-film,.ion-ios7-film-outline,.ion-ios7-flag,.ion-ios7-flag-outline,.ion-ios7-folder,.ion-ios7-folder-outline,.ion-ios7-gear,.ion-ios7-gear-outline,.ion-ios7-glasses,.ion-ios7-glasses-outline,.ion-ios7-heart,.ion-ios7-heart-outline,.ion-ios7-help,.ion-ios7-help-empty,.ion-ios7-help-outline,.ion-ios7-infinite,.ion-ios7-infinite-outline,.ion-ios7-information,.ion-ios7-information-empty,.ion-ios7-information-outline,.ion-ios7-ionic-outline,.ion-ios7-keypad,.ion-ios7-keypad-outline,.ion-ios7-lightbulb,.ion-ios7-lightbulb-outline,.ion-ios7-location,.ion-ios7-location-outline,.ion-ios7-locked,.ion-ios7-locked-outline,.ion-ios7-medkit,.ion-ios7-medkit-outline,.ion-ios7-mic,.ion-ios7-mic-off,.ion-ios7-mic-outline,.ion-ios7-minus,.ion-ios7-minus-empty,.ion-ios7-minus-outline,.ion-ios7-monitor,.ion-ios7-monitor-outline,.ion-ios7-moon,.ion-ios7-moon-outline,.ion-ios7-more,.ion-ios7-more-outline,.ion-ios7-musical-note,.ion-ios7-musical-notes,.ion-ios7-navigate,.ion-ios7-navigate-outline,.ion-ios7-paperplane,.ion-ios7-paperplane-outline,.ion-ios7-partlysunny,.ion-ios7-partlysunny-outline,.ion-ios7-pause,.ion-ios7-pause-outline,.ion-ios7-people,.ion-ios7-people-outline,.ion-ios7-person,.ion-ios7-person-outline,.ion-ios7-personadd,.ion-ios7-personadd-outline,.ion-ios7-photos,.ion-ios7-photos-outline,.ion-ios7-pie,.ion-ios7-pie-outline,.ion-ios7-play,.ion-ios7-play-outline,.ion-ios7-plus,.ion-ios7-plus-empty,.ion-ios7-plus-outline,.ion-ios7-pricetag,.ion-ios7-pricetag-outline,.ion-ios7-printer,.ion-ios7-printer-outline,.ion-ios7-rainy,.ion-ios7-rainy-outline,.ion-ios7-recording,.ion-ios7-recording-outline,.ion-ios7-redo,.ion-ios7-redo-outline,.ion-ios7-refresh,.ion-ios7-refresh-empty,.ion-ios7-refresh-outline,.ion-ios7-reload,.ion-ios7-reloading,.ion-ios7-rewind,.ion-ios7-rewind-outline,.ion-ios7-search,.ion-ios7-search-strong,.ion-ios7-skipbackward,.ion-ios7-skipbackward-outline,.ion-ios7-skipforward,.ion-ios7-skipforward-outline,.ion-ios7-snowy,.ion-ios7-speedometer,.ion-ios7-speedometer-outline,.ion-ios7-star,.ion-ios7-star-outline,.ion-ios7-stopwatch,.ion-ios7-stopwatch-outline,.ion-ios7-sunny,.ion-ios7-sunny-outline,.ion-ios7-telephone,.ion-ios7-telephone-outline,.ion-ios7-thunderstorm,.ion-ios7-thunderstorm-outline,.ion-ios7-time,.ion-ios7-time-outline,.ion-ios7-timer,.ion-ios7-timer-outline,.ion-ios7-trash,.ion-ios7-trash-outline,.ion-ios7-undo,.ion-ios7-undo-outline,.ion-ios7-unlocked,.ion-ios7-unlocked-outline,.ion-ios7-upload,.ion-ios7-upload-outline,.ion-ios7-videocam,.ion-ios7-videocam-outline,.ion-ios7-volume-high,.ion-ios7-volume-low,.ion-ios7-wineglass,.ion-ios7-wineglass-outline,.ion-ios7-world,.ion-ios7-world-outline,.ion-ipad,.ion-iphone,.ion-ipod,.ion-jet,.ion-key,.ion-knife,.ion-laptop,.ion-leaf,.ion-levels,.ion-lightbulb,.ion-link,.ion-load-a,.ion-load-b,.ion-load-c,.ion-load-d,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-location,.ion-locked,.ion-log-in,.ion-log-out,.ion-loop,.ion-looping,.ion-magnet,.ion-male,.ion-man,.ion-map,.ion-medkit,.ion-mic-a,.ion-mic-b,.ion-mic-c,.ion-minus,.ion-minus-circled,.ion-minus-round,.ion-model-s,.ion-monitor,.ion-more,.ion-music-note,.ion-navicon,.ion-navicon-round,.ion-navigate,.ion-no-smoking,.ion-nuclear,.ion-paper-airplane,.ion-paperclip,.ion-pause,.ion-person,.ion-person-add,.ion-person-stalker,.ion-pie-graph,.ion-pin,.ion-pinpoint,.ion-pizza,.ion-plane,.ion-play,.ion-playstation,.ion-plus,.ion-plus-circled,.ion-plus-round,.ion-pound,.ion-power,.ion-pricetag,.ion-pricetags,.ion-printer,.ion-radio-waves,.ion-record,.ion-refresh,.ion-refreshing,.ion-reply,.ion-reply-all,.ion-search,.ion-settings,.ion-share,.ion-shuffle,.ion-skip-backward,.ion-skip-forward,.ion-social-android,.ion-social-android-outline,.ion-social-apple,.ion-social-apple-outline,.ion-social-bitcoin,.ion-social-bitcoin-outline,.ion-social-buffer,.ion-social-buffer-outline,.ion-social-designernews,.ion-social-designernews-outline,.ion-social-dribbble,.ion-social-dribbble-outline,.ion-social-dropbox,.ion-social-dropbox-outline,.ion-social-facebook,.ion-social-facebook-outline,.ion-social-freebsd-devil,.ion-social-github,.ion-social-github-outline,.ion-social-googleplus,.ion-social-googleplus-outline,.ion-social-hackernews,.ion-social-hackernews-outline,.ion-social-linkedin,.ion-social-linkedin-outline,.ion-social-pinterest,.ion-social-pinterest-outline,.ion-social-reddit,.ion-social-reddit-outline,.ion-social-rss,.ion-social-rss-outline,.ion-social-skype,.ion-social-skype-outline,.ion-social-tumblr,.ion-social-tumblr-outline,.ion-social-tux,.ion-social-twitter,.ion-social-twitter-outline,.ion-social-vimeo,.ion-social-vimeo-outline,.ion-social-windows,.ion-social-windows-outline,.ion-social-wordpress,.ion-social-wordpress-outline,.ion-social-yahoo,.ion-social-yahoo-outline,.ion-social-youtube,.ion-social-youtube-outline,.ion-speakerphone,.ion-speedometer,.ion-spoon,.ion-star,.ion-stats-bars,.ion-steam,.ion-stop,.ion-thermometer,.ion-thumbsdown,.ion-thumbsup,.ion-trash-a,.ion-trash-b,.ion-umbrella,.ion-unlocked,.ion-upload,.ion-usb,.ion-videocamera,.ion-volume-high,.ion-volume-low,.ion-volume-medium,.ion-volume-mute,.ion-waterdrop,.ion-wifi,.ion-wineglass,.ion-woman,.ion-wrench,.ion-xbox,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios7-reloading,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-looping,.ion-refreshing,.ion-spin{-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.ion-loading-a{-webkit-animation-timing-function:steps(8,start);-moz-animation-timing-function:steps(8,start);animation-timing-function:steps(8,start)}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-contact:before{content:"\f2c6"}.ion-android-alarm:before{content:"\f2c8"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down-left:before{content:"\f2cb"}.ion-android-arrow-down-right:before{content:"\f2cc"}.ion-android-arrow-up-left:before{content:"\f2cd"}.ion-android-arrow-up-right:before{content:"\f2ce"}.ion-android-battery:before{content:"\f2cf"}.ion-android-book:before{content:"\f2d0"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkmark:before{content:"\f2d5"}.ion-android-clock:before{content:"\f2d6"}.ion-android-close:before{content:"\f2d7"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-data:before{content:"\f2da"}.ion-android-developer:before{content:"\f2db"}.ion-android-display:before{content:"\f2dc"}.ion-android-download:before{content:"\f2dd"}.ion-android-dropdown:before{content:"\f2de"}.ion-android-earth:before{content:"\f2df"}.ion-android-folder:before{content:"\f2e0"}.ion-android-forums:before{content:"\f2e1"}.ion-android-friends:before{content:"\f2e2"}.ion-android-hand:before{content:"\f2e3"}.ion-android-image:before{content:"\f2e4"}.ion-android-inbox:before{content:"\f2e5"}.ion-android-information:before{content:"\f2e6"}.ion-android-keypad:before{content:"\f2e7"}.ion-android-lightbulb:before{content:"\f2e8"}.ion-android-locate:before{content:"\f2e9"}.ion-android-location:before{content:"\f2ea"}.ion-android-mail:before{content:"\f2eb"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-mixer:before{content:"\f2ed"}.ion-android-more:before{content:"\f2ee"}.ion-android-note:before{content:"\f2ef"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-printer:before{content:"\f2f1"}.ion-android-promotion:before{content:"\f2f2"}.ion-android-reminder:before{content:"\f2f3"}.ion-android-remove:before{content:"\f2f4"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-social:before{content:"\f2fa"}.ion-android-social-user:before{content:"\f2f9"}.ion-android-sort:before{content:"\f2fb"}.ion-android-star:before{content:"\f2fc"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-storage:before{content:"\f2fe"}.ion-android-system-back:before{content:"\f2ff"}.ion-android-system-home:before{content:"\f300"}.ion-android-system-windows:before{content:"\f301"}.ion-android-timer:before{content:"\f302"}.ion-android-trash:before{content:"\f303"}.ion-android-volume:before{content:"\f304"}.ion-android-wifi:before{content:"\f305"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-at:before{content:"\f10f"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bookmark:before{content:"\f26b"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-flag:before{content:"\f279"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-flask:before{content:"\f138"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-game-controller-a:before{content:"\f13b"}.ion-game-controller-b:before{content:"\f13c"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-icon-social-google-plus:before{content:"\f146"}.ion-icon-social-google-plus-outline:before{content:"\f145"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios7-alarm:before{content:"\f14d"}.ion-ios7-alarm-outline:before{content:"\f14c"}.ion-ios7-albums:before{content:"\f14f"}.ion-ios7-albums-outline:before{content:"\f14e"}.ion-ios7-arrow-back:before{content:"\f150"}.ion-ios7-arrow-down:before{content:"\f151"}.ion-ios7-arrow-forward:before{content:"\f152"}.ion-ios7-arrow-left:before{content:"\f153"}.ion-ios7-arrow-right:before{content:"\f154"}.ion-ios7-arrow-thin-down:before{content:"\f27e"}.ion-ios7-arrow-thin-left:before{content:"\f27f"}.ion-ios7-arrow-thin-right:before{content:"\f280"}.ion-ios7-arrow-thin-up:before{content:"\f281"}.ion-ios7-arrow-up:before{content:"\f155"}.ion-ios7-at:before{content:"\f157"}.ion-ios7-at-outline:before{content:"\f156"}.ion-ios7-bell:before{content:"\f159"}.ion-ios7-bell-outline:before{content:"\f158"}.ion-ios7-bolt:before{content:"\f15b"}.ion-ios7-bolt-outline:before{content:"\f15a"}.ion-ios7-bookmarks:before{content:"\f15d"}.ion-ios7-bookmarks-outline:before{content:"\f15c"}.ion-ios7-box:before{content:"\f15f"}.ion-ios7-box-outline:before{content:"\f15e"}.ion-ios7-briefcase:before{content:"\f283"}.ion-ios7-briefcase-outline:before{content:"\f282"}.ion-ios7-browsers:before{content:"\f161"}.ion-ios7-browsers-outline:before{content:"\f160"}.ion-ios7-calculator:before{content:"\f285"}.ion-ios7-calculator-outline:before{content:"\f284"}.ion-ios7-calendar:before{content:"\f163"}.ion-ios7-calendar-outline:before{content:"\f162"}.ion-ios7-camera:before{content:"\f165"}.ion-ios7-camera-outline:before{content:"\f164"}.ion-ios7-cart:before{content:"\f167"}.ion-ios7-cart-outline:before{content:"\f166"}.ion-ios7-chatboxes:before{content:"\f169"}.ion-ios7-chatboxes-outline:before{content:"\f168"}.ion-ios7-chatbubble:before{content:"\f16b"}.ion-ios7-chatbubble-outline:before{content:"\f16a"}.ion-ios7-checkmark:before{content:"\f16e"}.ion-ios7-checkmark-empty:before{content:"\f16c"}.ion-ios7-checkmark-outline:before{content:"\f16d"}.ion-ios7-circle-filled:before{content:"\f16f"}.ion-ios7-circle-outline:before{content:"\f170"}.ion-ios7-clock:before{content:"\f172"}.ion-ios7-clock-outline:before{content:"\f171"}.ion-ios7-close:before{content:"\f2bc"}.ion-ios7-close-empty:before{content:"\f2bd"}.ion-ios7-close-outline:before{content:"\f2bb"}.ion-ios7-cloud:before{content:"\f178"}.ion-ios7-cloud-download:before{content:"\f174"}.ion-ios7-cloud-download-outline:before{content:"\f173"}.ion-ios7-cloud-outline:before{content:"\f175"}.ion-ios7-cloud-upload:before{content:"\f177"}.ion-ios7-cloud-upload-outline:before{content:"\f176"}.ion-ios7-cloudy:before{content:"\f17a"}.ion-ios7-cloudy-night:before{content:"\f308"}.ion-ios7-cloudy-night-outline:before{content:"\f307"}.ion-ios7-cloudy-outline:before{content:"\f179"}.ion-ios7-cog:before{content:"\f17c"}.ion-ios7-cog-outline:before{content:"\f17b"}.ion-ios7-compose:before{content:"\f17e"}.ion-ios7-compose-outline:before{content:"\f17d"}.ion-ios7-contact:before{content:"\f180"}.ion-ios7-contact-outline:before{content:"\f17f"}.ion-ios7-copy:before{content:"\f182"}.ion-ios7-copy-outline:before{content:"\f181"}.ion-ios7-download:before{content:"\f184"}.ion-ios7-download-outline:before{content:"\f183"}.ion-ios7-drag:before{content:"\f185"}.ion-ios7-email:before{content:"\f187"}.ion-ios7-email-outline:before{content:"\f186"}.ion-ios7-eye:before{content:"\f189"}.ion-ios7-eye-outline:before{content:"\f188"}.ion-ios7-fastforward:before{content:"\f18b"}.ion-ios7-fastforward-outline:before{content:"\f18a"}.ion-ios7-filing:before{content:"\f18d"}.ion-ios7-filing-outline:before{content:"\f18c"}.ion-ios7-film:before{content:"\f18f"}.ion-ios7-film-outline:before{content:"\f18e"}.ion-ios7-flag:before{content:"\f191"}.ion-ios7-flag-outline:before{content:"\f190"}.ion-ios7-folder:before{content:"\f193"}.ion-ios7-folder-outline:before{content:"\f192"}.ion-ios7-gear:before{content:"\f195"}.ion-ios7-gear-outline:before{content:"\f194"}.ion-ios7-glasses:before{content:"\f197"}.ion-ios7-glasses-outline:before{content:"\f196"}.ion-ios7-heart:before{content:"\f199"}.ion-ios7-heart-outline:before{content:"\f198"}.ion-ios7-help:before{content:"\f19c"}.ion-ios7-help-empty:before{content:"\f19a"}.ion-ios7-help-outline:before{content:"\f19b"}.ion-ios7-infinite:before{content:"\f19e"}.ion-ios7-infinite-outline:before{content:"\f19d"}.ion-ios7-information:before{content:"\f1a1"}.ion-ios7-information-empty:before{content:"\f19f"}.ion-ios7-information-outline:before{content:"\f1a0"}.ion-ios7-ionic-outline:before{content:"\f1a2"}.ion-ios7-keypad:before{content:"\f1a4"}.ion-ios7-keypad-outline:before{content:"\f1a3"}.ion-ios7-lightbulb:before{content:"\f287"}.ion-ios7-lightbulb-outline:before{content:"\f286"}.ion-ios7-location:before{content:"\f1a6"}.ion-ios7-location-outline:before{content:"\f1a5"}.ion-ios7-locked:before{content:"\f1a8"}.ion-ios7-locked-outline:before{content:"\f1a7"}.ion-ios7-medkit:before{content:"\f289"}.ion-ios7-medkit-outline:before{content:"\f288"}.ion-ios7-mic:before{content:"\f1ab"}.ion-ios7-mic-off:before{content:"\f1a9"}.ion-ios7-mic-outline:before{content:"\f1aa"}.ion-ios7-minus:before{content:"\f1ae"}.ion-ios7-minus-empty:before{content:"\f1ac"}.ion-ios7-minus-outline:before{content:"\f1ad"}.ion-ios7-monitor:before{content:"\f1b0"}.ion-ios7-monitor-outline:before{content:"\f1af"}.ion-ios7-moon:before{content:"\f1b2"}.ion-ios7-moon-outline:before{content:"\f1b1"}.ion-ios7-more:before{content:"\f1b4"}.ion-ios7-more-outline:before{content:"\f1b3"}.ion-ios7-musical-note:before{content:"\f1b5"}.ion-ios7-musical-notes:before{content:"\f1b6"}.ion-ios7-navigate:before{content:"\f1b8"}.ion-ios7-navigate-outline:before{content:"\f1b7"}.ion-ios7-paperplane:before{content:"\f1ba"}.ion-ios7-paperplane-outline:before{content:"\f1b9"}.ion-ios7-partlysunny:before{content:"\f1bc"}.ion-ios7-partlysunny-outline:before{content:"\f1bb"}.ion-ios7-pause:before{content:"\f1be"}.ion-ios7-pause-outline:before{content:"\f1bd"}.ion-ios7-people:before{content:"\f1c0"}.ion-ios7-people-outline:before{content:"\f1bf"}.ion-ios7-person:before{content:"\f1c2"}.ion-ios7-person-outline:before{content:"\f1c1"}.ion-ios7-personadd:before{content:"\f1c4"}.ion-ios7-personadd-outline:before{content:"\f1c3"}.ion-ios7-photos:before{content:"\f1c6"}.ion-ios7-photos-outline:before{content:"\f1c5"}.ion-ios7-pie:before{content:"\f28b"}.ion-ios7-pie-outline:before{content:"\f28a"}.ion-ios7-play:before{content:"\f1c8"}.ion-ios7-play-outline:before{content:"\f1c7"}.ion-ios7-plus:before{content:"\f1cb"}.ion-ios7-plus-empty:before{content:"\f1c9"}.ion-ios7-plus-outline:before{content:"\f1ca"}.ion-ios7-pricetag:before{content:"\f28d"}.ion-ios7-pricetag-outline:before{content:"\f28c"}.ion-ios7-printer:before{content:"\f1cd"}.ion-ios7-printer-outline:before{content:"\f1cc"}.ion-ios7-rainy:before{content:"\f1cf"}.ion-ios7-rainy-outline:before{content:"\f1ce"}.ion-ios7-recording:before{content:"\f1d1"}.ion-ios7-recording-outline:before{content:"\f1d0"}.ion-ios7-redo:before{content:"\f1d3"}.ion-ios7-redo-outline:before{content:"\f1d2"}.ion-ios7-refresh:before{content:"\f1d6"}.ion-ios7-refresh-empty:before{content:"\f1d4"}.ion-ios7-refresh-outline:before{content:"\f1d5"}.ion-ios7-reload:before,.ion-ios7-reloading:before{content:"\f28e"}.ion-ios7-rewind:before{content:"\f1d8"}.ion-ios7-rewind-outline:before{content:"\f1d7"}.ion-ios7-search:before{content:"\f1da"}.ion-ios7-search-strong:before{content:"\f1d9"}.ion-ios7-skipbackward:before{content:"\f1dc"}.ion-ios7-skipbackward-outline:before{content:"\f1db"}.ion-ios7-skipforward:before{content:"\f1de"}.ion-ios7-skipforward-outline:before{content:"\f1dd"}.ion-ios7-snowy:before{content:"\f309"}.ion-ios7-speedometer:before{content:"\f290"}.ion-ios7-speedometer-outline:before{content:"\f28f"}.ion-ios7-star:before{content:"\f1e0"}.ion-ios7-star-outline:before{content:"\f1df"}.ion-ios7-stopwatch:before{content:"\f1e2"}.ion-ios7-stopwatch-outline:before{content:"\f1e1"}.ion-ios7-sunny:before{content:"\f1e4"}.ion-ios7-sunny-outline:before{content:"\f1e3"}.ion-ios7-telephone:before{content:"\f1e6"}.ion-ios7-telephone-outline:before{content:"\f1e5"}.ion-ios7-thunderstorm:before{content:"\f1e8"}.ion-ios7-thunderstorm-outline:before{content:"\f1e7"}.ion-ios7-time:before{content:"\f292"}.ion-ios7-time-outline:before{content:"\f291"}.ion-ios7-timer:before{content:"\f1ea"}.ion-ios7-timer-outline:before{content:"\f1e9"}.ion-ios7-trash:before{content:"\f1ec"}.ion-ios7-trash-outline:before{content:"\f1eb"}.ion-ios7-undo:before{content:"\f1ee"}.ion-ios7-undo-outline:before{content:"\f1ed"}.ion-ios7-unlocked:before{content:"\f1f0"}.ion-ios7-unlocked-outline:before{content:"\f1ef"}.ion-ios7-upload:before{content:"\f1f2"}.ion-ios7-upload-outline:before{content:"\f1f1"}.ion-ios7-videocam:before{content:"\f1f4"}.ion-ios7-videocam-outline:before{content:"\f1f3"}.ion-ios7-volume-high:before{content:"\f1f5"}.ion-ios7-volume-low:before{content:"\f1f6"}.ion-ios7-wineglass:before{content:"\f294"}.ion-ios7-wineglass-outline:before{content:"\f293"}.ion-ios7-world:before{content:"\f1f8"}.ion-ios7-world-outline:before{content:"\f1f7"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before,.ion-loading-a:before{content:"\f29a"}.ion-load-b:before,.ion-loading-b:before{content:"\f29b"}.ion-load-c:before,.ion-loading-c:before{content:"\f29c"}.ion-load-d:before,.ion-loading-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before,.ion-looping:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before,.ion-refreshing:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-umbrella:before{content:"\f2b7"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a:active,a:focus,a:hover,button:focus{outline:0}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}img{-webkit-user-drag:none}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-backface-visibility:hidden;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-user-drag:none}.content:after,.content:before{display:block;overflow:hidden;height:0;content:"\00a0"}.content{position:absolute;width:100%;height:100%}.scroll-content{top:0;right:0;bottom:0;left:0;position:absolute;overflow:hidden;-webkit-backface-visibility:hidden;margin-top:-1px;width:auto;height:auto}.scroll-view{overflow:hidden;position:relative;-webkit-backface-visibility:hidden;margin-top:-1px}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);transform:translateZ(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;transform-origin:left top;-webkit-backface-visibility:hidden}.scroll-bar{position:absolute;z-index:9999}.scroll-bar-h{height:3px;left:2px;right:2px;bottom:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{width:3px;bottom:2px;top:2px;right:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;background:rgba(0,0,0,.3);border-radius:4px;opacity:1}.scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:opacity .3s linear;-moz-transition:opacity .3s linear;transition:opacity .3s linear;opacity:0}.scroll-refresher{overflow:hidden;margin-top:-60px;height:60px;position:relative}.scroll-refresher .icon-refreshing{display:none;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;animation-duration:1.5s}.ionic-refresher-content,.scroll-refresher-content{position:absolute;left:0;bottom:15px;width:100%;text-align:center;font-size:30px;color:#666}.ionic-refresher-content .icon-pulling{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}@keyframes refresh-spin{0%{transform:rotate(0)}100%{transform:rotate(-180deg)}}@-webkit-keyframes refresh-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(-180deg)}}.scroll-refresher.active .icon-pulling{display:block}.scroll-refresher.active .icon-refreshing,.scroll-refresher.active.refreshing .icon-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing{display:block}.scroll-refresher.active .ionic-refresher-content .icon-pulling{-webkit-animation-name:refresh-spin;-moz-animation-name:refresh-spin;animation-name:refresh-spin}infinite-scroll .scroll-infinite{overflow:hidden;margin-top:-70px;height:60px;position:relative}.scroll-infinite-content{position:absolute;left:0;bottom:15px;width:100%;text-align:center;font-size:30px;color:#666}infinite-scroll.active .scroll-infinite{margin-top:-30px}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.overflow-scroll .scroll{position:static;height:100%}.has-header{top:44px}.has-subheader{top:88px}.has-footer{bottom:44px}.has-tabs{bottom:49px}.pane{position:fixed;z-index:1}.view{position:absolute;z-index:1}.pane,.view{top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.1}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}@-webkit-keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@-webkit-keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}@keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}.action-sheet-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:rgba(0,0,0,0)}.action-sheet-backdrop.active{-webkit-animation:fadeInHalf .3s;-moz-animation:fadeInHalf .3s;animation:fadeInHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.action-sheet-backdrop.active-remove{-webkit-animation:fadeOutHalf .3s;-moz-animation:fadeOutHalf .3s;animation:fadeOutHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;background-color:rgba(0,0,0,.5)}@-webkit-keyframes actionSheetUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes actionSheetOut{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}.action-sheet-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.action-sheet-up .ng-enter,.action-sheet-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);opacity:0}.action-sheet-up .ng-enter-active,.action-sheet-up.ng-enter-active{-webkit-animation-name:actionSheetUp;-moz-animation-name:actionSheetUp;animation-name:actionSheetUp}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1)}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave-active{-webkit-animation-name:actionSheetOut;-moz-animation-name:actionSheetOut;animation-name:actionSheetOut}.action-sheet{position:fixed;bottom:0;left:15px;z-index:10;overflow:hidden;width:calc(100% - 30px)}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;background-color:transparent;color:#4a87ee;font-size:18px}.action-sheet .button.destructive{color:#ef4e3a}.action-sheet-title{padding:10px;color:#666;text-align:center;font-size:12px}.action-sheet-group{margin-bottom:5px;border-radius:3px;background-color:#fff}.action-sheet-group .button{border-width:1px 0 0;border-radius:0}.action-sheet-group .button.active,.action-sheet-group .button:active{background-color:transparent;color:inherit}.action-sheet-group .button:first-child:last-child{border-width:0}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:10;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:0;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:0;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;height:28px}.bar.bar-light{background-color:#fff;border-color:#ddd;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-stable{background-color:#f8f8f8;border-color:#b2b2b2;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-positive{background-color:#4a87ee;border-color:#145dd7;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-calm{background-color:#43cee6;border-color:#1aaac3;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-assertive{background-color:#ef4e3a;border-color:#cc2511;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-balanced{background-color:#6c3;border-color:#478f24;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-energized{background-color:#f0b840;border-color:#d39511;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-royal{background-color:#8a6de9;border-color:#552bdf;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-dark{background-color:#444;border-color:#111;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar .title{position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:18px;line-height:42px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-size:12px;line-height:30px}.bar .button .icon,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before{padding-right:2px;padding-left:2px;font-size:24px;line-height:30px}.bar .button.button-icon .icon,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon.icon:before{line-height:32px}.bar .button.button-clear{font-size:18px;padding-right:2px;padding-left:2px}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:30px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:6px;right:5px;bottom:5px}.bar-light .button{color:#444;background-color:#fff;border-color:#ddd}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.active,.bar-light .button:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.bar-light .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-light .button.button-icon{background:0 0;border-color:transparent}.bar-stable .button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.active,.bar-stable .button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.bar-stable .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-stable .button.button-icon{background:0 0;border-color:transparent}.bar-positive .button{color:#fff;background-color:#4a87ee;border-color:#145dd7}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.active,.bar-positive .button:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.bar-positive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-positive .button.button-icon{background:0 0;border-color:transparent}.bar-calm .button{color:#fff;background-color:#43cee6;border-color:#1aaac3}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.active,.bar-calm .button:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.bar-calm .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-calm .button.button-icon{background:0 0;border-color:transparent}.bar-assertive .button{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.active,.bar-assertive .button:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.bar-assertive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-assertive .button.button-icon{background:0 0;border-color:transparent}.bar-balanced .button{color:#fff;background-color:#6c3;border-color:#478f24}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.active,.bar-balanced .button:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.bar-balanced .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-balanced .button.button-icon{background:0 0;border-color:transparent}.bar-energized .button{color:#fff;background-color:#f0b840;border-color:#d39511}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.active,.bar-energized .button:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.bar-energized .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-energized .button.button-icon{background:0 0;border-color:transparent}.bar-royal .button{color:#fff;background-color:#8a6de9;border-color:#552bdf}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.active,.bar-royal .button:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.bar-royal .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-royal .button.button-icon{background:0 0;border-color:transparent}.bar-dark .button{color:#fff;background-color:#444;border-color:#111}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.active,.bar-dark .button:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.bar-dark .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-dark .button.button-icon{background:0 0;border-color:transparent}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block}.bar-subfooter{bottom:44px;display:block}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs.tabs-light{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd;color:#444}.tabs.tabs-stable{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444}.tabs.tabs-positive{background-color:#4a87ee;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);border-color:#145dd7;color:#fff}.tabs.tabs-calm{background-color:#43cee6;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);border-color:#1aaac3;color:#fff}.tabs.tabs-assertive{background-color:#ef4e3a;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);border-color:#cc2511;color:#fff}.tabs.tabs-balanced{background-color:#6c3;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);border-color:#478f24;color:#fff}.tabs.tabs-energized{background-color:#f0b840;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);border-color:#d39511;color:#fff}.tabs.tabs-royal{background-color:#8a6de9;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);border-color:#552bdf;color:#fff}.tabs.tabs-dark{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111;color:#fff}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:0!important;border-bottom:0!important;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-top{top:44px}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"Helvetica Neue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;opacity:.7}.tabs-icon-bottom .tab-item,.tabs-icon-top .tab-item{font-size:12px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left .tab-item,.tabs-icon-right .tab-item{font-size:12px}.tabs-icon-left .tab-item .icon,.tabs-icon-right .tab-item .icon{display:inline-block;vertical-align:top;font-size:24px;line-height:49px}.tabs-icon-only .icon{line-height:inherit}.tab-item.active,.tab-item:active{opacity:1}.tab-item.active.tab-item-light,.tab-item:active.tab-item-light{color:#fff}.tab-item.active.tab-item-stable,.tab-item:active.tab-item-stable{color:#f8f8f8}.tab-item.active.tab-item-positive,.tab-item:active.tab-item-positive{color:#4a87ee}.tab-item.active.tab-item-calm,.tab-item:active.tab-item-calm{color:#43cee6}.tab-item.active.tab-item-assertive,.tab-item:active.tab-item-assertive{color:#ef4e3a}.tab-item.active.tab-item-balanced,.tab-item:active.tab-item-balanced{color:#6c3}.tab-item.active.tab-item-energized,.tab-item:active.tab-item-energized{color:#f0b840}.tab-item.active.tab-item-royal,.tab-item:active.tab-item-royal{color:#8a6de9}.tab-item.active.tab-item-dark,.tab-item:active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon{position:relative}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu-content{box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-left{left:0}.menu-right{right:0}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;-moz-transition:-moz-transform 200ms ease;transition:transform 200ms ease}.modal{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);position:fixed;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff;opacity:0}.modal.active{height:100%}.popup{position:fixed}.popup-content{padding:10px}.loading-backdrop{-webkit-transition:visibility 0s linear .3s;-moz-transition:visibility 0s linear .3s;transition:visibility 0s linear .3s;position:fixed;top:0;left:0;visibility:hidden;width:100%;height:100%}.loading-backdrop.enabled{background-color:rgba(0,0,0,.7)}.loading-backdrop.active{-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s;visibility:visible}.loading{position:fixed;top:50%;left:50%;padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading h1,.loading h2,.loading h3,.loading h4,.loading h5,.loading h6{color:#fff}.item{color:#444;background-color:#fff;border-color:#ddd;-webkit-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;-moz-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;position:relative;z-index:2;display:block;margin:-1px;padding:15px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 4px;font-size:16px}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{float:right}.item .badge+.badge{margin-right:5px}.item.item-light{color:#444;background-color:#fff;border-color:#ddd}.item.item-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.item.item-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.item.item-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.item.item-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.item.item-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.item.item-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.item.item-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.item.item-dark{color:#fff;background-color:#444;border-color:#111}.ionic-pseudo a.item:active,.ionic-pseudo button.item:active,a.item.active,button.item.active{background-color:#d9d9d9;border-color:#ccc}.ionic-pseudo a.item.item-light:active,.ionic-pseudo button.item.item-light:active,a.item.item-light.active,button.item.item-light.active{background-color:#fafafa;border-color:#ccc}.ionic-pseudo a.item.item-stable:active,.ionic-pseudo button.item.item-stable:active,a.item.item-stable.active,button.item.item-stable.active{background-color:#e5e5e5;border-color:#a2a2a2}.ionic-pseudo a.item.item-positive:active,.ionic-pseudo button.item.item-positive:active,a.item.item-positive.active,button.item.item-positive.active{background-color:#145dd7;border-color:#145dd7}.ionic-pseudo a.item.item-calm:active,.ionic-pseudo button.item.item-calm:active,a.item.item-calm.active,button.item.item-calm.active{background-color:#1aaac3;border-color:#1aaac3}.ionic-pseudo a.item.item-assertive:active,.ionic-pseudo button.item.item-assertive:active,a.item.item-assertive.active,button.item.item-assertive.active{background-color:#cc2511;border-color:#cc2511}.ionic-pseudo a.item.item-balanced:active,.ionic-pseudo button.item.item-balanced:active,a.item.item-balanced.active,button.item.item-balanced.active{background-color:#478f24;border-color:#478f24}.ionic-pseudo a.item.item-energized:active,.ionic-pseudo button.item.item-energized:active,a.item.item-energized.active,button.item.item-energized.active{background-color:#d39511;border-color:#d39511}.ionic-pseudo a.item.item-royal:active,.ionic-pseudo button.item.item-royal:active,a.item.item-royal.active,button.item.item-royal.active{background-color:#552bdf;border-color:#552bdf}.ionic-pseudo a.item.item-dark:active,.ionic-pseudo button.item.item-dark:active,a.item.item-dark.active,button.item.item-dark.active{background-color:#262626;border-color:#000}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;transition:all .1s ease-in-out;position:relative;z-index:2;padding:15px 40px 15px 15px;border:0;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap .item-content,.item-text-wrap,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:hidden;white-space:normal}.item-complex.item-text-wrap,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p{overflow:hidden;white-space:nowrap}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:28px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:45px}.item-icon-left .icon{left:7.5px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:45px}.item-icon-right{padding-right:45px}.item-icon-right .icon{right:7.5px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:45px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-button-left{padding-left:67.5px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;left:7.5px;min-width:initial;min-height:32px;font-size:32px}.item-button-left .item-content>.button .icon,.item-button-left>.button .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:75px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;right:15px;min-width:initial;min-height:32px;font-size:32px}.item-button-right .item-content>.button .icon,.item-button-right .item-content>.buttons .icon,.item-button-right>.button .icon,.item-button-right>.buttons .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-height:32px;font-size:32px}a.item,button.item{padding-right:40px}a.item:after,button.item:after{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;position:absolute;top:0;right:11px;height:100%;color:#ccc;content:"\f125";text-transform:none;font-weight:400;font-style:normal;font-variant:normal;font-size:16px;font-family:Ionicons;line-height:1;speak:none}a.item-button-right:after,a.item-icon-right:after,button.item-button-right:after,button.item-icon-right:after{display:none}.item-avatar{padding-left:70px;min-height:70px}.item-avatar .item-img,.item-avatar img:first-child{position:absolute;top:15px;left:15px;max-width:40px;max-height:40px;width:100%;border-radius:4px}.item-thumbnail-left{padding-left:105px;min-height:100px}.item-thumbnail-left>.item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%}.item-thumbnail-right{padding-right:105px;min-height:100px}.item-thumbnail-right>.item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:15px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:15px;margin-bottom:15px}.item-divider{padding-top:7.5px;padding-bottom:7.5px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:700}.item-note{float:right;color:#aaa;font-size:14px}.item-reordering{position:absolute;z-index:20;width:100%}.item-placeholder{opacity:.7}.item-edit{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;position:absolute;top:0;left:8px;z-index:0;width:48px;height:100%;line-height:100%}.item-edit .button{height:100%}.item-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:0;height:100%;color:#ef4e3a;font-size:24px}.item-edit.ng-enter{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:-48px;opacity:0}.item-edit.ng-enter-active{left:8px;opacity:1}.item-edit.ng-leave{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:0;opacity:1}.item-edit.ng-leave-active{left:-48px;opacity:0}.item-drag{position:absolute;top:0;right:0;z-index:0;width:50px;height:100%;background:inherit}.item-drag .button{min-width:42px;height:100%}.item-drag .button.icon:before{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:0;border-radius:0}.item-options-hide .item-options{display:none}.list{position:relative;margin-bottom:20px;padding-top:1px;padding-bottom:1px;padding-left:0}.list-editing .item-content{-webkit-transform:translate3d(50px,0,0);-moz-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.list-reordering .item-content{margin-right:50px}.list-reordering .item-drag{z-index:1}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.nav-page{position:absolute;width:100%;height:100%;background-color:#fff}.badge{background-color:transparent;color:#aaa;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive{background-color:#4a87ee;color:#fff}.badge.badge-calm{background-color:#43cee6;color:#fff}.badge.badge-assertive{background-color:#ef4e3a;color:#fff}.badge.badge-balanced{background-color:#6c3;color:#fff}.badge.badge-energized{background-color:#f0b840;color:#fff}.badge.badge-royal{background-color:#8a6de9;color:#fff}.badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;overflow:hidden;visibility:hidden}.slider-slides{position:relative;height:100%}.slider-slide{display:block;position:relative;width:100%;height:100%;float:left;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;width:100%;text-align:center;z-index:1}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{opacity:1;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;transition:opacity .4s ease-in}.split-pane{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch;width:100%;height:100%}.split-pane-menu{-webkit-box-flex:0;-webkit-flex:0 0 320px;-moz-box-flex:0;-moz-flex:0 0 320px;-ms-flex:0 0 320px;flex:0 0 320px;overflow-y:auto;width:320px;height:100%;border-right:1px solid #eee}@media all and (max-width:568px){.split-pane-menu{border-right:0}}.split-pane-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;-moz-box-flex:1;-moz-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:1.42857}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 8px 5px}.item-input input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.ionic-pseudo .item-input.item:active,.item-input.item.active{border-color:#ddd;background-color:transparent}.item-input .button-bar{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:inherit;line-height:18px}.item-input-wrapper~.button{margin-left:10px}.input-label{-webkit-box-flex:1;-webkit-flex:1 0 100px;-moz-box-flex:1;-moz-flex:1 0 100px;-ms-flex:1 0 100px;flex:1 0 100px;padding:7px 10px 7px 3px;max-width:200px;color:#444;font-weight:700}.placeholder-icon{color:#aaa}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;overflow:hidden;padding:4px 8px 3px;border:0;background-color:#fff}.item-stacked-label input{height:46px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:20px}input,textarea{width:100%}textarea{height:auto}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}select[multiple],select[size]{height:auto}input[type=file],select{line-height:34px}select{border:1px solid #ddd;background-color:#fff}input:-moz-placeholder,textarea:-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{background-color:#f8f8f8;cursor:not-allowed}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox input{position:relative;width:28px;height:28px;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before{display:table;width:100%;height:100%;border:1px solid #4a87ee;border-radius:50%;background:#fff;content:' ';transition:background-color .1s ease-in-out}.checkbox input:after{-webkit-transition:opacity .05s ease-in-out;-moz-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:34%;left:26%;display:table;width:14px;height:10.33333px;border:3px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox input:checked:before{border:0;background:#4a87ee}.checkbox input:checked:after{opacity:1}.item-checkbox{padding-left:58px}.item-checkbox.active,.item-checkbox:active{box-shadow:none}.item-checkbox .checkbox{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:7.5px;z-index:3;height:100%}.toggle{position:relative;display:inline-block}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.1s;-moz-transition-duration:.1s;transition-duration:.1s;-webkit-transition-property:background-color,border;-moz-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:solid 2px #e5e5e5;border-radius:20px;background-color:#e5e5e5;content:' ';cursor:pointer}.toggle .handle{-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;transition:.1s ease-in-out;position:absolute;top:2px;left:2px;display:block;width:28px;height:28px;border-radius:50%;background-color:#fff}.toggle .handle:before{position:absolute;top:-4px;left:-22px;padding:19px 35px;content:" "}.toggle input:checked+.track{border-color:#4a87ee;background-color:#4a87ee}.toggle input:checked+.track .handle{-webkit-transform:translate3d(22px,0,0);-moz-transform:translate3d(22px,0,0);transform:translate3d(22px,0,0);background-color:#fff}.item-toggle{padding-right:99px}.item-toggle.active,.item-toggle:active{box-shadow:none}.item-toggle .toggle{position:absolute;top:7.5px;right:15px;z-index:3}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:60px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:13px;height:100%;font-size:24px}.item-radio input{display:none}.item-radio input:checked~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}input[type=range]{display:inline-block;overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:35px;outline:0;background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 4px;background-repeat:no-repeat;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb{position:relative;width:20px;height:20px;border-radius:10px;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.5),1px 3px 5px rgba(0,0,0,.25);cursor:pointer;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb:before{position:absolute;top:8px;left:-2001px;width:2000px;height:4px;background:#444;content:' '}input[type=range]::-webkit-slider-thumb:after{position:absolute;top:-20px;left:-20px;padding:30px;content:' '}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 4px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#4a87ee}.range.range-calm input::-webkit-slider-thumb:before{background:#43cee6}.range.range-balanced input::-webkit-slider-thumb:before{background:#6c3}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef4e3a}.range.range-energized input::-webkit-slider-thumb:before{background:#f0b840}.range.range-royal input::-webkit-slider-thumb:before{background:#8a6de9}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px;width:100%}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2;position:relative;display:inline-block;margin:0;padding:1px 12px 0;min-width:52px;min-height:42px;border-width:1px;border-style:solid;border-radius:2px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:41px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.active,.button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button .icon,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:40px}.button.icon-left:before{padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{color:#444;background-color:#fff;border-color:#ddd}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.active,.button.button-light:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.button.button-light.button-clear{color:#ddd;background:0 0;border-color:transparent;box-shadow:none}.button.button-light.button-icon{background:0 0;border-color:transparent}.button.button-light.button-outline{background:0 0;border-color:#ddd;color:#ddd}.button.button-light.button-outline.active,.button.button-light.button-outline:active{background-color:#ddd;color:#fff;box-shadow:none}.button.button-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.active,.button.button-stable:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button.button-stable.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button.button-stable.button-icon{background:0 0;border-color:transparent}.button.button-stable.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button.button-stable.button-outline.active,.button.button-stable.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.button.button-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.active,.button.button-positive:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.button.button-positive.button-clear{color:#4a87ee;background:0 0;border-color:transparent;box-shadow:none}.button.button-positive.button-icon{background:0 0;border-color:transparent}.button.button-positive.button-outline{background:0 0;border-color:#4a87ee;color:#4a87ee}.button.button-positive.button-outline.active,.button.button-positive.button-outline:active{background-color:#4a87ee;color:#fff;box-shadow:none}.button.button-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.active,.button.button-calm:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.button.button-calm.button-clear{color:#43cee6;background:0 0;border-color:transparent;box-shadow:none}.button.button-calm.button-icon{background:0 0;border-color:transparent}.button.button-calm.button-outline{background:0 0;border-color:#43cee6;color:#43cee6}.button.button-calm.button-outline.active,.button.button-calm.button-outline:active{background-color:#43cee6;color:#fff;box-shadow:none}.button.button-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.active,.button.button-assertive:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.button.button-assertive.button-clear{color:#ef4e3a;background:0 0;border-color:transparent;box-shadow:none}.button.button-assertive.button-icon{background:0 0;border-color:transparent}.button.button-assertive.button-outline{background:0 0;border-color:#ef4e3a;color:#ef4e3a}.button.button-assertive.button-outline.active,.button.button-assertive.button-outline:active{background-color:#ef4e3a;color:#fff;box-shadow:none}.button.button-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.active,.button.button-balanced:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.button.button-balanced.button-clear{color:#6c3;background:0 0;border-color:transparent;box-shadow:none}.button.button-balanced.button-icon{background:0 0;border-color:transparent}.button.button-balanced.button-outline{background:0 0;border-color:#6c3;color:#6c3}.button.button-balanced.button-outline.active,.button.button-balanced.button-outline:active{background-color:#6c3;color:#fff;box-shadow:none}.button.button-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.active,.button.button-energized:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.button.button-energized.button-clear{color:#f0b840;background:0 0;border-color:transparent;box-shadow:none}.button.button-energized.button-icon{background:0 0;border-color:transparent}.button.button-energized.button-outline{background:0 0;border-color:#f0b840;color:#f0b840}.button.button-energized.button-outline.active,.button.button-energized.button-outline:active{background-color:#f0b840;color:#fff;box-shadow:none}.button.button-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.active,.button.button-royal:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.button.button-royal.button-clear{color:#8a6de9;background:0 0;border-color:transparent;box-shadow:none}.button.button-royal.button-icon{background:0 0;border-color:transparent}.button.button-royal.button-outline{background:0 0;border-color:#8a6de9;color:#8a6de9}.button.button-royal.button-outline.active,.button.button-royal.button-outline:active{background-color:#8a6de9;color:#fff;box-shadow:none}.button.button-dark{color:#fff;background-color:#444;border-color:#111}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.active,.button.button-dark:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.button.button-dark.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none}.button.button-dark.button-icon{background:0 0;border-color:transparent}.button.button-dark.button-outline{background:0 0;border-color:#444;color:#444}.button.button-dark.button-outline.active,.button.button-dark.button-outline:active{background-color:#444;color:#fff;box-shadow:none}.button-small{padding:0 4px;min-width:28px;min-height:28px;font-size:12px;line-height:27px}.button-small .icon,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:26px}.button-large{padding:0 16px;min-width:66px;min-height:54px;font-size:18px;line-height:53px}.button-large .icon,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.active,.button-icon.button:active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button-clear.button-icon{background:0 0;border-color:transparent}.button-clear.active,.button-clear:active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button-outline.button-outline.active,.button-outline.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full{width:100%}a.button{text-decoration:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto;*zoom:1}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button:first-child{border-radius:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromLeft{from{-moz-transform:translateX(-100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromLeft{from{transform:translateX(-100%)}to{transform:translateX(0)}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromRight{from{-moz-transform:translateX(100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromRight{from{transform:translateX(100%)}to{transform:translateX(0)}}@-webkit-keyframes slideOutToLeft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0)}}@-moz-keyframes slideOutToLeft{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(-100%)}}@keyframes slideOutToLeft{from{transform:translateX(0)}to{transform:translateX(-100%)}}@-webkit-keyframes slideOutToRight{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0)}}@-moz-keyframes slideOutToRight{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(100%)}}@keyframes slideOutToRight{from{transform:translateX(0)}to{transform:translateX(100%)}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@keyframes spin{100%{transform:rotate(360deg)}}.no-animation.ng-enter,.no-animation.ng-leave,.no-animation>.ng-enter,.no-animation>.ng-leave{-webkit-transition:none;-moz-transition:none;transition:none}.noop-animation.ng-enter,.noop-animation.ng-leave,.noop-animation>.ng-enter,.noop-animation>.ng-leave{-webkit-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;-moz-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.ng-animate .pane{position:absolute}.slide-left-right.ng-enter,.slide-left-right.ng-leave,.slide-left-right>.ng-enter,.slide-left-right>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.ng-enter,.slide-left-right>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right.ng-enter.ng-enter-active,.slide-left-right>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.ng-leave.ng-leave-active,.slide-left-right>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse.ng-leave,.slide-left-right.reverse>.ng-enter,.slide-left-right.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter.ng-enter-active,.slide-left-right.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.reverse.ng-leave.ng-leave-active,.slide-left-right.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7.ng-leave,.slide-left-right-ios7>.ng-enter,.slide-left-right-ios7>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter.ng-enter-active,.slide-left-right-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.ng-leave.ng-leave-active,.slide-left-right-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-15%,0,0);-moz-transform:translate3d(-15%,0,0);transform:translate3d(-15%,0,0)}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse.ng-leave,.slide-left-right-ios7.reverse>.ng-enter,.slide-left-right-ios7.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right-ios7.reverse.ng-enter.ng-enter-active,.slide-left-right-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.reverse.ng-leave.ng-leave-active,.slide-left-right-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(15%,0,0);-moz-transform:translate3d(15%,0,0);transform:translate3d(15%,0,0)}.slide-in-left{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-left.ng-enter,.slide-in-left>.ng-enter{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left.ng-leave,.slide-in-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add-active{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft}.slide-out-left{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-out-left.ng-enter,.slide-out-left.ng-leave,.slide-out-left>.ng-enter,.slide-out-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add-active{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft}.slide-in-right{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-right.ng-enter,.slide-in-right.ng-leave,.slide-in-right>.ng-enter,.slide-in-right>.ng-leave{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add-active{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight}.slide-out-right{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-out-right.ng-enter,.slide-out-right.ng-leave,.slide-out-right>.ng-enter,.slide-out-right>.ng-leave{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add-active{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight}.slide-in-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.slide-in-up .ng-enter,.slide-in-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;opacity:0}.slide-in-up .ng-enter-active,.slide-in-up.ng-enter-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up .ng-leave,.slide-in-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up .ng-leave,.slide-in-up.ng-leave-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.slide-in-up-add{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up-add-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up-remove{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;animation-fill-mode:forwards}.slide-in-up-remove-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.fade-in{-webkit-animation:fadeOut .3s;-moz-animation:fadeOut .3s;animation:fadeOut .3s}.fade-in.active{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s}.fade-in-not-out .ng-enter,.fade-in-not-out.ng-enter{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s;position:relative}.fade-in-not-out .ng-leave,.fade-in-not-out.ng-leave{display:none}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7.ng-leave,.nav-title-slide-ios7>.ng-enter,.nav-title-slide-ios7>.ng-leave{-webkit-transition:all 350ms;-moz-transition:all 350ms;transition:all 350ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;opacity:1}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.nav-title-slide-ios7.ng-enter.ng-enter-active,.nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.ng-leave.ng-leave-active,.nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.reverse .nav-title-slide-ios7.ng-enter,.reverse .nav-title-slide-ios7.ng-leave,.reverse .nav-title-slide-ios7>.ng-enter,.reverse .nav-title-slide-ios7>.ng-leave{-webkit-transition:all 350ms;-moz-transition:all 350ms;transition:all 350ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;opacity:1}.reverse .nav-title-slide-ios7.ng-enter,.reverse .nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.reverse .nav-title-slide-ios7.ng-enter.ng-enter-active,.reverse .nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.reverse .nav-title-slide-ios7.ng-leave.ng-leave-active,.reverse .nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}.hidden,.hide{display:none}.show{display:block}.invisible{visibility:hidden}.inline{display:inline-block}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#4a87ee}.positive-bg{background-color:#4a87ee}.positive-border{border-color:#145dd7}.calm,a.calm{color:#43cee6}.calm-bg{background-color:#43cee6}.calm-border{border-color:#1aaac3}.assertive,a.assertive{color:#ef4e3a}.assertive-bg{background-color:#ef4e3a}.assertive-border{border-color:#cc2511}.balanced,a.balanced{color:#6c3}.balanced-bg{background-color:#6c3}.balanced-border{border-color:#478f24}.energized,a.energized{color:#f0b840}.energized-bg{background-color:#f0b840}.energized-border{border-color:#d39511}.royal,a.royal{color:#8a6de9}.royal-bg{background-color:#8a6de9}.royal-border{border-color:#552bdf}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}.platform-ios7 .bar-header{height:64px}.platform-ios7 .bar-header>*{margin-top:20px}.platform-ios7 .bar-subheader,.platform-ios7 .has-header{top:64px}.platform-ios7 .has-subheader{top:108px}.platform-android .bar-header{height:48px}.platform-android .bar-subheader,.platform-android .has-header{top:48px}.platform-android .has-subheader{top:96px}.platform-android .title{line-height:48px} \ No newline at end of file +*/@font-face{font-family:Ionicons;src:url(../fonts/ionicons.eot?v=1.4.0);src:url(../fonts/ionicons.eot?v=1.4.0#iefix) format("embedded-opentype"),url(../fonts/ionicons.ttf?v=1.4.0) format("truetype"),url(../fonts/ionicons.woff?v=1.4.0) format("woff"),url(../fonts/ionicons.svg?v=1.4.0#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert,.ion-alert-circled,.ion-android-add,.ion-android-add-contact,.ion-android-alarm,.ion-android-archive,.ion-android-arrow-back,.ion-android-arrow-down-left,.ion-android-arrow-down-right,.ion-android-arrow-up-left,.ion-android-arrow-up-right,.ion-android-battery,.ion-android-book,.ion-android-calendar,.ion-android-call,.ion-android-camera,.ion-android-chat,.ion-android-checkmark,.ion-android-clock,.ion-android-close,.ion-android-contact,.ion-android-contacts,.ion-android-data,.ion-android-developer,.ion-android-display,.ion-android-download,.ion-android-dropdown,.ion-android-earth,.ion-android-folder,.ion-android-forums,.ion-android-friends,.ion-android-hand,.ion-android-image,.ion-android-inbox,.ion-android-information,.ion-android-keypad,.ion-android-lightbulb,.ion-android-locate,.ion-android-location,.ion-android-mail,.ion-android-microphone,.ion-android-mixer,.ion-android-more,.ion-android-note,.ion-android-playstore,.ion-android-printer,.ion-android-promotion,.ion-android-reminder,.ion-android-remove,.ion-android-search,.ion-android-send,.ion-android-settings,.ion-android-share,.ion-android-social,.ion-android-social-user,.ion-android-sort,.ion-android-star,.ion-android-stopwatch,.ion-android-storage,.ion-android-system-back,.ion-android-system-home,.ion-android-system-windows,.ion-android-timer,.ion-android-trash,.ion-android-volume,.ion-android-wifi,.ion-archive,.ion-arrow-down-a,.ion-arrow-down-b,.ion-arrow-down-c,.ion-arrow-expand,.ion-arrow-graph-down-left,.ion-arrow-graph-down-right,.ion-arrow-graph-up-left,.ion-arrow-graph-up-right,.ion-arrow-left-a,.ion-arrow-left-b,.ion-arrow-left-c,.ion-arrow-move,.ion-arrow-resize,.ion-arrow-return-left,.ion-arrow-return-right,.ion-arrow-right-a,.ion-arrow-right-b,.ion-arrow-right-c,.ion-arrow-shrink,.ion-arrow-swap,.ion-arrow-up-a,.ion-arrow-up-b,.ion-arrow-up-c,.ion-at,.ion-bag,.ion-battery-charging,.ion-battery-empty,.ion-battery-full,.ion-battery-half,.ion-battery-low,.ion-beaker,.ion-beer,.ion-bluetooth,.ion-bookmark,.ion-briefcase,.ion-bug,.ion-calculator,.ion-calendar,.ion-camera,.ion-card,.ion-chatbox,.ion-chatbox-working,.ion-chatboxes,.ion-chatbubble,.ion-chatbubble-working,.ion-chatbubbles,.ion-checkmark,.ion-checkmark-circled,.ion-checkmark-round,.ion-chevron-down,.ion-chevron-left,.ion-chevron-right,.ion-chevron-up,.ion-clipboard,.ion-clock,.ion-close,.ion-close-circled,.ion-close-round,.ion-cloud,.ion-code,.ion-code-download,.ion-code-working,.ion-coffee,.ion-compass,.ion-compose,.ion-connection-bars,.ion-contrast,.ion-disc,.ion-document,.ion-document-text,.ion-drag,.ion-earth,.ion-edit,.ion-egg,.ion-eject,.ion-email,.ion-eye,.ion-eye-disabled,.ion-female,.ion-filing,.ion-film-marker,.ion-flag,.ion-flash,.ion-flash-off,.ion-flask,.ion-folder,.ion-fork,.ion-fork-repo,.ion-forward,.ion-game-controller-a,.ion-game-controller-b,.ion-gear-a,.ion-gear-b,.ion-grid,.ion-hammer,.ion-headphone,.ion-heart,.ion-help,.ion-help-buoy,.ion-help-circled,.ion-home,.ion-icecream,.ion-icon-social-google-plus,.ion-icon-social-google-plus-outline,.ion-image,.ion-images,.ion-information,.ion-information-circled,.ion-ionic,.ion-ios7-alarm,.ion-ios7-alarm-outline,.ion-ios7-albums,.ion-ios7-albums-outline,.ion-ios7-arrow-back,.ion-ios7-arrow-down,.ion-ios7-arrow-forward,.ion-ios7-arrow-left,.ion-ios7-arrow-right,.ion-ios7-arrow-thin-down,.ion-ios7-arrow-thin-left,.ion-ios7-arrow-thin-right,.ion-ios7-arrow-thin-up,.ion-ios7-arrow-up,.ion-ios7-at,.ion-ios7-at-outline,.ion-ios7-bell,.ion-ios7-bell-outline,.ion-ios7-bolt,.ion-ios7-bolt-outline,.ion-ios7-bookmarks,.ion-ios7-bookmarks-outline,.ion-ios7-box,.ion-ios7-box-outline,.ion-ios7-briefcase,.ion-ios7-briefcase-outline,.ion-ios7-browsers,.ion-ios7-browsers-outline,.ion-ios7-calculator,.ion-ios7-calculator-outline,.ion-ios7-calendar,.ion-ios7-calendar-outline,.ion-ios7-camera,.ion-ios7-camera-outline,.ion-ios7-cart,.ion-ios7-cart-outline,.ion-ios7-chatboxes,.ion-ios7-chatboxes-outline,.ion-ios7-chatbubble,.ion-ios7-chatbubble-outline,.ion-ios7-checkmark,.ion-ios7-checkmark-empty,.ion-ios7-checkmark-outline,.ion-ios7-circle-filled,.ion-ios7-circle-outline,.ion-ios7-clock,.ion-ios7-clock-outline,.ion-ios7-close,.ion-ios7-close-empty,.ion-ios7-close-outline,.ion-ios7-cloud,.ion-ios7-cloud-download,.ion-ios7-cloud-download-outline,.ion-ios7-cloud-outline,.ion-ios7-cloud-upload,.ion-ios7-cloud-upload-outline,.ion-ios7-cloudy,.ion-ios7-cloudy-night,.ion-ios7-cloudy-night-outline,.ion-ios7-cloudy-outline,.ion-ios7-cog,.ion-ios7-cog-outline,.ion-ios7-compose,.ion-ios7-compose-outline,.ion-ios7-contact,.ion-ios7-contact-outline,.ion-ios7-copy,.ion-ios7-copy-outline,.ion-ios7-download,.ion-ios7-download-outline,.ion-ios7-drag,.ion-ios7-email,.ion-ios7-email-outline,.ion-ios7-eye,.ion-ios7-eye-outline,.ion-ios7-fastforward,.ion-ios7-fastforward-outline,.ion-ios7-filing,.ion-ios7-filing-outline,.ion-ios7-film,.ion-ios7-film-outline,.ion-ios7-flag,.ion-ios7-flag-outline,.ion-ios7-folder,.ion-ios7-folder-outline,.ion-ios7-gear,.ion-ios7-gear-outline,.ion-ios7-glasses,.ion-ios7-glasses-outline,.ion-ios7-heart,.ion-ios7-heart-outline,.ion-ios7-help,.ion-ios7-help-empty,.ion-ios7-help-outline,.ion-ios7-infinite,.ion-ios7-infinite-outline,.ion-ios7-information,.ion-ios7-information-empty,.ion-ios7-information-outline,.ion-ios7-ionic-outline,.ion-ios7-keypad,.ion-ios7-keypad-outline,.ion-ios7-lightbulb,.ion-ios7-lightbulb-outline,.ion-ios7-location,.ion-ios7-location-outline,.ion-ios7-locked,.ion-ios7-locked-outline,.ion-ios7-medkit,.ion-ios7-medkit-outline,.ion-ios7-mic,.ion-ios7-mic-off,.ion-ios7-mic-outline,.ion-ios7-minus,.ion-ios7-minus-empty,.ion-ios7-minus-outline,.ion-ios7-monitor,.ion-ios7-monitor-outline,.ion-ios7-moon,.ion-ios7-moon-outline,.ion-ios7-more,.ion-ios7-more-outline,.ion-ios7-musical-note,.ion-ios7-musical-notes,.ion-ios7-navigate,.ion-ios7-navigate-outline,.ion-ios7-paperplane,.ion-ios7-paperplane-outline,.ion-ios7-partlysunny,.ion-ios7-partlysunny-outline,.ion-ios7-pause,.ion-ios7-pause-outline,.ion-ios7-people,.ion-ios7-people-outline,.ion-ios7-person,.ion-ios7-person-outline,.ion-ios7-personadd,.ion-ios7-personadd-outline,.ion-ios7-photos,.ion-ios7-photos-outline,.ion-ios7-pie,.ion-ios7-pie-outline,.ion-ios7-play,.ion-ios7-play-outline,.ion-ios7-plus,.ion-ios7-plus-empty,.ion-ios7-plus-outline,.ion-ios7-pricetag,.ion-ios7-pricetag-outline,.ion-ios7-printer,.ion-ios7-printer-outline,.ion-ios7-rainy,.ion-ios7-rainy-outline,.ion-ios7-recording,.ion-ios7-recording-outline,.ion-ios7-redo,.ion-ios7-redo-outline,.ion-ios7-refresh,.ion-ios7-refresh-empty,.ion-ios7-refresh-outline,.ion-ios7-reload,.ion-ios7-reloading,.ion-ios7-rewind,.ion-ios7-rewind-outline,.ion-ios7-search,.ion-ios7-search-strong,.ion-ios7-skipbackward,.ion-ios7-skipbackward-outline,.ion-ios7-skipforward,.ion-ios7-skipforward-outline,.ion-ios7-snowy,.ion-ios7-speedometer,.ion-ios7-speedometer-outline,.ion-ios7-star,.ion-ios7-star-outline,.ion-ios7-stopwatch,.ion-ios7-stopwatch-outline,.ion-ios7-sunny,.ion-ios7-sunny-outline,.ion-ios7-telephone,.ion-ios7-telephone-outline,.ion-ios7-thunderstorm,.ion-ios7-thunderstorm-outline,.ion-ios7-time,.ion-ios7-time-outline,.ion-ios7-timer,.ion-ios7-timer-outline,.ion-ios7-trash,.ion-ios7-trash-outline,.ion-ios7-undo,.ion-ios7-undo-outline,.ion-ios7-unlocked,.ion-ios7-unlocked-outline,.ion-ios7-upload,.ion-ios7-upload-outline,.ion-ios7-videocam,.ion-ios7-videocam-outline,.ion-ios7-volume-high,.ion-ios7-volume-low,.ion-ios7-wineglass,.ion-ios7-wineglass-outline,.ion-ios7-world,.ion-ios7-world-outline,.ion-ipad,.ion-iphone,.ion-ipod,.ion-jet,.ion-key,.ion-knife,.ion-laptop,.ion-leaf,.ion-levels,.ion-lightbulb,.ion-link,.ion-load-a,.ion-load-b,.ion-load-c,.ion-load-d,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-location,.ion-locked,.ion-log-in,.ion-log-out,.ion-loop,.ion-looping,.ion-magnet,.ion-male,.ion-man,.ion-map,.ion-medkit,.ion-mic-a,.ion-mic-b,.ion-mic-c,.ion-minus,.ion-minus-circled,.ion-minus-round,.ion-model-s,.ion-monitor,.ion-more,.ion-music-note,.ion-navicon,.ion-navicon-round,.ion-navigate,.ion-no-smoking,.ion-nuclear,.ion-paper-airplane,.ion-paperclip,.ion-pause,.ion-person,.ion-person-add,.ion-person-stalker,.ion-pie-graph,.ion-pin,.ion-pinpoint,.ion-pizza,.ion-plane,.ion-play,.ion-playstation,.ion-plus,.ion-plus-circled,.ion-plus-round,.ion-pound,.ion-power,.ion-pricetag,.ion-pricetags,.ion-printer,.ion-radio-waves,.ion-record,.ion-refresh,.ion-refreshing,.ion-reply,.ion-reply-all,.ion-search,.ion-settings,.ion-share,.ion-shuffle,.ion-skip-backward,.ion-skip-forward,.ion-social-android,.ion-social-android-outline,.ion-social-apple,.ion-social-apple-outline,.ion-social-bitcoin,.ion-social-bitcoin-outline,.ion-social-buffer,.ion-social-buffer-outline,.ion-social-designernews,.ion-social-designernews-outline,.ion-social-dribbble,.ion-social-dribbble-outline,.ion-social-dropbox,.ion-social-dropbox-outline,.ion-social-facebook,.ion-social-facebook-outline,.ion-social-freebsd-devil,.ion-social-github,.ion-social-github-outline,.ion-social-googleplus,.ion-social-googleplus-outline,.ion-social-hackernews,.ion-social-hackernews-outline,.ion-social-linkedin,.ion-social-linkedin-outline,.ion-social-pinterest,.ion-social-pinterest-outline,.ion-social-reddit,.ion-social-reddit-outline,.ion-social-rss,.ion-social-rss-outline,.ion-social-skype,.ion-social-skype-outline,.ion-social-tumblr,.ion-social-tumblr-outline,.ion-social-tux,.ion-social-twitter,.ion-social-twitter-outline,.ion-social-vimeo,.ion-social-vimeo-outline,.ion-social-windows,.ion-social-windows-outline,.ion-social-wordpress,.ion-social-wordpress-outline,.ion-social-yahoo,.ion-social-yahoo-outline,.ion-social-youtube,.ion-social-youtube-outline,.ion-speakerphone,.ion-speedometer,.ion-spoon,.ion-star,.ion-stats-bars,.ion-steam,.ion-stop,.ion-thermometer,.ion-thumbsdown,.ion-thumbsup,.ion-trash-a,.ion-trash-b,.ion-umbrella,.ion-unlocked,.ion-upload,.ion-usb,.ion-videocamera,.ion-volume-high,.ion-volume-low,.ion-volume-medium,.ion-volume-mute,.ion-waterdrop,.ion-wifi,.ion-wineglass,.ion-woman,.ion-wrench,.ion-xbox,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios7-reloading,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-looping,.ion-refreshing,.ion-spin{-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.ion-loading-a{-webkit-animation-timing-function:steps(8,start);-moz-animation-timing-function:steps(8,start);animation-timing-function:steps(8,start)}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-contact:before{content:"\f2c6"}.ion-android-alarm:before{content:"\f2c8"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down-left:before{content:"\f2cb"}.ion-android-arrow-down-right:before{content:"\f2cc"}.ion-android-arrow-up-left:before{content:"\f2cd"}.ion-android-arrow-up-right:before{content:"\f2ce"}.ion-android-battery:before{content:"\f2cf"}.ion-android-book:before{content:"\f2d0"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkmark:before{content:"\f2d5"}.ion-android-clock:before{content:"\f2d6"}.ion-android-close:before{content:"\f2d7"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-data:before{content:"\f2da"}.ion-android-developer:before{content:"\f2db"}.ion-android-display:before{content:"\f2dc"}.ion-android-download:before{content:"\f2dd"}.ion-android-dropdown:before{content:"\f2de"}.ion-android-earth:before{content:"\f2df"}.ion-android-folder:before{content:"\f2e0"}.ion-android-forums:before{content:"\f2e1"}.ion-android-friends:before{content:"\f2e2"}.ion-android-hand:before{content:"\f2e3"}.ion-android-image:before{content:"\f2e4"}.ion-android-inbox:before{content:"\f2e5"}.ion-android-information:before{content:"\f2e6"}.ion-android-keypad:before{content:"\f2e7"}.ion-android-lightbulb:before{content:"\f2e8"}.ion-android-locate:before{content:"\f2e9"}.ion-android-location:before{content:"\f2ea"}.ion-android-mail:before{content:"\f2eb"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-mixer:before{content:"\f2ed"}.ion-android-more:before{content:"\f2ee"}.ion-android-note:before{content:"\f2ef"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-printer:before{content:"\f2f1"}.ion-android-promotion:before{content:"\f2f2"}.ion-android-reminder:before{content:"\f2f3"}.ion-android-remove:before{content:"\f2f4"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-social:before{content:"\f2fa"}.ion-android-social-user:before{content:"\f2f9"}.ion-android-sort:before{content:"\f2fb"}.ion-android-star:before{content:"\f2fc"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-storage:before{content:"\f2fe"}.ion-android-system-back:before{content:"\f2ff"}.ion-android-system-home:before{content:"\f300"}.ion-android-system-windows:before{content:"\f301"}.ion-android-timer:before{content:"\f302"}.ion-android-trash:before{content:"\f303"}.ion-android-volume:before{content:"\f304"}.ion-android-wifi:before{content:"\f305"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-at:before{content:"\f10f"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bookmark:before{content:"\f26b"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-flag:before{content:"\f279"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-flask:before{content:"\f138"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-game-controller-a:before{content:"\f13b"}.ion-game-controller-b:before{content:"\f13c"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-icon-social-google-plus:before{content:"\f146"}.ion-icon-social-google-plus-outline:before{content:"\f145"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios7-alarm:before{content:"\f14d"}.ion-ios7-alarm-outline:before{content:"\f14c"}.ion-ios7-albums:before{content:"\f14f"}.ion-ios7-albums-outline:before{content:"\f14e"}.ion-ios7-arrow-back:before{content:"\f150"}.ion-ios7-arrow-down:before{content:"\f151"}.ion-ios7-arrow-forward:before{content:"\f152"}.ion-ios7-arrow-left:before{content:"\f153"}.ion-ios7-arrow-right:before{content:"\f154"}.ion-ios7-arrow-thin-down:before{content:"\f27e"}.ion-ios7-arrow-thin-left:before{content:"\f27f"}.ion-ios7-arrow-thin-right:before{content:"\f280"}.ion-ios7-arrow-thin-up:before{content:"\f281"}.ion-ios7-arrow-up:before{content:"\f155"}.ion-ios7-at:before{content:"\f157"}.ion-ios7-at-outline:before{content:"\f156"}.ion-ios7-bell:before{content:"\f159"}.ion-ios7-bell-outline:before{content:"\f158"}.ion-ios7-bolt:before{content:"\f15b"}.ion-ios7-bolt-outline:before{content:"\f15a"}.ion-ios7-bookmarks:before{content:"\f15d"}.ion-ios7-bookmarks-outline:before{content:"\f15c"}.ion-ios7-box:before{content:"\f15f"}.ion-ios7-box-outline:before{content:"\f15e"}.ion-ios7-briefcase:before{content:"\f283"}.ion-ios7-briefcase-outline:before{content:"\f282"}.ion-ios7-browsers:before{content:"\f161"}.ion-ios7-browsers-outline:before{content:"\f160"}.ion-ios7-calculator:before{content:"\f285"}.ion-ios7-calculator-outline:before{content:"\f284"}.ion-ios7-calendar:before{content:"\f163"}.ion-ios7-calendar-outline:before{content:"\f162"}.ion-ios7-camera:before{content:"\f165"}.ion-ios7-camera-outline:before{content:"\f164"}.ion-ios7-cart:before{content:"\f167"}.ion-ios7-cart-outline:before{content:"\f166"}.ion-ios7-chatboxes:before{content:"\f169"}.ion-ios7-chatboxes-outline:before{content:"\f168"}.ion-ios7-chatbubble:before{content:"\f16b"}.ion-ios7-chatbubble-outline:before{content:"\f16a"}.ion-ios7-checkmark:before{content:"\f16e"}.ion-ios7-checkmark-empty:before{content:"\f16c"}.ion-ios7-checkmark-outline:before{content:"\f16d"}.ion-ios7-circle-filled:before{content:"\f16f"}.ion-ios7-circle-outline:before{content:"\f170"}.ion-ios7-clock:before{content:"\f172"}.ion-ios7-clock-outline:before{content:"\f171"}.ion-ios7-close:before{content:"\f2bc"}.ion-ios7-close-empty:before{content:"\f2bd"}.ion-ios7-close-outline:before{content:"\f2bb"}.ion-ios7-cloud:before{content:"\f178"}.ion-ios7-cloud-download:before{content:"\f174"}.ion-ios7-cloud-download-outline:before{content:"\f173"}.ion-ios7-cloud-outline:before{content:"\f175"}.ion-ios7-cloud-upload:before{content:"\f177"}.ion-ios7-cloud-upload-outline:before{content:"\f176"}.ion-ios7-cloudy:before{content:"\f17a"}.ion-ios7-cloudy-night:before{content:"\f308"}.ion-ios7-cloudy-night-outline:before{content:"\f307"}.ion-ios7-cloudy-outline:before{content:"\f179"}.ion-ios7-cog:before{content:"\f17c"}.ion-ios7-cog-outline:before{content:"\f17b"}.ion-ios7-compose:before{content:"\f17e"}.ion-ios7-compose-outline:before{content:"\f17d"}.ion-ios7-contact:before{content:"\f180"}.ion-ios7-contact-outline:before{content:"\f17f"}.ion-ios7-copy:before{content:"\f182"}.ion-ios7-copy-outline:before{content:"\f181"}.ion-ios7-download:before{content:"\f184"}.ion-ios7-download-outline:before{content:"\f183"}.ion-ios7-drag:before{content:"\f185"}.ion-ios7-email:before{content:"\f187"}.ion-ios7-email-outline:before{content:"\f186"}.ion-ios7-eye:before{content:"\f189"}.ion-ios7-eye-outline:before{content:"\f188"}.ion-ios7-fastforward:before{content:"\f18b"}.ion-ios7-fastforward-outline:before{content:"\f18a"}.ion-ios7-filing:before{content:"\f18d"}.ion-ios7-filing-outline:before{content:"\f18c"}.ion-ios7-film:before{content:"\f18f"}.ion-ios7-film-outline:before{content:"\f18e"}.ion-ios7-flag:before{content:"\f191"}.ion-ios7-flag-outline:before{content:"\f190"}.ion-ios7-folder:before{content:"\f193"}.ion-ios7-folder-outline:before{content:"\f192"}.ion-ios7-gear:before{content:"\f195"}.ion-ios7-gear-outline:before{content:"\f194"}.ion-ios7-glasses:before{content:"\f197"}.ion-ios7-glasses-outline:before{content:"\f196"}.ion-ios7-heart:before{content:"\f199"}.ion-ios7-heart-outline:before{content:"\f198"}.ion-ios7-help:before{content:"\f19c"}.ion-ios7-help-empty:before{content:"\f19a"}.ion-ios7-help-outline:before{content:"\f19b"}.ion-ios7-infinite:before{content:"\f19e"}.ion-ios7-infinite-outline:before{content:"\f19d"}.ion-ios7-information:before{content:"\f1a1"}.ion-ios7-information-empty:before{content:"\f19f"}.ion-ios7-information-outline:before{content:"\f1a0"}.ion-ios7-ionic-outline:before{content:"\f1a2"}.ion-ios7-keypad:before{content:"\f1a4"}.ion-ios7-keypad-outline:before{content:"\f1a3"}.ion-ios7-lightbulb:before{content:"\f287"}.ion-ios7-lightbulb-outline:before{content:"\f286"}.ion-ios7-location:before{content:"\f1a6"}.ion-ios7-location-outline:before{content:"\f1a5"}.ion-ios7-locked:before{content:"\f1a8"}.ion-ios7-locked-outline:before{content:"\f1a7"}.ion-ios7-medkit:before{content:"\f289"}.ion-ios7-medkit-outline:before{content:"\f288"}.ion-ios7-mic:before{content:"\f1ab"}.ion-ios7-mic-off:before{content:"\f1a9"}.ion-ios7-mic-outline:before{content:"\f1aa"}.ion-ios7-minus:before{content:"\f1ae"}.ion-ios7-minus-empty:before{content:"\f1ac"}.ion-ios7-minus-outline:before{content:"\f1ad"}.ion-ios7-monitor:before{content:"\f1b0"}.ion-ios7-monitor-outline:before{content:"\f1af"}.ion-ios7-moon:before{content:"\f1b2"}.ion-ios7-moon-outline:before{content:"\f1b1"}.ion-ios7-more:before{content:"\f1b4"}.ion-ios7-more-outline:before{content:"\f1b3"}.ion-ios7-musical-note:before{content:"\f1b5"}.ion-ios7-musical-notes:before{content:"\f1b6"}.ion-ios7-navigate:before{content:"\f1b8"}.ion-ios7-navigate-outline:before{content:"\f1b7"}.ion-ios7-paperplane:before{content:"\f1ba"}.ion-ios7-paperplane-outline:before{content:"\f1b9"}.ion-ios7-partlysunny:before{content:"\f1bc"}.ion-ios7-partlysunny-outline:before{content:"\f1bb"}.ion-ios7-pause:before{content:"\f1be"}.ion-ios7-pause-outline:before{content:"\f1bd"}.ion-ios7-people:before{content:"\f1c0"}.ion-ios7-people-outline:before{content:"\f1bf"}.ion-ios7-person:before{content:"\f1c2"}.ion-ios7-person-outline:before{content:"\f1c1"}.ion-ios7-personadd:before{content:"\f1c4"}.ion-ios7-personadd-outline:before{content:"\f1c3"}.ion-ios7-photos:before{content:"\f1c6"}.ion-ios7-photos-outline:before{content:"\f1c5"}.ion-ios7-pie:before{content:"\f28b"}.ion-ios7-pie-outline:before{content:"\f28a"}.ion-ios7-play:before{content:"\f1c8"}.ion-ios7-play-outline:before{content:"\f1c7"}.ion-ios7-plus:before{content:"\f1cb"}.ion-ios7-plus-empty:before{content:"\f1c9"}.ion-ios7-plus-outline:before{content:"\f1ca"}.ion-ios7-pricetag:before{content:"\f28d"}.ion-ios7-pricetag-outline:before{content:"\f28c"}.ion-ios7-printer:before{content:"\f1cd"}.ion-ios7-printer-outline:before{content:"\f1cc"}.ion-ios7-rainy:before{content:"\f1cf"}.ion-ios7-rainy-outline:before{content:"\f1ce"}.ion-ios7-recording:before{content:"\f1d1"}.ion-ios7-recording-outline:before{content:"\f1d0"}.ion-ios7-redo:before{content:"\f1d3"}.ion-ios7-redo-outline:before{content:"\f1d2"}.ion-ios7-refresh:before{content:"\f1d6"}.ion-ios7-refresh-empty:before{content:"\f1d4"}.ion-ios7-refresh-outline:before{content:"\f1d5"}.ion-ios7-reload:before,.ion-ios7-reloading:before{content:"\f28e"}.ion-ios7-rewind:before{content:"\f1d8"}.ion-ios7-rewind-outline:before{content:"\f1d7"}.ion-ios7-search:before{content:"\f1da"}.ion-ios7-search-strong:before{content:"\f1d9"}.ion-ios7-skipbackward:before{content:"\f1dc"}.ion-ios7-skipbackward-outline:before{content:"\f1db"}.ion-ios7-skipforward:before{content:"\f1de"}.ion-ios7-skipforward-outline:before{content:"\f1dd"}.ion-ios7-snowy:before{content:"\f309"}.ion-ios7-speedometer:before{content:"\f290"}.ion-ios7-speedometer-outline:before{content:"\f28f"}.ion-ios7-star:before{content:"\f1e0"}.ion-ios7-star-outline:before{content:"\f1df"}.ion-ios7-stopwatch:before{content:"\f1e2"}.ion-ios7-stopwatch-outline:before{content:"\f1e1"}.ion-ios7-sunny:before{content:"\f1e4"}.ion-ios7-sunny-outline:before{content:"\f1e3"}.ion-ios7-telephone:before{content:"\f1e6"}.ion-ios7-telephone-outline:before{content:"\f1e5"}.ion-ios7-thunderstorm:before{content:"\f1e8"}.ion-ios7-thunderstorm-outline:before{content:"\f1e7"}.ion-ios7-time:before{content:"\f292"}.ion-ios7-time-outline:before{content:"\f291"}.ion-ios7-timer:before{content:"\f1ea"}.ion-ios7-timer-outline:before{content:"\f1e9"}.ion-ios7-trash:before{content:"\f1ec"}.ion-ios7-trash-outline:before{content:"\f1eb"}.ion-ios7-undo:before{content:"\f1ee"}.ion-ios7-undo-outline:before{content:"\f1ed"}.ion-ios7-unlocked:before{content:"\f1f0"}.ion-ios7-unlocked-outline:before{content:"\f1ef"}.ion-ios7-upload:before{content:"\f1f2"}.ion-ios7-upload-outline:before{content:"\f1f1"}.ion-ios7-videocam:before{content:"\f1f4"}.ion-ios7-videocam-outline:before{content:"\f1f3"}.ion-ios7-volume-high:before{content:"\f1f5"}.ion-ios7-volume-low:before{content:"\f1f6"}.ion-ios7-wineglass:before{content:"\f294"}.ion-ios7-wineglass-outline:before{content:"\f293"}.ion-ios7-world:before{content:"\f1f8"}.ion-ios7-world-outline:before{content:"\f1f7"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before,.ion-loading-a:before{content:"\f29a"}.ion-load-b:before,.ion-loading-b:before{content:"\f29b"}.ion-load-c:before,.ion-loading-c:before{content:"\f29c"}.ion-load-d:before,.ion-loading-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before,.ion-looping:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before,.ion-refreshing:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-umbrella:before{content:"\f2b7"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a:active,a:focus,a:hover,button:focus{outline:0}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}img{-webkit-user-drag:none}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-backface-visibility:hidden;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-user-drag:none}.content:after,.content:before{display:block;overflow:hidden;height:0;content:"\00a0"}.content{position:absolute;width:100%;height:100%}.scroll-content{top:0;right:0;bottom:0;left:0;position:absolute;overflow:hidden;-webkit-backface-visibility:hidden;margin-top:-1px;width:auto;height:auto}.scroll-view{overflow:hidden;position:relative;-webkit-backface-visibility:hidden;margin-top:-1px}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);transform:translateZ(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;transform-origin:left top;-webkit-backface-visibility:hidden}.scroll-bar{position:absolute;z-index:9999}.scroll-bar-h{height:3px;left:2px;right:2px;bottom:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{width:3px;bottom:2px;top:2px;right:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;background:rgba(0,0,0,.3);border-radius:4px;opacity:1}.scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:opacity .3s linear;-moz-transition:opacity .3s linear;transition:opacity .3s linear;opacity:0}.scroll-refresher{overflow:hidden;margin-top:-60px;height:60px;position:relative}.scroll-refresher .icon-refreshing{display:none;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;animation-duration:1.5s}.ionic-refresher-content,.scroll-refresher-content{position:absolute;left:0;bottom:15px;width:100%;text-align:center;font-size:30px;color:#666}.ionic-refresher-content .icon-pulling{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}@keyframes refresh-spin{0%{transform:rotate(0)}100%{transform:rotate(-180deg)}}@-webkit-keyframes refresh-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(-180deg)}}.scroll-refresher.active .icon-pulling{display:block}.scroll-refresher.active .icon-refreshing,.scroll-refresher.active.refreshing .icon-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing{display:block}.scroll-refresher.active .ionic-refresher-content .icon-pulling{-webkit-animation-name:refresh-spin;-moz-animation-name:refresh-spin;animation-name:refresh-spin}infinite-scroll .scroll-infinite{overflow:hidden;margin-top:-70px;height:60px;position:relative}.scroll-infinite-content{position:absolute;left:0;bottom:15px;width:100%;text-align:center;font-size:30px;color:#666}infinite-scroll.active .scroll-infinite{margin-top:-30px}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.overflow-scroll .scroll{position:static;height:100%}.has-header{top:44px}.has-subheader{top:88px}.has-footer{bottom:44px}.has-tabs{bottom:49px}.pane{position:fixed;z-index:1}.view{position:absolute;z-index:1}.pane,.view{top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.1}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}@-webkit-keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@-webkit-keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}@keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}.action-sheet-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:rgba(0,0,0,0)}.action-sheet-backdrop.active{-webkit-animation:fadeInHalf .3s;-moz-animation:fadeInHalf .3s;animation:fadeInHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.action-sheet-backdrop.active-remove{-webkit-animation:fadeOutHalf .3s;-moz-animation:fadeOutHalf .3s;animation:fadeOutHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;background-color:rgba(0,0,0,.5)}@-webkit-keyframes actionSheetUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes actionSheetOut{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}.action-sheet-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.action-sheet-up .ng-enter,.action-sheet-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);opacity:0}.action-sheet-up .ng-enter-active,.action-sheet-up.ng-enter-active{-webkit-animation-name:actionSheetUp;-moz-animation-name:actionSheetUp;animation-name:actionSheetUp}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1)}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave-active{-webkit-animation-name:actionSheetOut;-moz-animation-name:actionSheetOut;animation-name:actionSheetOut}.action-sheet{position:fixed;bottom:0;left:15px;z-index:10;overflow:hidden;width:calc(100% - 30px)}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;background-color:transparent;color:#4a87ee;font-size:18px}.action-sheet .button.destructive{color:#ef4e3a}.action-sheet-title{padding:10px;color:#666;text-align:center;font-size:12px}.action-sheet-group{margin-bottom:5px;border-radius:3px;background-color:#fff}.action-sheet-group .button{border-width:1px 0 0;border-radius:0}.action-sheet-group .button.active,.action-sheet-group .button:active{background-color:transparent;color:inherit}.action-sheet-group .button:first-child:last-child{border-width:0}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:10;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:0;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:0;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;height:28px}.bar.bar-light{background-color:#fff;border-color:#ddd;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-stable{background-color:#f8f8f8;border-color:#b2b2b2;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-positive{background-color:#4a87ee;border-color:#145dd7;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-calm{background-color:#43cee6;border-color:#1aaac3;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-assertive{background-color:#ef4e3a;border-color:#cc2511;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-balanced{background-color:#6c3;border-color:#478f24;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-energized{background-color:#f0b840;border-color:#d39511;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-royal{background-color:#8a6de9;border-color:#552bdf;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-dark{background-color:#444;border-color:#111;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar .title{position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:18px;line-height:42px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-size:12px;line-height:30px}.bar .button .icon,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before{padding-right:2px;padding-left:2px;font-size:24px;line-height:30px}.bar .button.button-icon .icon,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon.icon:before{line-height:32px}.bar .button.button-clear{font-size:18px;padding-right:2px;padding-left:2px}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:30px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:6px;right:5px;bottom:5px}.bar-light .button{color:#444;background-color:#fff;border-color:#ddd}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.active,.bar-light .button:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.bar-light .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-light .button.button-icon{background:0 0;border-color:transparent}.bar-stable .button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.active,.bar-stable .button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.bar-stable .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-stable .button.button-icon{background:0 0;border-color:transparent}.bar-positive .button{color:#fff;background-color:#4a87ee;border-color:#145dd7}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.active,.bar-positive .button:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.bar-positive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-positive .button.button-icon{background:0 0;border-color:transparent}.bar-calm .button{color:#fff;background-color:#43cee6;border-color:#1aaac3}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.active,.bar-calm .button:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.bar-calm .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-calm .button.button-icon{background:0 0;border-color:transparent}.bar-assertive .button{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.active,.bar-assertive .button:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.bar-assertive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-assertive .button.button-icon{background:0 0;border-color:transparent}.bar-balanced .button{color:#fff;background-color:#6c3;border-color:#478f24}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.active,.bar-balanced .button:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.bar-balanced .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-balanced .button.button-icon{background:0 0;border-color:transparent}.bar-energized .button{color:#fff;background-color:#f0b840;border-color:#d39511}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.active,.bar-energized .button:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.bar-energized .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-energized .button.button-icon{background:0 0;border-color:transparent}.bar-royal .button{color:#fff;background-color:#8a6de9;border-color:#552bdf}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.active,.bar-royal .button:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.bar-royal .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-royal .button.button-icon{background:0 0;border-color:transparent}.bar-dark .button{color:#fff;background-color:#444;border-color:#111}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.active,.bar-dark .button:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.bar-dark .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-dark .button.button-icon{background:0 0;border-color:transparent}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block}.bar-subfooter{bottom:44px;display:block}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs.tabs-light{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd;color:#444}.tabs.tabs-stable{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444}.tabs.tabs-positive{background-color:#4a87ee;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);border-color:#145dd7;color:#fff}.tabs.tabs-calm{background-color:#43cee6;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);border-color:#1aaac3;color:#fff}.tabs.tabs-assertive{background-color:#ef4e3a;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);border-color:#cc2511;color:#fff}.tabs.tabs-balanced{background-color:#6c3;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);border-color:#478f24;color:#fff}.tabs.tabs-energized{background-color:#f0b840;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);border-color:#d39511;color:#fff}.tabs.tabs-royal{background-color:#8a6de9;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);border-color:#552bdf;color:#fff}.tabs.tabs-dark{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111;color:#fff}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:0!important;border-bottom:0!important;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-top{top:44px}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"Helvetica Neue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;opacity:.7}.tabs-icon-bottom .tab-item,.tabs-icon-top .tab-item{font-size:12px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left .tab-item,.tabs-icon-right .tab-item{font-size:12px}.tabs-icon-left .tab-item .icon,.tabs-icon-right .tab-item .icon{display:inline-block;vertical-align:top;font-size:24px;line-height:49px}.tabs-icon-only .icon{line-height:inherit}.tab-item.active,.tab-item:active{opacity:1}.tab-item.active.tab-item-light,.tab-item:active.tab-item-light{color:#fff}.tab-item.active.tab-item-stable,.tab-item:active.tab-item-stable{color:#f8f8f8}.tab-item.active.tab-item-positive,.tab-item:active.tab-item-positive{color:#4a87ee}.tab-item.active.tab-item-calm,.tab-item:active.tab-item-calm{color:#43cee6}.tab-item.active.tab-item-assertive,.tab-item:active.tab-item-assertive{color:#ef4e3a}.tab-item.active.tab-item-balanced,.tab-item:active.tab-item-balanced{color:#6c3}.tab-item.active.tab-item-energized,.tab-item:active.tab-item-energized{color:#f0b840}.tab-item.active.tab-item-royal,.tab-item:active.tab-item-royal{color:#8a6de9}.tab-item.active.tab-item-dark,.tab-item:active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon{position:relative}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu-content{box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-left{left:0}.menu-right{right:0}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;-moz-transition:-moz-transform 200ms ease;transition:transform 200ms ease}.modal{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);position:fixed;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff;opacity:0}.modal.active{height:100%}.popup{position:fixed}.popup-content{padding:10px}.loading-backdrop{-webkit-transition:visibility 0s linear .3s;-moz-transition:visibility 0s linear .3s;transition:visibility 0s linear .3s;position:fixed;top:0;left:0;visibility:hidden;width:100%;height:100%}.loading-backdrop.enabled{background-color:rgba(0,0,0,.7)}.loading-backdrop.active{-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s;visibility:visible}.loading{position:fixed;top:50%;left:50%;padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading h1,.loading h2,.loading h3,.loading h4,.loading h5,.loading h6{color:#fff}.item{color:#444;background-color:#fff;border-color:#ddd;-webkit-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;-moz-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;position:relative;z-index:2;display:block;margin:-1px;padding:15px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 4px;font-size:16px}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{float:right}.item .badge+.badge{margin-right:5px}.item.item-light{color:#444;background-color:#fff;border-color:#ddd}.item.item-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.item.item-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.item.item-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.item.item-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.item.item-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.item.item-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.item.item-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.item.item-dark{color:#fff;background-color:#444;border-color:#111}.ionic-pseudo a.item:active,.ionic-pseudo button.item:active,a.item.active,button.item.active{background-color:#d9d9d9;border-color:#ccc}.ionic-pseudo a.item.item-light:active,.ionic-pseudo button.item.item-light:active,a.item.item-light.active,button.item.item-light.active{background-color:#fafafa;border-color:#ccc}.ionic-pseudo a.item.item-stable:active,.ionic-pseudo button.item.item-stable:active,a.item.item-stable.active,button.item.item-stable.active{background-color:#e5e5e5;border-color:#a2a2a2}.ionic-pseudo a.item.item-positive:active,.ionic-pseudo button.item.item-positive:active,a.item.item-positive.active,button.item.item-positive.active{background-color:#145dd7;border-color:#145dd7}.ionic-pseudo a.item.item-calm:active,.ionic-pseudo button.item.item-calm:active,a.item.item-calm.active,button.item.item-calm.active{background-color:#1aaac3;border-color:#1aaac3}.ionic-pseudo a.item.item-assertive:active,.ionic-pseudo button.item.item-assertive:active,a.item.item-assertive.active,button.item.item-assertive.active{background-color:#cc2511;border-color:#cc2511}.ionic-pseudo a.item.item-balanced:active,.ionic-pseudo button.item.item-balanced:active,a.item.item-balanced.active,button.item.item-balanced.active{background-color:#478f24;border-color:#478f24}.ionic-pseudo a.item.item-energized:active,.ionic-pseudo button.item.item-energized:active,a.item.item-energized.active,button.item.item-energized.active{background-color:#d39511;border-color:#d39511}.ionic-pseudo a.item.item-royal:active,.ionic-pseudo button.item.item-royal:active,a.item.item-royal.active,button.item.item-royal.active{background-color:#552bdf;border-color:#552bdf}.ionic-pseudo a.item.item-dark:active,.ionic-pseudo button.item.item-dark:active,a.item.item-dark.active,button.item.item-dark.active{background-color:#262626;border-color:#000}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;transition:all .1s ease-in-out;position:relative;z-index:2;padding:15px 40px 15px 15px;border:0;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap .item-content,.item-text-wrap,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:hidden;white-space:normal}.item-complex.item-text-wrap,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p{overflow:hidden;white-space:nowrap}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:28px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:45px}.item-icon-left .icon{left:7.5px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:45px}.item-icon-right{padding-right:45px}.item-icon-right .icon{right:7.5px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:45px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-button-left{padding-left:67.5px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;left:7.5px;min-width:initial;min-height:32px;font-size:32px}.item-button-left .item-content>.button .icon,.item-button-left>.button .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:75px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;right:15px;min-width:initial;min-height:32px;font-size:32px}.item-button-right .item-content>.button .icon,.item-button-right .item-content>.buttons .icon,.item-button-right>.button .icon,.item-button-right>.buttons .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-height:32px;font-size:32px}a.item,button.item{padding-right:40px}a.item:after,button.item:after{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;position:absolute;top:0;right:11px;height:100%;color:#ccc;content:"\f125";text-transform:none;font-weight:400;font-style:normal;font-variant:normal;font-size:16px;font-family:Ionicons;line-height:1;speak:none}a.item-button-right:after,a.item-icon-right:after,button.item-button-right:after,button.item-icon-right:after{display:none}.item-avatar{padding-left:70px;min-height:70px}.item-avatar .item-img,.item-avatar img:first-child{position:absolute;top:15px;left:15px;max-width:40px;max-height:40px;width:100%;border-radius:4px}.item-thumbnail-left{padding-left:105px;min-height:100px}.item-thumbnail-left>.item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%}.item-thumbnail-right{padding-right:105px;min-height:100px}.item-thumbnail-right>.item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:15px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:15px;margin-bottom:15px}.item-divider{padding-top:7.5px;padding-bottom:7.5px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:700}.item-note{float:right;color:#aaa;font-size:14px}.item-reordering{position:absolute;z-index:20;width:100%}.item-placeholder{opacity:.7}.item-edit{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;position:absolute;top:0;left:8px;z-index:0;width:48px;height:100%;line-height:100%}.item-edit .button{height:100%}.item-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:0;height:100%;color:#ef4e3a;font-size:24px}.item-edit.ng-enter{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:-48px;opacity:0}.item-edit.ng-enter-active{left:8px;opacity:1}.item-edit.ng-leave{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:0;opacity:1}.item-edit.ng-leave-active{left:-48px;opacity:0}.item-drag{position:absolute;top:0;right:0;z-index:0;width:50px;height:100%;background:inherit}.item-drag .button{min-width:42px;height:100%}.item-drag .button.icon:before{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:0;border-radius:0}.item-options-hide .item-options{display:none}.list{position:relative;margin-bottom:20px;padding-top:1px;padding-bottom:1px;padding-left:0}.list-editing .item-content{-webkit-transform:translate3d(50px,0,0);-moz-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.list-reordering .item-content{margin-right:50px}.list-reordering .item-drag{z-index:1}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.nav-page{position:absolute;width:100%;height:100%;background-color:#fff}.badge{background-color:transparent;color:#aaa;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive{background-color:#4a87ee;color:#fff}.badge.badge-calm{background-color:#43cee6;color:#fff}.badge.badge-assertive{background-color:#ef4e3a;color:#fff}.badge.badge-balanced{background-color:#6c3;color:#fff}.badge.badge-energized{background-color:#f0b840;color:#fff}.badge.badge-royal{background-color:#8a6de9;color:#fff}.badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;overflow:hidden;visibility:hidden}.slider-slides{position:relative;height:100%}.slider-slide{display:block;position:relative;width:100%;height:100%;float:left;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;width:100%;text-align:center;z-index:1}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{opacity:1;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;transition:opacity .4s ease-in}.split-pane{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch;width:100%;height:100%}.split-pane-menu{-webkit-box-flex:0;-webkit-flex:0 0 320px;-moz-box-flex:0;-moz-flex:0 0 320px;-ms-flex:0 0 320px;flex:0 0 320px;overflow-y:auto;width:320px;height:100%;border-right:1px solid #eee}@media all and (max-width:568px){.split-pane-menu{border-right:0}}.split-pane-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;-moz-box-flex:1;-moz-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:1.42857}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 8px 5px}.item-input input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.ionic-pseudo .item-input.item:active,.item-input.item.active{border-color:#ddd;background-color:transparent}.item-input .button-bar{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:inherit;line-height:18px}.item-input-wrapper~.button{margin-left:10px}.input-label{-webkit-box-flex:1;-webkit-flex:1 0 100px;-moz-box-flex:1;-moz-flex:1 0 100px;-ms-flex:1 0 100px;flex:1 0 100px;padding:7px 10px 7px 3px;max-width:200px;color:#444;font-weight:700}.placeholder-icon{color:#aaa}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;overflow:hidden;padding:4px 8px 3px;border:0;background-color:#fff}.item-stacked-label input{height:46px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:20px}input,textarea{width:100%}textarea{height:auto}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}select[multiple],select[size]{height:auto}input[type=file],select{line-height:34px}select{border:1px solid #ddd;background-color:#fff}input:-moz-placeholder,textarea:-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{background-color:#f8f8f8;cursor:not-allowed}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox input{position:relative;width:28px;height:28px;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before{display:table;width:100%;height:100%;border:1px solid #4a87ee;border-radius:50%;background:#fff;content:' ';transition:background-color .1s ease-in-out}.checkbox input:after{-webkit-transition:opacity .05s ease-in-out;-moz-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:34%;left:26%;display:table;width:14px;height:10.33333px;border:3px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox input:checked:before{border:0;background:#4a87ee}.checkbox input:checked:after{opacity:1}.item-checkbox{padding-left:58px}.item-checkbox.active,.item-checkbox:active{box-shadow:none}.item-checkbox .checkbox{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:7.5px;z-index:3;height:100%}.toggle{position:relative;display:inline-block}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.1s;-moz-transition-duration:.1s;transition-duration:.1s;-webkit-transition-property:background-color,border;-moz-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:solid 2px #e5e5e5;border-radius:20px;background-color:#e5e5e5;content:' ';cursor:pointer}.toggle .handle{-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;transition:.1s ease-in-out;position:absolute;top:2px;left:2px;display:block;width:28px;height:28px;border-radius:50%;background-color:#fff}.toggle .handle:before{position:absolute;top:-4px;left:-22px;padding:19px 35px;content:" "}.toggle input:checked+.track{border-color:#4a87ee;background-color:#4a87ee}.toggle input:checked+.track .handle{-webkit-transform:translate3d(22px,0,0);-moz-transform:translate3d(22px,0,0);transform:translate3d(22px,0,0);background-color:#fff}.item-toggle{padding-right:99px}.item-toggle.active,.item-toggle:active{box-shadow:none}.item-toggle .toggle{position:absolute;top:7.5px;right:15px;z-index:3}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:60px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:13px;height:100%;font-size:24px}.item-radio input{display:none}.item-radio input:checked~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}input[type=range]{display:inline-block;overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:35px;outline:0;background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 4px;background-repeat:no-repeat;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb{position:relative;width:20px;height:20px;border-radius:10px;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.5),1px 3px 5px rgba(0,0,0,.25);cursor:pointer;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb:before{position:absolute;top:8px;left:-2001px;width:2000px;height:4px;background:#444;content:' '}input[type=range]::-webkit-slider-thumb:after{position:absolute;top:-20px;left:-20px;padding:30px;content:' '}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 4px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#4a87ee}.range.range-calm input::-webkit-slider-thumb:before{background:#43cee6}.range.range-balanced input::-webkit-slider-thumb:before{background:#6c3}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef4e3a}.range.range-energized input::-webkit-slider-thumb:before{background:#f0b840}.range.range-royal input::-webkit-slider-thumb:before{background:#8a6de9}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px;width:100%}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2;position:relative;display:inline-block;margin:0;padding:1px 12px 0;min-width:52px;min-height:42px;border-width:1px;border-style:solid;border-radius:2px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:41px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.active,.button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button .icon,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:40px}.button.icon-left:before{padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{color:#444;background-color:#fff;border-color:#ddd}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.active,.button.button-light:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.button.button-light.button-clear{color:#ddd;background:0 0;border-color:transparent;box-shadow:none}.button.button-light.button-icon{background:0 0;border-color:transparent}.button.button-light.button-outline{background:0 0;border-color:#ddd;color:#ddd}.button.button-light.button-outline.active,.button.button-light.button-outline:active{background-color:#ddd;color:#fff;box-shadow:none}.button.button-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.active,.button.button-stable:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button.button-stable.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button.button-stable.button-icon{background:0 0;border-color:transparent}.button.button-stable.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button.button-stable.button-outline.active,.button.button-stable.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.button.button-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.active,.button.button-positive:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.button.button-positive.button-clear{color:#4a87ee;background:0 0;border-color:transparent;box-shadow:none}.button.button-positive.button-icon{background:0 0;border-color:transparent}.button.button-positive.button-outline{background:0 0;border-color:#4a87ee;color:#4a87ee}.button.button-positive.button-outline.active,.button.button-positive.button-outline:active{background-color:#4a87ee;color:#fff;box-shadow:none}.button.button-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.active,.button.button-calm:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.button.button-calm.button-clear{color:#43cee6;background:0 0;border-color:transparent;box-shadow:none}.button.button-calm.button-icon{background:0 0;border-color:transparent}.button.button-calm.button-outline{background:0 0;border-color:#43cee6;color:#43cee6}.button.button-calm.button-outline.active,.button.button-calm.button-outline:active{background-color:#43cee6;color:#fff;box-shadow:none}.button.button-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.active,.button.button-assertive:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.button.button-assertive.button-clear{color:#ef4e3a;background:0 0;border-color:transparent;box-shadow:none}.button.button-assertive.button-icon{background:0 0;border-color:transparent}.button.button-assertive.button-outline{background:0 0;border-color:#ef4e3a;color:#ef4e3a}.button.button-assertive.button-outline.active,.button.button-assertive.button-outline:active{background-color:#ef4e3a;color:#fff;box-shadow:none}.button.button-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.active,.button.button-balanced:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.button.button-balanced.button-clear{color:#6c3;background:0 0;border-color:transparent;box-shadow:none}.button.button-balanced.button-icon{background:0 0;border-color:transparent}.button.button-balanced.button-outline{background:0 0;border-color:#6c3;color:#6c3}.button.button-balanced.button-outline.active,.button.button-balanced.button-outline:active{background-color:#6c3;color:#fff;box-shadow:none}.button.button-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.active,.button.button-energized:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.button.button-energized.button-clear{color:#f0b840;background:0 0;border-color:transparent;box-shadow:none}.button.button-energized.button-icon{background:0 0;border-color:transparent}.button.button-energized.button-outline{background:0 0;border-color:#f0b840;color:#f0b840}.button.button-energized.button-outline.active,.button.button-energized.button-outline:active{background-color:#f0b840;color:#fff;box-shadow:none}.button.button-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.active,.button.button-royal:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.button.button-royal.button-clear{color:#8a6de9;background:0 0;border-color:transparent;box-shadow:none}.button.button-royal.button-icon{background:0 0;border-color:transparent}.button.button-royal.button-outline{background:0 0;border-color:#8a6de9;color:#8a6de9}.button.button-royal.button-outline.active,.button.button-royal.button-outline:active{background-color:#8a6de9;color:#fff;box-shadow:none}.button.button-dark{color:#fff;background-color:#444;border-color:#111}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.active,.button.button-dark:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.button.button-dark.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none}.button.button-dark.button-icon{background:0 0;border-color:transparent}.button.button-dark.button-outline{background:0 0;border-color:#444;color:#444}.button.button-dark.button-outline.active,.button.button-dark.button-outline:active{background-color:#444;color:#fff;box-shadow:none}.button-small{padding:0 4px;min-width:28px;min-height:28px;font-size:12px;line-height:27px}.button-small .icon,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:26px}.button-large{padding:0 16px;min-width:66px;min-height:54px;font-size:18px;line-height:53px}.button-large .icon,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.active,.button-icon.button:active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button-clear.button-icon{background:0 0;border-color:transparent}.button-clear.active,.button-clear:active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button-outline.button-outline.active,.button-outline.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full{width:100%}a.button{text-decoration:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto;*zoom:1}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button:first-child{border-radius:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromLeft{from{-moz-transform:translateX(-100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromLeft{from{transform:translateX(-100%)}to{transform:translateX(0)}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromRight{from{-moz-transform:translateX(100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromRight{from{transform:translateX(100%)}to{transform:translateX(0)}}@-webkit-keyframes slideOutToLeft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0)}}@-moz-keyframes slideOutToLeft{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(-100%)}}@keyframes slideOutToLeft{from{transform:translateX(0)}to{transform:translateX(-100%)}}@-webkit-keyframes slideOutToRight{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0)}}@-moz-keyframes slideOutToRight{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(100%)}}@keyframes slideOutToRight{from{transform:translateX(0)}to{transform:translateX(100%)}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@keyframes spin{100%{transform:rotate(360deg)}}.no-animation.ng-enter,.no-animation.ng-leave,.no-animation>.ng-enter,.no-animation>.ng-leave{-webkit-transition:none;-moz-transition:none;transition:none}.noop-animation.ng-enter,.noop-animation.ng-leave,.noop-animation>.ng-enter,.noop-animation>.ng-leave{-webkit-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;-moz-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.ng-animate .pane{position:absolute}.slide-left-right.ng-enter,.slide-left-right.ng-leave,.slide-left-right>.ng-enter,.slide-left-right>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.ng-enter,.slide-left-right>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right.ng-enter.ng-enter-active,.slide-left-right>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.ng-leave.ng-leave-active,.slide-left-right>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse.ng-leave,.slide-left-right.reverse>.ng-enter,.slide-left-right.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter.ng-enter-active,.slide-left-right.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.reverse.ng-leave.ng-leave-active,.slide-left-right.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7.ng-leave,.slide-left-right-ios7>.ng-enter,.slide-left-right-ios7>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter.ng-enter-active,.slide-left-right-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.ng-leave.ng-leave-active,.slide-left-right-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-15%,0,0);-moz-transform:translate3d(-15%,0,0);transform:translate3d(-15%,0,0)}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse.ng-leave,.slide-left-right-ios7.reverse>.ng-enter,.slide-left-right-ios7.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right-ios7.reverse.ng-enter.ng-enter-active,.slide-left-right-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.reverse.ng-leave.ng-leave-active,.slide-left-right-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(15%,0,0);-moz-transform:translate3d(15%,0,0);transform:translate3d(15%,0,0)}.slide-in-left{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-left.ng-enter,.slide-in-left>.ng-enter{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left.ng-leave,.slide-in-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add-active{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft}.slide-out-left{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-out-left.ng-enter,.slide-out-left.ng-leave,.slide-out-left>.ng-enter,.slide-out-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add-active{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft}.slide-in-right{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-right.ng-enter,.slide-in-right.ng-leave,.slide-in-right>.ng-enter,.slide-in-right>.ng-leave{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add-active{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight}.slide-out-right{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-out-right.ng-enter,.slide-out-right.ng-leave,.slide-out-right>.ng-enter,.slide-out-right>.ng-leave{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add-active{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight}.slide-in-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.slide-in-up .ng-enter,.slide-in-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;opacity:0}.slide-in-up .ng-enter-active,.slide-in-up.ng-enter-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up .ng-leave,.slide-in-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up .ng-leave,.slide-in-up.ng-leave-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.slide-in-up-add{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up-add-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up-remove{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;animation-fill-mode:forwards}.slide-in-up-remove-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.fade-in{-webkit-animation:fadeOut .3s;-moz-animation:fadeOut .3s;animation:fadeOut .3s}.fade-in.active{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s}.fade-in-not-out .ng-enter,.fade-in-not-out.ng-enter{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s;position:relative}.fade-in-not-out .ng-leave,.fade-in-not-out.ng-leave{display:none}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7.ng-leave,.nav-title-slide-ios7>.ng-enter,.nav-title-slide-ios7>.ng-leave{-webkit-transition:all 250ms;-moz-transition:all 250ms;transition:all 250ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;opacity:1}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.nav-title-slide-ios7.ng-enter.ng-enter-active,.nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.ng-leave.ng-leave-active,.nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.nav-title-slide-ios7.reverse.ng-enter,.nav-title-slide-ios7.reverse.ng-leave,.nav-title-slide-ios7.reverse>.ng-enter,.nav-title-slide-ios7.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;opacity:1}.nav-title-slide-ios7.reverse.ng-enter,.nav-title-slide-ios7.reverse>.ng-enter{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.nav-title-slide-ios7.reverse.ng-enter.ng-enter-active,.nav-title-slide-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.reverse.ng-leave.ng-leave-active,.nav-title-slide-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}.hidden,.hide{display:none}.show{display:block}.invisible{visibility:hidden}.inline{display:inline-block}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#4a87ee}.positive-bg{background-color:#4a87ee}.positive-border{border-color:#145dd7}.calm,a.calm{color:#43cee6}.calm-bg{background-color:#43cee6}.calm-border{border-color:#1aaac3}.assertive,a.assertive{color:#ef4e3a}.assertive-bg{background-color:#ef4e3a}.assertive-border{border-color:#cc2511}.balanced,a.balanced{color:#6c3}.balanced-bg{background-color:#6c3}.balanced-border{border-color:#478f24}.energized,a.energized{color:#f0b840}.energized-bg{background-color:#f0b840}.energized-border{border-color:#d39511}.royal,a.royal{color:#8a6de9}.royal-bg{background-color:#8a6de9}.royal-border{border-color:#552bdf}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}.platform-ios7 .bar-header{height:64px}.platform-ios7 .bar-header>*{margin-top:20px}.platform-ios7 .bar-subheader,.platform-ios7 .has-header{top:64px}.platform-ios7 .has-subheader{top:108px}.platform-android .bar-header{height:48px}.platform-android .bar-subheader,.platform-android .has-header{top:48px}.platform-android .has-subheader{top:96px}.platform-android .title{line-height:48px} \ No newline at end of file diff --git a/dist/css/themes/ionic-ios7.css b/dist/css/themes/ionic-ios7.css index 1e5a055c50..23bcd03921 100644 --- a/dist/css/themes/ionic-ios7.css +++ b/dist/css/themes/ionic-ios7.css @@ -1,4 +1,3 @@ -@charset "UTF-8"; /*! * Copyright 2013 Drifty Co. * http://drifty.com/ diff --git a/dist/css/themes/ionic-ios7.min.css b/dist/css/themes/ionic-ios7.min.css index ad027032bb..720502854f 100644 --- a/dist/css/themes/ionic-ios7.min.css +++ b/dist/css/themes/ionic-ios7.min.css @@ -1,4 +1,4 @@ -@charset "UTF-8";/*! +/*! * Copyright 2013 Drifty Co. * http://drifty.com/ diff --git a/dist/js/angular-ui/angular-ui-router.js b/dist/js/angular-ui/angular-ui-router.js new file mode 100755 index 0000000000..109b5d0531 --- /dev/null +++ b/dist/js/angular-ui/angular-ui-router.js @@ -0,0 +1,1769 @@ +/** + * State-based routing for AngularJS + * @version v0.2.7 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +/* commonjs package manager support (eg componentjs) */ +if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){ + module.exports = 'ui.router'; +} + +(function (window, angular, undefined) { +/*jshint globalstrict:true*/ +/*global angular:false*/ +'use strict'; + +var isDefined = angular.isDefined, + isFunction = angular.isFunction, + isString = angular.isString, + isObject = angular.isObject, + isArray = angular.isArray, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy; + +function inherit(parent, extra) { + return extend(new (extend(function() {}, { prototype: parent }))(), extra); +} + +function merge(dst) { + forEach(arguments, function(obj) { + if (obj !== dst) { + forEach(obj, function(value, key) { + if (!dst.hasOwnProperty(key)) dst[key] = value; + }); + } + }); + return dst; +} + +/** + * Finds the common ancestor path between two states. + * + * @param {Object} first The first state. + * @param {Object} second The second state. + * @return {Array} Returns an array of state names in descending order, not including the root. + */ +function ancestors(first, second) { + var path = []; + + for (var n in first.path) { + if (first.path[n] === "") continue; + if (!second.path[n]) break; + path.push(first.path[n]); + } + return path; +} + +/** + * IE8-safe wrapper for `Object.keys()`. + * + * @param {Object} object A JavaScript object. + * @return {Array} Returns the keys of the object as an array. + */ +function keys(object) { + if (Object.keys) { + return Object.keys(object); + } + var result = []; + + angular.forEach(object, function(val, key) { + result.push(key); + }); + return result; +} + +/** + * IE8-safe wrapper for `Array.prototype.indexOf()`. + * + * @param {Array} array A JavaScript array. + * @param {*} value A value to search the array for. + * @return {Number} Returns the array index value of `value`, or `-1` if not present. + */ +function arraySearch(array, value) { + if (Array.prototype.indexOf) { + return array.indexOf(value, Number(arguments[2]) || 0); + } + var len = array.length >>> 0, from = Number(arguments[2]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + + if (from < 0) from += len; + + for (; from < len; from++) { + if (from in array && array[from] === value) return from; + } + return -1; +} + +/** + * Merges a set of parameters with all parameters inherited between the common parents of the + * current state and a given destination state. + * + * @param {Object} currentParams The value of the current state parameters ($stateParams). + * @param {Object} newParams The set of parameters which will be composited with inherited params. + * @param {Object} $current Internal definition of object representing the current state. + * @param {Object} $to Internal definition of object representing state to transition to. + */ +function inheritParams(currentParams, newParams, $current, $to) { + var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; + + for (var i in parents) { + if (!parents[i].params || !parents[i].params.length) continue; + parentParams = parents[i].params; + + for (var j in parentParams) { + if (arraySearch(inheritList, parentParams[j]) >= 0) continue; + inheritList.push(parentParams[j]); + inherited[parentParams[j]] = currentParams[parentParams[j]]; + } + } + return extend({}, inherited, newParams); +} + +/** + * Normalizes a set of values to string or `null`, filtering them by a list of keys. + * + * @param {Array} keys The list of keys to normalize/return. + * @param {Object} values An object hash of values to normalize. + * @return {Object} Returns an object hash of normalized string values. + */ +function normalize(keys, values) { + var normalized = {}; + + forEach(keys, function (name) { + var value = values[name]; + normalized[name] = (value != null) ? String(value) : null; + }); + return normalized; +} + +/** + * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. + * + * @param {Object} a The first object. + * @param {Object} b The second object. + * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, + * it defaults to the list of keys in `a`. + * @return {Boolean} Returns `true` if the keys match, otherwise `false`. + */ +function equalForKeys(a, b, keys) { + if (!keys) { + keys = []; + for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility + } + + for (var i=0; i ")); + } + visited[key] = VISIT_IN_PROGRESS; + + if (isString(value)) { + plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); + } else { + var params = $injector.annotate(value); + forEach(params, function (param) { + if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); + }); + plan.push(key, value, params); + } + + cycle.pop(); + visited[key] = VISIT_DONE; + } + forEach(invocables, visit); + invocables = cycle = visited = null; // plan is all that's required + + function isResolve(value) { + return isObject(value) && value.then && value.$$promises; + } + + return function (locals, parent, self) { + if (isResolve(locals) && self === undefined) { + self = parent; parent = locals; locals = null; + } + if (!locals) locals = NO_LOCALS; + else if (!isObject(locals)) { + throw new Error("'locals' must be an object"); + } + if (!parent) parent = NO_PARENT; + else if (!isResolve(parent)) { + throw new Error("'parent' must be a promise returned by $resolve.resolve()"); + } + + // To complete the overall resolution, we have to wait for the parent + // promise and for the promise for each invokable in our plan. + var resolution = $q.defer(), + result = resolution.promise, + promises = result.$$promises = {}, + values = extend({}, locals), + wait = 1 + plan.length/3, + merged = false; + + function done() { + // Merge parent values we haven't got yet and publish our own $$values + if (!--wait) { + if (!merged) merge(values, parent.$$values); + result.$$values = values; + result.$$promises = true; // keep for isResolve() + resolution.resolve(values); + } + } + + function fail(reason) { + result.$$failure = reason; + resolution.reject(reason); + } + + // Short-circuit if parent has already failed + if (isDefined(parent.$$failure)) { + fail(parent.$$failure); + return result; + } + + // Merge parent values if the parent has already resolved, or merge + // parent promises and wait if the parent resolve is still in progress. + if (parent.$$values) { + merged = merge(values, parent.$$values); + done(); + } else { + extend(promises, parent.$$promises); + parent.then(done, fail); + } + + // Process each invocable in the plan, but ignore any where a local of the same name exists. + for (var i=0, ii=plan.length; i} invocables functions to invoke or `$injector` services to fetch. + * @param {Object.} [locals] values to make available to the injectables + * @param {Promise.} [parent] a promise returned by another call to `$resolve`. + * @param {Object} [self] the `this` for the invoked methods + * @return {Promise.} Promise for an object that contains the resolved return value + * of all invocables, as well as any inherited and local values. + */ + this.resolve = function (invocables, locals, parent, self) { + return this.study(invocables)(locals, parent, self); + }; +} + +angular.module('ui.router.util').service('$resolve', $Resolve); + + +/** + * Service. Manages loading of templates. + * @constructor + * @name $templateFactory + * @requires $http + * @requires $templateCache + * @requires $injector + */ +$TemplateFactory.$inject = ['$http', '$templateCache', '$injector']; +function $TemplateFactory( $http, $templateCache, $injector) { + + /** + * Creates a template from a configuration object. + * @function + * @name $templateFactory#fromConfig + * @methodOf $templateFactory + * @param {Object} config Configuration object for which to load a template. The following + * properties are search in the specified order, and the first one that is defined is + * used to create the template: + * @param {string|Function} config.template html string template or function to load via + * {@link $templateFactory#fromString fromString}. + * @param {string|Function} config.templateUrl url to load or a function returning the url + * to load via {@link $templateFactory#fromUrl fromUrl}. + * @param {Function} config.templateProvider function to invoke via + * {@link $templateFactory#fromProvider fromProvider}. + * @param {Object} params Parameters to pass to the template function. + * @param {Object} [locals] Locals to pass to `invoke` if the template is loaded via a + * `templateProvider`. Defaults to `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise for that string, + * or `null` if no template is configured. + */ + this.fromConfig = function (config, params, locals) { + return ( + isDefined(config.template) ? this.fromString(config.template, params) : + isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : + isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : + null + ); + }; + + /** + * Creates a template from a string or a function returning a string. + * @function + * @name $templateFactory#fromString + * @methodOf $templateFactory + * @param {string|Function} template html template as a string or function that returns an html + * template as a string. + * @param {Object} params Parameters to pass to the template function. + * @return {string|Promise.} The template html as a string, or a promise for that string. + */ + this.fromString = function (template, params) { + return isFunction(template) ? template(params) : template; + }; + + /** + * Loads a template from the a URL via `$http` and `$templateCache`. + * @function + * @name $templateFactory#fromUrl + * @methodOf $templateFactory + * @param {string|Function} url url of the template to load, or a function that returns a url. + * @param {Object} params Parameters to pass to the url function. + * @return {string|Promise.} The template html as a string, or a promise for that string. + */ + this.fromUrl = function (url, params) { + if (isFunction(url)) url = url(params); + if (url == null) return null; + else return $http + .get(url, { cache: $templateCache }) + .then(function(response) { return response.data; }); + }; + + /** + * Creates a template by invoking an injectable provider function. + * @function + * @name $templateFactory#fromUrl + * @methodOf $templateFactory + * @param {Function} provider Function to invoke via `$injector.invoke` + * @param {Object} params Parameters for the template. + * @param {Object} [locals] Locals to pass to `invoke`. Defaults to `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise for that string. + */ + this.fromProvider = function (provider, params, locals) { + return $injector.invoke(provider, null, locals || { params: params }); + }; +} + +angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); + +/** + * Matches URLs against patterns and extracts named parameters from the path or the search + * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list + * of search parameters. Multiple search parameter names are separated by '&'. Search parameters + * do not influence whether or not a URL is matched, but their values are passed through into + * the matched parameters returned by {@link UrlMatcher#exec exec}. + * + * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace + * syntax, which optionally allows a regular expression for the parameter to be specified: + * + * * ':' name - colon placeholder + * * '*' name - catch-all placeholder + * * '{' name '}' - curly placeholder + * * '{' name ':' regexp '}' - curly placeholder with regexp. Should the regexp itself contain + * curly braces, they must be in matched pairs or escaped with a backslash. + * + * Parameter names may contain only word characters (latin letters, digits, and underscore) and + * must be unique within the pattern (across both path and search parameters). For colon + * placeholders or curly placeholders without an explicit regexp, a path parameter matches any + * number of characters other than '/'. For catch-all placeholders the path parameter matches + * any number of characters. + * + * ### Examples + * + * * '/hello/' - Matches only if the path is exactly '/hello/'. There is no special treatment for + * trailing slashes, and patterns have to match the entire path, not just a prefix. + * * '/user/:id' - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or + * '/user/bob/details'. The second path segment will be captured as the parameter 'id'. + * * '/user/{id}' - Same as the previous example, but using curly brace syntax. + * * '/user/{id:[^/]*}' - Same as the previous example. + * * '/user/{id:[0-9a-fA-F]{1,8}}' - Similar to the previous example, but only matches if the id + * parameter consists of 1 to 8 hex digits. + * * '/files/{path:.*}' - Matches any URL starting with '/files/' and captures the rest of the + * path into the parameter 'path'. + * * '/files/*path' - ditto. + * + * @constructor + * @param {string} pattern the pattern to compile into a matcher. + * + * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any + * URL matching this matcher (i.e. any string for which {@link UrlMatcher#exec exec()} returns + * non-null) will start with this prefix. + */ +function UrlMatcher(pattern) { + + // Find all placeholders and create a compiled pattern, using either classic or curly syntax: + // '*' name + // ':' name + // '{' name '}' + // '{' name ':' regexp '}' + // The regular expression is somewhat complicated due to the need to allow curly braces + // inside the regular expression. The placeholder regexp breaks down as follows: + // ([:*])(\w+) classic placeholder ($1 / $2) + // \{(\w+)(?:\:( ... ))?\} curly brace placeholder ($3) with optional regexp ... ($4) + // (?: ... | ... | ... )+ the regexp consists of any number of atoms, an atom being either + // [^{}\\]+ - anything other than curly braces or backslash + // \\. - a backslash escape + // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms + var placeholder = /([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + names = {}, compiled = '^', last = 0, m, + segments = this.segments = [], + params = this.params = []; + + function addParameter(id) { + if (!/^\w+(-+\w+)*$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); + if (names[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); + names[id] = true; + params.push(id); + } + + function quoteRegExp(string) { + return string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); + } + + this.source = pattern; + + // Split into static segments separated by path parameter placeholders. + // The number of segments is always 1 more than the number of parameters. + var id, regexp, segment; + while ((m = placeholder.exec(pattern))) { + id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null + regexp = m[4] || (m[1] == '*' ? '.*' : '[^/]*'); + segment = pattern.substring(last, m.index); + if (segment.indexOf('?') >= 0) break; // we're into the search part + compiled += quoteRegExp(segment) + '(' + regexp + ')'; + addParameter(id); + segments.push(segment); + last = placeholder.lastIndex; + } + segment = pattern.substring(last); + + // Find any search parameter names and remove them from the last segment + var i = segment.indexOf('?'); + if (i >= 0) { + var search = this.sourceSearch = segment.substring(i); + segment = segment.substring(0, i); + this.sourcePath = pattern.substring(0, last+i); + + // Allow parameters to be separated by '?' as well as '&' to make concat() easier + forEach(search.substring(1).split(/[&?]/), addParameter); + } else { + this.sourcePath = pattern; + this.sourceSearch = ''; + } + + compiled += quoteRegExp(segment) + '$'; + segments.push(segment); + this.regexp = new RegExp(compiled); + this.prefix = segments[0]; +} + +/** + * Returns a new matcher for a pattern constructed by appending the path part and adding the + * search parameters of the specified pattern to this pattern. The current pattern is not + * modified. This can be understood as creating a pattern for URLs that are relative to (or + * suffixes of) the current pattern. + * + * ### Example + * The following two matchers are equivalent: + * ``` + * new UrlMatcher('/user/{id}?q').concat('/details?date'); + * new UrlMatcher('/user/{id}/details?q&date'); + * ``` + * + * @param {string} pattern The pattern to append. + * @return {UrlMatcher} A matcher for the concatenated pattern. + */ +UrlMatcher.prototype.concat = function (pattern) { + // Because order of search parameters is irrelevant, we can add our own search + // parameters to the end of the new pattern. Parse the new pattern by itself + // and then join the bits together, but it's much easier to do this on a string level. + return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch); +}; + +UrlMatcher.prototype.toString = function () { + return this.source; +}; + +/** + * Tests the specified path against this matcher, and returns an object containing the captured + * parameter values, or null if the path does not match. The returned object contains the values + * of any search parameters that are mentioned in the pattern, but their value may be null if + * they are not present in `searchParams`. This means that search parameters are always treated + * as optional. + * + * ### Example + * ``` + * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', { x:'1', q:'hello' }); + * // returns { id:'bob', q:'hello', r:null } + * ``` + * + * @param {string} path The URL path to match, e.g. `$location.path()`. + * @param {Object} searchParams URL search parameters, e.g. `$location.search()`. + * @return {Object} The captured parameter values. + */ +UrlMatcher.prototype.exec = function (path, searchParams) { + var m = this.regexp.exec(path); + if (!m) return null; + + var params = this.params, nTotal = params.length, + nPath = this.segments.length-1, + values = {}, i; + + if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); + + for (i=0; i} An array of parameter names. Must be treated as read-only. If the + * pattern has no parameters, an empty array is returned. + */ +UrlMatcher.prototype.parameters = function () { + return this.params; +}; + +/** + * Creates a URL that matches this pattern by substituting the specified values + * for the path and search parameters. Null values for path parameters are + * treated as empty strings. + * + * ### Example + * ``` + * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' }); + * // returns '/user/bob?q=yes' + * ``` + * + * @param {Object} values the values to substitute for the parameters in this pattern. + * @return {string} the formatted URL (path and optionally search part). + */ +UrlMatcher.prototype.format = function (values) { + var segments = this.segments, params = this.params; + if (!values) return segments.join(''); + + var nPath = segments.length-1, nTotal = params.length, + result = segments[0], i, search, value; + + for (i=0; i= 0) throw new Error("State must have a valid name"); + if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); + + // Get parent name + var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.')) + : (isString(state.parent)) ? state.parent + : ''; + + // If parent is not registered yet, add state to queue and register later + if (parentName && !states[parentName]) { + return queueState(parentName, state.self); + } + + for (var key in stateBuilder) { + if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]); + } + states[name] = state; + + // Register the state in the global state list and with $urlRouter if necessary. + if (!state[abstractKey] && state.url) { + $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { + if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { + $state.transitionTo(state, $match, { location: false }); + } + }]); + } + + // Register any queued children + if (queue[name]) { + for (var i = 0; i < queue[name].length; i++) { + registerState(queue[name][i]); + } + } + + return state; + } + + + // Implicit root state that is always active + root = registerState({ + name: '', + url: '^', + views: null, + 'abstract': true + }); + root.navigable = null; + + + // .decorator() + // .decorator(name) + // .decorator(name, function) + this.decorator = decorator; + function decorator(name, func) { + /*jshint validthis: true */ + if (isString(name) && !isDefined(func)) { + return stateBuilder[name]; + } + if (!isFunction(func) || !isString(name)) { + return this; + } + if (stateBuilder[name] && !stateBuilder.$delegates[name]) { + stateBuilder.$delegates[name] = stateBuilder[name]; + } + stateBuilder[name] = func; + return this; + } + + // .state(state) + // .state(name, state) + this.state = state; + function state(name, definition) { + /*jshint validthis: true */ + if (isObject(name)) definition = name; + else definition.name = name; + registerState(definition); + return this; + } + + // $urlRouter is injected just to ensure it gets instantiated + this.$get = $get; + $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter']; + function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $location, $urlRouter) { + + var TransitionSuperseded = $q.reject(new Error('transition superseded')); + var TransitionPrevented = $q.reject(new Error('transition prevented')); + var TransitionAborted = $q.reject(new Error('transition aborted')); + var TransitionFailed = $q.reject(new Error('transition failed')); + var currentLocation = $location.url(); + + function syncUrl() { + if ($location.url() !== currentLocation) { + $location.url(currentLocation); + $location.replace(); + } + } + + root.locals = { resolve: null, globals: { $stateParams: {} } }; + $state = { + params: {}, + current: root.self, + $current: root, + transition: null + }; + + $state.reload = function reload() { + $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false }); + }; + + $state.go = function go(to, params, options) { + return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options)); + }; + + $state.transitionTo = function transitionTo(to, toParams, options) { + toParams = toParams || {}; + options = extend({ + location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false + }, options || {}); + + var from = $state.$current, fromParams = $state.params, fromPath = from.path; + var evt, toState = findState(to, options.relative); + + if (!isDefined(toState)) { + // Broadcast not found event and abort the transition if prevented + var redirect = { to: to, toParams: toParams, options: options }; + evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams); + if (evt.defaultPrevented) { + syncUrl(); + return TransitionAborted; + } + + // Allow the handler to return a promise to defer state lookup retry + if (evt.retry) { + if (options.$retry) { + syncUrl(); + return TransitionFailed; + } + var retryTransition = $state.transition = $q.when(evt.retry); + retryTransition.then(function() { + if (retryTransition !== $state.transition) return TransitionSuperseded; + redirect.options.$retry = true; + return $state.transitionTo(redirect.to, redirect.toParams, redirect.options); + }, function() { + return TransitionAborted; + }); + syncUrl(); + return retryTransition; + } + + // Always retry once if the $stateNotFound was not prevented + // (handles either redirect changed or state lazy-definition) + to = redirect.to; + toParams = redirect.toParams; + options = redirect.options; + toState = findState(to, options.relative); + if (!isDefined(toState)) { + if (options.relative) throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'"); + throw new Error("No such state '" + to + "'"); + } + } + if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); + if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState); + to = toState; + + var toPath = to.path; + + // Starting from the root of the path, keep all levels that haven't changed + var keep, state, locals = root.locals, toLocals = []; + for (keep = 0, state = toPath[keep]; + state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload; + keep++, state = toPath[keep]) { + locals = toLocals[keep] = state.locals; + } + + // If we're going to the same state and all locals are kept, we've got nothing to do. + // But clear 'transition', as we still want to cancel any other pending transitions. + // TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves, + // because we might accidentally abort a legitimate transition initiated from code? + if (shouldTriggerReload(to, from, locals, options) ) { + if ( to.self.reloadOnSearch !== false ) + syncUrl(); + $state.transition = null; + return $q.when($state.current); + } + + // Normalize/filter parameters before we pass them to event handlers etc. + toParams = normalize(to.params, toParams || {}); + + // Broadcast start event and cancel the transition if requested + if (options.notify) { + evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams); + if (evt.defaultPrevented) { + syncUrl(); + return TransitionPrevented; + } + } + + // Resolve locals for the remaining states, but don't update any global state just + // yet -- if anything fails to resolve the current state needs to remain untouched. + // We also set up an inheritance chain for the locals here. This allows the view directive + // to quickly look up the correct definition for each view in the current state. Even + // though we create the locals object itself outside resolveState(), it is initially + // empty and gets filled asynchronously. We need to keep track of the promise for the + // (fully resolved) current locals, and pass this down the chain. + var resolved = $q.when(locals); + for (var l=keep; l=keep; l--) { + exiting = fromPath[l]; + if (exiting.self.onExit) { + $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals); + } + exiting.locals = null; + } + + // Enter 'to' states not kept + for (l=keep; l').html(template).contents(); + animate.enter(contents, element); + return contents; + } + }, + "false": { + remove: function(element) { element.html(''); }, + restore: function(compiled, element) { element.append(compiled); }, + populate: function(template, element) { + element.html(template); + return element.contents(); + } + } + })[doAnimate.toString()]; + }; + + // Put back the compiled initial view + element.append(initialView); + + // Find the details of the parent view directive (if any) and use it + // to derive our own qualified view name, then hang our own details + // off the DOM so child directives can find it. + var parent = element.parent().inheritedData('$uiView'); + if (name.indexOf('@') < 0) name = name + '@' + (parent ? parent.state.name : ''); + var view = { name: name, state: null }; + element.data('$uiView', view); + + var eventHook = function() { + if (viewIsUpdating) return; + viewIsUpdating = true; + + try { updateView(true); } catch (e) { + viewIsUpdating = false; + throw e; + } + viewIsUpdating = false; + }; + + scope.$on('$stateChangeSuccess', eventHook); + scope.$on('$viewContentLoading', eventHook); + updateView(false); + + function updateView(doAnimate) { + var locals = $state.$current && $state.$current.locals[name]; + if (locals === viewLocals) return; // nothing to do + var render = renderer(animate && doAnimate); + + // Remove existing content + render.remove(element); + + // Destroy previous view scope + if (viewScope) { + viewScope.$destroy(); + viewScope = null; + } + + if (!locals) { + viewLocals = null; + view.state = null; + + // Restore the initial view + return render.restore(initialView, element); + } + + viewLocals = locals; + view.state = locals.$$state; + + var link = $compile(render.populate(locals.$template, element)); + viewScope = scope.$new(); + + if (locals.$$controller) { + locals.$scope = viewScope; + var controller = $controller(locals.$$controller, locals); + element.children().data('$ngControllerController', controller); + } + link(viewScope); + viewScope.$emit('$viewContentLoaded'); + if (onloadExp) viewScope.$eval(onloadExp); + + // TODO: This seems strange, shouldn't $anchorScroll listen for $viewContentLoaded if necessary? + // $anchorScroll might listen on event... + $anchorScroll(); + } + }; + } + }; + return directive; +} + +angular.module('ui.router.state').directive('uiView', $ViewDirective); + +function parseStateRef(ref) { + var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'"); + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function stateContext(el) { + var stateData = el.parent().inheritedData('$uiView'); + + if (stateData && stateData.state && stateData.state.name) { + return stateData.state; + } +} + +$StateRefDirective.$inject = ['$state', '$timeout']; +function $StateRefDirective($state, $timeout) { + return { + restrict: 'A', + require: '?^uiSrefActive', + link: function(scope, element, attrs, uiSrefActive) { + var ref = parseStateRef(attrs.uiSref); + var params = null, url = null, base = stateContext(element) || $state.$current; + var isForm = element[0].nodeName === "FORM"; + var attr = isForm ? "action" : "href", nav = true; + + var update = function(newVal) { + if (newVal) params = newVal; + if (!nav) return; + + var newHref = $state.href(ref.state, params, { relative: base }); + + if (!newHref) { + nav = false; + return false; + } + element[0][attr] = newHref; + if (uiSrefActive) { + uiSrefActive.$$setStateInfo(ref.state, params); + } + }; + + if (ref.paramExpr) { + scope.$watch(ref.paramExpr, function(newVal, oldVal) { + if (newVal !== params) update(newVal); + }, true); + params = scope.$eval(ref.paramExpr); + } + update(); + + if (isForm) return; + + element.bind("click", function(e) { + var button = e.which || e.button; + + if ((button === 0 || button == 1) && !e.ctrlKey && !e.metaKey && !e.shiftKey) { + // HACK: This is to allow ng-clicks to be processed before the transition is initiated: + $timeout(function() { + scope.$apply(function() { + $state.go(ref.state, params, { relative: base }); + }); + }); + e.preventDefault(); + } + }); + } + }; +} + +$StateActiveDirective.$inject = ['$state', '$stateParams', '$interpolate']; +function $StateActiveDirective($state, $stateParams, $interpolate) { + return { + restrict: "A", + controller: function($scope, $element, $attrs) { + var state, params, activeClass; + + // There probably isn't much point in $observing this + activeClass = $interpolate($attrs.uiSrefActive || '', false)($scope); + + // Allow uiSref to communicate with uiSrefActive + this.$$setStateInfo = function(newState, newParams) { + state = $state.get(newState, stateContext($element)); + params = newParams; + update(); + }; + + $scope.$on('$stateChangeSuccess', update); + + // Update route state + function update() { + if ($state.$current.self === state && matchesParams()) { + $element.addClass(activeClass); + } else { + $element.removeClass(activeClass); + } + } + + function matchesParams() { + return !params || equalForKeys(params, $stateParams); + } + } + }; +} + +angular.module('ui.router.state') + .directive('uiSref', $StateRefDirective) + .directive('uiSrefActive', $StateActiveDirective); + +$RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider']; +function $RouteProvider( $stateProvider, $urlRouterProvider) { + + var routes = []; + + onEnterRoute.$inject = ['$$state']; + function onEnterRoute( $$state) { + /*jshint validthis: true */ + this.locals = $$state.locals.globals; + this.params = this.locals.$stateParams; + } + + function onExitRoute() { + /*jshint validthis: true */ + this.locals = null; + this.params = null; + } + + this.when = when; + function when(url, route) { + /*jshint validthis: true */ + if (route.redirectTo != null) { + // Redirect, configure directly on $urlRouterProvider + var redirect = route.redirectTo, handler; + if (isString(redirect)) { + handler = redirect; // leave $urlRouterProvider to handle + } else if (isFunction(redirect)) { + // Adapt to $urlRouterProvider API + handler = function (params, $location) { + return redirect(params, $location.path(), $location.search()); + }; + } else { + throw new Error("Invalid 'redirectTo' in when()"); + } + $urlRouterProvider.when(url, handler); + } else { + // Regular route, configure as state + $stateProvider.state(inherit(route, { + parent: null, + name: 'route:' + encodeURIComponent(url), + url: url, + onEnter: onEnterRoute, + onExit: onExitRoute + })); + } + routes.push(route); + return this; + } + + this.$get = $get; + $get.$inject = ['$state', '$rootScope', '$routeParams']; + function $get( $state, $rootScope, $routeParams) { + + var $route = { + routes: routes, + params: $routeParams, + current: undefined + }; + + function stateAsRoute(state) { + return (state.name !== '') ? state : undefined; + } + + $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) { + $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from)); + }); + + $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) { + $route.current = stateAsRoute(to); + $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from)); + copy(toParams, $route.params); + }); + + $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) { + $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error); + }); + + return $route; + } +} + +angular.module('ui.router.compat') + .provider('$route', $RouteProvider) + .directive('ngView', $ViewDirective); +})(window, window.angular); \ No newline at end of file diff --git a/dist/js/angular-ui/angular-ui-router.min.js b/dist/js/angular-ui/angular-ui-router.min.js new file mode 100755 index 0000000000..fece6d9b91 --- /dev/null +++ b/dist/js/angular-ui/angular-ui-router.min.js @@ -0,0 +1,7 @@ +/** + * State-based routing for AngularJS + * @version v0.2.7 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return E(new(E(function(){},{prototype:a})),b)}function e(a){return D(arguments,function(b){b!==a&&D(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path)if(""!==a.path[d]){if(!b.path[d])break;c.push(a.path[d])}return c}function g(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function h(a,b,c,d){var e,h=f(c,d),i={},j=[];for(var k in h)if(h[k].params&&h[k].params.length){e=h[k].params;for(var l in e)g(j,e[l])>=0||(j.push(e[l]),i[e[l]]=a[e[l]])}return E({},i,b)}function i(a,b){var c={};return D(a,function(a){var d=b[a];c[a]=null!=d?String(d):null}),c}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e "));if(o[c]=d,A(a))m.push(c,[function(){return b.get(a)}],h);else{var e=b.annotate(a);D(e,function(a){a!==c&&g.hasOwnProperty(a)&&k(g[a],a)}),m.push(c,a,e)}n.pop(),o[c]=f}}function l(a){return B(a)&&a.then&&a.$$promises}if(!B(g))throw new Error("'invocables' must be an object");var m=[],n=[],o={};return D(g,k),g=n=o=null,function(d,f,g){function h(){--s||(t||e(r,f.$$values),p.$$values=r,p.$$promises=!0,o.resolve(r))}function k(a){p.$$failure=a,o.reject(a)}function n(c,e,f){function i(a){l.reject(a),k(a)}function j(){if(!y(p.$$failure))try{l.resolve(b.invoke(e,g,r)),l.promise.then(function(a){r[c]=a,h()},i)}catch(a){i(a)}}var l=a.defer(),m=0;D(f,function(a){q.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,q[a].then(function(b){r[a]=b,--m||j()},i))}),m||j(),q[c]=l.promise}if(l(d)&&g===c&&(g=f,f=d,d=null),d){if(!B(d))throw new Error("'locals' must be an object")}else d=i;if(f){if(!l(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=j;var o=a.defer(),p=o.promise,q=p.$$promises={},r=E({},d),s=1+m.length/3,t=!1;if(y(f.$$failure))return k(f.$$failure),p;f.$$values?(t=e(r,f.$$values),h()):(E(q,f.$$promises),f.then(h,k));for(var u=0,v=m.length;v>u;u+=3)d.hasOwnProperty(m[u])?h():n(m[u],m[u+1],m[u+2]);return p}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function m(a,b,c){this.fromConfig=function(a,b,c){return y(a.template)?this.fromString(a.template,b):y(a.templateUrl)?this.fromUrl(a.templateUrl,b):y(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return z(a)?a(b):a},this.fromUrl=function(c,d){return z(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function n(a){function b(b){if(!/^\w+(-+\w+)*$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(f[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");f[b]=!0,j.push(b)}function c(a){return a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&")}var d,e=/([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f={},g="^",h=0,i=this.segments=[],j=this.params=[];this.source=a;for(var k,l,m;(d=e.exec(a))&&(k=d[2]||d[3],l=d[4]||("*"==d[1]?".*":"[^/]*"),m=a.substring(h,d.index),!(m.indexOf("?")>=0));)g+=c(m)+"("+l+")",b(k),i.push(m),h=e.lastIndex;m=a.substring(h);var n=m.indexOf("?");if(n>=0){var o=this.sourceSearch=m.substring(n);m=m.substring(0,n),this.sourcePath=a.substring(0,h+n),D(o.substring(1).split(/[&?]/),b)}else this.sourcePath=a,this.sourceSearch="";g+=c(m)+"$",i.push(m),this.regexp=new RegExp(g),this.prefix=i[0]}function o(){this.compile=function(a){return new n(a)},this.isMatcher=function(a){return B(a)&&z(a.exec)&&z(a.format)&&z(a.concat)},this.$get=function(){return this}}function p(a){function b(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function c(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function d(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return y(d)?d:!0}var e=[],f=null;this.rule=function(a){if(!z(a))throw new Error("'rule' must be a function");return e.push(a),this},this.otherwise=function(a){if(A(a)){var b=a;a=function(){return b}}else if(!z(a))throw new Error("'rule' must be a function");return f=a,this},this.when=function(e,f){var g,h=A(f);if(A(e)&&(e=a.compile(e)),!h&&!z(f)&&!C(f))throw new Error("invalid 'handler' in when()");var i={matcher:function(b,c){return h&&(g=a.compile(c),c=["$match",function(a){return g.format(a)}]),E(function(a,e){return d(a,c,b.exec(e.path(),e.search()))},{prefix:A(b.prefix)?b.prefix:""})},regex:function(a,e){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(g=e,e=["$match",function(a){return c(g,a)}]),E(function(b,c){return d(b,e,a.exec(c.path()))},{prefix:b(a)})}},j={matcher:a.isMatcher(e),regex:e instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](e,f));throw new Error("invalid 'what' in when()")},this.$get=["$location","$rootScope","$injector",function(a,b,c){function d(b){function d(b){var d=b(c,a);return d?(A(d)&&a.replace().url(d),!0):!1}if(!b||!b.defaultPrevented){var g,h=e.length;for(g=0;h>g;g++)if(d(e[g]))return;f&&d(f)}}return b.$on("$locationChangeSuccess",d),{sync:function(){d()}}}]}function q(a,e,f){function g(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){var d=A(a),e=d?a:a.name,f=g(e);if(f){if(!b)throw new Error("No reference point given for path '"+e+"'");for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var l=u[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function m(a,b){v[a]||(v[a]=[]),v[a].push(b)}function n(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!A(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(u.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):A(b.parent)?b.parent:"";if(e&&!u[e])return m(e,b.self);for(var f in x)z(x[f])&&(b[f]=x[f](b,x.$delegates[f]));if(u[c]=b,!b[w]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){t.$current.navigable==b&&j(a,c)||t.transitionTo(b,a,{location:!1})}]),v[c])for(var g=0;g=I;d--)g=u[d],g.self.onExit&&m.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=I;d").html(a).contents();return r.enter(d,c),d}},"false":{remove:function(a){a.html("")},restore:function(a,b){b.append(a)},populate:function(a,b){return b.html(a),b.contents()}}}[a.toString()]};j.append(s);var u=j.parent().inheritedData("$uiView");p.indexOf("@")<0&&(p=p+"@"+(u?u.state.name:""));var v={name:p,state:null};j.data("$uiView",v);var w=function(){if(!h){h=!0;try{m(!0)}catch(a){throw h=!1,a}h=!1}};e.$on("$stateChangeSuccess",w),e.$on("$viewContentLoading",w),m(!1)}}};return i}function t(a){var b=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/);if(!b||4!==b.length)throw new Error("Invalid state ref '"+a+"'");return{state:b[1],paramExpr:b[3]||null}}function u(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function v(a,b){return{restrict:"A",require:"?^uiSrefActive",link:function(c,d,e,f){var g=t(e.uiSref),h=null,i=u(d)||a.$current,j="FORM"===d[0].nodeName,k=j?"action":"href",l=!0,m=function(b){if(b&&(h=b),l){var c=a.href(g.state,h,{relative:i});if(!c)return l=!1,!1;d[0][k]=c,f&&f.$$setStateInfo(g.state,h)}};g.paramExpr&&(c.$watch(g.paramExpr,function(a){a!==h&&m(a)},!0),h=c.$eval(g.paramExpr)),m(),j||d.bind("click",function(d){var e=d.which||d.button;0!==e&&1!=e||d.ctrlKey||d.metaKey||d.shiftKey||(b(function(){c.$apply(function(){a.go(g.state,h,{relative:i})})}),d.preventDefault())})}}}function w(a,b,c){return{restrict:"A",controller:function(d,e,f){function g(){a.$current.self===i&&h()?e.addClass(l):e.removeClass(l)}function h(){return!k||j(k,b)}var i,k,l;l=c(f.uiSrefActive||"",!1)(d),this.$$setStateInfo=function(b,c){i=a.get(b,u(e)),k=c,g()},d.$on("$stateChangeSuccess",g)}}}function x(a,b){function e(a){this.locals=a.locals.globals,this.params=this.locals.$stateParams}function f(){this.locals=null,this.params=null}function g(c,g){if(null!=g.redirectTo){var h,j=g.redirectTo;if(A(j))h=j;else{if(!z(j))throw new Error("Invalid 'redirectTo' in when()");h=function(a,b){return j(a,b.path(),b.search())}}b.when(c,h)}else a.state(d(g,{parent:null,name:"route:"+encodeURIComponent(c),url:c,onEnter:e,onExit:f}));return i.push(g),this}function h(a,b,d){function e(a){return""!==a.name?a:c}var f={routes:i,params:d,current:c};return b.$on("$stateChangeStart",function(a,c,d,f){b.$broadcast("$routeChangeStart",e(c),e(f))}),b.$on("$stateChangeSuccess",function(a,c,d,g){f.current=e(c),b.$broadcast("$routeChangeSuccess",e(c),e(g)),F(d,f.params)}),b.$on("$stateChangeError",function(a,c,d,f,g,h){b.$broadcast("$routeChangeError",e(c),e(f),h)}),f}var i=[];e.$inject=["$$state"],this.when=g,this.$get=h,h.$inject=["$state","$rootScope","$routeParams"]}var y=b.isDefined,z=b.isFunction,A=b.isString,B=b.isObject,C=b.isArray,D=b.forEach,E=b.extend,F=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),l.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",l),m.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",m),n.prototype.concat=function(a){return new n(this.sourcePath+a+this.sourceSearch)},n.prototype.toString=function(){return this.source},n.prototype.exec=function(a,b){var c=this.regexp.exec(a);if(!c)return null;var d,e=this.params,f=e.length,g=this.segments.length-1,h={};if(g!==c.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(d=0;g>d;d++)h[e[d]]=c[d+1];for(;f>d;d++)h[e[d]]=b[e[d]];return h},n.prototype.parameters=function(){return this.params},n.prototype.format=function(a){var b=this.segments,c=this.params;if(!a)return b.join("");var d,e,f,g=b.length-1,h=c.length,i=b[0];for(d=0;g>d;d++)f=a[c[d]],null!=f&&(i+=encodeURIComponent(f)),i+=b[d+1];for(;h>d;d++)f=a[c[d]],null!=f&&(i+=(e?"&":"?")+c[d]+"="+encodeURIComponent(f),e=!0);return i},b.module("ui.router.util").provider("$urlMatcherFactory",o),p.$inject=["$urlMatcherFactoryProvider"],b.module("ui.router.router").provider("$urlRouter",p),q.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider","$locationProvider"],b.module("ui.router.state").value("$stateParams",{}).provider("$state",q),r.$inject=[],b.module("ui.router.state").provider("$view",r),s.$inject=["$state","$compile","$controller","$injector","$anchorScroll"],b.module("ui.router.state").directive("uiView",s),v.$inject=["$state","$timeout"],w.$inject=["$state","$stateParams","$interpolate"],b.module("ui.router.state").directive("uiSref",v).directive("uiSrefActive",w),x.$inject=["$stateProvider","$urlRouterProvider"],b.module("ui.router.compat").provider("$route",x).directive("ngView",s)}(window,window.angular); \ No newline at end of file diff --git a/dist/js/ionic-angular.js b/dist/js/ionic-angular.js index 13e3380a25..26f693f04b 100644 --- a/dist/js/ionic-angular.js +++ b/dist/js/ionic-angular.js @@ -1,8 +1,8 @@ /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -22,7 +22,8 @@ angular.module('ionic.service', [ 'ionic.service.loading', 'ionic.service.modal', 'ionic.service.popup', - 'ionic.service.templateLoad' + 'ionic.service.templateLoad', + 'ionic.service.view' ]); // UI specific services and delegates @@ -34,7 +35,7 @@ angular.module('ionic.ui', [ 'ionic.ui.content', 'ionic.ui.scroll', 'ionic.ui.tabs', - 'ionic.ui.navRouter', + 'ionic.ui.viewState', 'ionic.ui.header', 'ionic.ui.sideMenu', 'ionic.ui.slideBox', @@ -54,7 +55,8 @@ angular.module('ionic', [ 'ngAnimate', 'ngRoute', 'ngTouch', - 'ngSanitize' + 'ngSanitize', + 'ui.router' ]); ; (function() { @@ -333,9 +335,10 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ngAnimate' return modal; }, fromTemplateUrl: function(url, cb, options) { - TemplateLoader.load(url).then(function(templateString) { + return TemplateLoader.load(url).then(function(templateString) { var modal = createModal(templateString, options || {}); - cb(modal); + cb ? cb(modal) : null; + return modal; }); }, }; @@ -516,6 +519,382 @@ angular.module('ionic.service.templateLoad', []) }; }]); ; +angular.module('ionic.service.view', ['ui.router']) + + +.run( ['$rootScope', '$state', '$location', '$document', + function( $rootScope, $state, $location, $document) { + + // init the variables that keep track of the view history + $rootScope.$viewHistory = { + histories: { root: { historyId: 'root', parentHistoryId: null, stack: [], cursor: -1 } }, + backView: null, + forwardView: null, + currentView: null + }; + + $rootScope.$on('viewState.changeHistory', function(e, data) { + if(!data) return; + + var hist = (data.historyId ? $rootScope.$viewHistory.histories[ data.historyId ] : null ); + if(hist && hist.cursor > -1 && hist.cursor < hist.stack.length) { + // the history they're going to already exists + // go to it's last view in its stack + var view = hist.stack[ hist.cursor ]; + return view.go(data); + } + + // this history does not have a URL, but it does have a uiSref + // figure out its URL from the uiSref + if(!data.url && data.uiSref) { + data.url = $state.href(data.uiSref); + } + + if(data.url) { + // don't let it start with a #, messes with $location.url() + if(data.url.indexOf('#') === 0) { + data.url = data.url.replace('#', ''); + } + if(data.url !== $location.url()) { + // we've got a good URL, ready GO! + $location.url(data.url); + } + } + }); + + // Set the document title when a new view is shown + $rootScope.$on('viewState.viewEnter', function(e, data) { + if(data && data.title) { + $document[0].title = data.title; + } + }); + +}]) + +.factory('ViewService', ['$rootScope', '$state', '$location', '$window', '$injector', + function( $rootScope, $state, $location, $window, $injector) { + var $animate = $injector.has('$animate') ? $injector.get('$animate') : false; + + var View = function(){}; + View.prototype.initialize = function(data) { + if(data) { + for(var name in data) this[name] = data[name]; + return this; + } + return null; + }; + View.prototype.go = function(opts) { + if(this.url && this.url !== $location.url() && (!opts || opts.enableUrlChange !== false)) { + + if($rootScope.$viewHistory.backView === this) { + return $window.history.go(-1); + } else if($rootScope.$viewHistory.forwardView === this) { + return $window.history.go(1); + } + + return $location.url(this.url); + } + + if(this.stateName) { + return $state.go(this.stateName, this.stateParams); + } + + return null; + }; + View.prototype.destory = function() { + if(this.scope) { + this.scope.destory && this.scope.destory(); + this.scope = null; + } + }; + + function createViewId(stateId) { + return ('_' + stateId + '_' + Math.round(Math.random() * 99999999)).replace(/\./g, '_'); + } + + return { + + register: function(containerScope) { + var viewHistory = $rootScope.$viewHistory, + currentStateId = this.getCurrentStateId(), + hist = this._getHistory(containerScope), + currentView = viewHistory.currentView, + backView = viewHistory.backView, + forwardView = viewHistory.forwardView, + rsp = { + viewId: null, + navAction: null, + navDirection: null, + historyId: hist.historyId + }; + + if(currentView && + currentView.stateId === currentStateId && + currentView.historyId === hist.historyId) { + // do nothing if its the same stateId in the same history + rsp.navAction = 'noChange'; + return rsp; + } + + if(backView && backView.stateId === currentStateId) { + // they went back one, set the old current view as a forward view + rsp.viewId = backView.viewId; + rsp.navAction = 'moveBack'; + if(backView.historyId === currentView.historyId) { + // went back in the same history + rsp.navDirection = 'back'; + } + + } else if(forwardView && forwardView.stateId === currentStateId) { + // they went to the forward one, set the forward view to no longer a forward view + rsp.viewId = forwardView.viewId; + rsp.navAction = 'moveForward'; + if(forwardView.historyId === currentView.historyId) { + rsp.navDirection = 'forward'; + } + + var parentHistory = this._getParentHistoryObj(containerScope); + if(forwardView.historyId && parentHistory.scope) { + // if a history has already been created by the forward view then make sure it stays the same + parentHistory.scope.$historyId = forwardView.historyId; + rsp.historyId = forwardView.historyId; + } + + } else { + + // set a new unique viewId + rsp.viewId = createViewId(currentStateId); + + if(currentView) { + // set the forward view if there is a current view (ie: if its not the first view) + currentView.forwardViewId = rsp.viewId; + + // its only moving forward if its in the same history + if(hist.historyId === currentView.historyId) { + rsp.navDirection = 'forward'; + } + rsp.navAction = 'newView'; + + // check if there is a new forward view + if(forwardView && currentView.stateId !== forwardView.stateId) { + // they navigated to a new view but the stack already has a forward view + // since its a new view remove any forwards that existed + var forwardsHistory = this._getView(forwardView.historyId); + if(forwardsHistory) { + // the forward has a history + for(var x=forwardsHistory.stack.length - 1; x >= forwardView.index; x--) { + // starting from the end destory all forwards in this history from this point + forwardsHistory.stack[x].destory(); + forwardsHistory.stack.splice(x); + } + } + } + + } else { + // there's no current view, so this must be the initial view + rsp.navAction = 'initialView'; + } + + // add the new view to the stack + viewHistory.histories[rsp.viewId] = this.createView({ + viewId: rsp.viewId, + index: hist.stack.length, + historyId: hist.historyId, + backViewId: (currentView && currentView.viewId ? currentView.viewId : null), + forwardViewId: null, + stateId: currentStateId, + stateName: this.getCurrentStateName(), + stateParams: this.getCurrentStateParams(), + url: $location.url() + }); + + // add the new view to this history's stack + hist.stack.push(viewHistory.histories[rsp.viewId]); + } + + viewHistory.currentView = this._getView(rsp.viewId); + viewHistory.backView = this._getBackView(viewHistory.currentView); + viewHistory.forwardView = this._getForwardView(viewHistory.currentView); + + hist.cursor = viewHistory.currentView.index; + + return rsp; + }, + + registerHistory: function(scope) { + scope.$historyId = 'h' + Math.round(Math.random() * 99999999999); + }, + + createView: function(data) { + var newView = new View(); + return newView.initialize(data); + }, + + getCurrentView: function() { + return $rootScope.$viewHistory.currentView; + }, + + getBackView: function() { + return $rootScope.$viewHistory.backView; + }, + + getForwardView: function() { + return $rootScope.$viewHistory.forwardView; + }, + + getNavDirection: function() { + return $rootScope.$viewHistory.navDirection; + }, + + getCurrentStateName: function() { + return ($state && $state.current ? $state.current.name : null); + }, + + isCurrentStateNavView: function(navView) { + return ($state && + $state.current && + $state.current.views && + $state.current.views[navView] ? true : false); + }, + + getCurrentStateParams: function() { + var rtn; + if ($state && $state.params) { + for(var key in $state.params) { + if($state.params.hasOwnProperty(key)) { + rtn = rtn || {}; + rtn[key] = $state.params[key]; + } + } + } + return rtn; + }, + + getCurrentStateId: function() { + var id; + if($state && $state.current && $state.current.name) { + id = $state.current.name; + if($state.params) { + for(var key in $state.params) { + if($state.params.hasOwnProperty(key) && $state.params[key]) { + id += "_" + key + "=" + $state.params[key]; + } + } + } + return id; + } + // if something goes wrong make sure its got a unique stateId + return 'r' + Math.round(Math.random() * 9999999); + }, + + _getView: function(viewId) { + return (viewId ? $rootScope.$viewHistory.histories[ viewId ] : null ); + }, + + _getBackView: function(view) { + return (view ? this._getView(view.backViewId) : null ); + }, + + _getForwardView: function(view) { + return (view ? this._getView(view.forwardViewId) : null ); + }, + + _getHistory: function(scope) { + var histObj = this._getParentHistoryObj(scope); + + if( !$rootScope.$viewHistory.histories[ histObj.historyId ] ) { + // this history object exists in parent scope, but doesn't + // exist in the history data yet + $rootScope.$viewHistory.histories[ histObj.historyId ] = { + historyId: histObj.historyId, + parentHistoryId: this._getParentHistoryObj(histObj.scope.$parent).historyId, + stack: [], + cursor: -1 + }; + } + + return $rootScope.$viewHistory.histories[ histObj.historyId ]; + }, + + _getParentHistoryObj: function(scope) { + var parentScope = scope; + while(parentScope) { + if(parentScope.hasOwnProperty('$historyId')) { + // this parent scope has a historyId + return { historyId: parentScope.$historyId, scope: parentScope }; + } + // nothing found keep climbing up + parentScope = parentScope.$parent; + } + // no history for for the parent, use the root + return { historyId: 'root', scope: $rootScope }; + }, + + transition: function(opts) { + if(!opts || !opts.enteringElement) return; + + if (opts.leavingScope) { + opts.leavingScope.$destroy(); + opts.leavingScope = null; + } + + // use the directive's animation attribute first + // if it doesn't exist, then use the given animation + var animationClass = opts.animation || getAnimationClass(); + + if($animate && animationClass && opts.doAnimation !== false && opts.navDirection) { + // set the animation we're gonna use + this.setAnimationClass(opts.parentElement, animationClass, opts.navDirection); + + // start the animations + if(opts.leavingElement) { + $animate.leave(opts.leavingElement); + } + $animate.enter(opts.enteringElement, opts.parentElement); + + } else { + // no animation, just plain ol' add/remove DOM elements + if(opts.leavingElement) { + opts.leavingElement.remove(); + } + opts.parentElement.append(opts.enteringElement); + } + + $rootScope.$broadcast('viewState.viewEnter', { + title: (opts.enteringScope ? opts.enteringScope.title : null), + navDirection: (opts.navDirection ? opts.navDirection : null) + }); + + function getAnimationClass(){ + // go up the ancestors looking for an animation value + var climbScope = opts.enteringScope; + while(climbScope) { + if(climbScope.animation) { + return climbScope.animation; + } + climbScope = climbScope.$parent; + } + } + }, + + setAnimationClass: function(element, animationClass, navDirection) { + // add the animation we're gonna use + element[0].classList.add(animationClass); + + if(navDirection === 'back') { + // animate backward + element[0].classList.add('reverse'); + } else { + // defaults to animate forward + // make sure the reverse class isn't already added + element[0].classList.remove('reverse'); + } + } + + }; + +}]); +; (function() { 'use strict'; @@ -745,24 +1124,25 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) scrollbarY: '@', scrollEventInterval: '@' }, + compile: function(element, attr, transclude) { - return function($scope, $element, $attr) { + if(attr.hasHeader == "true") { element.addClass('has-header'); } + if(attr.hasSubheader == "true") { element.addClass('has-subheader'); } + if(attr.hasFooter == "true") { element.addClass('has-footer'); } + if(attr.hasTabs == "true") { element.addClass('has-tabs'); } + + return function link($scope, $element, $attr) { var clone, sc, sv, addedPadding = false, c = $element.eq(0); - if(attr.hasHeader == "true") { c.addClass('has-header'); } - if(attr.hasSubheader == "true") { c.addClass('has-subheader'); } - if(attr.hasFooter == "true") { c.addClass('has-footer'); } - if(attr.hasTabs == "true") { c.addClass('has-tabs'); } - // If they want plain overflow scrolling, add that as a class if($scope.scroll === "false") { clone = transclude($scope.$parent); $element.append(clone); } else if(attr.overflowScroll === "true") { c.addClass('overflow-scroll'); - clone = transclude($scope.$parent); + clone = transclude($scope.$parent); $element.append(clone); } else { sc = document.createElement('div'); @@ -790,7 +1170,6 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) }; } - // Otherwise, supercharge this baby! $timeout(function() { sv = new ionic.views.Scroll({ @@ -825,7 +1204,6 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // Register for scroll delegate event handling ScrollDelegate.register($scope, $element); - // Let child scopes access this $scope.$parent.scrollView = sv; }); @@ -1072,419 +1450,6 @@ angular.module('ionic.ui.loading', []) }; }); -})(); -; -(function() { -'use strict'; - -/** - * @description - * The NavController is a navigation stack View Controller modelled off of - * UINavigationController from Cocoa Touch. With the Nav Controller, you can - * "push" new "pages" on to the navigation stack, and then pop them off to go - * back. The NavController controls a navigation bar with a back button and title - * which updates as the pages switch. - * - * The NavController makes sure to not recycle scopes of old pages - * so that a pop will still show the same state that the user left. - * - * However, once a page is popped, its scope is destroyed and will have to be - * recreated then next time it is pushed. - * - */ - -var actualLocation = null; - -angular.module('ionic.ui.navRouter', ['ionic.service.gesture']) - -.run(['$rootScope', function($rootScope) { - $rootScope.stackCursorPosition = 0; -}]) - -.directive('navRouter', ['$rootScope', '$timeout', '$location', '$window', '$route', function($rootScope, $timeout, $location, $window, $route) { - return { - restrict: 'AC', - // So you can require being under this - controller: ['$scope', '$element', function($scope, $element) { - this.navBar = { - isVisible: false - }; - $scope.navController = this; - - this.goBack = function() { - $scope.direction = 'back'; - }; - }], - - link: function($scope, $element, $attr, ctrl) { - if(!$element.length) return; - - $scope.animation = $attr.animation; - - $element[0].classList.add('noop-animation'); - - var isFirst = true; - // Store whether we did an animation yet, to know if - // we should let the first state animate - var didAnimate = false; - - var initTransition = function() { - //$element.addClass($scope.animation); - }; - - var reverseTransition = function() { - $element[0].classList.remove('noop-animation'); - $element[0].classList.add($scope.animation); - $element[0].classList.add('reverse'); - }; - - var forwardTransition = function() { - $element[0].classList.remove('noop-animation'); - $element[0].classList.remove('reverse'); - $element[0].classList.add($scope.animation); - }; - - $scope.$on('$routeChangeSuccess', function(e, a) { - }); - $scope.$on('$routeChangeStart', function(e, next, current) { - var back, historyState = $window.history.state; - - back = $scope.direction == 'back' || (!!(historyState && historyState.position <= $rootScope.stackCursorPosition)); - - if(isFirst || (next && next.$$route && next.$$route.originalPath === "")) { - // Don't animate - isFirst = false; - return; - } - - if(didAnimate || $rootScope.stackCursorPosition > 0) { - didAnimate = true; - if(back) { - reverseTransition(); - } else { - forwardTransition(); - } - } - }); - - $scope.$on('$locationChangeSuccess', function(a, b, c) { - // Store the new location - $rootScope.actualLocation = $location.path(); - if(isFirst && $location.path() !== '/') { - isFirst = false; - } - }); - - $scope.$on('navRouter.goBack', function(e) { - ctrl.goBack(); - }); - - - // Keep track of location changes and update a stack pointer that tracks whether we are - // going forwards or back - $scope.$watch(function () { return $location.path(); }, function (newLocation, oldLocation) { - if($rootScope.actualLocation === newLocation) { - if(oldLocation === '') {// || newLocation == '/') { - // initial route, skip this - return; - } - - var back, historyState = $window.history.state; - - back = $scope.direction == 'back' || (!!(historyState && historyState.position <= $rootScope.stackCursorPosition)); - - if (back) { - //back button - $rootScope.stackCursorPosition--; - } else { - //forward button - $rootScope.stackCursorPosition++; - } - - $scope.direction = 'forwards'; - - } else { - var currentRouteBeforeChange = $route.current; - - if (currentRouteBeforeChange) { - - $window.history.replaceState({ - position: $rootScope.stackCursorPosition - }); - - $rootScope.stackCursorPosition++; - } - } - }); - } - }; -}]) - -/** - * Our Nav Bar directive which updates as the controller state changes. - */ -.directive('navBar', ['$rootScope', '$animate', '$compile', function($rootScope, $animate, $compile) { - - /** - * Perform an animation between one tab bar state and the next. - * Right now this just animates the titles. - */ - var animate = function($scope, $element, oldTitle, data, cb) { - var title, nTitle, oTitle, titles = $element[0].querySelectorAll('.title'); - - var newTitle = data.title; - if(!oldTitle || oldTitle === newTitle) { - cb(); - return; - } - - // Clone the old title and add a new one so we can show two animating in and out - // add ng-leave and ng-enter during creation to prevent flickering when they are swapped during animation - title = angular.element(titles[0]); - oTitle = $compile('

')($scope); - title.replaceWith(oTitle); - nTitle = $compile('

')($scope); - - var insert = $element[0].firstElementChild || null; - - // Insert the new title - $animate.enter(nTitle, $element, insert && angular.element(insert), function() { - cb(); - }); - - // Remove the old title - $animate.leave(angular.element(oTitle), function() { - }); - }; - - return { - restrict: 'E', - require: '^navRouter', - replace: true, - scope: { - type: '@', - backButtonType: '@', - backButtonLabel: '@', - backButtonIcon: '@', - alignTitle: '@' - }, - template: '', - link: function($scope, $element, $attr, navCtrl) { - var backButton; - - $element.addClass($attr.animation); - - // Create the back button content and show/hide it based on scope settings - $scope.enableBackButton = true; - $scope.backButtonClass = $attr.backButtonType; - if($attr.backButtonIcon) { - $scope.backButtonClass += ' icon ' + $attr.backButtonIcon; - } - - // Listen for changes in the stack cursor position to indicate whether a back - // button should be shown (this can still be disabled by the $scope.enableBackButton - $rootScope.$watch('stackCursorPosition', function(value) { - if(value > 0) { - $scope.showBackButton = true; - } else { - $scope.showBackButton = false; - } - }); - - // Store a reference to our nav controller - $scope.navController = navCtrl; - - // Initialize our header bar view which will handle resizing and aligning our title labels - var hb = new ionic.views.HeaderBar({ - el: $element[0], - alignTitle: $scope.alignTitle || 'center' - }); - $scope.headerBarView = hb; - - // Add the type of header bar class to this element - $element.addClass($scope.type); - - var updateHeaderData = function(data) { - var oldTitle = $scope.currentTitle; - $scope.oldTitle = oldTitle; - - if(typeof data.title !== 'undefined') { - $scope.currentTitle = data.title; - } - - $scope.leftButtons = data.leftButtons; - $scope.rightButtons = data.rightButtons; - - if(typeof data.hideBackButton !== 'undefined') { - $scope.enableBackButton = data.hideBackButton !== true; - } - - if(data.animate !== false && typeof data.title !== 'undefined') { - animate($scope, $element, oldTitle, data, function() { - hb.align(); - }); - } else { - hb.align(); - } - }; - - $scope.$parent.$on('navRouter.showBackButton', function(e, data) { - $scope.enableBackButton = true; - }); - - $scope.$parent.$on('navRouter.hideBackButton', function(e, data) { - $scope.enableBackButton = false; - }); - - // Listen for changes on title change, and update the title - $scope.$parent.$on('navRouter.pageChanged', function(e, data) { - updateHeaderData(data); - }); - - $scope.$parent.$on('navRouter.pageShown', function(e, data) { - updateHeaderData(data); - }); - - $scope.$parent.$on('navRouter.titleChanged', function(e, data) { - var oldTitle = $scope.currentTitle; - $scope.oldTitle = oldTitle; - - if(typeof data.title !== 'undefined') { - $scope.currentTitle = data.title; - } - - if(data.animate !== false && typeof data.title !== 'undefined') { - animate($scope, $element, oldTitle, data, function() { - hb.align(); - }); - } else { - hb.align(); - } - }); - - // If a nav page changes the left or right buttons, update our scope vars - $scope.$parent.$on('navRouter.leftButtonsChanged', function(e, data) { - $scope.leftButtons = data; - }); - $scope.$parent.$on('navRouter.rightButtonsChanged', function(e, data) { - $scope.rightButtons = data; - }); - - /* - $scope.$parent.$on('navigation.push', function() { - backButton = angular.element($element[0].querySelector('.button')); - backButton.addClass($scope.backButtonType); - hb.align(); - }); - $scope.$parent.$on('navigation.pop', function() { - hb.align(); - }); - */ - - $scope.$on('$destroy', function() { - // - }); - } - }; -}]) - -.directive('navPage', ['$parse', function($parse) { - return { - restrict: 'E', - require: '^navRouter', - scope: { - leftButtons: '=', - rightButtons: '=', - title: '=', - icon: '@', - iconOn: '@', - iconOff: '@', - type: '@', - alignTitle: '@', - hideBackButton: '@', - hideNavBar: '@', - animate: '@', - }, - link: function($scope, $element, $attr, navCtrl) { - $element.addClass('pane'); - - // Should we hide a back button when this tab is shown - $scope.hideBackButton = $scope.$eval($scope.hideBackButton); - - $scope.hideNavBar = $scope.$eval($scope.hideNavBar); - - navCtrl.navBar.isVisible = !$scope.hideNavBar; - - if($scope.hideBackButton === true) { - $scope.$emit('navRouter.hideBackButton'); - } else { - $scope.$emit('navRouter.showBackButton'); - } - - // Whether we should animate on tab change, also impacts whether we - // tell any parent nav controller to animate - $scope.animate = $scope.$eval($scope.animate); - - - // watch for changes in the left buttons - $scope.$watch('leftButtons', function(value) { - $scope.$emit('navRouter.leftButtonsChanged', $scope.leftButtons); - }); - - $scope.$watch('rightButtons', function(val) { - $scope.$emit('navRouter.rightButtonsChanged', $scope.rightButtons); - }); - - /* - $scope.$watch('hideBackButton', function(value) { - if(value === true) { - navCtrl.hideBackButton(); - } else { - navCtrl.showBackButton(); - } - }); - */ - - // watch for changes in the title - $scope.$watch('title', function(value) { - $scope.$emit('navRouter.titleChanged', { - title: value, - animate: $scope.animate - }); - }); - } - }; -}]) - -.directive('navBack', ['$window', '$rootScope', 'Gesture', function($window, $rootScope, Gesture) { - return { - restrict: 'AC', - link: function($scope, $element, $attr, navCtrl) { - var goBack = function(e) { - // Only trigger back if the stack is greater than zero - if($rootScope.stackCursorPosition > 0) { - $window.history.back(); - - // Fallback for bad history supporting devices - $scope.$emit('navRouter.goBack'); - } - e.alreadyHandled = true; - return false; - }; - $element.bind('click', goBack); - } - }; -}]); - })(); ; (function(ionic) { @@ -2050,7 +2015,7 @@ angular.module('ionic.ui.slideBox', []) })(); ; -angular.module('ionic.ui.tabs', ['ngAnimate']) +angular.module('ionic.ui.tabs', ['ionic.service.view']) /** * @description @@ -2059,15 +2024,19 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) * on a tab bar. Modelled off of UITabBarController. */ -.directive('tabs', function() { +.directive('tabs', [function() { return { restrict: 'E', replace: true, scope: true, transclude: true, - controller: ['$scope', '$element', '$animate', function($scope, $element, $animate) { + controller: ['$scope', '$element', function($scope, $element) { var _this = this; + $scope.tabCount = 0; + $scope.selectedIndex = -1; + $scope.$enableViewRegister = false; + angular.extend(this, ionic.controllers.TabBarController.prototype); @@ -2087,24 +2056,55 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) } }); - this.add = function(controller) { - this.addController(controller); - this.select(0); + this.add = function(tabScope) { + tabScope.tabIndex = $scope.tabCount; + this.addController(tabScope); + if(tabScope.tabIndex === 0) { + this.select(0); + } + $scope.tabCount++; }; - this.select = function(controllerIndex) { - $scope.activeAnimation = $scope.animation; - _this.selectController(controllerIndex); + this.select = function(tabIndex, emitChange) { + if(tabIndex !== $scope.selectedIndex) { + + $scope.selectedIndex = tabIndex; + $scope.activeAnimation = $scope.animation; + _this.selectController(tabIndex); + + var viewData = { + type: 'tab', + typeIndex: tabIndex + }; + + for(var x=0; x', + compile: function(element, attr, transclude, tabsCtrl) { - return function($scope, $element, $attr) { + return function link($scope, $element, $attr) { + var tabs = $element[0].querySelector('.tabs'); $scope.tabsType = $attr.tabsType || 'tabs-positive'; @@ -2135,26 +2135,35 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) transclude($scope, function(cloned) { $element.prepend(cloned); }); + }; } }; -}) +}]) // Generic controller directive -.directive('tab', ['$animate', '$parse', function($animate, $parse) { +.directive('tab', ['ViewService', '$rootScope', '$animate', '$parse', function(ViewService, $rootScope, $animate, $parse) { return { restrict: 'E', require: '^tabs', scope: true, transclude: 'element', compile: function(element, attr, transclude) { - return function($scope, $element, $attr, tabsCtrl) { + + return function link($scope, $element, $attr, tabsCtrl) { var childScope, childElement; + ViewService.registerHistory($scope); + $scope.title = $attr.title; $scope.icon = $attr.icon; $scope.iconOn = $attr.iconOn; $scope.iconOff = $attr.iconOff; + $scope.viewSref = $attr.uiSref; + $scope.url = $attr.href; + if($scope.url && $scope.url.indexOf('#') === 0) { + $scope.url = $scope.url.replace('#', ''); + } // Should we hide a back button when this tab is shown $scope.hideBackButton = $scope.$eval($attr.hideBackButton); @@ -2167,17 +2176,11 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) // tell any parent nav controller to animate $scope.animate = $scope.$eval($attr.animate); - // Grab whether we should update any parent nav router on tab changes - $scope.doesUpdateNavRouter = $scope.$eval($attr.doesUpdateNavRouter); - if($scope.doesUpdateNavRouter !== false) { - $scope.doesUpdateNavRouter = true; - } - var leftButtonsGet = $parse($attr.leftButtons); $scope.$watch(leftButtonsGet, function(value) { $scope.leftButtons = value; if($scope.doesUpdateNavRouter) { - $scope.$emit('navRouter.leftButtonsChanged', $scope.rightButtons); + $scope.$emit('viewState.leftButtonsChanged', $scope.rightButtons); } }); @@ -2187,7 +2190,7 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) }); tabsCtrl.add($scope); - + $scope.$watch('isVisible', function(value) { if(childElement) { $animate.leave(childElement); @@ -2207,23 +2210,32 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) $animate.enter(clone, $element.parent(), $element); - if($scope.title) { - // Send the title up in case we are inside of a nav controller - if($scope.doesUpdateNavRouter) { - $scope.$emit('navRouter.pageShown', { - title: $scope.title, - rightButtons: $scope.rightButtons, - leftButtons: $scope.leftButtons, - hideBackButton: $scope.hideBackButton, - animate: $scope.animateNav - }); - } - //$scope.$emit('navRouter.titleChanged', $scope.title); - } $scope.$broadcast('tab.shown'); }); } }); + + // check if it has a ui-view in it + transclude($scope.$new(), function(clone) { + var navViewEle = clone[0].getElementsByTagName("nav-view"); + $scope.hasNavView = (navViewEle.length > 0); + if($scope.hasNavView) { + // this tab has a ui-view + $scope.navViewName = navViewEle[0].getAttribute('name'); + if( ViewService.isCurrentStateNavView( $scope.navViewName ) ) { + // this tab's ui-view is the current one, go to it! + tabsCtrl.select($scope.tabIndex); + } + } + }); + + $rootScope.$on('$stateChangeSuccess', function(value){ + if( ViewService.isCurrentStateNavView($scope.navViewName) && + $scope.tabIndex !== tabsCtrl.selectedIndex) { + tabsCtrl.select($scope.tabIndex); + } + }); + }; } }; @@ -2238,7 +2250,7 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) replace: true, scope: true, template: '
' + - '' + + '' + '
', link: function($scope, $element, $attr, tabsCtrl) { $element.addClass($scope.tabsType); @@ -2247,13 +2259,13 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) }; }) -.directive('tabControllerItem', function() { +.directive('tabControllerItem', ['$window', function($window) { return { restrict: 'E', replace: true, require: '^tabs', scope: { - title: '@', + iconTitle: '@', icon: '@', iconOn: '@', iconOff: '@', @@ -2265,26 +2277,26 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) if(attrs.icon) { scope.iconOn = scope.iconOff = attrs.icon; } - scope.selectTab = function(index) { - tabsCtrl.select(scope.index); + + scope.selectTab = function() { + tabsCtrl.select(scope.index, true); }; }, template: '' + - '' + + '' + '' + - ' {{title}}' + + ' {{iconTitle}}' + '' }; -}) +}]) .directive('tabBar', function() { return { restrict: 'E', replace: true, transclude: true, - template: '
' + - '
' + template: '
' }; }); @@ -2337,6 +2349,345 @@ angular.module('ionic.ui.toggle', []) (function() { 'use strict'; +/** + * @description + * The NavController is a navigation stack View Controller modelled off of + * UINavigationController from Cocoa Touch. With the Nav Controller, you can + * "push" new "pages" on to the navigation stack, and then pop them off to go + * back. The NavController controls a navigation bar with a back button and title + * which updates as the pages switch. + * + * The NavController makes sure to not recycle scopes of old pages + * so that a pop will still show the same state that the user left. + * + * However, once a page is popped, its scope is destroyed and will have to be + * recreated then next time it is pushed. + * + */ + +angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gesture']) + +/** + * Our Nav Bar directive which updates as the controller state changes. + */ +.directive('navBar', ['ViewService', '$rootScope', '$animate', '$compile', + function( ViewService, $rootScope, $animate, $compile) { + + /** + * Perform an animation between one tab bar state and the next. + * Right now this just animates the titles. + */ + var animate = function($scope, $element, oldTitle, data, cb) { + var title, nTitle, oTitle, titles = $element[0].querySelectorAll('.title'); + + var newTitle = data.title; + if(!oldTitle || oldTitle === newTitle) { + cb(); + return; + } + + // Clone the old title and add a new one so we can show two animating in and out + // add ng-leave and ng-enter during creation to prevent flickering when they are swapped during animation + title = angular.element(titles[0]); + oTitle = $compile('

')($scope); + title.replaceWith(oTitle); + nTitle = $compile('

')($scope); + + var insert = $element[0].firstElementChild || null; + + // Insert the new title + $animate.enter(nTitle, $element, insert && angular.element(insert), function() { + cb(); + }); + + // Remove the old title + $animate.leave(angular.element(oTitle), function() { + }); + }; + + return { + restrict: 'E', + replace: true, + scope: { + type: '@', + backButtonType: '@', + backButtonLabel: '@', + backButtonIcon: '@', + alignTitle: '@' + }, + template: '', + link: function($scope, $element, $attr, navCtrl) { + + // Create the back button content and show/hide it based on scope settings + $scope.enableBackButton = true; + $scope.backButtonClass = $attr.backButtonType; + if($attr.backButtonIcon) { + $scope.backButtonClass += ' icon ' + $attr.backButtonIcon; + } + + // Listen for changes in the stack cursor position to indicate whether a back + // button should be shown (this can still be disabled by the $scope.enableBackButton + $rootScope.$watch('$viewHistory.backView', function(backView) { + if(backView) { + var currentView = ViewService.getCurrentView(); + if(currentView) { + if(backView.historyId === currentView.historyId) { + $scope.showBackButton = true; + return; + } + } + } + $scope.showBackButton = false; + }); + + // Store a reference to our nav controller + $scope.navController = navCtrl; + + // Initialize our header bar view which will handle resizing and aligning our title labels + var hb = new ionic.views.HeaderBar({ + el: $element[0], + alignTitle: $scope.alignTitle || 'center' + }); + $scope.headerBarView = hb; + + // Add the type of header bar class to this element + $element.addClass($scope.type); + + var updateHeaderData = function(data) { + var oldTitle = $scope.currentTitle; + $scope.oldTitle = oldTitle; + + if(typeof data.title !== 'undefined') { + $scope.currentTitle = data.title; + } + + $scope.leftButtons = data.leftButtons; + $scope.rightButtons = data.rightButtons; + + if(typeof data.hideBackButton !== 'undefined') { + $scope.enableBackButton = data.hideBackButton !== true; + } + + if(data.animate !== false && $attr.animation && data.title && data.navDirection) { + + $element[0].classList.add($attr.animation); + if(data.navDirection === 'back') { + $element[0].classList.add('reverse'); + } else { + $element[0].classList.remove('reverse'); + } + + animate($scope, $element, oldTitle, data, function() { + hb.align(); + }); + } else { + hb.align(); + } + }; + + $rootScope.$on('viewState.viewEnter', function(e, data) { + updateHeaderData(data); + }); + + // If a nav page changes the left or right buttons, update our scope vars + $scope.$parent.$on('viewState.leftButtonsChanged', function(e, data) { + $scope.leftButtons = data; + }); + $scope.$parent.$on('viewState.rightButtonsChanged', function(e, data) { + $scope.rightButtons = data; + }); + + } + }; +}]) + + +.directive('view', ['ViewService', '$rootScope', '$animate', + function( ViewService, $rootScope, $animate) { + return { + restrict: 'EA', + priority: 1000, + scope: { + leftButtons: '=', + rightButtons: '=', + title: '=', + icon: '@', + iconOn: '@', + iconOff: '@', + type: '@', + alignTitle: '@', + hideBackButton: '@', + hideNavBar: '@', + animation: '@' + }, + + compile: function(tElement, tAttrs, transclude) { + tElement.addClass('pane'); + tElement[0].removeAttribute('title'); + + return function link($scope, $element, $attr) { + // Should we hide a back button when this tab is shown + $scope.hideBackButton = $scope.$eval($scope.hideBackButton); + + $scope.hideNavBar = $scope.$eval($scope.hideNavBar); + + if($scope.hideBackButton === true) { + $scope.$emit('viewState.hideBackButton'); + } else { + $scope.$emit('viewState.showBackButton'); + } + + // watch for changes in the left buttons + $scope.$watch('leftButtons', function(value) { + $scope.$emit('viewState.leftButtonsChanged', $scope.leftButtons); + }); + + $scope.$watch('rightButtons', function(val) { + $scope.$emit('viewState.rightButtonsChanged', $scope.rightButtons); + }); + + }; + } + }; +}]) + + +.directive('viewBack', ['ViewService', function(ViewService) { + var goBack = function(e) { + var backView = ViewService.getBackView(); + backView && backView.go(); + e.alreadyHandled = true; + return false; + }; + + return { + restrict: 'AC', + link: function($scope, $element) { + $element.bind('click', goBack); + } + }; +}]) + + +.directive('navView', ['ViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', + function( ViewService, $state, $anchorScroll, $compile, $controller, $animate) { + + var viewIsUpdating = false; + var animation; + + var directive = { + restrict: 'E', + terminal: true, + priority: 2000, + transclude: true, + + link: function(scope, $element, attr, ctrl, $transclude) { + var currentElement, + autoScrollExp = attr.autoscroll, + onloadExp = attr.onload || '', + viewLocals, + viewScope, + name = attr[directive.name] || attr.name || '', + parent = $element.parent().inheritedData('$uiView'); + + if (name.indexOf('@') < 0) name = name + '@' + (parent ? parent.state.name : ''); + var view = { name: name, state: null, animation: null }; + $element.data('$uiView', view); + + var climbElement = $element[0]; + while(!animation && climbElement) { + animation = climbElement.getAttribute('animation'); + climbElement = climbElement.parentElement; + } + + var eventHook = function() { + if (viewIsUpdating) return; + viewIsUpdating = true; + + try { update(true); } catch (e) { + viewIsUpdating = false; + throw e; + } + viewIsUpdating = false; + }; + + scope.$on('$stateChangeSuccess', eventHook); + scope.$on('$viewContentLoading', eventHook); + update(false); + + function update(doAnimation) { + var locals = $state.$current && $state.$current.locals[name], + template = (locals && locals.$template ? locals.$template.trim() : null); + + if (locals === viewLocals) return; // nothing to do here, go about your business + + var transitionOptions = { + parentElement: $element, + doAnimation: doAnimation, + leavingScope: viewScope, + leavingElement: currentElement, + navDirection: null + }; + + if (template) { + currentElement = angular.element(template); + + var registerData = {}; + if(currentElement[0].tagName !== 'TABS') { + // the tabs directive shouldn't register in the view history (its tab will) + registerData = ViewService.register(scope); + transitionOptions.navDirection = registerData.navDirection; + } + + viewLocals = locals; + view.state = locals.$$state; + + var link = $compile(currentElement), + current = $state.current; + + viewScope = current.scope = scope.$new(); + + if (locals.$$controller) { + locals.$scope = viewScope; + var controller = $controller(locals.$$controller, locals); + if (current.controllerAs) { + viewScope[current.controllerAs] = controller; + } + currentElement.data('$ngControllerController', controller); + currentElement.children().data('$ngControllerController', controller); + } + + link(viewScope); + + viewScope.$emit('$viewContentLoaded'); + viewScope.$eval(onloadExp); + viewScope.animation = animation; + + transitionOptions.enteringScope = viewScope.$$childHead; + transitionOptions.enteringElement = currentElement; + } + + ViewService.transition(transitionOptions); + } + } + }; + return directive; +}]); + + +})();; +(function() { +'use strict'; + angular.module('ionic.ui.virtRepeat', []) .directive('virtRepeat', function() { diff --git a/dist/js/ionic-angular.min.js b/dist/js/ionic-angular.min.js index 19074343be..91b49b652c 100644 --- a/dist/js/ionic-angular.min.js +++ b/dist/js/ionic-angular.min.js @@ -1,8 +1,8 @@ /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -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"]),angular.module("ionic.ui.service",["ionic.ui.service.scrollDelegate"]),angular.module("ionic.ui",["ionic.ui.content","ionic.ui.scroll","ionic.ui.tabs","ionic.ui.navRouter","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","ngRoute","ngTouch","ngSanitize"]),function(){"use strict";angular.module("ionic.ui.service.scrollDelegate",[]).factory("ScrollDelegate",["$rootScope",function(a){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,b){b.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(){$timeout(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),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(){angular.element(this.el),d.leave(angular.element(this.el),function(){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){f.load(a).then(function(a){var d=h(a,c||{});b(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)})},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}}}]),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","ScrollDelegate",function(a,b,c){return{restrict:"E",replace:!0,template:'
    ',transclude:!0,scope:{onRefresh:"&",onRefreshOpening:"&",onScroll:"&",onScrollComplete:"&",refreshComplete:"=",onInfiniteScroll:"=",infiniteScrollDistance:"@",scroll:"@",hasScrollX:"@",hasScrollY:"@",scrollbarX:"@",scrollbarY:"@",scrollEventInterval:"@"},compile:function(a,d,e){return function(a,f){var g,h,i,j=!1,k=f.eq(0);if("true"==d.hasHeader&&k.addClass("has-header"),"true"==d.hasSubheader&&k.addClass("has-subheader"),"true"==d.hasFooter&&k.addClass("has-footer"),"true"==d.hasTabs&&k.addClass("has-tabs"),"false"===a.scroll)g=e(a.$parent),f.append(g);else if("true"===d.overflowScroll)k.addClass("overflow-scroll"),g=e(a.$parent),f.append(g);else{h=document.createElement("div"),h.className="scroll","true"==d.padding&&(h.className+=" padding",j=!0),f.append(h),g=e(a.$parent),angular.element(f[0].firstElementChild).append(g);var l=f[0].querySelector(".scroll-refresher");l&&l.clientHeight||0,d.refreshComplete&&(a.refreshComplete=function(){a.scrollView&&(l&&l.classList.remove("active"),a.scrollView.finishPullToRefresh(),a.$parent.$broadcast("scroll.onRefreshComplete"))}),b(function(){i=new ionic.views.Scroll({el:f[0],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})}}),l&&i.activatePullToRefresh(50,function(){l.classList.add("active")},function(){l.classList.remove("refreshing"),l.classList.remove("active")},function(){l.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),c.register(a,f),a.$parent.scrollView=i});var m=f.find("infinite-scroll"),n=!1;if(m){var o,p=d.infiniteScrollDistance||"1%";o=p.indexOf("%")?function(){return i.getScrollMax().top*(1-parseInt(p,10)/100)}:function(){return i.getScrollMax().top-parseInt(p,10)},f.bind("scroll",function(){if(i&&!n&&i.getValues().top>o()){n=!0,m.addClass("active");var b=function(){i.resize(),n=!1,m.removeClass("active")};a.$apply(angular.bind(a,a.onInfiniteScroll,b))}})}}"true"!=d.padding||j||k.addClass("padding")}}}}]).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.itemClass=a.itemType||e.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(){"use strict";angular.module("ionic.ui.navRouter",["ionic.service.gesture"]).run(["$rootScope",function(a){a.stackCursorPosition=0}]).directive("navRouter",["$rootScope","$timeout","$location","$window","$route",function(a,b,c,d,e){return{restrict:"AC",controller:["$scope","$element",function(a){this.navBar={isVisible:!0},a.navController=this,this.goBack=function(){a.direction="back"}}],link:function(b,f,g,h){if(f.length){b.animation=g.animation,f[0].classList.add("noop-animation");var i=!0,j=!1,k=function(){f[0].classList.remove("noop-animation"),f[0].classList.add(b.animation),f[0].classList.add("reverse")},l=function(){f[0].classList.remove("noop-animation"),f[0].classList.remove("reverse"),f[0].classList.add(b.animation)};b.$on("$routeChangeSuccess",function(){}),b.$on("$routeChangeStart",function(c,e){var f,g=d.history.state;return f="back"==b.direction||!!(g&&g.position<=a.stackCursorPosition),i||e&&e.$$route&&""===e.$$route.originalPath?(i=!1,void 0):((j||a.stackCursorPosition>0)&&(j=!0,f?k():l()),void 0)}),b.$on("$locationChangeSuccess",function(){a.actualLocation=c.path(),i&&"/"!==c.path()&&(i=!1)}),b.$on("navRouter.goBack",function(){h.goBack()}),b.$watch(function(){return c.path()},function(c,f){if(a.actualLocation===c){if(""===f)return;var g,h=d.history.state;g="back"==b.direction||!!(h&&h.position<=a.stackCursorPosition),g?a.stackCursorPosition--:a.stackCursorPosition++,b.direction="forwards"}else{var i=e.current;i&&(d.history.replaceState({position:a.stackCursorPosition}),a.stackCursorPosition++)}})}}}}]).directive("navBar",["$rootScope","$animate","$compile",function(a,b,c){var d=function(a,d,e,f,g){var h,i,j,k=d[0].querySelectorAll(".title"),l=f.title;if(!e||e===l)return g(),void 0;h=angular.element(k[0]),j=c('

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

    ')(a);var m=d[0].firstElementChild||null;b.enter(i,d,m&&angular.element(m),function(){g()}),b.leave(angular.element(j),function(){})};return{restrict:"E",require:"^navRouter",replace:!0,scope:{type:"@",backButtonType:"@",backButtonLabel:"@",backButtonIcon:"@",alignTitle:"@"},template:'',link:function(b,c,e,f){c.addClass(e.animation),b.enableBackButton=!0,b.backButtonClass=e.backButtonType,e.backButtonIcon&&(b.backButtonClass+=" icon "+e.backButtonIcon),a.$watch("stackCursorPosition",function(a){b.showBackButton=a>0?!0:!1}),b.navController=f;var g=new ionic.views.HeaderBar({el:c[0],alignTitle:b.alignTitle||"center"});b.headerBarView=g,c.addClass(b.type);var h=function(a){var e=b.currentTitle;b.oldTitle=e,"undefined"!=typeof a.title&&(b.currentTitle=a.title),b.leftButtons=a.leftButtons,b.rightButtons=a.rightButtons,"undefined"!=typeof a.hideBackButton&&(b.enableBackButton=a.hideBackButton!==!0),a.animate!==!1&&"undefined"!=typeof a.title?d(b,c,e,a,function(){g.align()}):g.align()};b.$parent.$on("navRouter.showBackButton",function(){b.enableBackButton=!0}),b.$parent.$on("navRouter.hideBackButton",function(){b.enableBackButton=!1}),b.$parent.$on("navRouter.pageChanged",function(a,b){h(b)}),b.$parent.$on("navRouter.pageShown",function(a,b){h(b)}),b.$parent.$on("navRouter.titleChanged",function(a,e){var f=b.currentTitle;b.oldTitle=f,"undefined"!=typeof e.title&&(b.currentTitle=e.title),e.animate!==!1&&"undefined"!=typeof e.title?d(b,c,f,e,function(){g.align()}):g.align()}),b.$parent.$on("navRouter.leftButtonsChanged",function(a,c){b.leftButtons=c}),b.$parent.$on("navRouter.rightButtonsChanged",function(a,c){b.rightButtons=c}),b.$on("$destroy",function(){})}}}]).directive("navPage",["$parse",function(){return{restrict:"E",require:"^navRouter",scope:{leftButtons:"=",rightButtons:"=",title:"=",icon:"@",iconOn:"@",iconOff:"@",type:"@",alignTitle:"@",hideBackButton:"@",hideNavBar:"@",animate:"@"},link:function(a,b,c,d){b.addClass("pane"),a.hideBackButton=a.$eval(a.hideBackButton),a.hideNavBar=a.$eval(a.hideNavBar),d.navBar.isVisible=!a.hideNavBar,a.hideBackButton===!0?a.$emit("navRouter.hideBackButton"):a.$emit("navRouter.showBackButton"),a.animate=a.$eval(a.animate),a.$watch("leftButtons",function(){a.$emit("navRouter.leftButtonsChanged",a.leftButtons)}),a.$watch("rightButtons",function(){a.$emit("navRouter.rightButtonsChanged",a.rightButtons)}),a.$watch("title",function(b){a.$emit("navRouter.titleChanged",{title:b,animate:a.animate})})}}}]).directive("navBack",["$window","$rootScope","Gesture",function(a,b){return{restrict:"AC",link:function(c,d){var e=function(d){return b.stackCursorPosition>0&&(a.history.back(),c.$emit("navRouter.goBack")),d.alreadyHandled=!0,!1};d.bind("click",e)}}}])}(),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"),addedPadding=!0),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",function(a,b){return{restrict:"E",replace:!0,transclude:!0,scope:{doesContinue:"@",slideInterval:"@",showPager:"@",disableScroll:"@",onSlideChanged:"&"},controller:["$scope","$element",function(b,c){var d=b.$eval(b.doesContinue)===!0,e=d?b.$eval(b.slideInterval)||4e3:0,f=new ionic.views.Slider({el:c[0],auto:e,disableScroll:b.$eval(b.disableScroll)===!0||!1,continuous:d,slidesChanged:function(){b.currentSlide=f.getPos(),a(function(){})},callback:function(c){b.currentSlide=c,b.onSlideChanged({index:b.currentSlide}),b.$parent.$broadcast("slideBox.slideChanged",c),a(function(){})}});b.$on("slideBox.nextSlide",function(){f.next()}),b.$on("slideBox.prevSlide",function(){f.prev()}),b.$on("slideBox.setSlide",function(a,b){f.slide(b)}),b.$parent.slideBox=f,this.getNumSlides=function(){return f.getNumSlides()},a(function(){f.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",["ngAnimate"]).directive("tabs",function(){return{restrict:"E",replace:!0,scope:!0,transclude:!0,controller:["$scope","$element","$animate",function(a){var b=this;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(a){this.addController(a),this.select(0)},this.select=function(c){a.activeAnimation=a.animation,b.selectController(c)},a.controllers=this.controllers,a.tabsController=this}],template:'
    ',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",["$animate","$parse",function(a,b){return{restrict:"E",require:"^tabs",scope:!0,transclude:"element",compile:function(c,d,e){return function(c,d,f,g){var h,i;c.title=f.title,c.icon=f.icon,c.iconOn=f.iconOn,c.iconOff=f.iconOff,c.hideBackButton=c.$eval(f.hideBackButton),c.hideBackButton!==!0&&(c.hideBackButton=!1),c.animate=c.$eval(f.animate),c.doesUpdateNavRouter=c.$eval(f.doesUpdateNavRouter),c.doesUpdateNavRouter!==!1&&(c.doesUpdateNavRouter=!0);var j=b(f.leftButtons);c.$watch(j,function(a){c.leftButtons=a,c.doesUpdateNavRouter&&c.$emit("navRouter.leftButtonsChanged",c.rightButtons)});var k=b(f.rightButtons);c.$watch(k,function(a){c.rightButtons=a}),g.add(c),c.$watch("isVisible",function(b){i&&(a.leave(i),c.$broadcast("tab.hidden"),i=void 0),h&&(h.$destroy(),h=void 0),b&&(h=c.$new(),e(h,function(b){i=b,b.addClass("pane"),a.enter(b,d.parent(),d),c.title&&c.doesUpdateNavRouter&&c.$emit("navRouter.pageShown",{title:c.title,rightButtons:c.rightButtons,leftButtons:c.leftButtons,hideBackButton:c.hideBackButton,animate:c.animateNav}),c.$broadcast("tab.shown")}))})}}}}]).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",function(){return{restrict:"E",replace:!0,require:"^tabs",scope:{title:"@",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)}},template:' {{title}}'}}).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.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"]),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","ngRoute","ngTouch","ngSanitize","ui.router"]),function(){"use strict";angular.module("ionic.ui.service.scrollDelegate",[]).factory("ScrollDelegate",["$rootScope",function(a){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,b){b.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(){$timeout(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),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(){angular.element(this.el);d.leave(angular.element(this.el),function(){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)})},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=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 d.currentView=this._getView(k.viewId),d.backView=this._getBackView(d.currentView),d.forwardView=this._getForwardView(d.currentView),g.cursor=d.currentView.index,k},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},isCurrentStateUiView: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(b){function c(){for(var a=b.enteringScope;a;){if(a.animation)return a.animation;a=a.$parent}}if(b&&b.enteringElement){b.leavingScope&&(b.leavingScope.$destroy(),b.leavingScope=null);var d=b.animation||c();g&&d&&b.doAnimation!==!1&&b.navDirection?(this.setAnimationClass(b.parentElement,d,b.navDirection),b.leavingElement&&g.leave(b.leavingElement),g.enter(b.enteringElement,b.parentElement)):(b.leavingElement&&b.leavingElement.remove(),b.parentElement.append(b.enteringElement)),a.$broadcast("viewState.viewEnter",{title:b.enteringScope?b.enteringScope.title:null,navDirection:b.navDirection?b.navDirection:null})}},setAnimationClass:function(a,b,c){a[0].classList.add(b),"back"===c?a[0].classList.add("reverse"):a[0].classList.remove("reverse")}}}]),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","ScrollDelegate",function(a,b,c){return{restrict:"E",replace:!0,template:'
    ',transclude:!0,scope:{onRefresh:"&",onRefreshOpening:"&",onScroll:"&",onScrollComplete:"&",refreshComplete:"=",onInfiniteScroll:"=",infiniteScrollDistance:"@",scroll:"@",hasScrollX:"@",hasScrollY:"@",scrollbarX:"@",scrollbarY:"@",scrollEventInterval:"@"},compile:function(a,d,e){return"true"==d.hasHeader&&a.addClass("has-header"),"true"==d.hasSubheader&&a.addClass("has-subheader"),"true"==d.hasFooter&&a.addClass("has-footer"),"true"==d.hasTabs&&a.addClass("has-tabs"),function(a,f){var g,h,i,j=!1,k=f.eq(0);if("false"===a.scroll)g=e(a.$parent),f.append(g);else if("true"===d.overflowScroll)k.addClass("overflow-scroll"),g=e(a.$parent),f.append(g);else{h=document.createElement("div"),h.className="scroll","true"==d.padding&&(h.className+=" padding",j=!0),f.append(h),g=e(a.$parent),angular.element(f[0].firstElementChild).append(g);{var l=f[0].querySelector(".scroll-refresher");l&&l.clientHeight||0}d.refreshComplete&&(a.refreshComplete=function(){a.scrollView&&(l&&l.classList.remove("active"),a.scrollView.finishPullToRefresh(),a.$parent.$broadcast("scroll.onRefreshComplete"))}),b(function(){i=new ionic.views.Scroll({el:f[0],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})}}),l&&i.activatePullToRefresh(50,function(){l.classList.add("active")},function(){l.classList.remove("refreshing"),l.classList.remove("active")},function(){l.classList.add("refreshing"),a.onRefresh(),a.$parent.$broadcast("scroll.onRefresh")}),c.register(a,f),a.$parent.scrollView=i});var m=f.find("infinite-scroll"),n=!1;if(m){var o,p=d.infiniteScrollDistance||"1%";o=p.indexOf("%")?function(){return i.getScrollMax().top*(1-parseInt(p,10)/100)}:function(){return i.getScrollMax().top-parseInt(p,10)},f.bind("scroll",function(){if(i&&!n&&i.getValues().top>o()){n=!0,m.addClass("active");var b=function(){i.resize(),n=!1,m.removeClass("active")};a.$apply(angular.bind(a,a.onInfiniteScroll,b))}})}}"true"!=d.padding||j||k.addClass("padding")}}}}]).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.itemClass=a.itemType||e.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"),addedPadding=!0),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",function(a,b){return{restrict:"E",replace:!0,transclude:!0,scope:{doesContinue:"@",slideInterval:"@",showPager:"@",disableScroll:"@",onSlideChanged:"&"},controller:["$scope","$element",function(b,c){var d=b.$eval(b.doesContinue)===!0,e=d?b.$eval(b.slideInterval)||4e3:0,f=new ionic.views.Slider({el:c[0],auto:e,disableScroll:b.$eval(b.disableScroll)===!0||!1,continuous:d,slidesChanged:function(){b.currentSlide=f.getPos(),a(function(){})},callback:function(c){b.currentSlide=c,b.onSlideChanged({index:b.currentSlide}),b.$parent.$broadcast("slideBox.slideChanged",c),a(function(){})}});b.$on("slideBox.nextSlide",function(){f.next()}),b.$on("slideBox.prevSlide",function(){f.prev()}),b.$on("slideBox.setSlide",function(a,b){f.slide(b)}),b.$parent.slideBox=f,this.getNumSlides=function(){return f.getNumSlides()},a(function(){f.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","$animate","$parse",function(a,b,c,d){return{restrict:"E",require:"^tabs",scope:!0,transclude:"element",compile:function(e,f,g){return function(e,f,h,i){var j,k;a.registerHistory(e),e.title=h.title,e.icon=h.icon,e.iconOn=h.iconOn,e.iconOff=h.iconOff,e.viewSref=h.uiSref,e.url=h.href,e.url&&0===e.url.indexOf("#")&&(e.url=e.url.replace("#","")),e.hideBackButton=e.$eval(h.hideBackButton),e.hideBackButton!==!0&&(e.hideBackButton=!1),e.animate=e.$eval(h.animate);var l=d(h.leftButtons);e.$watch(l,function(a){e.leftButtons=a,e.doesUpdateNavRouter&&e.$emit("viewState.leftButtonsChanged",e.rightButtons)});var m=d(h.rightButtons);e.$watch(m,function(a){e.rightButtons=a}),i.add(e),e.$watch("isVisible",function(a){k&&(c.leave(k),e.$broadcast("tab.hidden"),k=void 0),j&&(j.$destroy(),j=void 0),a&&(j=e.$new(),g(j,function(a){k=a,a.addClass("pane"),c.enter(a,f.parent(),f),e.$broadcast("tab.shown")}))}),g(e.$new(),function(b){var c=b[0].querySelector("[ui-view]");e.hasUiView=null!==c,e.hasUiView&&(e.uiViewName=c.getAttribute("ui-view"),a.isCurrentStateUiView(e.uiViewName)&&i.select(e.tabIndex))}),b.$on("$stateChangeSuccess",function(){a.isCurrentStateUiView(e.uiViewName)&&e.tabIndex!==i.selectedIndex&&i.select(e.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(c,d,f,g){c.enableBackButton=!0,c.backButtonClass=f.backButtonType,f.backButtonIcon&&(c.backButtonClass+=" icon "+f.backButtonIcon),b.$watch("$viewHistory.backView",function(b){if(b){var d=a.getCurrentView();if(d&&b.historyId===d.historyId)return c.showBackButton=!0,void 0}c.showBackButton=!1}),c.navController=g;var h=new ionic.views.HeaderBar({el:d[0],alignTitle:c.alignTitle||"center"});c.headerBarView=h,d.addClass(c.type);var i=function(a){var b=c.currentTitle;c.oldTitle=b,"undefined"!=typeof a.title&&(c.currentTitle=a.title),c.leftButtons=a.leftButtons,c.rightButtons=a.rightButtons,"undefined"!=typeof a.hideBackButton&&(c.enableBackButton=a.hideBackButton!==!0),a.animate!==!1&&f.animation&&a.title&&a.navDirection?(d[0].classList.add(f.animation),"back"===a.navDirection?d[0].classList.add("reverse"):d[0].classList.remove("reverse"),e(c,d,b,a,function(){h.align()})):h.align()};b.$on("viewState.viewEnter",function(a,b){i(b)}),c.$parent.$on("viewState.leftButtonsChanged",function(a,b){c.leftButtons=b}),c.$parent.$on("viewState.rightButtonsChanged",function(a,b){c.rightButtons=b})}}}]).directive("view",["ViewService","$rootScope","$animate",function(){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){a.hideBackButton=a.$eval(a.hideBackButton),a.hideNavBar=a.$eval(a.hideNavBar),a.hideBackButton===!0?a.$emit("viewState.hideBackButton"):a.$emit("viewState.showBackButton"),a.$watch("leftButtons",function(){a.$emit("viewState.leftButtonsChanged",a.leftButtons)}),a.$watch("rightButtons",function(){a.$emit("viewState.rightButtonsChanged",a.rightButtons)})}}}}]).directive("viewBack",["ViewService",function(a){var b=function(b){var c=a.getBackView();return c&&c.go(),b.alreadyHandled=!0,!1};return{restrict:"AC",link:function(a,c){c.bind("click",b)}}}]).directive("uiView",["ViewService","$state","$anchorScroll","$compile","$controller","$animate",function(a,b,c,d,e){var f,g=!1,h={restrict:"ECA",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.trim():null;if(h!==m){var k={parentElement:i,doAnimation:g,leavingScope:n,leavingElement:l,navDirection:null};if(j){l=angular.element(j);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(),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.$$childHead,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/dist/js/ionic.js b/dist/js/ionic.js index 4c8bf0501e..6aff99a884 100644 --- a/dist/js/ionic.js +++ b/dist/js/ionic.js @@ -1,8 +1,8 @@ /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -16,7 +16,7 @@ window.ionic = { controllers: {}, views: {}, - version: '0.9.18' + version: '0.9.19' };; (function(ionic) { diff --git a/dist/js/ionic.min.js b/dist/js/ionic.min.js index 437f6c7041..1ea0e541c0 100644 --- a/dist/js/ionic.min.js +++ b/dist/js/ionic.min.js @@ -1,8 +1,8 @@ /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * - * Ionic, v0.9.18 + * Ionic, v0.9.19 * A powerful HTML5 mobile app framework. * http://ionicframework.com/ * @@ -11,6 +11,6 @@ * Licensed under the MIT license. Please see LICENSE for more information. * */ -window.ionic={controllers:{},views:{},version:"0.9.18"},function(a){function b(a){return a*a*a}function c(a){return 3*a*a*(1-a)}function d(a){return 3*a*(1-a)*(1-a)}function e(a){return(1-a)*(1-a)*(1-a)}var f=function(a,b){return a||(a=0),b||(b=0),{x:a,y:b}};a.Animator={getQuadraticBezier:function(a,g,h,i,j){var k=new f;return k.x=g.x*b(a)+h.x*c(a)+i.x*d(a)+j.x*e(a),k.y=g.y*b(a)+h.y*c(a)+i.y*d(a)+j.y*e(a),k},getCubicBezier:function(a,b,c,d,e){epsilon=1e3/60/e/4;var f=function(b){var d=1-b;return 3*d*d*b*a+3*d*b*b*c+b*b*b},g=function(a){var c=1-a;return 3*c*c*a*b+3*c*a*a*d+a*a*a},h=function(b){var d=1-b;return 3*(2*(b-1)*b+d*d)*a+3*(-b*b*b+2*d*b)*c};return function(a){var b,c,d,e,i,j,k=a;for(d=k,j=0;8>j;j++){if(e=f(d)-k,Math.abs(e)d)return g(b);if(d>c)return g(c);for(;c>b;){if(e=f(d),Math.abs(e-k)e?b=d:c=d,d=.5*(c-b)+b}return g(d)}},animate:function(a){return{leave:function(){var b=function(){a.classList.remove("leave"),a.classList.remove("leave-active"),a.removeEventListener("webkitTransitionEnd",b),a.removeEventListener("transitionEnd",b)};return a.addEventListener("webkitTransitionEnd",b),a.addEventListener("transitionEnd",b),a.classList.add("leave"),a.classList.add("leave-active"),this},enter:function(){var b=function(){a.classList.remove("enter"),a.classList.remove("enter-active"),a.removeEventListener("webkitTransitionEnd",b),a.removeEventListener("transitionEnd",b)};return a.addEventListener("webkitTransitionEnd",b),a.addEventListener("transitionEnd",b),a.classList.add("enter"),a.classList.add("enter-active"),this}}}}}(ionic),function(a){a.DomUtil={getTextBounds:function(a){if(document.createRange){var b=document.createRange();if(b.selectNodeContents(a),b.getBoundingClientRect){var c=b.getBoundingClientRect(),d=window.scrollX,e=window.scrollY;return{top:c.top+e,left:c.left+d,right:c.left+d+c.width,bottom:c.top+e+c.height,width:c.width,height:c.height}}}return null},getChildIndex:function(a,b){if(b)for(var c,d=a.parentNode.children,e=0,f=0,g=d.length;g>e;e++)if(c=d[e],c.nodeName&&c.nodeName.toLowerCase()==b){if(c==a)return f;f++}return Array.prototype.slice.call(a.parentNode.children).indexOf(a)},swapNodes:function(a,b){b.parentNode.insertBefore(a,b)},getParentWithClass:function(a,b){for(;a.parentNode;){if(a.parentNode.classList&&a.parentNode.classList.contains(b))return a.parentNode;a=a.parentNode}return null},getParentOrSelfWithClass:function(a,b){for(;a;){if(a.classList&&a.classList.contains(b))return a;a=a.parentNode}return null},rectContains:function(a,b,c,d,e,f){return c>a||a>e?!1:d>b||b>f?!1:!0}}}(window.ionic),function(a){window.CustomEvent||!function(){var a;a=function(a,b){var c;return b=b||{bubbles:!1,cancelable:!1,detail:void 0},c=document.createEvent("CustomEvent"),c.initCustomEvent(a,b.bubbles,b.cancelable,b.detail),c},a.prototype=window.Event.prototype,window.CustomEvent=a}(),a.EventController={VIRTUALIZED_EVENTS:["tap","swipe","swiperight","swipeleft","drag","hold","release"],trigger:function(a,b){var c=new CustomEvent(a,{detail:b});b&&b.target&&b.target.dispatchEvent(c)||window.dispatchEvent(c)},on:function(b,c,d){for(var e=d||window,f=0,g=this.VIRTUALIZED_EVENTS.length;g>f;f++)if(b==this.VIRTUALIZED_EVENTS[f]){var h=new a.Gesture(d);return h.on(b,c),h}e.addEventListener(b,c)},off:function(a,b,c){c.removeEventListener(a,b)},onGesture:function(b,c,d){var e=new a.Gesture(d);return e.on(b,c),e},offGesture:function(a,b,c){a.off(b,c)},handlePopState:function(){}},a.on=function(){a.EventController.on.apply(a.EventController,arguments)},a.off=function(){a.EventController.off.apply(a.EventController,arguments)},a.trigger=a.EventController.trigger,a.onGesture=function(){return a.EventController.onGesture.apply(a.EventController.onGesture,arguments)},a.offGesture=function(){return a.EventController.offGesture.apply(a.EventController.offGesture,arguments)}}(window.ionic),function(a){function b(){if(!a.Gestures.READY){a.Gestures.event.determineEventTypes();for(var b in a.Gestures.gestures)a.Gestures.gestures.hasOwnProperty(b)&&a.Gestures.detection.register(a.Gestures.gestures[b]);a.Gestures.event.onTouch(a.Gestures.DOCUMENT,a.Gestures.EVENT_MOVE,a.Gestures.detection.detect),a.Gestures.event.onTouch(a.Gestures.DOCUMENT,a.Gestures.EVENT_END,a.Gestures.detection.detect),a.Gestures.READY=!0}}a.Gesture=function(b,c){return new a.Gestures.Instance(b,c||{})},a.Gestures={},a.Gestures.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.Gestures.HAS_POINTEREVENTS=window.navigator.pointerEnabled||window.navigator.msPointerEnabled,a.Gestures.HAS_TOUCHEVENTS="ontouchstart"in window,a.Gestures.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android|silk/i,a.Gestures.NO_MOUSEEVENTS=a.Gestures.HAS_TOUCHEVENTS&&window.navigator.userAgent.match(a.Gestures.MOBILE_REGEX),a.Gestures.EVENT_TYPES={},a.Gestures.DIRECTION_DOWN="down",a.Gestures.DIRECTION_LEFT="left",a.Gestures.DIRECTION_UP="up",a.Gestures.DIRECTION_RIGHT="right",a.Gestures.POINTER_MOUSE="mouse",a.Gestures.POINTER_TOUCH="touch",a.Gestures.POINTER_PEN="pen",a.Gestures.EVENT_START="start",a.Gestures.EVENT_MOVE="move",a.Gestures.EVENT_END="end",a.Gestures.DOCUMENT=window.document,a.Gestures.plugins={},a.Gestures.READY=!1,a.Gestures.Instance=function(c,d){var e=this;return null===c?(console.error("Null element passed to gesture (element does not exist). Not listening for gesture"),void 0):(b(),this.element=c,this.enabled=!0,this.options=a.Gestures.utils.extend(a.Gestures.utils.extend({},a.Gestures.defaults),d||{}),this.options.stop_browser_behavior&&a.Gestures.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),a.Gestures.event.onTouch(c,a.Gestures.EVENT_START,function(b){e.enabled&&a.Gestures.detection.startDetect(e,b)}),this)},a.Gestures.Instance.prototype={on:function(a,b){for(var c=a.split(" "),d=0;d0&&f==a.Gestures.EVENT_END?f=a.Gestures.EVENT_MOVE:k||(f=a.Gestures.EVENT_END),(k||null===c)&&(c=i),g.call(a.Gestures.detection,h.collectEventData(b,f,h.getTouchList(c,f),i)),a.Gestures.HAS_POINTEREVENTS&&f==a.Gestures.EVENT_END&&(k=a.Gestures.PointerEvent.updatePointer(f,i))),k||(c=null,d=!1,e=!1,a.Gestures.PointerEvent.reset())}})},determineEventTypes:function(){var b;b=a.Gestures.HAS_POINTEREVENTS?a.Gestures.PointerEvent.getEvents():a.Gestures.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_START]=b[0],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_MOVE]=b[1],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_END]=b[2]},getTouchList:function(b){return a.Gestures.HAS_POINTEREVENTS?a.Gestures.PointerEvent.getTouchList():b.touches?b.touches:(b.indentifier=1,[b])},collectEventData:function(b,c,d,e){var f=a.Gestures.POINTER_TOUCH;return(e.type.match(/mouse/)||a.Gestures.PointerEvent.matchType(a.Gestures.POINTER_MOUSE,e))&&(f=a.Gestures.POINTER_MOUSE),{center:a.Gestures.utils.getCenter(d),timeStamp:(new Date).getTime(),target:e.target,touches:d,eventType:c,pointerType:f,srcEvent:e,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return a.Gestures.detection.stopDetect()}}}},a.Gestures.PointerEvent={pointers:{},getTouchList:function(){var a=this,b=[];return Object.keys(a.pointers).sort().forEach(function(c){b.push(a.pointers[c])}),b},updatePointer:function(b,c){return b==a.Gestures.EVENT_END?this.pointers={}:(c.identifier=c.pointerId,this.pointers[c.pointerId]=c),Object.keys(this.pointers).length},matchType:function(b,c){if(!c.pointerType)return!1;var d={};return d[a.Gestures.POINTER_MOUSE]=c.pointerType==c.MSPOINTER_TYPE_MOUSE||c.pointerType==a.Gestures.POINTER_MOUSE,d[a.Gestures.POINTER_TOUCH]=c.pointerType==c.MSPOINTER_TYPE_TOUCH||c.pointerType==a.Gestures.POINTER_TOUCH,d[a.Gestures.POINTER_PEN]=c.pointerType==c.MSPOINTER_TYPE_PEN||c.pointerType==a.Gestures.POINTER_PEN,d[b]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},a.Gestures.utils={extend:function(a,b,c){for(var d in b)void 0!==a[d]&&c||(a[d]=b[d]);return a},hasParent:function(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1},getCenter:function(a){for(var b=[],c=[],d=0,e=a.length;e>d;d++)b.push(a[d].pageX),c.push(a[d].pageY);return{pageX:(Math.min.apply(Math,b)+Math.max.apply(Math,b))/2,pageY:(Math.min.apply(Math,c)+Math.max.apply(Math,c))/2}},getVelocity:function(a,b,c){return{x:Math.abs(b/a)||0,y:Math.abs(c/a)||0}},getAngle:function(a,b){var c=b.pageY-a.pageY,d=b.pageX-a.pageX;return 180*Math.atan2(c,d)/Math.PI},getDirection:function(b,c){var d=Math.abs(b.pageX-c.pageX),e=Math.abs(b.pageY-c.pageY);return d>=e?b.pageX-c.pageX>0?a.Gestures.DIRECTION_LEFT:a.Gestures.DIRECTION_RIGHT:b.pageY-c.pageY>0?a.Gestures.DIRECTION_UP:a.Gestures.DIRECTION_DOWN},getDistance:function(a,b){var c=b.pageX-a.pageX,d=b.pageY-a.pageY;return Math.sqrt(c*c+d*d)},getScale:function(a,b){return a.length>=2&&b.length>=2?this.getDistance(b[0],b[1])/this.getDistance(a[0],a[1]):1},getRotation:function(a,b){return a.length>=2&&b.length>=2?this.getAngle(b[1],b[0])-this.getAngle(a[1],a[0]):0},isVertical:function(b){return b==a.Gestures.DIRECTION_UP||b==a.Gestures.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(a,b){var c,d=["webkit","khtml","moz","Moz","ms","o",""];if(b&&a.style){for(var e=0;ed;d++){var f=this.gestures[d];if(!this.stopped&&c[f.name]!==!1&&f.handler.call(f,b,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=b),b.eventType==a.Gestures.EVENT_END&&!b.touches.length-1&&this.stopDetect(),b}},stopDetect:function(){this.previous=a.Gestures.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(b){var c=this.current.startEvent;if(c&&(b.touches.length!=c.touches.length||b.touches===c.touches)){c.touches=[];for(var d=0,e=b.touches.length;e>d;d++)c.touches.push(a.Gestures.utils.extend({},b.touches[d]))}var f=b.timeStamp-c.timeStamp,g=b.center.pageX-c.center.pageX,h=b.center.pageY-c.center.pageY,i=a.Gestures.utils.getVelocity(f,g,h);return a.Gestures.utils.extend(b,{deltaTime:f,deltaX:g,deltaY:h,velocityX:i.x,velocityY:i.y,distance:a.Gestures.utils.getDistance(c.center,b.center),angle:a.Gestures.utils.getAngle(c.center,b.center),direction:a.Gestures.utils.getDirection(c.center,b.center),scale:a.Gestures.utils.getScale(c.touches,b.touches),rotation:a.Gestures.utils.getRotation(c.touches,b.touches),startEvent:c}),b},register:function(b){var c=b.defaults||{};return void 0===c[b.name]&&(c[b.name]=!0),a.Gestures.utils.extend(a.Gestures.defaults,c,!0),b.index=b.index||1e3,this.gestures.push(b),this.gestures.sort(function(a,b){return a.indexb.index?1:0}),this.gestures}},a.Gestures.gestures=a.Gestures.gestures||{},a.Gestures.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(b,c){switch(b.eventType){case a.Gestures.EVENT_START:clearTimeout(this.timer),a.Gestures.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==a.Gestures.detection.current.name&&c.trigger("hold",b)},c.options.hold_timeout);break;case a.Gestures.EVENT_MOVE:b.distance>c.options.hold_threshold&&clearTimeout(this.timer);break;case a.Gestures.EVENT_END:clearTimeout(this.timer)}}},a.Gestures.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(b,c){if(b.eventType==a.Gestures.EVENT_END){var d=a.Gestures.detection.previous,e=!1;if(b.deltaTime>c.options.tap_max_touchtime||b.distance>c.options.tap_max_distance)return;d&&"tap"==d.name&&b.timeStamp-d.lastEvent.timeStamp0&&b.touches.length>c.options.swipe_max_touches)return;(b.velocityX>c.options.swipe_velocity||b.velocityY>c.options.swipe_velocity)&&(c.trigger(this.name,b),c.trigger(this.name+b.direction,b))}}},a.Gestures.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,correct_for_drag_min_distance:!0,drag_max_touches:1,drag_block_horizontal:!0,drag_block_vertical:!0,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(b,c){if(a.Gestures.detection.current.name!=this.name&&this.triggered)return c.trigger(this.name+"end",b),this.triggered=!1,void 0;if(!(c.options.drag_max_touches>0&&b.touches.length>c.options.drag_max_touches))switch(b.eventType){case a.Gestures.EVENT_START:this.triggered=!1;break;case a.Gestures.EVENT_MOVE:if(b.distancec.options.transform_min_rotation&&c.trigger("rotate",b),d>c.options.transform_min_scale&&(c.trigger("pinch",b),c.trigger("pinch"+(b.scale<1?"in":"out"),b));break;case a.Gestures.EVENT_END:this.triggered&&c.trigger(this.name+"end",b),this.triggered=!1}}},a.Gestures.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(b,c){return c.options.prevent_mouseevents&&b.pointerType==a.Gestures.POINTER_MOUSE?(b.stopDetect(),void 0):(c.options.prevent_default&&b.preventDefault(),b.eventType==a.Gestures.EVENT_START&&c.trigger(this.name,b),void 0)}},a.Gestures.gestures.Release={name:"release",index:1/0,handler:function(b,c){b.eventType==a.Gestures.EVENT_END&&c.trigger(this.name,b)}}}(window.ionic),function(a){a.Platform={detect:function(){var a=[];this._checkPlatforms(a);var b=function(){if(document.body)for(var b=0;b=0},isIOS7:function(){return window.device?"iOS"==window.device.platform&&parseFloat(window.device.version)>=7:!1},isAndroid:function(){return window.device?"Android"===device.platform:navigator.userAgent.toLowerCase().indexOf("android")>=0}},a.Platform.detect()}(window.ionic),function(a,b,c){"use strict";function d(a,b){return"radio"===a.type?(a.checked=!a.checked,c.trigger("click",{target:a})):"checkbox"===a.type?(a.checked=!a.checked,c.trigger("change",{target:a})):"submit"===a.type||"button"===a.type?c.trigger("click",{target:a}):a.focus(),b.stopPropagation(),b.preventDefault(),!1}function e(a){if(a.gesture&&"touch"===a.gesture.pointerType&&a.gesture.srcEvent&&!a.alreadyHandled){a=a.gesture.srcEvent;for(var e=a.target;e;){if("INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)return d(e,a);if("LABEL"===e.tagName){if(e.control)return d(e.control,a)}else if("A"===e.tagName||"BUTTON"===e.tagName)return c.trigger("click",{target:e}),a.stopPropagation(),a.preventDefault(),!1;e=e.parentElement}var f=b.activeElement;return!f||"INPUT"!==f.tagName&&"TEXTAREA"!==f.tagName&&"SELECT"!==f.tagName?void 0:(f.blur(),a.stopPropagation(),a.preventDefault(),!1)}}a.rAF=function(){return a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||function(b){a.setTimeout(b,1e3/60)}}(),c.CSS={},function(){for(var a=b.createElement("div"),d=["webkitTransform","transform","-webkit-transform","webkit-transform","-moz-transform","moz-transform","MozTransform","mozTransform"],e=0;e=a.length)for(var d=c-a.length;d--+1;)a.push(void 0);return a.splice(c,0,a.splice(b,1)[0]),a},proxy:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){return a.apply(b,c.concat(Array.prototype.slice.call(arguments)))}},debounce:function(a,b,c){var d,e,f,g,h;return function(){f=this,e=arguments,g=new Date;var i=function(){var j=new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}},throttle:function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:Date.now(),g=null,f=a.apply(d,e)};return function(){var j=Date.now();h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}},inherit:function(b,c){var d,e=this;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){return e.apply(this,arguments)},a.extend(d,e,c);var f=function(){this.constructor=d};return f.prototype=e.prototype,d.prototype=new f,b&&a.extend(d.prototype,b),d.__super__=e.prototype,d},extend:function(a){for(var b=Array.prototype.slice.call(arguments,1),c=0;c2500&&(clearInterval(h),h=null)},1e3/d)),b}}(),stop:function(a){var b=null!=e[a];return b&&(e[a]=null),b},isRunning:function(a){return null!=e[a]},start:function(a,g,h,i,j,k){var l=b(),m=l,n=0,o=0,p=f++;if(k||(k=document.body),0===p%20){var q={};for(var r in e)q[r]=!0;e=q}var s=function(f){var q=f!==!0,r=b();if(!e[p]||g&&!g(p))return e[p]=null,h&&h(c-o/((r-l)/d),p,!1),void 0;if(q)for(var t=Math.round((r-m)/(d/c))-1,u=0;u1&&(n=1));var v=j?j(n):n;a(v,r,q)!==!1&&1!==n||!q?q&&(m=r,core.effect.Animate.requestAnimationFrame(s,k)):(e[p]=null,h&&h(c-o/((r-l)/d),p,1===n||null==i))};return e[p]=!0,core.effect.Animate.requestAnimationFrame(s,k),p}}}(this);var Scroller;!function(a){var b=function(){},c=function(a){return Math.pow(a-1,3)+1},d=function(a){return(a/=.5)<1?.5*Math.pow(a,3):.5*(Math.pow(a-2,3)+2)};a.views.Scroll=a.views.View.inherit({initialize:function(c){var d=this;this.__container=c.el,this.__content=c.el.firstElementChild,this.options={scrollingX:!1,scrollbarX:!0,scrollingY:!0,scrollbarY:!0,minScrollbarSizeX:5,minScrollbarSizeY:5,scrollbarsFade:!0,scrollbarFadeDelay:300,scrollbarResizeFadeDelay:1e3,animating:!0,animationDuration:250,bouncing:!0,locking:!0,paging:!1,snapping:!1,zooming:!1,minZoom:.5,maxZoom:3,speedMultiplier:1,scrollingComplete:b,penetrationDeceleration:.03,penetrationAcceleration:.08,scrollEventInterval:50};for(var e in c)this.options[e]=c[e];this.hintResize=a.debounce(function(){d.resize()},1e3,!0),this.triggerScrollEvent=a.throttle(function(){a.trigger("scroll",{scrollTop:d.__scrollTop,scrollLeft:d.__scrollLeft,target:d.__container})},this.options.scrollEventInterval),this.triggerScrollEndEvent=function(){a.trigger("scrollend",{scrollTop:d.__scrollTop,scrollLeft:d.__scrollLeft,target:d.__container})},this.__callback=this.getRenderFn(),this.__initEventHandlers(),this.__createScrollbars(),this.resize(),this.__fadeScrollbars("out",this.options.scrollbarResizeFadeDelay)},__isSingleTouch:!1,__isTracking:!1,__didDecelerationComplete:!1,__isGesturing:!1,__isDragging:!1,__isDecelerating:!1,__isAnimating:!1,__clientLeft:0,__clientTop:0,__clientWidth:0,__clientHeight:0,__contentWidth:0,__contentHeight:0,__snapWidth:100,__snapHeight:100,__refreshHeight:null,__refreshActive:!1,__refreshActivate:null,__refreshDeactivate:null,__refreshStart:null,__zoomLevel:1,__scrollLeft:0,__scrollTop:0,__maxScrollLeft:0,__maxScrollTop:0,__scheduledLeft:0,__scheduledTop:0,__scheduledZoom:0,__lastTouchLeft:null,__lastTouchTop:null,__lastTouchMove:null,__positions:null,__minDecelerationScrollLeft:null,__minDecelerationScrollTop:null,__maxDecelerationScrollLeft:null,__maxDecelerationScrollTop:null,__decelerationVelocityX:null,__decelerationVelocityY:null,__transformProperty:null,__perspectiveProperty:null,__indicatorX:null,__indicatorY:null,__scrollbarFadeTimeout:null,__didWaitForSize:null,__sizerTimeout:null,__initEventHandlers:function(){var a=this,b=this.__container;if("ontouchstart"in window)b.addEventListener("touchstart",function(b){b.target.tagName.match(/input|textarea|select/i)||(a.doTouchStart(b.touches,b.timeStamp),b.preventDefault())},!1),document.addEventListener("touchmove",function(b){b.defaultPrevented||a.doTouchMove(b.touches,b.timeStamp)},!1),document.addEventListener("touchend",function(b){a.doTouchEnd(b.timeStamp)},!1);else{var c=!1;b.addEventListener("mousedown",function(b){b.target.tagName.match(/input|textarea|select/i)||(a.doTouchStart([{pageX:b.pageX,pageY:b.pageY}],b.timeStamp),c=!0)},!1),document.addEventListener("mousemove",function(b){c&&!b.defaultPrevented&&(a.doTouchMove([{pageX:b.pageX,pageY:b.pageY}],b.timeStamp),c=!0)},!1),document.addEventListener("mouseup",function(b){c&&(a.doTouchEnd(b.timeStamp),c=!1)},!1)}},__createScrollbar:function(a){var b=document.createElement("div"),c=document.createElement("div");return c.className="scroll-bar-indicator",b.className="h"==a?"scroll-bar scroll-bar-h":"scroll-bar scroll-bar-v",b.appendChild(c),b},__createScrollbars:function(){var a,b;this.options.scrollingX&&(a={el:this.__createScrollbar("h"),sizeRatio:1},a.indicator=a.el.children[0],this.options.scrollbarX&&this.__container.appendChild(a.el),this.__indicatorX=a),this.options.scrollingY&&(b={el:this.__createScrollbar("v"),sizeRatio:1},b.indicator=b.el.children[0],this.options.scrollbarY&&this.__container.appendChild(b.el),this.__indicatorY=b)},__resizeScrollbars:function(){var a=this;if(a.__fadeScrollbars("in"),a.__indicatorX){var b=Math.max(Math.round(a.__clientWidth*a.__clientWidth/a.__contentWidth),20);b>a.__contentWidth&&(b=0),a.__indicatorX.size=b,a.__indicatorX.minScale=this.options.minScrollbarSizeX/b,a.__indicatorX.indicator.style.width=b+"px",a.__indicatorX.maxPos=a.__clientWidth-b,a.__indicatorX.sizeRatio=a.__maxScrollLeft?a.__indicatorX.maxPos/a.__maxScrollLeft:1}if(a.__indicatorY){var c=Math.max(Math.round(a.__clientHeight*a.__clientHeight/a.__contentHeight),20);c>a.__contentHeight&&(c=0),a.__indicatorY.size=c,a.__indicatorY.minScale=this.options.minScrollbarSizeY/c,a.__indicatorY.maxPos=a.__clientHeight-c,a.__indicatorY.indicator.style.height=c+"px",a.__indicatorY.sizeRatio=a.__maxScrollTop?a.__indicatorY.maxPos/a.__maxScrollTop:1}},__repositionScrollbars:function(){var a,b,c,d,e,f=this,g=0,h=0;f.__indicatorX&&(f.__indicatorY&&(g=10),d=Math.round(f.__indicatorX.sizeRatio*f.__scrollLeft)||0,b=f.__scrollLeft-(f.__maxScrollLeft-g),f.__scrollLeft<0?(widthScale=Math.max(f.__indicatorX.minScale,(f.__indicatorX.size-Math.abs(f.__scrollLeft))/f.__indicatorX.size),d=0,f.__indicatorX.indicator.style[f.__transformOriginProperty]="left center"):b>0?(widthScale=Math.max(f.__indicatorX.minScale,(f.__indicatorX.size-b)/f.__indicatorX.size),d=f.__indicatorX.maxPos-g,f.__indicatorX.indicator.style[f.__transformOriginProperty]="right center"):(d=Math.min(f.__maxScrollLeft,Math.max(0,d)),widthScale=1),f.__indicatorX.indicator.style[f.__transformProperty]="translate3d("+d+"px, 0, 0) scaleX("+widthScale+")"),f.__indicatorY&&(e=Math.round(f.__indicatorY.sizeRatio*f.__scrollTop)||0,f.__indicatorX&&(h=10),c=f.__scrollTop-(f.__maxScrollTop-h),f.__scrollTop<0?(a=Math.max(f.__indicatorY.minScale,(f.__indicatorY.size-Math.abs(f.__scrollTop))/f.__indicatorY.size),e=0,f.__indicatorY.indicator.style[f.__transformOriginProperty]="center top"):c>0?(a=Math.max(f.__indicatorY.minScale,(f.__indicatorY.size-c)/f.__indicatorY.size),e=f.__indicatorY.maxPos-h,f.__indicatorY.indicator.style[f.__transformOriginProperty]="center bottom"):(e=Math.min(f.__maxScrollTop,Math.max(0,e)),a=1),f.__indicatorY.indicator.style[f.__transformProperty]="translate3d(0,"+e+"px, 0) scaleY("+a+")")},__fadeScrollbars:function(a,b){var c=this;if(this.options.scrollbarsFade){var d="scroll-bar-fade-out";c.options.scrollbarsFade===!0&&(clearTimeout(c.__scrollbarFadeTimeout),"in"==a?(c.__indicatorX&&c.__indicatorX.indicator.classList.remove(d),c.__indicatorY&&c.__indicatorY.indicator.classList.remove(d)):c.__scrollbarFadeTimeout=setTimeout(function(){c.__indicatorX&&c.__indicatorX.indicator.classList.add(d),c.__indicatorY&&c.__indicatorY.indicator.classList.add(d)},b||c.options.scrollbarFadeDelay))}},__scrollingComplete:function(){var a=this;a.options.scrollingComplete(),a.__fadeScrollbars("out")},resize:function(){this.setDimensions(this.__container.clientWidth,this.__container.clientHeight,Math.max(this.__content.scrollWidth,this.__content.offsetWidth),Math.max(this.__content.scrollHeight,this.__content.offsetHeight+20))},getRenderFn:function(){var a,b=this,c=this.__content,d=document.documentElement.style;"MozAppearance"in d?a="gecko":"WebkitAppearance"in d?a="webkit":"string"==typeof navigator.cpuClass&&(a="trident");var e,f={trident:"ms",gecko:"Moz",webkit:"Webkit",presto:"O"}[a],g=document.createElement("div"),h=f+"Perspective",i=f+"Transform",j=f+"TransformOrigin";return b.__perspectiveProperty=i,b.__transformProperty=i,b.__transformOriginProperty=j,g.style[h]!==e?function(a,d){c.style[i]="translate3d("+-a+"px,"+-d+"px,0)",b.__repositionScrollbars(),b.triggerScrollEvent()}:g.style[i]!==e?function(a,d){c.style[i]="translate("+-a+"px,"+-d+"px)",b.__repositionScrollbars(),b.triggerScrollEvent()}:function(a,d,e){c.style.marginLeft=a?-a/e+"px":"",c.style.marginTop=d?-d/e+"px":"",c.style.zoom=e||"",b.__repositionScrollbars(),b.triggerScrollEvent()}},setDimensions:function(a,b,c,d){var e=this;a===+a&&(e.__clientWidth=a),b===+b&&(e.__clientHeight=b),c===+c&&(e.__contentWidth=c),d===+d&&(e.__contentHeight=d),e.__computeScrollMax(),e.__resizeScrollbars(),e.scrollTo(e.__scrollLeft,e.__scrollTop,!0)},setPosition:function(a,b){var c=this;c.__clientLeft=a||0,c.__clientTop=b||0},setSnapSize:function(a,b){var c=this;c.__snapWidth=a,c.__snapHeight=b},activatePullToRefresh:function(a,b,c,d){var e=this;e.__refreshHeight=a,e.__refreshActivate=b,e.__refreshDeactivate=c,e.__refreshStart=d},triggerPullToRefresh:function(){this.__publish(this.__scrollLeft,-this.__refreshHeight,this.__zoomLevel,!0),this.__refreshStart&&this.__refreshStart()},finishPullToRefresh:function(){var a=this;a.__refreshActive=!1,a.__refreshDeactivate&&a.__refreshDeactivate(),a.scrollTo(a.__scrollLeft,a.__scrollTop,!0)},getValues:function(){var a=this;return{left:a.__scrollLeft,top:a.__scrollTop,zoom:a.__zoomLevel}},getScrollMax:function(){var a=this;return{left:a.__maxScrollLeft,top:a.__maxScrollTop}},zoomTo:function(a,b,c,d){var e=this;if(!e.options.zooming)throw new Error("Zooming is not enabled!");e.__isDecelerating&&(core.effect.Animate.stop(e.__isDecelerating),e.__isDecelerating=!1);var f=e.__zoomLevel;null==c&&(c=e.__clientWidth/2),null==d&&(d=e.__clientHeight/2),a=Math.max(Math.min(a,e.options.maxZoom),e.options.minZoom),e.__computeScrollMax(a);var g=(c+e.__scrollLeft)*a/f-c,h=(d+e.__scrollTop)*a/f-d;g>e.__maxScrollLeft?g=e.__maxScrollLeft:0>g&&(g=0),h>e.__maxScrollTop?h=e.__maxScrollTop:0>h&&(h=0),e.__publish(g,h,a,b)},zoomBy:function(a,b,c,d){var e=this;e.zoomTo(e.__zoomLevel*a,b,c,d) -},scrollTo:function(a,b,c,d){var e=this;if(e.__isDecelerating&&(core.effect.Animate.stop(e.__isDecelerating),e.__isDecelerating=!1),null!=d&&d!==e.__zoomLevel){if(!e.options.zooming)throw new Error("Zooming is not enabled!");a*=d,b*=d,e.__computeScrollMax(d)}else d=e.__zoomLevel;e.options.scrollingX?e.options.paging?a=Math.round(a/e.__clientWidth)*e.__clientWidth:e.options.snapping&&(a=Math.round(a/e.__snapWidth)*e.__snapWidth):a=e.__scrollLeft,e.options.scrollingY?e.options.paging?b=Math.round(b/e.__clientHeight)*e.__clientHeight:e.options.snapping&&(b=Math.round(b/e.__snapHeight)*e.__snapHeight):b=e.__scrollTop,a=Math.max(Math.min(e.__maxScrollLeft,a),0),b=Math.max(Math.min(e.__maxScrollTop,b),0),a===e.__scrollLeft&&b===e.__scrollTop&&(c=!1),e.__publish(a,b,d,c)},scrollBy:function(a,b,c){var d=this,e=d.__isAnimating?d.__scheduledLeft:d.__scrollLeft,f=d.__isAnimating?d.__scheduledTop:d.__scrollTop;d.scrollTo(e+(a||0),f+(b||0),c)},doMouseZoom:function(a,b,c,d){var e=this,f=a>0?.97:1.03;return e.zoomTo(e.__zoomLevel*f,!1,c-e.__clientLeft,d-e.__clientTop)},doTouchStart:function(a,b){if(this.hintResize(),null==a.length)throw new Error("Invalid touch list: "+a);if(b instanceof Date&&(b=b.valueOf()),"number"!=typeof b)throw new Error("Invalid timestamp value: "+b);var c=this;c.__fadeScrollbars("in"),c.__interruptedAnimation=!0,c.__isDecelerating&&(core.effect.Animate.stop(c.__isDecelerating),c.__isDecelerating=!1,c.__interruptedAnimation=!0),c.__isAnimating&&(core.effect.Animate.stop(c.__isAnimating),c.__isAnimating=!1,c.__interruptedAnimation=!0);var d,e,f=1===a.length;f?(d=a[0].pageX,e=a[0].pageY):(d=Math.abs(a[0].pageX+a[1].pageX)/2,e=Math.abs(a[0].pageY+a[1].pageY)/2),c.__initialTouchLeft=d,c.__initialTouchTop=e,c.__zoomLevelStart=c.__zoomLevel,c.__lastTouchLeft=d,c.__lastTouchTop=e,c.__lastTouchMove=b,c.__lastScale=1,c.__enableScrollX=!f&&c.options.scrollingX,c.__enableScrollY=!f&&c.options.scrollingY,c.__isTracking=!0,c.__didDecelerationComplete=!1,c.__isDragging=!f,c.__isSingleTouch=f,c.__positions=[]},doTouchMove:function(a,b,c){if(null==a.length)throw new Error("Invalid touch list: "+a);if(b instanceof Date&&(b=b.valueOf()),"number"!=typeof b)throw new Error("Invalid timestamp value: "+b);var d=this;if(d.__isTracking){var e,f;2===a.length?(e=Math.abs(a[0].pageX+a[1].pageX)/2,f=Math.abs(a[0].pageY+a[1].pageY)/2):(e=a[0].pageX,f=a[0].pageY);var g=d.__positions;if(d.__isDragging){var h=e-d.__lastTouchLeft,i=f-d.__lastTouchTop,j=d.__scrollLeft,k=d.__scrollTop,l=d.__zoomLevel;if(null!=c&&d.options.zooming){var m=l;if(l=l/d.__lastScale*c,l=Math.max(Math.min(l,d.options.maxZoom),d.options.minZoom),m!==l){var n=e-d.__clientLeft,o=f-d.__clientTop;j=(n+j)*l/m-n,k=(o+k)*l/m-o,d.__computeScrollMax(l)}}if(d.__enableScrollX){j-=h*this.options.speedMultiplier;var p=d.__maxScrollLeft;(j>p||0>j)&&(d.options.bouncing?j+=h/2*this.options.speedMultiplier:j=j>p?p:0)}if(d.__enableScrollY){k-=i*this.options.speedMultiplier;var q=d.__maxScrollTop;(k>q||0>k)&&(d.options.bouncing?(k+=i/2*this.options.speedMultiplier,d.__enableScrollX||null==d.__refreshHeight||(!d.__refreshActive&&k<=-d.__refreshHeight?(d.__refreshActive=!0,d.__refreshActivate&&d.__refreshActivate()):d.__refreshActive&&k>-d.__refreshHeight&&(d.__refreshActive=!1,d.__refreshDeactivate&&d.__refreshDeactivate()))):k=k>q?q:0)}g.length>60&&g.splice(0,30),g.push(j,k,b),d.__publish(j,k,l)}else{var r=d.options.locking?3:0,s=5,t=Math.abs(e-d.__initialTouchLeft),u=Math.abs(f-d.__initialTouchTop);d.__enableScrollX=d.options.scrollingX&&t>=r,d.__enableScrollY=d.options.scrollingY&&u>=r,g.push(d.__scrollLeft,d.__scrollTop,b),d.__isDragging=(d.__enableScrollX||d.__enableScrollY)&&(t>=s||u>=s),d.__isDragging&&(d.__interruptedAnimation=!1)}d.__lastTouchLeft=e,d.__lastTouchTop=f,d.__lastTouchMove=b,d.__lastScale=c}},doTouchEnd:function(a){if(a instanceof Date&&(a=a.valueOf()),"number"!=typeof a)throw new Error("Invalid timestamp value: "+a);var b=this;if(b.__isTracking){if(b.__isTracking=!1,b.__isDragging)if(b.__isDragging=!1,b.__isSingleTouch&&b.options.animating&&a-b.__lastTouchMove<=100){for(var c=b.__positions,d=c.length-1,e=d,f=d;f>0&&c[f]>b.__lastTouchMove-100;f-=3)e=f;if(e!==d){var g=c[d]-c[e],h=b.__scrollLeft-c[e-2],i=b.__scrollTop-c[e-1];b.__decelerationVelocityX=h/g*(1e3/60),b.__decelerationVelocityY=i/g*(1e3/60);var j=b.options.paging||b.options.snapping?4:1;(Math.abs(b.__decelerationVelocityX)>j||Math.abs(b.__decelerationVelocityY)>j)&&(b.__refreshActive||b.__startDeceleration(a))}else b.__scrollingComplete()}else a-b.__lastTouchMove>100&&b.__scrollingComplete();b.__isDecelerating||(b.__refreshActive&&b.__refreshStart?(b.__publish(b.__scrollLeft,-b.__refreshHeight,b.__zoomLevel,!0),b.__refreshStart&&b.__refreshStart()):((b.__interruptedAnimation||b.__isDragging)&&b.__scrollingComplete(),b.scrollTo(b.__scrollLeft,b.__scrollTop,!0,b.__zoomLevel),b.__refreshActive&&(b.__refreshActive=!1,b.__refreshDeactivate&&b.__refreshDeactivate()))),b.__positions.length=0}},__publish:function(a,b,e,f){var g=this,h=g.__isAnimating;if(h&&(core.effect.Animate.stop(h),g.__isAnimating=!1),f&&g.options.animating){g.__scheduledLeft=a,g.__scheduledTop=b,g.__scheduledZoom=e;var i=g.__scrollLeft,j=g.__scrollTop,k=g.__zoomLevel,l=a-i,m=b-j,n=e-k,o=function(a,b,c){c&&(g.__scrollLeft=i+l*a,g.__scrollTop=j+m*a,g.__zoomLevel=k+n*a,g.__callback&&g.__callback(g.__scrollLeft,g.__scrollTop,g.__zoomLevel))},p=function(a){return g.__isAnimating===a},q=function(a,b,c){b===g.__isAnimating&&(g.__isAnimating=!1),(g.__didDecelerationComplete||c)&&g.__scrollingComplete(),g.options.zooming&&g.__computeScrollMax()};g.__isAnimating=core.effect.Animate.start(o,p,q,g.options.animationDuration,h?c:d)}else g.__scheduledLeft=g.__scrollLeft=a,g.__scheduledTop=g.__scrollTop=b,g.__scheduledZoom=g.__zoomLevel=e,g.__callback&&g.__callback(a,b,e),g.options.zooming&&g.__computeScrollMax()},__computeScrollMax:function(a){var b=this;null==a&&(a=b.__zoomLevel),b.__maxScrollLeft=Math.max(b.__contentWidth*a-b.__clientWidth,0),b.__maxScrollTop=Math.max(b.__contentHeight*a-b.__clientHeight,0),b.__didWaitForSize||0!=b.__maxScrollLeft||0!=b.__maxScrollTop||(b.__didWaitForSize=!0,b.__waitForSize())},__waitForSize:function(){var a=this;clearTimeout(a.__sizerTimeout);var b=function(){a.resize(),a.options.scrollingX&&0==a.__maxScrollLeft||a.options.scrollingY&&0==a.__maxScrollTop};b(),a.__sizerTimeout=setTimeout(b,1e3)},__startDeceleration:function(){var a=this;if(a.options.paging){var b=Math.max(Math.min(a.__scrollLeft,a.__maxScrollLeft),0),c=Math.max(Math.min(a.__scrollTop,a.__maxScrollTop),0),d=a.__clientWidth,e=a.__clientHeight;a.__minDecelerationScrollLeft=Math.floor(b/d)*d,a.__minDecelerationScrollTop=Math.floor(c/e)*e,a.__maxDecelerationScrollLeft=Math.ceil(b/d)*d,a.__maxDecelerationScrollTop=Math.ceil(c/e)*e}else a.__minDecelerationScrollLeft=0,a.__minDecelerationScrollTop=0,a.__maxDecelerationScrollLeft=a.__maxScrollLeft,a.__maxDecelerationScrollTop=a.__maxScrollTop;var f=function(b,c,d){a.__stepThroughDeceleration(d)},g=a.options.snapping?4:.1,h=function(){var b=Math.abs(a.__decelerationVelocityX)>=g||Math.abs(a.__decelerationVelocityY)>=g;return b||(a.__didDecelerationComplete=!0),b},i=function(){a.__isDecelerating=!1,a.__didDecelerationComplete&&a.__scrollingComplete(),a.options.paging&&a.scrollTo(a.__scrollLeft,a.__scrollTop,a.options.snapping)};a.__isDecelerating=core.effect.Animate.start(f,h,i)},__stepThroughDeceleration:function(a){var b=this,c=b.__scrollLeft+b.__decelerationVelocityX,d=b.__scrollTop+b.__decelerationVelocityY;if(!b.options.bouncing){var e=Math.max(Math.min(b.__maxDecelerationScrollLeft,c),b.__minDecelerationScrollLeft);e!==c&&(c=e,b.__decelerationVelocityX=0);var f=Math.max(Math.min(b.__maxDecelerationScrollTop,d),b.__minDecelerationScrollTop);f!==d&&(d=f,b.__decelerationVelocityY=0)}if(a?b.__publish(c,d,b.__zoomLevel):(b.__scrollLeft=c,b.__scrollTop=d),!b.options.paging){var g=.95;b.__decelerationVelocityX*=g,b.__decelerationVelocityY*=g}if(b.options.bouncing){var h=0,i=0,j=b.options.penetrationDeceleration,k=b.options.penetrationAcceleration;cb.__maxDecelerationScrollLeft&&(h=b.__maxDecelerationScrollLeft-c),db.__maxDecelerationScrollTop&&(i=b.__maxDecelerationScrollTop-d),0!==h&&(h*b.__decelerationVelocityX<=0?b.__decelerationVelocityX+=h*j:b.__decelerationVelocityX=h*k),0!==i&&(i*b.__decelerationVelocityY<=0?b.__decelerationVelocityY+=i*j:b.__decelerationVelocityY=i*k)}}})}(ionic),function(a){"use strict";a.views.ActionSheet=a.views.View.inherit({initialize:function(a){this.el=a.el},show:function(){this.el.offsetWidth,this.el.classList.add("active")},hide:function(){this.el.offsetWidth,this.el.classList.remove("active")}})}(ionic),function(a){"use strict";a.views.HeaderBar=a.views.View.inherit({initialize:function(b){this.el=b.el,a.extend(this,{alignTitle:"center"},b),this.align()},align:function(){window.rAF(a.proxy(function(){var b,c,d,e=this.el.childNodes,f=this.el.querySelector(".title");if(f){var g=0,h=0,i=Array.prototype.indexOf.call(e,f);for(b=0;i>b;b++)d=null,c=e[b],3==c.nodeType?d=a.DomUtil.getTextBounds(c):1==c.nodeType&&(d=c.getBoundingClientRect()),d&&(g+=d.width);for(b=i+1;b10&&(f.style.left=j+"px",f.style.right=j+"px"),f.offsetWidth0&&(f.style.right=h+5+"px")):"left"==this.alignTitle?(f.classList.add("title-left"),g>0&&(f.style.left=g+15+"px")):"right"==this.alignTitle&&(f.classList.add("title-right"),h>0&&(f.style.right=h+15+"px"))}},this))}})}(ionic),function(a){"use strict";var b="item",c="item-content",d="item-sliding",e="item-options",f="item-placeholder",g="item-reordering",h="item-drag",i=function(){};i.prototype={start:function(){},drag:function(){},end:function(){}};var j=function(a){this.dragThresholdX=a.dragThresholdX||10,this.el=a.el};j.prototype=new i,j.prototype.start=function(a){var f,g,h,i;a.target.classList.contains(c)?f=a.target:a.target.classList.contains(b)&&(f=a.target.querySelector("."+c)),f&&(f.classList.remove(d),h=parseFloat(f.style.webkitTransform.replace("translate3d(","").split(",")[0])||0,g=f.parentNode.querySelector("."+e),g&&(i=g.offsetWidth,this._currentDrag={buttonsWidth:i,content:f,startOffsetX:h}))},j.prototype.drag=function(a){var b,c=this;window.rAF(function(){if(c._currentDrag&&(!c._isDragging&&(Math.abs(a.gesture.deltaX)>c.dragThresholdX||Math.abs(c._currentDrag.startOffsetX)>0)&&(c._isDragging=!0),c._isDragging)){b=c._currentDrag.buttonsWidth;var d=Math.min(0,c._currentDrag.startOffsetX+a.gesture.deltaX);-b>d&&(d=Math.min(-b,-b+.4*(a.gesture.deltaX+b))),c._currentDrag.content.style.webkitTransform="translate3d("+d+"px, 0, 0)",c._currentDrag.content.style.webkitTransition="none"}})},j.prototype.end=function(a,b){var c=this;if(!this._currentDrag)return b&&b(),void 0;var d=-this._currentDrag.buttonsWidth;a.gesture.deltaX>-(this._currentDrag.buttonsWidth/2)&&("left"==a.gesture.direction&&Math.abs(a.gesture.velocityX)<.3?d=0:"right"==a.gesture.direction&&(d=0)),window.rAF(function(){c._currentDrag.content.style.webkitTransform=0===d?"":"translate3d("+d+"px, 0, 0)",c._currentDrag.content.style.webkitTransition="",c._currentDrag=null,b&&b()})};var k=function(a){this.dragThresholdY=a.dragThresholdY||0,this.onReorder=a.onReorder,this.el=a.el};k.prototype=new i,k.prototype.start=function(){var b=this.el.offsetTop,c=a.DomUtil.getChildIndex(this.el,this.el.nodeName.toLowerCase()),d=this.el.cloneNode(!0);d.classList.add(f),this.el.parentNode.insertBefore(d,this.el),this.el.classList.add(g),this._currentDrag={startOffsetTop:b,startIndex:c,placeholder:d}},k.prototype.drag=function(a){var b=this;window.rAF(function(){if(b._currentDrag&&(!b._isDragging&&Math.abs(a.gesture.deltaY)>b.dragThresholdY&&(b._isDragging=!0),b._isDragging)){var c=b._currentDrag.startOffsetTop+a.gesture.deltaY;b.el.style.top=c+"px",b._currentDrag.currentY=c,b._reorderItems()}})},k.prototype._reorderItems=function(){this._currentDrag.placeholder;var b=Array.prototype.slice.call(this._currentDrag.placeholder.parentNode.children);b.splice(b.indexOf(this.el),1);var c=b.indexOf(this._currentDrag.placeholder),d=b[Math.max(0,c-1)],e=b[Math.min(b.length,c+1)],f=this._currentDrag.currentY;return d&&fe.offsetTop+e.offsetHeight/2?(a.DomUtil.swapNodes(e,this._currentDrag.placeholder),c+1):void 0},k.prototype.end=function(b,c){if(!this._currentDrag)return c&&c(),void 0;var d=this._currentDrag.placeholder;this.el.classList.remove(g),this.el.style.top=0;var e=a.DomUtil.getChildIndex(d,d.nodeName.toLowerCase());d.parentNode.insertBefore(this.el,d),d.parentNode.removeChild(d),this.onReorder&&this.onReorder(this.el,this._currentDrag.startIndex,e),this._currentDrag=null,c&&c()},a.views.ListView=a.views.View.inherit({initialize:function(b){var c=this;b=a.extend({onReorder:function(){},virtualRemoveThreshold:-200,virtualAddThreshold:200},b),a.extend(this,b),!this.itemHeight&&this.listEl&&(this.itemHeight=this.listEl.children[0]&&parseInt(this.listEl.children[0].style.height,10)),this.onRefresh=b.onRefresh||function(){},this.onRefreshOpening=b.onRefreshOpening||function(){},this.onRefreshHolding=b.onRefreshHolding||function(){},window.ionic.onGesture("touch",function(a){c._handleTouch(a)},this.el),window.ionic.onGesture("release",function(a){c._handleEndDrag(a)},this.el),window.ionic.onGesture("drag",function(a){c._handleDrag(a)},this.el),this._initDrag()},stopRefreshing:function(){var a=this.el.querySelector(".list-refresher");a.style.height="0px"},didScroll:function(a){if(this.isVirtual){var b=this.itemHeight;this.listEl.children.length;var c=a.target.scrollHeight,d=this.el.parentNode.offsetHeight;a.scrollTop;var e=Math.max(0,a.scrollTop+this.virtualRemoveThreshold),f=Math.min(c,Math.abs(a.scrollTop)+d+this.virtualAddThreshold),g=Math.floor((f-e)/b),h=parseInt(Math.abs(e/b),10),i=parseInt(Math.abs(f/b),10);this._virtualItemsToRemove=Array.prototype.slice.call(this.listEl.children,0,h),Array.prototype.slice.call(this.listEl.children,h,h+g),this.renderViewport&&this.renderViewport(e,f,h,i)}},didStopScrolling:function(){if(this.isVirtual)for(var a=0;a5)return this._dragOp=new j({el:this.el}),this._dragOp.start(b),b.preventDefault(),void 0}else{var d=this._getItem(b.target);if(d)return this._dragOp=new k({el:d,onReorder:function(a,b,d){c.onReorder&&c.onReorder(a,b,d)}}),this._dragOp.start(b),b.preventDefault(),void 0}},_handleEndDrag:function(a){var b=this;if(this._dragOp){clearTimeout(this._touchTimeout);for(var c=b.el.querySelectorAll(".item"),d=0,e=c.length;e>d;d++)c[d].classList.remove("active");this._dragOp.end(a,function(){b._initDrag()})}},_handleDrag:function(a){(Math.abs(a.gesture.deltaX)>10||Math.abs(a.gesture.deltaY)>10)&&clearTimeout(this._touchTimeout),clearTimeout(this._touchTimeout),this.isDragging||this._dragOp||this._startDrag(a),this._dragOp&&(a.gesture.srcEvent.preventDefault(),this._dragOp.drag(a))},_handleTouch:function(c){var d=this,e=a.DomUtil.getParentOrSelfWithClass(c.target,b);e&&(this._touchTimeout=setTimeout(function(){for(var a=d.el.querySelectorAll(".item"),b=0,c=a.length;c>b;b++)a[b].classList.remove("active");e.classList.add("active")},250))}})}(ionic),function(a){"use strict";a.views.Loading=a.views.View.inherit({initialize:function(a){this.el=a.el,this.maxWidth=a.maxWidth||200,this._loadingBox=this.el.querySelector(".loading")},show:function(){var a=this;if(this._loadingBox){var b=a._loadingBox,c=Math.min(a.maxWidth,Math.max(window.outerWidth-40,b.offsetWidth));b.style.width=c+"px",b.style.marginLeft=-b.offsetWidth/2+"px",b.style.marginTop=-b.offsetHeight/2+"px",a.el.classList.add("active")}},hide:function(){this.el.offsetWidth,this.el.classList.remove("active")}})}(ionic),function(a){"use strict";a.views.Modal=a.views.View.inherit({initialize:function(b){b=a.extend({focusFirstInput:!1,unfocusOnHide:!0},b),a.extend(this,b),this.el=b.el},show:function(){if(this.el.classList.add("active"),this.focusFirstInput){var a=this.el.querySelector("input, textarea");a&&a.focus&&a.focus()}},hide:function(){if(this.el.classList.remove("active"),this.unfocusOnHide)for(var a=this.el.querySelectorAll("input, textarea"),b=0;bb?-r:b>u?r:0,0))}a.continuous&&n.transitions&&(g(e(u-1),-r,0),g(e(u+1),r,0)),n.transitions||(t.style.left=u*-r+"px"),o.style.visibility="visible",a.slidesChanged&&a.slidesChanged()}function c(){a.continuous?f(u-1):u&&f(u-1)}function d(){a.continuous?f(u+1):uu?b:u)-h-1),r*d,0);b=e(b),g(u,r*d,c||v),g(b,0,c||v),a.continuous&&g(e(b-d),-(r*d),0)}else b=e(b),i(u*-r,b*-r,c||v);u=b,m(a.callback&&a.callback(u,p[u]))}}function g(a,b,c){h(a,b,c),q[a]=b}function h(a,b,c){var d=p[a],e=d&&d.style;e&&(e.webkitTransitionDuration=e.MozTransitionDuration=e.msTransitionDuration=e.OTransitionDuration=e.transitionDuration=c+"ms",e.webkitTransform="translate("+b+"px,0)"+"translateZ(0)",e.msTransform=e.MozTransform=e.OTransform="translateX("+b+"px)")}function i(b,c,d){if(!d)return t.style.left=c+"px",void 0;var e=+new Date,f=setInterval(function(){var g=+new Date-e;return g>d?(t.style.left=c+"px",y&&j(),a.transitionEnd&&a.transitionEnd.call(event,u,p[u]),clearInterval(f),void 0):(t.style.left=(c-b)*(Math.floor(100*(g/d))/100)+b+"px",void 0)},4)}function j(){w=setTimeout(d,y)}function k(){y=0,clearTimeout(w)}var l=function(){},m=function(a){setTimeout(a||l,0)},n={addEventListener:!!window.addEventListener,touch:"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch,transitions:function(a){var b=["transitionProperty","WebkitTransition","MozTransition","OTransition","msTransition"];for(var c in b)if(void 0!==a.style[b[c]])return!0;return!1}(document.createElement("swipe"))},o=a.el;if(o){var p,q,r,s,t=o.children[0];a=a||{};var u=parseInt(a.startSlide,10)||0,v=a.speed||300;a.continuous=void 0!==a.continuous?a.continuous:!0;var w,x,y=a.auto||0,z={},A={},B={handleEvent:function(c){switch(("mousedown"==c.type||"mouseup"==c.type||"mousemove"==c.type)&&(c.touches=[{pageX:c.pageX,pageY:c.pageY}]),c.type){case"mousedown":this.start(c);break;case"touchstart":this.start(c);break;case"touchmove":this.move(c);break;case"mousemove":this.move(c);break;case"touchend":m(this.end(c));break;case"mouseup":m(this.end(c));break;case"webkitTransitionEnd":case"msTransitionEnd":case"oTransitionEnd":case"otransitionend":case"transitionend":m(this.transitionEnd(c));break;case"resize":m(b)}a.stopPropagation&&c.stopPropagation()},start:function(a){var b=a.touches[0];z={x:b.pageX,y:b.pageY,time:+new Date},x=void 0,A={},n.touch?(t.addEventListener("touchmove",this,!1),t.addEventListener("touchend",this,!1)):(t.addEventListener("mousemove",this,!1),t.addEventListener("mouseup",this,!1),document.addEventListener("mouseup",this,!1))},move:function(b){if(!(b.touches.length>1||b.scale&&1!==b.scale)){a.disableScroll&&b.preventDefault();var c=b.touches[0];A={x:c.pageX-z.x,y:c.pageY-z.y},"undefined"==typeof x&&(x=!!(x||Math.abs(A.x)0||u==p.length-1&&A.x<0?Math.abs(A.x)/r+1:1),h(u-1,A.x+q[u-1],0),h(u,A.x+q[u],0),h(u+1,A.x+q[u+1],0)))}},end:function(){var b=+new Date-z.time,c=Number(b)<250&&Math.abs(A.x)>20||Math.abs(A.x)>r/2,d=!u&&A.x>0||u==p.length-1&&A.x<0;a.continuous&&(d=!1);var f=A.x<0;x||(c&&!d?(f?(a.continuous?(g(e(u-1),-r,0),g(e(u+2),r,0)):g(u-1,-r,0),g(u,q[u]-r,v),g(e(u+1),q[e(u+1)]-r,v),u=e(u+1)):(a.continuous?(g(e(u+1),r,0),g(e(u-2),-r,0)):g(u+1,r,0),g(u,q[u]+r,v),g(e(u-1),q[e(u-1)]+r,v),u=e(u-1)),a.callback&&a.callback(u,p[u])):a.continuous?(g(e(u-1),-r,v),g(u,0,v),g(e(u+1),r,v)):(g(u-1,-r,v),g(u,0,v),g(u+1,r,v))),n.touch?(t.removeEventListener("touchmove",B,!1),t.removeEventListener("touchend",B,!1)):(t.removeEventListener("mousemove",B,!1),t.removeEventListener("mouseup",B,!1),document.removeEventListener("mouseup",B,!1))},transitionEnd:function(b){parseInt(b.target.getAttribute("data-index"),10)==u&&(y&&j(),a.transitionEnd&&a.transitionEnd.call(b,u,p[u]))}};this.setup=function(){b()},this.slide=function(a,b){k(),f(a,b)},this.prev=function(){k(),c()},this.next=function(){k(),d()},this.stop=function(){k()},this.getPos=function(){return u},this.getNumSlides=function(){return s},this.kill=function(){k(),t.style.width="",t.style.left="";for(var a=p.length;a--;){var b=p[a];b.style.width="",b.style.left="",n.transitions&&h(a,0,0)}n.addEventListener?(t.removeEventListener("touchstart",B,!1),t.removeEventListener("webkitTransitionEnd",B,!1),t.removeEventListener("msTransitionEnd",B,!1),t.removeEventListener("oTransitionEnd",B,!1),t.removeEventListener("otransitionend",B,!1),t.removeEventListener("transitionend",B,!1),window.removeEventListener("resize",B,!1)):window.onresize=null},this.load=function(){b(),y&&j(),n.addEventListener?(n.touch?t.addEventListener("touchstart",B,!1):t.addEventListener("mousedown",B,!1),n.transitions&&(t.addEventListener("webkitTransitionEnd",B,!1),t.addEventListener("msTransitionEnd",B,!1),t.addEventListener("oTransitionEnd",B,!1),t.addEventListener("otransitionend",B,!1),t.addEventListener("transitionend",B,!1)),window.addEventListener("resize",B,!1)):window.onresize=function(){b()}}}}})}(ionic),function(a){"use strict";a.views.TabBarItem=a.views.View.inherit({initialize:function(a){this.el=a,this._buildItem()},create:function(b){var c=document.createElement("a");if(c.className="tab-item",b.icon){var d=document.createElement("i");d.className=b.icon,c.appendChild(d)}return c.appendChild(document.createTextNode(b.title)),new a.views.TabBarItem(c)},_buildItem:function(){for(var b,c=this,d=Array.prototype.slice.call(this.el.children),e=0,f=d.length;f>e;e++)if(b=d[e],"i"==b.tagName.toLowerCase()&&/icon/.test(b.className)){this.icon=b.className;break}this.title=this.el.textContent.trim(),this._tapHandler=function(a){c.onTap&&c.onTap(a)},a.on("tap",this._tapHandler,this.el)},onTap:function(){},destroy:function(){a.off("tap",this._tapHandler,this.el)},getIcon:function(){return this.icon},getTitle:function(){return this.title},setSelected:function(a){this.isSelected=a,a?this.el.classList.add("active"):this.el.classList.remove("active")}}),a.views.TabBar=a.views.View.inherit({initialize:function(a){this.el=a.el,this.items=[],this._buildItems()},getItems:function(){return this.items},addItem:function(b){var c=a.views.TabBarItem.prototype.create(b);this.appendItemElement(c),this.items.push(c),this._bindEventsOnItem(c)},appendItemElement:function(a){this.el&&this.el.appendChild(a.el)},removeItem:function(a){var b=this.items[a];b&&(b.onTap=void 0,b.destroy())},_bindEventsOnItem:function(a){var b=this;this._itemTapHandler||(this._itemTapHandler=function(){b.trySelectItem(this)}),a.onTap=this._itemTapHandler},getSelectedItem:function(){return this.selectedItem},setSelectedItem:function(a){this.selectedItem=this.items[a];for(var b=0,c=this.items.length;c>b;b+=1)this.items[b].setSelected(!1);this.selectedItem&&this.selectedItem.setSelected(!0)},selectItem:function(a){for(var b=0,c=this.items.length;c>b;b+=1)if(this.items[b]==a)return this.setSelectedItem(b),void 0},trySelectItem:function(a){for(var b=0,c=this.items.length;c>b;b+=1)if(this.items[b]==a)return this.tryTabSelect&&this.tryTabSelect(b),void 0},_buildItems:function(){for(var b,c=Array.prototype.slice.call(this.el.children),d=0,e=c.length;e>d;d+=1)b=new a.views.TabBarItem(c[d]),this.items[d]=b,this._bindEventsOnItem(b);this.items.length>0&&(this.selectedItem=this.items[0])},destroy:function(){for(var a=0,b=this.items.length;b>a;a+=1)this.items[a].destroy();this.items.length=0}})}(window.ionic),function(a){"use strict";a.views.Toggle=a.views.View.inherit({initialize:function(a){this.el=a.el,this.checkbox=a.checkbox,this.handle=a.handle,this.openPercent=-1},tap:function(){this.val(!this.checkbox.checked)},drag:function(a){var b=this.checkbox.offsetLeft+this.handle.offsetWidth/2,c=this.checkbox.offsetLeft+this.checkbox.offsetWidth-this.handle.offsetWidth/2;a.pageX>=c-4?this.val(!0):a.pageX<=b?this.val(!1):this.setOpenPercent(Math.round(100*(1-(c-a.pageX)/(c-b))))},setOpenPercent:function(a){if(this.openPercent<0||athis.openPercent+3)if(this.openPercent=a,0===a)this.val(!1);else if(100===a)this.val(!0);else{var b=Math.round(a/100*this.checkbox.offsetWidth-this.handle.offsetWidth);b=1>b?0:b,this.handle.style.webkitTransform="translate3d("+b+"px,0,0)"}},release:function(){this.val(this.openPercent>=50)},val:function(a){return(a===!0||a===!1)&&(""!==this.handle.style.webkitTransform&&(this.handle.style.webkitTransform=""),this.checkbox.checked=a,this.openPercent=a?100:0),this.checkbox.checked}})}(ionic),function(a){"use strict";a.controllers.ViewController=function(){this.initialize.apply(this,arguments)},a.controllers.ViewController.inherit=a.inherit,a.extend(a.controllers.ViewController.prototype,{initialize:function(){},destroy:function(){}})}(window.ionic),function(a){"use strict";a.controllers.NavController=a.controllers.ViewController.inherit({initialize:function(a){var b=this;this.navBar=a.navBar,this.content=a.content,this.controllers=a.controllers||[],this._updateNavBar(),this.navBar.shouldGoBack=function(){b.pop()}},getControllers:function(){return this.controllers},getTopController:function(){return this.controllers[this.controllers.length-1]},push:function(a){var b=this.controllers[this.controllers.length-1];this.controllers.push(a);var c=this.switchingController&&this.switchingController(a)||!0;if(c!==!1){b&&(b.isVisible=!1,b.visibilityChanged&&b.visibilityChanged("push"));var d=this.controllers[this.controllers.length-1];return d.isVisible=!0,d.visibilityChanged&&d.visibilityChanged(b?"push":"first"),this._updateNavBar(),a}},pop:function(){var a,b;if(!(this.controllers.length<2))return b=this.controllers.pop(),b&&(b.isVisible=!1,b.visibilityChanged&&b.visibilityChanged("pop")),a=this.controllers[this.controllers.length-1],a.isVisible=!0,a.visibilityChanged&&a.visibilityChanged("pop"),this._updateNavBar(),b},showNavBar:function(){this.navBar&&this.navBar.show()},hideNavBar:function(){this.navBar&&this.navBar.hide()},_updateNavBar:function(){this.getTopController()&&this.navBar&&(this.navBar.setTitle(this.getTopController().title),this.controllers.length>1?this.navBar.showBackButton(!0):this.navBar.showBackButton(!1))}})}(window.ionic),function(a){"use strict";a.controllers.SideMenuController=a.controllers.ViewController.inherit({initialize:function(a){var b=this;this.left=a.left,this.right=a.right,this.content=a.content,this.dragThresholdX=a.dragThresholdX||10,this._rightShowing=!1,this._leftShowing=!1,this._isDragging=!1,this.content&&(this.content.onDrag=function(a){b._handleDrag(a)},this.content.onEndDrag=function(a){b._endDrag(a)})},setContent:function(a){var b=this;this.content=a,this.content.onDrag=function(a){b._handleDrag(a)},this.content.endDrag=function(a){b._endDrag(a)}},toggleLeft:function(){this.content.enableAnimation();var a=this.getOpenAmount();a>0?this.openPercentage(0):this.openPercentage(100)},toggleRight:function(){this.content.enableAnimation();var a=this.getOpenAmount();0>a?this.openPercentage(0):this.openPercentage(-100)},close:function(){this.openPercentage(0)},getOpenAmount:function(){return this.content.getTranslateX()||0},getOpenRatio:function(){var a=this.getOpenAmount();return a>=0?a/this.left.width:a/this.right.width},isOpen:function(){return 1==this.getOpenRatio()},getOpenPercentage:function(){return 100*this.getOpenRatio()},openPercentage:function(a){var b=a/100;this.left&&a>=0?this.openAmount(this.left.width*b):this.right&&0>a&&(this.right.width,this.openAmount(this.right.width*b))},openAmount:function(a){var b=this.left&&this.left.width||0,c=this.right&&this.right.width||0;(!this.left||!this.left.isEnabled)&&a>0||(!this.right||!this.right.isEnabled)&&0>a||this._leftShowing&&a>b||this._rightShowing&&-c>a||(this.content.setTranslateX(a),a>=0?(this._leftShowing=!0,this._rightShowing=!1,this.right&&this.right.pushDown&&this.right.pushDown(),this.left&&this.left.bringUp&&this.left.bringUp()):(this._rightShowing=!0,this._leftShowing=!1,this.right&&this.right.bringUp&&this.right.bringUp(),this.left&&this.left.pushDown&&this.left.pushDown())) +window.ionic={controllers:{},views:{},version:"0.9.19"},function(a){function b(a){return a*a*a}function c(a){return 3*a*a*(1-a)}function d(a){return 3*a*(1-a)*(1-a)}function e(a){return(1-a)*(1-a)*(1-a)}var f=function(a,b){return a||(a=0),b||(b=0),{x:a,y:b}};a.Animator={getQuadraticBezier:function(a,g,h,i,j){var k=new f;return k.x=g.x*b(a)+h.x*c(a)+i.x*d(a)+j.x*e(a),k.y=g.y*b(a)+h.y*c(a)+i.y*d(a)+j.y*e(a),k},getCubicBezier:function(a,b,c,d,e){epsilon=1e3/60/e/4;var f=function(b){var d=1-b;return 3*d*d*b*a+3*d*b*b*c+b*b*b},g=function(a){var c=1-a;return 3*c*c*a*b+3*c*a*a*d+a*a*a},h=function(b){var d=1-b;return 3*(2*(b-1)*b+d*d)*a+3*(-b*b*b+2*d*b)*c};return function(a){var b,c,d,e,i,j,k=a;for(d=k,j=0;8>j;j++){if(e=f(d)-k,Math.abs(e)d)return g(b);if(d>c)return g(c);for(;c>b;){if(e=f(d),Math.abs(e-k)e?b=d:c=d,d=.5*(c-b)+b}return g(d)}},animate:function(a){return{leave:function(){var b=function(){a.classList.remove("leave"),a.classList.remove("leave-active"),a.removeEventListener("webkitTransitionEnd",b),a.removeEventListener("transitionEnd",b)};return a.addEventListener("webkitTransitionEnd",b),a.addEventListener("transitionEnd",b),a.classList.add("leave"),a.classList.add("leave-active"),this},enter:function(){var b=function(){a.classList.remove("enter"),a.classList.remove("enter-active"),a.removeEventListener("webkitTransitionEnd",b),a.removeEventListener("transitionEnd",b)};return a.addEventListener("webkitTransitionEnd",b),a.addEventListener("transitionEnd",b),a.classList.add("enter"),a.classList.add("enter-active"),this}}}}}(ionic),function(a){a.DomUtil={getTextBounds:function(a){if(document.createRange){var b=document.createRange();if(b.selectNodeContents(a),b.getBoundingClientRect){var c=b.getBoundingClientRect(),d=window.scrollX,e=window.scrollY;return{top:c.top+e,left:c.left+d,right:c.left+d+c.width,bottom:c.top+e+c.height,width:c.width,height:c.height}}}return null},getChildIndex:function(a,b){if(b)for(var c,d=a.parentNode.children,e=0,f=0,g=d.length;g>e;e++)if(c=d[e],c.nodeName&&c.nodeName.toLowerCase()==b){if(c==a)return f;f++}return Array.prototype.slice.call(a.parentNode.children).indexOf(a)},swapNodes:function(a,b){b.parentNode.insertBefore(a,b)},getParentWithClass:function(a,b){for(;a.parentNode;){if(a.parentNode.classList&&a.parentNode.classList.contains(b))return a.parentNode;a=a.parentNode}return null},getParentOrSelfWithClass:function(a,b){for(;a;){if(a.classList&&a.classList.contains(b))return a;a=a.parentNode}return null},rectContains:function(a,b,c,d,e,f){return c>a||a>e?!1:d>b||b>f?!1:!0}}}(window.ionic),function(a){window.CustomEvent||!function(){var a;a=function(a,b){var c;return b=b||{bubbles:!1,cancelable:!1,detail:void 0},c=document.createEvent("CustomEvent"),c.initCustomEvent(a,b.bubbles,b.cancelable,b.detail),c},a.prototype=window.Event.prototype,window.CustomEvent=a}(),a.EventController={VIRTUALIZED_EVENTS:["tap","swipe","swiperight","swipeleft","drag","hold","release"],trigger:function(a,b){var c=new CustomEvent(a,{detail:b});b&&b.target&&b.target.dispatchEvent(c)||window.dispatchEvent(c)},on:function(b,c,d){for(var e=d||window,f=0,g=this.VIRTUALIZED_EVENTS.length;g>f;f++)if(b==this.VIRTUALIZED_EVENTS[f]){var h=new a.Gesture(d);return h.on(b,c),h}e.addEventListener(b,c)},off:function(a,b,c){c.removeEventListener(a,b)},onGesture:function(b,c,d){var e=new a.Gesture(d);return e.on(b,c),e},offGesture:function(a,b,c){a.off(b,c)},handlePopState:function(){}},a.on=function(){a.EventController.on.apply(a.EventController,arguments)},a.off=function(){a.EventController.off.apply(a.EventController,arguments)},a.trigger=a.EventController.trigger,a.onGesture=function(){return a.EventController.onGesture.apply(a.EventController.onGesture,arguments)},a.offGesture=function(){return a.EventController.offGesture.apply(a.EventController.offGesture,arguments)}}(window.ionic),function(a){function b(){if(!a.Gestures.READY){a.Gestures.event.determineEventTypes();for(var b in a.Gestures.gestures)a.Gestures.gestures.hasOwnProperty(b)&&a.Gestures.detection.register(a.Gestures.gestures[b]);a.Gestures.event.onTouch(a.Gestures.DOCUMENT,a.Gestures.EVENT_MOVE,a.Gestures.detection.detect),a.Gestures.event.onTouch(a.Gestures.DOCUMENT,a.Gestures.EVENT_END,a.Gestures.detection.detect),a.Gestures.READY=!0}}a.Gesture=function(b,c){return new a.Gestures.Instance(b,c||{})},a.Gestures={},a.Gestures.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},a.Gestures.HAS_POINTEREVENTS=window.navigator.pointerEnabled||window.navigator.msPointerEnabled,a.Gestures.HAS_TOUCHEVENTS="ontouchstart"in window,a.Gestures.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android|silk/i,a.Gestures.NO_MOUSEEVENTS=a.Gestures.HAS_TOUCHEVENTS&&window.navigator.userAgent.match(a.Gestures.MOBILE_REGEX),a.Gestures.EVENT_TYPES={},a.Gestures.DIRECTION_DOWN="down",a.Gestures.DIRECTION_LEFT="left",a.Gestures.DIRECTION_UP="up",a.Gestures.DIRECTION_RIGHT="right",a.Gestures.POINTER_MOUSE="mouse",a.Gestures.POINTER_TOUCH="touch",a.Gestures.POINTER_PEN="pen",a.Gestures.EVENT_START="start",a.Gestures.EVENT_MOVE="move",a.Gestures.EVENT_END="end",a.Gestures.DOCUMENT=window.document,a.Gestures.plugins={},a.Gestures.READY=!1,a.Gestures.Instance=function(c,d){var e=this;return null===c?(console.error("Null element passed to gesture (element does not exist). Not listening for gesture"),void 0):(b(),this.element=c,this.enabled=!0,this.options=a.Gestures.utils.extend(a.Gestures.utils.extend({},a.Gestures.defaults),d||{}),this.options.stop_browser_behavior&&a.Gestures.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),a.Gestures.event.onTouch(c,a.Gestures.EVENT_START,function(b){e.enabled&&a.Gestures.detection.startDetect(e,b)}),this)},a.Gestures.Instance.prototype={on:function(a,b){for(var c=a.split(" "),d=0;d0&&f==a.Gestures.EVENT_END?f=a.Gestures.EVENT_MOVE:k||(f=a.Gestures.EVENT_END),(k||null===c)&&(c=i),g.call(a.Gestures.detection,h.collectEventData(b,f,h.getTouchList(c,f),i)),a.Gestures.HAS_POINTEREVENTS&&f==a.Gestures.EVENT_END&&(k=a.Gestures.PointerEvent.updatePointer(f,i))),k||(c=null,d=!1,e=!1,a.Gestures.PointerEvent.reset())}})},determineEventTypes:function(){var b;b=a.Gestures.HAS_POINTEREVENTS?a.Gestures.PointerEvent.getEvents():a.Gestures.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_START]=b[0],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_MOVE]=b[1],a.Gestures.EVENT_TYPES[a.Gestures.EVENT_END]=b[2]},getTouchList:function(b){return a.Gestures.HAS_POINTEREVENTS?a.Gestures.PointerEvent.getTouchList():b.touches?b.touches:(b.indentifier=1,[b])},collectEventData:function(b,c,d,e){var f=a.Gestures.POINTER_TOUCH;return(e.type.match(/mouse/)||a.Gestures.PointerEvent.matchType(a.Gestures.POINTER_MOUSE,e))&&(f=a.Gestures.POINTER_MOUSE),{center:a.Gestures.utils.getCenter(d),timeStamp:(new Date).getTime(),target:e.target,touches:d,eventType:c,pointerType:f,srcEvent:e,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return a.Gestures.detection.stopDetect()}}}},a.Gestures.PointerEvent={pointers:{},getTouchList:function(){var a=this,b=[];return Object.keys(a.pointers).sort().forEach(function(c){b.push(a.pointers[c])}),b},updatePointer:function(b,c){return b==a.Gestures.EVENT_END?this.pointers={}:(c.identifier=c.pointerId,this.pointers[c.pointerId]=c),Object.keys(this.pointers).length},matchType:function(b,c){if(!c.pointerType)return!1;var d={};return d[a.Gestures.POINTER_MOUSE]=c.pointerType==c.MSPOINTER_TYPE_MOUSE||c.pointerType==a.Gestures.POINTER_MOUSE,d[a.Gestures.POINTER_TOUCH]=c.pointerType==c.MSPOINTER_TYPE_TOUCH||c.pointerType==a.Gestures.POINTER_TOUCH,d[a.Gestures.POINTER_PEN]=c.pointerType==c.MSPOINTER_TYPE_PEN||c.pointerType==a.Gestures.POINTER_PEN,d[b]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},a.Gestures.utils={extend:function(a,b,c){for(var d in b)void 0!==a[d]&&c||(a[d]=b[d]);return a},hasParent:function(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1},getCenter:function(a){for(var b=[],c=[],d=0,e=a.length;e>d;d++)b.push(a[d].pageX),c.push(a[d].pageY);return{pageX:(Math.min.apply(Math,b)+Math.max.apply(Math,b))/2,pageY:(Math.min.apply(Math,c)+Math.max.apply(Math,c))/2}},getVelocity:function(a,b,c){return{x:Math.abs(b/a)||0,y:Math.abs(c/a)||0}},getAngle:function(a,b){var c=b.pageY-a.pageY,d=b.pageX-a.pageX;return 180*Math.atan2(c,d)/Math.PI},getDirection:function(b,c){var d=Math.abs(b.pageX-c.pageX),e=Math.abs(b.pageY-c.pageY);return d>=e?b.pageX-c.pageX>0?a.Gestures.DIRECTION_LEFT:a.Gestures.DIRECTION_RIGHT:b.pageY-c.pageY>0?a.Gestures.DIRECTION_UP:a.Gestures.DIRECTION_DOWN},getDistance:function(a,b){var c=b.pageX-a.pageX,d=b.pageY-a.pageY;return Math.sqrt(c*c+d*d)},getScale:function(a,b){return a.length>=2&&b.length>=2?this.getDistance(b[0],b[1])/this.getDistance(a[0],a[1]):1},getRotation:function(a,b){return a.length>=2&&b.length>=2?this.getAngle(b[1],b[0])-this.getAngle(a[1],a[0]):0},isVertical:function(b){return b==a.Gestures.DIRECTION_UP||b==a.Gestures.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(a,b){var c,d=["webkit","khtml","moz","Moz","ms","o",""];if(b&&a.style){for(var e=0;ed;d++){var f=this.gestures[d];if(!this.stopped&&c[f.name]!==!1&&f.handler.call(f,b,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=b),b.eventType==a.Gestures.EVENT_END&&!b.touches.length-1&&this.stopDetect(),b}},stopDetect:function(){this.previous=a.Gestures.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(b){var c=this.current.startEvent;if(c&&(b.touches.length!=c.touches.length||b.touches===c.touches)){c.touches=[];for(var d=0,e=b.touches.length;e>d;d++)c.touches.push(a.Gestures.utils.extend({},b.touches[d]))}var f=b.timeStamp-c.timeStamp,g=b.center.pageX-c.center.pageX,h=b.center.pageY-c.center.pageY,i=a.Gestures.utils.getVelocity(f,g,h);return a.Gestures.utils.extend(b,{deltaTime:f,deltaX:g,deltaY:h,velocityX:i.x,velocityY:i.y,distance:a.Gestures.utils.getDistance(c.center,b.center),angle:a.Gestures.utils.getAngle(c.center,b.center),direction:a.Gestures.utils.getDirection(c.center,b.center),scale:a.Gestures.utils.getScale(c.touches,b.touches),rotation:a.Gestures.utils.getRotation(c.touches,b.touches),startEvent:c}),b},register:function(b){var c=b.defaults||{};return void 0===c[b.name]&&(c[b.name]=!0),a.Gestures.utils.extend(a.Gestures.defaults,c,!0),b.index=b.index||1e3,this.gestures.push(b),this.gestures.sort(function(a,b){return a.indexb.index?1:0}),this.gestures}},a.Gestures.gestures=a.Gestures.gestures||{},a.Gestures.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(b,c){switch(b.eventType){case a.Gestures.EVENT_START:clearTimeout(this.timer),a.Gestures.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==a.Gestures.detection.current.name&&c.trigger("hold",b)},c.options.hold_timeout);break;case a.Gestures.EVENT_MOVE:b.distance>c.options.hold_threshold&&clearTimeout(this.timer);break;case a.Gestures.EVENT_END:clearTimeout(this.timer)}}},a.Gestures.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(b,c){if(b.eventType==a.Gestures.EVENT_END){var d=a.Gestures.detection.previous,e=!1;if(b.deltaTime>c.options.tap_max_touchtime||b.distance>c.options.tap_max_distance)return;d&&"tap"==d.name&&b.timeStamp-d.lastEvent.timeStamp0&&b.touches.length>c.options.swipe_max_touches)return;(b.velocityX>c.options.swipe_velocity||b.velocityY>c.options.swipe_velocity)&&(c.trigger(this.name,b),c.trigger(this.name+b.direction,b))}}},a.Gestures.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,correct_for_drag_min_distance:!0,drag_max_touches:1,drag_block_horizontal:!0,drag_block_vertical:!0,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(b,c){if(a.Gestures.detection.current.name!=this.name&&this.triggered)return c.trigger(this.name+"end",b),this.triggered=!1,void 0;if(!(c.options.drag_max_touches>0&&b.touches.length>c.options.drag_max_touches))switch(b.eventType){case a.Gestures.EVENT_START:this.triggered=!1;break;case a.Gestures.EVENT_MOVE:if(b.distancec.options.transform_min_rotation&&c.trigger("rotate",b),d>c.options.transform_min_scale&&(c.trigger("pinch",b),c.trigger("pinch"+(b.scale<1?"in":"out"),b));break;case a.Gestures.EVENT_END:this.triggered&&c.trigger(this.name+"end",b),this.triggered=!1}}},a.Gestures.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(b,c){return c.options.prevent_mouseevents&&b.pointerType==a.Gestures.POINTER_MOUSE?(b.stopDetect(),void 0):(c.options.prevent_default&&b.preventDefault(),b.eventType==a.Gestures.EVENT_START&&c.trigger(this.name,b),void 0)}},a.Gestures.gestures.Release={name:"release",index:1/0,handler:function(b,c){b.eventType==a.Gestures.EVENT_END&&c.trigger(this.name,b)}}}(window.ionic),function(a){a.Platform={detect:function(){var a=[];this._checkPlatforms(a);var b=function(){if(document.body)for(var b=0;b=0},isIOS7:function(){return window.device?"iOS"==window.device.platform&&parseFloat(window.device.version)>=7:!1},isAndroid:function(){return window.device?"Android"===device.platform:navigator.userAgent.toLowerCase().indexOf("android")>=0}},a.Platform.detect()}(window.ionic),function(a,b,c){"use strict";function d(a,b){return"radio"===a.type?(a.checked=!a.checked,c.trigger("click",{target:a})):"checkbox"===a.type?(a.checked=!a.checked,c.trigger("change",{target:a})):"submit"===a.type||"button"===a.type?c.trigger("click",{target:a}):a.focus(),b.stopPropagation(),b.preventDefault(),!1}function e(a){if(a.gesture&&"touch"===a.gesture.pointerType&&a.gesture.srcEvent&&!a.alreadyHandled){a=a.gesture.srcEvent;for(var e=a.target;e;){if("INPUT"===e.tagName||"TEXTAREA"===e.tagName||"SELECT"===e.tagName)return d(e,a);if("LABEL"===e.tagName){if(e.control)return d(e.control,a)}else if("A"===e.tagName||"BUTTON"===e.tagName)return c.trigger("click",{target:e}),a.stopPropagation(),a.preventDefault(),!1;e=e.parentElement}var f=b.activeElement;return!f||"INPUT"!==f.tagName&&"TEXTAREA"!==f.tagName&&"SELECT"!==f.tagName?void 0:(f.blur(),a.stopPropagation(),a.preventDefault(),!1)}}a.rAF=function(){return a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||function(b){a.setTimeout(b,1e3/60)}}(),c.CSS={},function(){for(var a=b.createElement("div"),d=["webkitTransform","transform","-webkit-transform","webkit-transform","-moz-transform","moz-transform","MozTransform","mozTransform"],e=0;e=a.length)for(var d=c-a.length;d--+1;)a.push(void 0);return a.splice(c,0,a.splice(b,1)[0]),a},proxy:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){return a.apply(b,c.concat(Array.prototype.slice.call(arguments)))}},debounce:function(a,b,c){var d,e,f,g,h;return function(){f=this,e=arguments,g=new Date;var i=function(){var j=new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e)))},j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e)),h}},throttle:function(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:Date.now(),g=null,f=a.apply(d,e)};return function(){var j=Date.now();h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e)):g||c.trailing===!1||(g=setTimeout(i,k)),f}},inherit:function(b,c){var d,e=this;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){return e.apply(this,arguments)},a.extend(d,e,c);var f=function(){this.constructor=d};return f.prototype=e.prototype,d.prototype=new f,b&&a.extend(d.prototype,b),d.__super__=e.prototype,d},extend:function(a){for(var b=Array.prototype.slice.call(arguments,1),c=0;c2500&&(clearInterval(h),h=null)},1e3/d)),b}}(),stop:function(a){var b=null!=e[a];return b&&(e[a]=null),b},isRunning:function(a){return null!=e[a]},start:function(a,g,h,i,j,k){var l=b(),m=l,n=0,o=0,p=f++;if(k||(k=document.body),p%20===0){var q={};for(var r in e)q[r]=!0;e=q}var s=function(f){var q=f!==!0,r=b();if(!e[p]||g&&!g(p))return e[p]=null,h&&h(c-o/((r-l)/d),p,!1),void 0;if(q)for(var t=Math.round((r-m)/(d/c))-1,u=0;u1&&(n=1));var v=j?j(n):n;a(v,r,q)!==!1&&1!==n||!q?q&&(m=r,core.effect.Animate.requestAnimationFrame(s,k)):(e[p]=null,h&&h(c-o/((r-l)/d),p,1===n||null==i))};return e[p]=!0,core.effect.Animate.requestAnimationFrame(s,k),p}}}(this);var Scroller;!function(a){var b=function(){},c=function(a){return Math.pow(a-1,3)+1},d=function(a){return(a/=.5)<1?.5*Math.pow(a,3):.5*(Math.pow(a-2,3)+2)};a.views.Scroll=a.views.View.inherit({initialize:function(c){var d=this;this.__container=c.el,this.__content=c.el.firstElementChild,this.options={scrollingX:!1,scrollbarX:!0,scrollingY:!0,scrollbarY:!0,minScrollbarSizeX:5,minScrollbarSizeY:5,scrollbarsFade:!0,scrollbarFadeDelay:300,scrollbarResizeFadeDelay:1e3,animating:!0,animationDuration:250,bouncing:!0,locking:!0,paging:!1,snapping:!1,zooming:!1,minZoom:.5,maxZoom:3,speedMultiplier:1,scrollingComplete:b,penetrationDeceleration:.03,penetrationAcceleration:.08,scrollEventInterval:50};for(var e in c)this.options[e]=c[e];this.hintResize=a.debounce(function(){d.resize()},1e3,!0),this.triggerScrollEvent=a.throttle(function(){a.trigger("scroll",{scrollTop:d.__scrollTop,scrollLeft:d.__scrollLeft,target:d.__container})},this.options.scrollEventInterval),this.triggerScrollEndEvent=function(){a.trigger("scrollend",{scrollTop:d.__scrollTop,scrollLeft:d.__scrollLeft,target:d.__container})},this.__callback=this.getRenderFn(),this.__initEventHandlers(),this.__createScrollbars(),this.resize(),this.__fadeScrollbars("out",this.options.scrollbarResizeFadeDelay)},__isSingleTouch:!1,__isTracking:!1,__didDecelerationComplete:!1,__isGesturing:!1,__isDragging:!1,__isDecelerating:!1,__isAnimating:!1,__clientLeft:0,__clientTop:0,__clientWidth:0,__clientHeight:0,__contentWidth:0,__contentHeight:0,__snapWidth:100,__snapHeight:100,__refreshHeight:null,__refreshActive:!1,__refreshActivate:null,__refreshDeactivate:null,__refreshStart:null,__zoomLevel:1,__scrollLeft:0,__scrollTop:0,__maxScrollLeft:0,__maxScrollTop:0,__scheduledLeft:0,__scheduledTop:0,__scheduledZoom:0,__lastTouchLeft:null,__lastTouchTop:null,__lastTouchMove:null,__positions:null,__minDecelerationScrollLeft:null,__minDecelerationScrollTop:null,__maxDecelerationScrollLeft:null,__maxDecelerationScrollTop:null,__decelerationVelocityX:null,__decelerationVelocityY:null,__transformProperty:null,__perspectiveProperty:null,__indicatorX:null,__indicatorY:null,__scrollbarFadeTimeout:null,__didWaitForSize:null,__sizerTimeout:null,__initEventHandlers:function(){var a=this,b=this.__container;if("ontouchstart"in window)b.addEventListener("touchstart",function(b){b.target.tagName.match(/input|textarea|select/i)||(a.doTouchStart(b.touches,b.timeStamp),b.preventDefault())},!1),document.addEventListener("touchmove",function(b){b.defaultPrevented||a.doTouchMove(b.touches,b.timeStamp)},!1),document.addEventListener("touchend",function(b){a.doTouchEnd(b.timeStamp)},!1);else{var c=!1;b.addEventListener("mousedown",function(b){b.target.tagName.match(/input|textarea|select/i)||(a.doTouchStart([{pageX:b.pageX,pageY:b.pageY}],b.timeStamp),c=!0)},!1),document.addEventListener("mousemove",function(b){c&&!b.defaultPrevented&&(a.doTouchMove([{pageX:b.pageX,pageY:b.pageY}],b.timeStamp),c=!0)},!1),document.addEventListener("mouseup",function(b){c&&(a.doTouchEnd(b.timeStamp),c=!1)},!1)}},__createScrollbar:function(a){var b=document.createElement("div"),c=document.createElement("div");return c.className="scroll-bar-indicator",b.className="h"==a?"scroll-bar scroll-bar-h":"scroll-bar scroll-bar-v",b.appendChild(c),b},__createScrollbars:function(){var a,b;this.options.scrollingX&&(a={el:this.__createScrollbar("h"),sizeRatio:1},a.indicator=a.el.children[0],this.options.scrollbarX&&this.__container.appendChild(a.el),this.__indicatorX=a),this.options.scrollingY&&(b={el:this.__createScrollbar("v"),sizeRatio:1},b.indicator=b.el.children[0],this.options.scrollbarY&&this.__container.appendChild(b.el),this.__indicatorY=b)},__resizeScrollbars:function(){var a=this;if(a.__fadeScrollbars("in"),a.__indicatorX){var b=Math.max(Math.round(a.__clientWidth*a.__clientWidth/a.__contentWidth),20);b>a.__contentWidth&&(b=0),a.__indicatorX.size=b,a.__indicatorX.minScale=this.options.minScrollbarSizeX/b,a.__indicatorX.indicator.style.width=b+"px",a.__indicatorX.maxPos=a.__clientWidth-b,a.__indicatorX.sizeRatio=a.__maxScrollLeft?a.__indicatorX.maxPos/a.__maxScrollLeft:1}if(a.__indicatorY){var c=Math.max(Math.round(a.__clientHeight*a.__clientHeight/a.__contentHeight),20);c>a.__contentHeight&&(c=0),a.__indicatorY.size=c,a.__indicatorY.minScale=this.options.minScrollbarSizeY/c,a.__indicatorY.maxPos=a.__clientHeight-c,a.__indicatorY.indicator.style.height=c+"px",a.__indicatorY.sizeRatio=a.__maxScrollTop?a.__indicatorY.maxPos/a.__maxScrollTop:1}},__repositionScrollbars:function(){var a,b,c,d,e,f=this,g=0,h=0;f.__indicatorX&&(f.__indicatorY&&(g=10),d=Math.round(f.__indicatorX.sizeRatio*f.__scrollLeft)||0,b=f.__scrollLeft-(f.__maxScrollLeft-g),f.__scrollLeft<0?(widthScale=Math.max(f.__indicatorX.minScale,(f.__indicatorX.size-Math.abs(f.__scrollLeft))/f.__indicatorX.size),d=0,f.__indicatorX.indicator.style[f.__transformOriginProperty]="left center"):b>0?(widthScale=Math.max(f.__indicatorX.minScale,(f.__indicatorX.size-b)/f.__indicatorX.size),d=f.__indicatorX.maxPos-g,f.__indicatorX.indicator.style[f.__transformOriginProperty]="right center"):(d=Math.min(f.__maxScrollLeft,Math.max(0,d)),widthScale=1),f.__indicatorX.indicator.style[f.__transformProperty]="translate3d("+d+"px, 0, 0) scaleX("+widthScale+")"),f.__indicatorY&&(e=Math.round(f.__indicatorY.sizeRatio*f.__scrollTop)||0,f.__indicatorX&&(h=10),c=f.__scrollTop-(f.__maxScrollTop-h),f.__scrollTop<0?(a=Math.max(f.__indicatorY.minScale,(f.__indicatorY.size-Math.abs(f.__scrollTop))/f.__indicatorY.size),e=0,f.__indicatorY.indicator.style[f.__transformOriginProperty]="center top"):c>0?(a=Math.max(f.__indicatorY.minScale,(f.__indicatorY.size-c)/f.__indicatorY.size),e=f.__indicatorY.maxPos-h,f.__indicatorY.indicator.style[f.__transformOriginProperty]="center bottom"):(e=Math.min(f.__maxScrollTop,Math.max(0,e)),a=1),f.__indicatorY.indicator.style[f.__transformProperty]="translate3d(0,"+e+"px, 0) scaleY("+a+")")},__fadeScrollbars:function(a,b){var c=this;if(this.options.scrollbarsFade){var d="scroll-bar-fade-out";c.options.scrollbarsFade===!0&&(clearTimeout(c.__scrollbarFadeTimeout),"in"==a?(c.__indicatorX&&c.__indicatorX.indicator.classList.remove(d),c.__indicatorY&&c.__indicatorY.indicator.classList.remove(d)):c.__scrollbarFadeTimeout=setTimeout(function(){c.__indicatorX&&c.__indicatorX.indicator.classList.add(d),c.__indicatorY&&c.__indicatorY.indicator.classList.add(d)},b||c.options.scrollbarFadeDelay))}},__scrollingComplete:function(){var a=this;a.options.scrollingComplete(),a.__fadeScrollbars("out")},resize:function(){this.setDimensions(this.__container.clientWidth,this.__container.clientHeight,Math.max(this.__content.scrollWidth,this.__content.offsetWidth),Math.max(this.__content.scrollHeight,this.__content.offsetHeight+20))},getRenderFn:function(){var a,b=this,c=this.__content,d=document.documentElement.style;"MozAppearance"in d?a="gecko":"WebkitAppearance"in d?a="webkit":"string"==typeof navigator.cpuClass&&(a="trident");var e,f={trident:"ms",gecko:"Moz",webkit:"Webkit",presto:"O"}[a],g=document.createElement("div"),h=f+"Perspective",i=f+"Transform",j=f+"TransformOrigin";return b.__perspectiveProperty=i,b.__transformProperty=i,b.__transformOriginProperty=j,g.style[h]!==e?function(a,d){c.style[i]="translate3d("+-a+"px,"+-d+"px,0)",b.__repositionScrollbars(),b.triggerScrollEvent()}:g.style[i]!==e?function(a,d){c.style[i]="translate("+-a+"px,"+-d+"px)",b.__repositionScrollbars(),b.triggerScrollEvent()}:function(a,d,e){c.style.marginLeft=a?-a/e+"px":"",c.style.marginTop=d?-d/e+"px":"",c.style.zoom=e||"",b.__repositionScrollbars(),b.triggerScrollEvent()}},setDimensions:function(a,b,c,d){var e=this;a===+a&&(e.__clientWidth=a),b===+b&&(e.__clientHeight=b),c===+c&&(e.__contentWidth=c),d===+d&&(e.__contentHeight=d),e.__computeScrollMax(),e.__resizeScrollbars(),e.scrollTo(e.__scrollLeft,e.__scrollTop,!0)},setPosition:function(a,b){var c=this;c.__clientLeft=a||0,c.__clientTop=b||0},setSnapSize:function(a,b){var c=this;c.__snapWidth=a,c.__snapHeight=b},activatePullToRefresh:function(a,b,c,d){var e=this;e.__refreshHeight=a,e.__refreshActivate=b,e.__refreshDeactivate=c,e.__refreshStart=d},triggerPullToRefresh:function(){this.__publish(this.__scrollLeft,-this.__refreshHeight,this.__zoomLevel,!0),this.__refreshStart&&this.__refreshStart()},finishPullToRefresh:function(){var a=this;a.__refreshActive=!1,a.__refreshDeactivate&&a.__refreshDeactivate(),a.scrollTo(a.__scrollLeft,a.__scrollTop,!0)},getValues:function(){var a=this;return{left:a.__scrollLeft,top:a.__scrollTop,zoom:a.__zoomLevel}},getScrollMax:function(){var a=this;return{left:a.__maxScrollLeft,top:a.__maxScrollTop}},zoomTo:function(a,b,c,d){var e=this;if(!e.options.zooming)throw new Error("Zooming is not enabled!");e.__isDecelerating&&(core.effect.Animate.stop(e.__isDecelerating),e.__isDecelerating=!1);var f=e.__zoomLevel;null==c&&(c=e.__clientWidth/2),null==d&&(d=e.__clientHeight/2),a=Math.max(Math.min(a,e.options.maxZoom),e.options.minZoom),e.__computeScrollMax(a);var g=(c+e.__scrollLeft)*a/f-c,h=(d+e.__scrollTop)*a/f-d;g>e.__maxScrollLeft?g=e.__maxScrollLeft:0>g&&(g=0),h>e.__maxScrollTop?h=e.__maxScrollTop:0>h&&(h=0),e.__publish(g,h,a,b)},zoomBy:function(a,b,c,d){var e=this;e.zoomTo(e.__zoomLevel*a,b,c,d) +},scrollTo:function(a,b,c,d){var e=this;if(e.__isDecelerating&&(core.effect.Animate.stop(e.__isDecelerating),e.__isDecelerating=!1),null!=d&&d!==e.__zoomLevel){if(!e.options.zooming)throw new Error("Zooming is not enabled!");a*=d,b*=d,e.__computeScrollMax(d)}else d=e.__zoomLevel;e.options.scrollingX?e.options.paging?a=Math.round(a/e.__clientWidth)*e.__clientWidth:e.options.snapping&&(a=Math.round(a/e.__snapWidth)*e.__snapWidth):a=e.__scrollLeft,e.options.scrollingY?e.options.paging?b=Math.round(b/e.__clientHeight)*e.__clientHeight:e.options.snapping&&(b=Math.round(b/e.__snapHeight)*e.__snapHeight):b=e.__scrollTop,a=Math.max(Math.min(e.__maxScrollLeft,a),0),b=Math.max(Math.min(e.__maxScrollTop,b),0),a===e.__scrollLeft&&b===e.__scrollTop&&(c=!1),e.__publish(a,b,d,c)},scrollBy:function(a,b,c){var d=this,e=d.__isAnimating?d.__scheduledLeft:d.__scrollLeft,f=d.__isAnimating?d.__scheduledTop:d.__scrollTop;d.scrollTo(e+(a||0),f+(b||0),c)},doMouseZoom:function(a,b,c,d){var e=this,f=a>0?.97:1.03;return e.zoomTo(e.__zoomLevel*f,!1,c-e.__clientLeft,d-e.__clientTop)},doTouchStart:function(a,b){if(this.hintResize(),null==a.length)throw new Error("Invalid touch list: "+a);if(b instanceof Date&&(b=b.valueOf()),"number"!=typeof b)throw new Error("Invalid timestamp value: "+b);var c=this;c.__fadeScrollbars("in"),c.__interruptedAnimation=!0,c.__isDecelerating&&(core.effect.Animate.stop(c.__isDecelerating),c.__isDecelerating=!1,c.__interruptedAnimation=!0),c.__isAnimating&&(core.effect.Animate.stop(c.__isAnimating),c.__isAnimating=!1,c.__interruptedAnimation=!0);var d,e,f=1===a.length;f?(d=a[0].pageX,e=a[0].pageY):(d=Math.abs(a[0].pageX+a[1].pageX)/2,e=Math.abs(a[0].pageY+a[1].pageY)/2),c.__initialTouchLeft=d,c.__initialTouchTop=e,c.__zoomLevelStart=c.__zoomLevel,c.__lastTouchLeft=d,c.__lastTouchTop=e,c.__lastTouchMove=b,c.__lastScale=1,c.__enableScrollX=!f&&c.options.scrollingX,c.__enableScrollY=!f&&c.options.scrollingY,c.__isTracking=!0,c.__didDecelerationComplete=!1,c.__isDragging=!f,c.__isSingleTouch=f,c.__positions=[]},doTouchMove:function(a,b,c){if(null==a.length)throw new Error("Invalid touch list: "+a);if(b instanceof Date&&(b=b.valueOf()),"number"!=typeof b)throw new Error("Invalid timestamp value: "+b);var d=this;if(d.__isTracking){var e,f;2===a.length?(e=Math.abs(a[0].pageX+a[1].pageX)/2,f=Math.abs(a[0].pageY+a[1].pageY)/2):(e=a[0].pageX,f=a[0].pageY);var g=d.__positions;if(d.__isDragging){var h=e-d.__lastTouchLeft,i=f-d.__lastTouchTop,j=d.__scrollLeft,k=d.__scrollTop,l=d.__zoomLevel;if(null!=c&&d.options.zooming){var m=l;if(l=l/d.__lastScale*c,l=Math.max(Math.min(l,d.options.maxZoom),d.options.minZoom),m!==l){var n=e-d.__clientLeft,o=f-d.__clientTop;j=(n+j)*l/m-n,k=(o+k)*l/m-o,d.__computeScrollMax(l)}}if(d.__enableScrollX){j-=h*this.options.speedMultiplier;var p=d.__maxScrollLeft;(j>p||0>j)&&(d.options.bouncing?j+=h/2*this.options.speedMultiplier:j=j>p?p:0)}if(d.__enableScrollY){k-=i*this.options.speedMultiplier;var q=d.__maxScrollTop;(k>q||0>k)&&(d.options.bouncing?(k+=i/2*this.options.speedMultiplier,d.__enableScrollX||null==d.__refreshHeight||(!d.__refreshActive&&k<=-d.__refreshHeight?(d.__refreshActive=!0,d.__refreshActivate&&d.__refreshActivate()):d.__refreshActive&&k>-d.__refreshHeight&&(d.__refreshActive=!1,d.__refreshDeactivate&&d.__refreshDeactivate()))):k=k>q?q:0)}g.length>60&&g.splice(0,30),g.push(j,k,b),d.__publish(j,k,l)}else{var r=d.options.locking?3:0,s=5,t=Math.abs(e-d.__initialTouchLeft),u=Math.abs(f-d.__initialTouchTop);d.__enableScrollX=d.options.scrollingX&&t>=r,d.__enableScrollY=d.options.scrollingY&&u>=r,g.push(d.__scrollLeft,d.__scrollTop,b),d.__isDragging=(d.__enableScrollX||d.__enableScrollY)&&(t>=s||u>=s),d.__isDragging&&(d.__interruptedAnimation=!1)}d.__lastTouchLeft=e,d.__lastTouchTop=f,d.__lastTouchMove=b,d.__lastScale=c}},doTouchEnd:function(a){if(a instanceof Date&&(a=a.valueOf()),"number"!=typeof a)throw new Error("Invalid timestamp value: "+a);var b=this;if(b.__isTracking){if(b.__isTracking=!1,b.__isDragging)if(b.__isDragging=!1,b.__isSingleTouch&&b.options.animating&&a-b.__lastTouchMove<=100){for(var c=b.__positions,d=c.length-1,e=d,f=d;f>0&&c[f]>b.__lastTouchMove-100;f-=3)e=f;if(e!==d){var g=c[d]-c[e],h=b.__scrollLeft-c[e-2],i=b.__scrollTop-c[e-1];b.__decelerationVelocityX=h/g*(1e3/60),b.__decelerationVelocityY=i/g*(1e3/60);var j=b.options.paging||b.options.snapping?4:1;(Math.abs(b.__decelerationVelocityX)>j||Math.abs(b.__decelerationVelocityY)>j)&&(b.__refreshActive||b.__startDeceleration(a))}else b.__scrollingComplete()}else a-b.__lastTouchMove>100&&b.__scrollingComplete();b.__isDecelerating||(b.__refreshActive&&b.__refreshStart?(b.__publish(b.__scrollLeft,-b.__refreshHeight,b.__zoomLevel,!0),b.__refreshStart&&b.__refreshStart()):((b.__interruptedAnimation||b.__isDragging)&&b.__scrollingComplete(),b.scrollTo(b.__scrollLeft,b.__scrollTop,!0,b.__zoomLevel),b.__refreshActive&&(b.__refreshActive=!1,b.__refreshDeactivate&&b.__refreshDeactivate()))),b.__positions.length=0}},__publish:function(a,b,e,f){var g=this,h=g.__isAnimating;if(h&&(core.effect.Animate.stop(h),g.__isAnimating=!1),f&&g.options.animating){g.__scheduledLeft=a,g.__scheduledTop=b,g.__scheduledZoom=e;var i=g.__scrollLeft,j=g.__scrollTop,k=g.__zoomLevel,l=a-i,m=b-j,n=e-k,o=function(a,b,c){c&&(g.__scrollLeft=i+l*a,g.__scrollTop=j+m*a,g.__zoomLevel=k+n*a,g.__callback&&g.__callback(g.__scrollLeft,g.__scrollTop,g.__zoomLevel))},p=function(a){return g.__isAnimating===a},q=function(a,b,c){b===g.__isAnimating&&(g.__isAnimating=!1),(g.__didDecelerationComplete||c)&&g.__scrollingComplete(),g.options.zooming&&g.__computeScrollMax()};g.__isAnimating=core.effect.Animate.start(o,p,q,g.options.animationDuration,h?c:d)}else g.__scheduledLeft=g.__scrollLeft=a,g.__scheduledTop=g.__scrollTop=b,g.__scheduledZoom=g.__zoomLevel=e,g.__callback&&g.__callback(a,b,e),g.options.zooming&&g.__computeScrollMax()},__computeScrollMax:function(a){var b=this;null==a&&(a=b.__zoomLevel),b.__maxScrollLeft=Math.max(b.__contentWidth*a-b.__clientWidth,0),b.__maxScrollTop=Math.max(b.__contentHeight*a-b.__clientHeight,0),b.__didWaitForSize||0!=b.__maxScrollLeft||0!=b.__maxScrollTop||(b.__didWaitForSize=!0,b.__waitForSize())},__waitForSize:function(){var a=this;clearTimeout(a.__sizerTimeout);var b=function(){a.resize(),a.options.scrollingX&&0==a.__maxScrollLeft||a.options.scrollingY&&0==a.__maxScrollTop};b(),a.__sizerTimeout=setTimeout(b,1e3)},__startDeceleration:function(){var a=this;if(a.options.paging){var b=Math.max(Math.min(a.__scrollLeft,a.__maxScrollLeft),0),c=Math.max(Math.min(a.__scrollTop,a.__maxScrollTop),0),d=a.__clientWidth,e=a.__clientHeight;a.__minDecelerationScrollLeft=Math.floor(b/d)*d,a.__minDecelerationScrollTop=Math.floor(c/e)*e,a.__maxDecelerationScrollLeft=Math.ceil(b/d)*d,a.__maxDecelerationScrollTop=Math.ceil(c/e)*e}else a.__minDecelerationScrollLeft=0,a.__minDecelerationScrollTop=0,a.__maxDecelerationScrollLeft=a.__maxScrollLeft,a.__maxDecelerationScrollTop=a.__maxScrollTop;var f=function(b,c,d){a.__stepThroughDeceleration(d)},g=a.options.snapping?4:.1,h=function(){var b=Math.abs(a.__decelerationVelocityX)>=g||Math.abs(a.__decelerationVelocityY)>=g;return b||(a.__didDecelerationComplete=!0),b},i=function(){a.__isDecelerating=!1,a.__didDecelerationComplete&&a.__scrollingComplete(),a.options.paging&&a.scrollTo(a.__scrollLeft,a.__scrollTop,a.options.snapping)};a.__isDecelerating=core.effect.Animate.start(f,h,i)},__stepThroughDeceleration:function(a){var b=this,c=b.__scrollLeft+b.__decelerationVelocityX,d=b.__scrollTop+b.__decelerationVelocityY;if(!b.options.bouncing){var e=Math.max(Math.min(b.__maxDecelerationScrollLeft,c),b.__minDecelerationScrollLeft);e!==c&&(c=e,b.__decelerationVelocityX=0);var f=Math.max(Math.min(b.__maxDecelerationScrollTop,d),b.__minDecelerationScrollTop);f!==d&&(d=f,b.__decelerationVelocityY=0)}if(a?b.__publish(c,d,b.__zoomLevel):(b.__scrollLeft=c,b.__scrollTop=d),!b.options.paging){var g=.95;b.__decelerationVelocityX*=g,b.__decelerationVelocityY*=g}if(b.options.bouncing){var h=0,i=0,j=b.options.penetrationDeceleration,k=b.options.penetrationAcceleration;cb.__maxDecelerationScrollLeft&&(h=b.__maxDecelerationScrollLeft-c),db.__maxDecelerationScrollTop&&(i=b.__maxDecelerationScrollTop-d),0!==h&&(h*b.__decelerationVelocityX<=0?b.__decelerationVelocityX+=h*j:b.__decelerationVelocityX=h*k),0!==i&&(i*b.__decelerationVelocityY<=0?b.__decelerationVelocityY+=i*j:b.__decelerationVelocityY=i*k)}}})}(ionic),function(a){"use strict";a.views.ActionSheet=a.views.View.inherit({initialize:function(a){this.el=a.el},show:function(){this.el.offsetWidth,this.el.classList.add("active")},hide:function(){this.el.offsetWidth,this.el.classList.remove("active")}})}(ionic),function(a){"use strict";a.views.HeaderBar=a.views.View.inherit({initialize:function(b){this.el=b.el,a.extend(this,{alignTitle:"center"},b),this.align()},align:function(){window.rAF(a.proxy(function(){var b,c,d,e=this.el.childNodes,f=this.el.querySelector(".title");if(f){var g=0,h=0,i=Array.prototype.indexOf.call(e,f);for(b=0;i>b;b++)d=null,c=e[b],3==c.nodeType?d=a.DomUtil.getTextBounds(c):1==c.nodeType&&(d=c.getBoundingClientRect()),d&&(g+=d.width);for(b=i+1;b10&&(f.style.left=j+"px",f.style.right=j+"px"),f.offsetWidth0&&(f.style.right=h+5+"px")):"left"==this.alignTitle?(f.classList.add("title-left"),g>0&&(f.style.left=g+15+"px")):"right"==this.alignTitle&&(f.classList.add("title-right"),h>0&&(f.style.right=h+15+"px"))}},this))}})}(ionic),function(a){"use strict";var b="item",c="item-content",d="item-sliding",e="item-options",f="item-placeholder",g="item-reordering",h="item-drag",i=function(){};i.prototype={start:function(){},drag:function(){},end:function(){}};var j=function(a){this.dragThresholdX=a.dragThresholdX||10,this.el=a.el};j.prototype=new i,j.prototype.start=function(a){var f,g,h,i;a.target.classList.contains(c)?f=a.target:a.target.classList.contains(b)&&(f=a.target.querySelector("."+c)),f&&(f.classList.remove(d),h=parseFloat(f.style.webkitTransform.replace("translate3d(","").split(",")[0])||0,g=f.parentNode.querySelector("."+e),g&&(i=g.offsetWidth,this._currentDrag={buttonsWidth:i,content:f,startOffsetX:h}))},j.prototype.drag=function(a){var b,c=this;window.rAF(function(){if(c._currentDrag&&(!c._isDragging&&(Math.abs(a.gesture.deltaX)>c.dragThresholdX||Math.abs(c._currentDrag.startOffsetX)>0)&&(c._isDragging=!0),c._isDragging)){b=c._currentDrag.buttonsWidth;var d=Math.min(0,c._currentDrag.startOffsetX+a.gesture.deltaX);-b>d&&(d=Math.min(-b,-b+.4*(a.gesture.deltaX+b))),c._currentDrag.content.style.webkitTransform="translate3d("+d+"px, 0, 0)",c._currentDrag.content.style.webkitTransition="none"}})},j.prototype.end=function(a,b){var c=this;if(!this._currentDrag)return b&&b(),void 0;var d=-this._currentDrag.buttonsWidth;a.gesture.deltaX>-(this._currentDrag.buttonsWidth/2)&&("left"==a.gesture.direction&&Math.abs(a.gesture.velocityX)<.3?d=0:"right"==a.gesture.direction&&(d=0)),window.rAF(function(){c._currentDrag.content.style.webkitTransform=0===d?"":"translate3d("+d+"px, 0, 0)",c._currentDrag.content.style.webkitTransition="",c._currentDrag=null,b&&b()})};var k=function(a){this.dragThresholdY=a.dragThresholdY||0,this.onReorder=a.onReorder,this.el=a.el};k.prototype=new i,k.prototype.start=function(){var b=this.el.offsetTop,c=a.DomUtil.getChildIndex(this.el,this.el.nodeName.toLowerCase()),d=this.el.cloneNode(!0);d.classList.add(f),this.el.parentNode.insertBefore(d,this.el),this.el.classList.add(g),this._currentDrag={startOffsetTop:b,startIndex:c,placeholder:d}},k.prototype.drag=function(a){var b=this;window.rAF(function(){if(b._currentDrag&&(!b._isDragging&&Math.abs(a.gesture.deltaY)>b.dragThresholdY&&(b._isDragging=!0),b._isDragging)){var c=b._currentDrag.startOffsetTop+a.gesture.deltaY;b.el.style.top=c+"px",b._currentDrag.currentY=c,b._reorderItems()}})},k.prototype._reorderItems=function(){var b=(this._currentDrag.placeholder,Array.prototype.slice.call(this._currentDrag.placeholder.parentNode.children));b.splice(b.indexOf(this.el),1);var c=b.indexOf(this._currentDrag.placeholder),d=b[Math.max(0,c-1)],e=b[Math.min(b.length,c+1)],f=this._currentDrag.currentY;return d&&fe.offsetTop+e.offsetHeight/2?(a.DomUtil.swapNodes(e,this._currentDrag.placeholder),c+1):void 0},k.prototype.end=function(b,c){if(!this._currentDrag)return c&&c(),void 0;var d=this._currentDrag.placeholder;this.el.classList.remove(g),this.el.style.top=0;var e=a.DomUtil.getChildIndex(d,d.nodeName.toLowerCase());d.parentNode.insertBefore(this.el,d),d.parentNode.removeChild(d),this.onReorder&&this.onReorder(this.el,this._currentDrag.startIndex,e),this._currentDrag=null,c&&c()},a.views.ListView=a.views.View.inherit({initialize:function(b){var c=this;b=a.extend({onReorder:function(){},virtualRemoveThreshold:-200,virtualAddThreshold:200},b),a.extend(this,b),!this.itemHeight&&this.listEl&&(this.itemHeight=this.listEl.children[0]&&parseInt(this.listEl.children[0].style.height,10)),this.onRefresh=b.onRefresh||function(){},this.onRefreshOpening=b.onRefreshOpening||function(){},this.onRefreshHolding=b.onRefreshHolding||function(){},window.ionic.onGesture("touch",function(a){c._handleTouch(a)},this.el),window.ionic.onGesture("release",function(a){c._handleEndDrag(a)},this.el),window.ionic.onGesture("drag",function(a){c._handleDrag(a)},this.el),this._initDrag()},stopRefreshing:function(){var a=this.el.querySelector(".list-refresher");a.style.height="0px"},didScroll:function(a){if(this.isVirtual){var b=this.itemHeight,c=(this.listEl.children.length,a.target.scrollHeight),d=this.el.parentNode.offsetHeight,e=(a.scrollTop,Math.max(0,a.scrollTop+this.virtualRemoveThreshold)),f=Math.min(c,Math.abs(a.scrollTop)+d+this.virtualAddThreshold),g=Math.floor((f-e)/b),h=parseInt(Math.abs(e/b),10),i=parseInt(Math.abs(f/b),10);this._virtualItemsToRemove=Array.prototype.slice.call(this.listEl.children,0,h);{Array.prototype.slice.call(this.listEl.children,h,h+g)}this.renderViewport&&this.renderViewport(e,f,h,i)}},didStopScrolling:function(){if(this.isVirtual)for(var a=0;a5)return this._dragOp=new j({el:this.el}),this._dragOp.start(b),b.preventDefault(),void 0}else{var d=this._getItem(b.target);if(d)return this._dragOp=new k({el:d,onReorder:function(a,b,d){c.onReorder&&c.onReorder(a,b,d)}}),this._dragOp.start(b),b.preventDefault(),void 0}},_handleEndDrag:function(a){var b=this;if(this._dragOp){clearTimeout(this._touchTimeout);for(var c=b.el.querySelectorAll(".item"),d=0,e=c.length;e>d;d++)c[d].classList.remove("active");this._dragOp.end(a,function(){b._initDrag()})}},_handleDrag:function(a){(Math.abs(a.gesture.deltaX)>10||Math.abs(a.gesture.deltaY)>10)&&clearTimeout(this._touchTimeout),clearTimeout(this._touchTimeout),this.isDragging||this._dragOp||this._startDrag(a),this._dragOp&&(a.gesture.srcEvent.preventDefault(),this._dragOp.drag(a))},_handleTouch:function(c){var d=this,e=a.DomUtil.getParentOrSelfWithClass(c.target,b);e&&(this._touchTimeout=setTimeout(function(){for(var a=d.el.querySelectorAll(".item"),b=0,c=a.length;c>b;b++)a[b].classList.remove("active");e.classList.add("active")},250))}})}(ionic),function(a){"use strict";a.views.Loading=a.views.View.inherit({initialize:function(a){this.el=a.el,this.maxWidth=a.maxWidth||200,this._loadingBox=this.el.querySelector(".loading")},show:function(){var a=this;if(this._loadingBox){var b=a._loadingBox,c=Math.min(a.maxWidth,Math.max(window.outerWidth-40,b.offsetWidth));b.style.width=c+"px",b.style.marginLeft=-b.offsetWidth/2+"px",b.style.marginTop=-b.offsetHeight/2+"px",a.el.classList.add("active")}},hide:function(){this.el.offsetWidth,this.el.classList.remove("active")}})}(ionic),function(a){"use strict";a.views.Modal=a.views.View.inherit({initialize:function(b){b=a.extend({focusFirstInput:!1,unfocusOnHide:!0},b),a.extend(this,b),this.el=b.el},show:function(){if(this.el.classList.add("active"),this.focusFirstInput){var a=this.el.querySelector("input, textarea");a&&a.focus&&a.focus()}},hide:function(){if(this.el.classList.remove("active"),this.unfocusOnHide)for(var a=this.el.querySelectorAll("input, textarea"),b=0;bb?-r:b>u?r:0,0))}a.continuous&&n.transitions&&(g(e(u-1),-r,0),g(e(u+1),r,0)),n.transitions||(t.style.left=u*-r+"px"),o.style.visibility="visible",a.slidesChanged&&a.slidesChanged()}function c(){a.continuous?f(u-1):u&&f(u-1)}function d(){a.continuous?f(u+1):uu?b:u)-h-1),r*d,0);b=e(b),g(u,r*d,c||v),g(b,0,c||v),a.continuous&&g(e(b-d),-(r*d),0)}else b=e(b),i(u*-r,b*-r,c||v);u=b,m(a.callback&&a.callback(u,p[u]))}}function g(a,b,c){h(a,b,c),q[a]=b}function h(a,b,c){var d=p[a],e=d&&d.style;e&&(e.webkitTransitionDuration=e.MozTransitionDuration=e.msTransitionDuration=e.OTransitionDuration=e.transitionDuration=c+"ms",e.webkitTransform="translate("+b+"px,0)translateZ(0)",e.msTransform=e.MozTransform=e.OTransform="translateX("+b+"px)")}function i(b,c,d){if(!d)return t.style.left=c+"px",void 0;var e=+new Date,f=setInterval(function(){var g=+new Date-e;return g>d?(t.style.left=c+"px",y&&j(),a.transitionEnd&&a.transitionEnd.call(event,u,p[u]),clearInterval(f),void 0):(t.style.left=(c-b)*(Math.floor(g/d*100)/100)+b+"px",void 0)},4)}function j(){w=setTimeout(d,y)}function k(){y=0,clearTimeout(w)}var l=function(){},m=function(a){setTimeout(a||l,0)},n={addEventListener:!!window.addEventListener,touch:"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch,transitions:function(a){var b=["transitionProperty","WebkitTransition","MozTransition","OTransition","msTransition"];for(var c in b)if(void 0!==a.style[b[c]])return!0;return!1}(document.createElement("swipe"))},o=a.el;if(o){var p,q,r,s,t=o.children[0];a=a||{};var u=parseInt(a.startSlide,10)||0,v=a.speed||300;a.continuous=void 0!==a.continuous?a.continuous:!0;var w,x,y=a.auto||0,z={},A={},B={handleEvent:function(c){switch(("mousedown"==c.type||"mouseup"==c.type||"mousemove"==c.type)&&(c.touches=[{pageX:c.pageX,pageY:c.pageY}]),c.type){case"mousedown":this.start(c);break;case"touchstart":this.start(c);break;case"touchmove":this.move(c);break;case"mousemove":this.move(c);break;case"touchend":m(this.end(c));break;case"mouseup":m(this.end(c));break;case"webkitTransitionEnd":case"msTransitionEnd":case"oTransitionEnd":case"otransitionend":case"transitionend":m(this.transitionEnd(c));break;case"resize":m(b)}a.stopPropagation&&c.stopPropagation()},start:function(a){var b=a.touches[0];z={x:b.pageX,y:b.pageY,time:+new Date},x=void 0,A={},n.touch?(t.addEventListener("touchmove",this,!1),t.addEventListener("touchend",this,!1)):(t.addEventListener("mousemove",this,!1),t.addEventListener("mouseup",this,!1),document.addEventListener("mouseup",this,!1))},move:function(b){if(!(b.touches.length>1||b.scale&&1!==b.scale)){a.disableScroll&&b.preventDefault();var c=b.touches[0];A={x:c.pageX-z.x,y:c.pageY-z.y},"undefined"==typeof x&&(x=!!(x||Math.abs(A.x)0||u==p.length-1&&A.x<0?Math.abs(A.x)/r+1:1),h(u-1,A.x+q[u-1],0),h(u,A.x+q[u],0),h(u+1,A.x+q[u+1],0)))}},end:function(){var b=+new Date-z.time,c=Number(b)<250&&Math.abs(A.x)>20||Math.abs(A.x)>r/2,d=!u&&A.x>0||u==p.length-1&&A.x<0;a.continuous&&(d=!1);var f=A.x<0;x||(c&&!d?(f?(a.continuous?(g(e(u-1),-r,0),g(e(u+2),r,0)):g(u-1,-r,0),g(u,q[u]-r,v),g(e(u+1),q[e(u+1)]-r,v),u=e(u+1)):(a.continuous?(g(e(u+1),r,0),g(e(u-2),-r,0)):g(u+1,r,0),g(u,q[u]+r,v),g(e(u-1),q[e(u-1)]+r,v),u=e(u-1)),a.callback&&a.callback(u,p[u])):a.continuous?(g(e(u-1),-r,v),g(u,0,v),g(e(u+1),r,v)):(g(u-1,-r,v),g(u,0,v),g(u+1,r,v))),n.touch?(t.removeEventListener("touchmove",B,!1),t.removeEventListener("touchend",B,!1)):(t.removeEventListener("mousemove",B,!1),t.removeEventListener("mouseup",B,!1),document.removeEventListener("mouseup",B,!1))},transitionEnd:function(b){parseInt(b.target.getAttribute("data-index"),10)==u&&(y&&j(),a.transitionEnd&&a.transitionEnd.call(b,u,p[u]))}};this.setup=function(){b()},this.slide=function(a,b){k(),f(a,b)},this.prev=function(){k(),c()},this.next=function(){k(),d()},this.stop=function(){k()},this.getPos=function(){return u},this.getNumSlides=function(){return s},this.kill=function(){k(),t.style.width="",t.style.left="";for(var a=p.length;a--;){var b=p[a];b.style.width="",b.style.left="",n.transitions&&h(a,0,0)}n.addEventListener?(t.removeEventListener("touchstart",B,!1),t.removeEventListener("webkitTransitionEnd",B,!1),t.removeEventListener("msTransitionEnd",B,!1),t.removeEventListener("oTransitionEnd",B,!1),t.removeEventListener("otransitionend",B,!1),t.removeEventListener("transitionend",B,!1),window.removeEventListener("resize",B,!1)):window.onresize=null},this.load=function(){b(),y&&j(),n.addEventListener?(n.touch?t.addEventListener("touchstart",B,!1):t.addEventListener("mousedown",B,!1),n.transitions&&(t.addEventListener("webkitTransitionEnd",B,!1),t.addEventListener("msTransitionEnd",B,!1),t.addEventListener("oTransitionEnd",B,!1),t.addEventListener("otransitionend",B,!1),t.addEventListener("transitionend",B,!1)),window.addEventListener("resize",B,!1)):window.onresize=function(){b()}}}}})}(ionic),function(a){"use strict";a.views.TabBarItem=a.views.View.inherit({initialize:function(a){this.el=a,this._buildItem()},create:function(b){var c=document.createElement("a");if(c.className="tab-item",b.icon){var d=document.createElement("i");d.className=b.icon,c.appendChild(d)}return c.appendChild(document.createTextNode(b.title)),new a.views.TabBarItem(c)},_buildItem:function(){for(var b,c=this,d=Array.prototype.slice.call(this.el.children),e=0,f=d.length;f>e;e++)if(b=d[e],"i"==b.tagName.toLowerCase()&&/icon/.test(b.className)){this.icon=b.className;break}this.title=this.el.textContent.trim(),this._tapHandler=function(a){c.onTap&&c.onTap(a)},a.on("tap",this._tapHandler,this.el)},onTap:function(){},destroy:function(){a.off("tap",this._tapHandler,this.el)},getIcon:function(){return this.icon},getTitle:function(){return this.title},setSelected:function(a){this.isSelected=a,a?this.el.classList.add("active"):this.el.classList.remove("active")}}),a.views.TabBar=a.views.View.inherit({initialize:function(a){this.el=a.el,this.items=[],this._buildItems()},getItems:function(){return this.items},addItem:function(b){var c=a.views.TabBarItem.prototype.create(b);this.appendItemElement(c),this.items.push(c),this._bindEventsOnItem(c)},appendItemElement:function(a){this.el&&this.el.appendChild(a.el)},removeItem:function(a){var b=this.items[a];b&&(b.onTap=void 0,b.destroy())},_bindEventsOnItem:function(a){var b=this;this._itemTapHandler||(this._itemTapHandler=function(){b.trySelectItem(this)}),a.onTap=this._itemTapHandler},getSelectedItem:function(){return this.selectedItem},setSelectedItem:function(a){this.selectedItem=this.items[a];for(var b=0,c=this.items.length;c>b;b+=1)this.items[b].setSelected(!1);this.selectedItem&&this.selectedItem.setSelected(!0)},selectItem:function(a){for(var b=0,c=this.items.length;c>b;b+=1)if(this.items[b]==a)return this.setSelectedItem(b),void 0},trySelectItem:function(a){for(var b=0,c=this.items.length;c>b;b+=1)if(this.items[b]==a)return this.tryTabSelect&&this.tryTabSelect(b),void 0},_buildItems:function(){for(var b,c=Array.prototype.slice.call(this.el.children),d=0,e=c.length;e>d;d+=1)b=new a.views.TabBarItem(c[d]),this.items[d]=b,this._bindEventsOnItem(b);this.items.length>0&&(this.selectedItem=this.items[0])},destroy:function(){for(var a=0,b=this.items.length;b>a;a+=1)this.items[a].destroy();this.items.length=0}})}(window.ionic),function(a){"use strict";a.views.Toggle=a.views.View.inherit({initialize:function(a){this.el=a.el,this.checkbox=a.checkbox,this.handle=a.handle,this.openPercent=-1},tap:function(){this.val(!this.checkbox.checked)},drag:function(a){var b=this.checkbox.offsetLeft+this.handle.offsetWidth/2,c=this.checkbox.offsetLeft+this.checkbox.offsetWidth-this.handle.offsetWidth/2;a.pageX>=c-4?this.val(!0):a.pageX<=b?this.val(!1):this.setOpenPercent(Math.round(100*(1-(c-a.pageX)/(c-b))))},setOpenPercent:function(a){if(this.openPercent<0||athis.openPercent+3)if(this.openPercent=a,0===a)this.val(!1);else if(100===a)this.val(!0);else{var b=Math.round(a/100*this.checkbox.offsetWidth-this.handle.offsetWidth);b=1>b?0:b,this.handle.style.webkitTransform="translate3d("+b+"px,0,0)"}},release:function(){this.val(this.openPercent>=50)},val:function(a){return(a===!0||a===!1)&&(""!==this.handle.style.webkitTransform&&(this.handle.style.webkitTransform=""),this.checkbox.checked=a,this.openPercent=a?100:0),this.checkbox.checked}})}(ionic),function(a){"use strict";a.controllers.ViewController=function(){this.initialize.apply(this,arguments)},a.controllers.ViewController.inherit=a.inherit,a.extend(a.controllers.ViewController.prototype,{initialize:function(){},destroy:function(){}})}(window.ionic),function(a){"use strict";a.controllers.NavController=a.controllers.ViewController.inherit({initialize:function(a){var b=this;this.navBar=a.navBar,this.content=a.content,this.controllers=a.controllers||[],this._updateNavBar(),this.navBar.shouldGoBack=function(){b.pop()}},getControllers:function(){return this.controllers},getTopController:function(){return this.controllers[this.controllers.length-1]},push:function(a){var b=this.controllers[this.controllers.length-1];this.controllers.push(a);var c=this.switchingController&&this.switchingController(a)||!0;if(c!==!1){b&&(b.isVisible=!1,b.visibilityChanged&&b.visibilityChanged("push"));var d=this.controllers[this.controllers.length-1];return d.isVisible=!0,d.visibilityChanged&&d.visibilityChanged(b?"push":"first"),this._updateNavBar(),a}},pop:function(){var a,b;if(!(this.controllers.length<2))return b=this.controllers.pop(),b&&(b.isVisible=!1,b.visibilityChanged&&b.visibilityChanged("pop")),a=this.controllers[this.controllers.length-1],a.isVisible=!0,a.visibilityChanged&&a.visibilityChanged("pop"),this._updateNavBar(),b},showNavBar:function(){this.navBar&&this.navBar.show()},hideNavBar:function(){this.navBar&&this.navBar.hide()},_updateNavBar:function(){this.getTopController()&&this.navBar&&(this.navBar.setTitle(this.getTopController().title),this.controllers.length>1?this.navBar.showBackButton(!0):this.navBar.showBackButton(!1))}})}(window.ionic),function(a){"use strict";a.controllers.SideMenuController=a.controllers.ViewController.inherit({initialize:function(a){var b=this;this.left=a.left,this.right=a.right,this.content=a.content,this.dragThresholdX=a.dragThresholdX||10,this._rightShowing=!1,this._leftShowing=!1,this._isDragging=!1,this.content&&(this.content.onDrag=function(a){b._handleDrag(a)},this.content.onEndDrag=function(a){b._endDrag(a)})},setContent:function(a){var b=this;this.content=a,this.content.onDrag=function(a){b._handleDrag(a)},this.content.endDrag=function(a){b._endDrag(a)}},toggleLeft:function(){this.content.enableAnimation();var a=this.getOpenAmount();a>0?this.openPercentage(0):this.openPercentage(100)},toggleRight:function(){this.content.enableAnimation();var a=this.getOpenAmount();0>a?this.openPercentage(0):this.openPercentage(-100)},close:function(){this.openPercentage(0)},getOpenAmount:function(){return this.content.getTranslateX()||0},getOpenRatio:function(){var a=this.getOpenAmount();return a>=0?a/this.left.width:a/this.right.width},isOpen:function(){return 1==this.getOpenRatio()},getOpenPercentage:function(){return 100*this.getOpenRatio()},openPercentage:function(a){var b=a/100;if(this.left&&a>=0)this.openAmount(this.left.width*b);else if(this.right&&0>a){{this.right.width}this.openAmount(this.right.width*b)}},openAmount:function(a){var b=this.left&&this.left.width||0,c=this.right&&this.right.width||0;(!this.left||!this.left.isEnabled)&&a>0||(!this.right||!this.right.isEnabled)&&0>a||this._leftShowing&&a>b||this._rightShowing&&-c>a||(this.content.setTranslateX(a),a>=0?(this._leftShowing=!0,this._rightShowing=!1,this.right&&this.right.pushDown&&this.right.pushDown(),this.left&&this.left.bringUp&&this.left.bringUp()):(this._rightShowing=!0,this._leftShowing=!1,this.right&&this.right.bringUp&&this.right.bringUp(),this.left&&this.left.pushDown&&this.left.pushDown())) },snapToRest:function(a){this.content.enableAnimation(),this._isDragging=!1;var b=this.getOpenRatio();if(0!==b){var c=.3,d=a.gesture.velocityX,e=a.gesture.direction;b>0&&.5>b&&"right"==e&&c>d?this.openPercentage(0):b>.5&&"left"==e&&c>d?this.openPercentage(100):0>b&&b>-.5&&"left"==e&&c>d?this.openPercentage(0):.5>b&&"right"==e&&c>d?this.openPercentage(-100):"right"==e&&b>=0&&(b>=.5||d>c)?this.openPercentage(100):"left"==e&&0>=b&&(-.5>=b||d>c)?this.openPercentage(-100):this.openPercentage(0)}},_endDrag:function(a){this._isDragging&&this.snapToRest(a),this._startX=null,this._lastX=null,this._offsetX=null},_handleDrag:function(a){this._startX?this._lastX=a.gesture.touches[0].pageX:(this._startX=a.gesture.touches[0].pageX,this._lastX=this._startX),!this._isDragging&&Math.abs(this._lastX-this._startX)>this.dragThresholdX&&(this._startX=this._lastX,this._isDragging=!0,this.content.disableAnimation(),this._offsetX=this.getOpenAmount()),this._isDragging&&this.openAmount(this._offsetX+(this._lastX-this._startX))}})}(ionic),function(a){"use strict";a.controllers.TabBarController=a.controllers.ViewController.inherit({initialize:function(a){this.tabBar=a.tabBar,this._bindEvents(),this.controllers=[];for(var b=a.controllers||[],c=0;c=this.controllers.length)){var b=this.selectedController,c=this.selectedIndex;this.selectedController=this.controllers[a],this.selectedIndex=a,this._showController(a),this.tabBar.setSelectedItem(a),this.controllerChanged&&this.controllerChanged(b,c,this.selectedController,this.selectedIndex)}},_showController:function(a){for(var b,c=0,d=this.controllers.length;d>c;c++)b=this.controllers[c],b.isVisible=!1,b.visibilityChanged&&b.visibilityChanged();b=this.controllers[a],b.isVisible=!0,b.visibilityChanged&&b.visibilityChanged()},_clearSelected:function(){this.selectedController=null,this.selectedIndex=-1},getController:function(a){return this.controllers[a]},getControllers:function(){return this.controllers},getSelectedController:function(){return this.selectedController},getSelectedControllerIndex:function(){return this.selectedIndex},addController:function(a){this.controllers.push(a),this.tabBar.addItem({title:a.title,icon:a.icon}),this.selectedController||this.setSelectedController(0)},setControllers:function(a){this.controllers=a,this._clearSelected(),this.selectController(0)}})}(window.ionic); \ No newline at end of file diff --git a/examples/starters/flickr/index.html b/examples/starters/flickr/index.html index e2f084d539..9f75dcd71f 100644 --- a/examples/starters/flickr/index.html +++ b/examples/starters/flickr/index.html @@ -19,6 +19,7 @@ + diff --git a/examples/starters/list/index.html b/examples/starters/list/index.html index 6a8183483e..6548275883 100644 --- a/examples/starters/list/index.html +++ b/examples/starters/list/index.html @@ -14,6 +14,7 @@ + @@ -24,20 +25,19 @@ - + - + diff --git a/examples/starters/list/js/app.js b/examples/starters/list/js/app.js index ec82ea2e8a..a85bf58153 100644 --- a/examples/starters/list/js/app.js +++ b/examples/starters/list/js/app.js @@ -3,34 +3,29 @@ // the 2nd parameter is an array or 'requires' // 'listExample.services' is found in services.js // 'listExample.controllers' is found in controllers.js -angular.module('listExample', ['ionic', 'ngRoute', 'ngAnimate', 'listExample.services', 'listExample.controllers']) +angular.module('listExample', ['ionic', 'listExample.services', 'listExample.controllers']) -.config(function ($compileProvider){ - // Needed for routing to work - $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/); -}) - -.config(function($routeProvider, $locationProvider) { +.config(function($stateProvider, $urlRouterProvider) { // Set up the initial routes that our app will respond to. // These are then tied up to our nav router which animates and // updates a navigation bar - $routeProvider.when('/', { - templateUrl: '/index.html', - controller: 'MovieIndexCtrl' - }); + $stateProvider + .state('movieIndex', { + url: '/', + templateUrl: '/index.html', + controller: 'MovieIndexCtrl' + }) - // if the url matches something like /movie/88 then this route - // will fire off the MovieDetailCtrl (controllers.js) - $routeProvider.when('/movie/:movieId', { - templateUrl: '/movie.html', - controller: 'MovieDetailCtrl' - }); + // if the url matches something like /movie/88 then this route + // will fire off the MovieDetailCtrl (controllers.js) + .state('movieDetail', { + url: '/movie/:movieId', + templateUrl: '/movie.html', + controller: 'MovieDetailCtrl' + }); // if none of the above routes are met, use this fallback - $routeProvider.otherwise({ - redirectTo: '/' - }); + $urlRouterProvider.otherwise('/'); }); - diff --git a/examples/starters/list/js/controllers.js b/examples/starters/list/js/controllers.js index e620bcb6dd..fd4fe6b307 100644 --- a/examples/starters/list/js/controllers.js +++ b/examples/starters/list/js/controllers.js @@ -45,8 +45,8 @@ angular.module('listExample.controllers', []) }) // Controller that shows more detailed info about a movie -.controller('MovieDetailCtrl', function($scope, $routeParams, MovieService) { +.controller('MovieDetailCtrl', function($scope, $stateParams, MovieService) { // "MovieService" is a service returning mock data (services.js) - $scope.movie = MovieService.get($routeParams.movieId); + $scope.movie = MovieService.get($stateParams.movieId); $scope.title = "Movie Info"; }); diff --git a/examples/starters/map/index.html b/examples/starters/map/index.html index 6ca49a3b4a..10c1efd494 100644 --- a/examples/starters/map/index.html +++ b/examples/starters/map/index.html @@ -24,6 +24,7 @@ + diff --git a/examples/starters/profile/index.html b/examples/starters/profile/index.html index 82c8b6e515..6402b93245 100644 --- a/examples/starters/profile/index.html +++ b/examples/starters/profile/index.html @@ -105,6 +105,7 @@ + diff --git a/examples/starters/profile/me.jpg b/examples/starters/profile/me.jpg deleted file mode 100644 index 1d6c8ffb59..0000000000 Binary files a/examples/starters/profile/me.jpg and /dev/null differ diff --git a/examples/starters/tabs/index.html b/examples/starters/tabs/index.html index 0d7bb11894..be41793568 100644 --- a/examples/starters/tabs/index.html +++ b/examples/starters/tabs/index.html @@ -16,6 +16,7 @@ + diff --git a/examples/starters/weather/index.html b/examples/starters/weather/index.html index 1749d3a57d..0a386109e2 100644 --- a/examples/starters/weather/index.html +++ b/examples/starters/weather/index.html @@ -16,6 +16,7 @@ + diff --git a/ionic.conf.js b/ionic.conf.js index 8acc17fcbd..cb961b3981 100644 --- a/ionic.conf.js +++ b/ionic.conf.js @@ -25,6 +25,7 @@ module.exports = function(config) { 'dist/js/angular/angular-mocks.js', 'dist/js/angular/angular-touch.js', 'dist/js/angular/angular-sanitize.js', + 'dist/js/angular-ui/angular-ui-router.js', 'dist/js/ionic-angular.js', 'test/**/*.js', diff --git a/js/_license.js b/js/_license.js index 4f0c319589..3cd47cca0b 100644 --- a/js/_license.js +++ b/js/_license.js @@ -1,5 +1,5 @@ /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * * Ionic, v{{ VERSION }} diff --git a/js/ext/angular/src/directive/ionicContent.js b/js/ext/angular/src/directive/ionicContent.js index 6b12782c8e..39c65b2119 100644 --- a/js/ext/angular/src/directive/ionicContent.js +++ b/js/ext/angular/src/directive/ionicContent.js @@ -39,24 +39,25 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) scrollbarY: '@', scrollEventInterval: '@' }, + compile: function(element, attr, transclude) { - return function($scope, $element, $attr) { + if(attr.hasHeader == "true") { element.addClass('has-header'); } + if(attr.hasSubheader == "true") { element.addClass('has-subheader'); } + if(attr.hasFooter == "true") { element.addClass('has-footer'); } + if(attr.hasTabs == "true") { element.addClass('has-tabs'); } + + return function link($scope, $element, $attr) { var clone, sc, sv, addedPadding = false, c = $element.eq(0); - if(attr.hasHeader == "true") { c.addClass('has-header'); } - if(attr.hasSubheader == "true") { c.addClass('has-subheader'); } - if(attr.hasFooter == "true") { c.addClass('has-footer'); } - if(attr.hasTabs == "true") { c.addClass('has-tabs'); } - // If they want plain overflow scrolling, add that as a class if($scope.scroll === "false") { clone = transclude($scope.$parent); $element.append(clone); } else if(attr.overflowScroll === "true") { c.addClass('overflow-scroll'); - clone = transclude($scope.$parent); + clone = transclude($scope.$parent); $element.append(clone); } else { sc = document.createElement('div'); @@ -84,7 +85,6 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) }; } - // Otherwise, supercharge this baby! $timeout(function() { sv = new ionic.views.Scroll({ @@ -119,7 +119,6 @@ angular.module('ionic.ui.content', ['ionic.ui.service']) // Register for scroll delegate event handling ScrollDelegate.register($scope, $element); - // Let child scopes access this $scope.$parent.scrollView = sv; }); diff --git a/js/ext/angular/src/directive/ionicNavRouter.js b/js/ext/angular/src/directive/ionicNavRouter.js deleted file mode 100644 index ff72957df4..0000000000 --- a/js/ext/angular/src/directive/ionicNavRouter.js +++ /dev/null @@ -1,412 +0,0 @@ -(function() { -'use strict'; - -/** - * @description - * The NavController is a navigation stack View Controller modelled off of - * UINavigationController from Cocoa Touch. With the Nav Controller, you can - * "push" new "pages" on to the navigation stack, and then pop them off to go - * back. The NavController controls a navigation bar with a back button and title - * which updates as the pages switch. - * - * The NavController makes sure to not recycle scopes of old pages - * so that a pop will still show the same state that the user left. - * - * However, once a page is popped, its scope is destroyed and will have to be - * recreated then next time it is pushed. - * - */ - -var actualLocation = null; - -angular.module('ionic.ui.navRouter', ['ionic.service.gesture']) - -.run(['$rootScope', function($rootScope) { - $rootScope.stackCursorPosition = 0; -}]) - -.directive('navRouter', ['$rootScope', '$timeout', '$location', '$window', '$route', function($rootScope, $timeout, $location, $window, $route) { - return { - restrict: 'AC', - // So you can require being under this - controller: ['$scope', '$element', function($scope, $element) { - this.navBar = { - isVisible: false - }; - $scope.navController = this; - - this.goBack = function() { - $scope.direction = 'back'; - }; - }], - - link: function($scope, $element, $attr, ctrl) { - if(!$element.length) return; - - $scope.animation = $attr.animation; - - $element[0].classList.add('noop-animation'); - - var isFirst = true; - // Store whether we did an animation yet, to know if - // we should let the first state animate - var didAnimate = false; - - var initTransition = function() { - //$element.addClass($scope.animation); - }; - - var reverseTransition = function() { - $element[0].classList.remove('noop-animation'); - $element[0].classList.add($scope.animation); - $element[0].classList.add('reverse'); - }; - - var forwardTransition = function() { - $element[0].classList.remove('noop-animation'); - $element[0].classList.remove('reverse'); - $element[0].classList.add($scope.animation); - }; - - $scope.$on('$routeChangeSuccess', function(e, a) { - }); - $scope.$on('$routeChangeStart', function(e, next, current) { - var back, historyState = $window.history.state; - - back = $scope.direction == 'back' || (!!(historyState && historyState.position <= $rootScope.stackCursorPosition)); - - if(isFirst || (next && next.$$route && next.$$route.originalPath === "")) { - // Don't animate - isFirst = false; - return; - } - - if(didAnimate || $rootScope.stackCursorPosition > 0) { - didAnimate = true; - if(back) { - reverseTransition(); - } else { - forwardTransition(); - } - } - }); - - $scope.$on('$locationChangeSuccess', function(a, b, c) { - // Store the new location - $rootScope.actualLocation = $location.path(); - if(isFirst && $location.path() !== '/') { - isFirst = false; - } - }); - - $scope.$on('navRouter.goBack', function(e) { - ctrl.goBack(); - }); - - - // Keep track of location changes and update a stack pointer that tracks whether we are - // going forwards or back - $scope.$watch(function () { return $location.path(); }, function (newLocation, oldLocation) { - if($rootScope.actualLocation === newLocation) { - if(oldLocation === '') {// || newLocation == '/') { - // initial route, skip this - return; - } - - var back, historyState = $window.history.state; - - back = $scope.direction == 'back' || (!!(historyState && historyState.position <= $rootScope.stackCursorPosition)); - - if (back) { - //back button - $rootScope.stackCursorPosition--; - } else { - //forward button - $rootScope.stackCursorPosition++; - } - - $scope.direction = 'forwards'; - - } else { - var currentRouteBeforeChange = $route.current; - - if (currentRouteBeforeChange) { - - $window.history.replaceState({ - position: $rootScope.stackCursorPosition - }); - - $rootScope.stackCursorPosition++; - } - } - }); - } - }; -}]) - -/** - * Our Nav Bar directive which updates as the controller state changes. - */ -.directive('navBar', ['$rootScope', '$animate', '$compile', function($rootScope, $animate, $compile) { - - /** - * Perform an animation between one tab bar state and the next. - * Right now this just animates the titles. - */ - var animate = function($scope, $element, oldTitle, data, cb) { - var title, nTitle, oTitle, titles = $element[0].querySelectorAll('.title'); - - var newTitle = data.title; - if(!oldTitle || oldTitle === newTitle) { - cb(); - return; - } - - // Clone the old title and add a new one so we can show two animating in and out - // add ng-leave and ng-enter during creation to prevent flickering when they are swapped during animation - title = angular.element(titles[0]); - oTitle = $compile('

    ')($scope); - title.replaceWith(oTitle); - nTitle = $compile('

    ')($scope); - - var insert = $element[0].firstElementChild || null; - - // Insert the new title - $animate.enter(nTitle, $element, insert && angular.element(insert), function() { - cb(); - }); - - // Remove the old title - $animate.leave(angular.element(oTitle), function() { - }); - }; - - return { - restrict: 'E', - require: '^navRouter', - replace: true, - scope: { - type: '@', - backButtonType: '@', - backButtonLabel: '@', - backButtonIcon: '@', - alignTitle: '@' - }, - template: '', - link: function($scope, $element, $attr, navCtrl) { - var backButton; - - $element.addClass($attr.animation); - - // Create the back button content and show/hide it based on scope settings - $scope.enableBackButton = true; - $scope.backButtonClass = $attr.backButtonType; - if($attr.backButtonIcon) { - $scope.backButtonClass += ' icon ' + $attr.backButtonIcon; - } - - // Listen for changes in the stack cursor position to indicate whether a back - // button should be shown (this can still be disabled by the $scope.enableBackButton - $rootScope.$watch('stackCursorPosition', function(value) { - if(value > 0) { - $scope.showBackButton = true; - } else { - $scope.showBackButton = false; - } - }); - - // Store a reference to our nav controller - $scope.navController = navCtrl; - - // Initialize our header bar view which will handle resizing and aligning our title labels - var hb = new ionic.views.HeaderBar({ - el: $element[0], - alignTitle: $scope.alignTitle || 'center' - }); - $scope.headerBarView = hb; - - // Add the type of header bar class to this element - $element.addClass($scope.type); - - var updateHeaderData = function(data) { - var oldTitle = $scope.currentTitle; - $scope.oldTitle = oldTitle; - - if(typeof data.title !== 'undefined') { - $scope.currentTitle = data.title; - } - - $scope.leftButtons = data.leftButtons; - $scope.rightButtons = data.rightButtons; - - if(typeof data.hideBackButton !== 'undefined') { - $scope.enableBackButton = data.hideBackButton !== true; - } - - if(data.animate !== false && typeof data.title !== 'undefined') { - animate($scope, $element, oldTitle, data, function() { - hb.align(); - }); - } else { - hb.align(); - } - }; - - $scope.$parent.$on('navRouter.showBackButton', function(e, data) { - $scope.enableBackButton = true; - }); - - $scope.$parent.$on('navRouter.hideBackButton', function(e, data) { - $scope.enableBackButton = false; - }); - - // Listen for changes on title change, and update the title - $scope.$parent.$on('navRouter.pageChanged', function(e, data) { - updateHeaderData(data); - }); - - $scope.$parent.$on('navRouter.pageShown', function(e, data) { - updateHeaderData(data); - }); - - $scope.$parent.$on('navRouter.titleChanged', function(e, data) { - var oldTitle = $scope.currentTitle; - $scope.oldTitle = oldTitle; - - if(typeof data.title !== 'undefined') { - $scope.currentTitle = data.title; - } - - if(data.animate !== false && typeof data.title !== 'undefined') { - animate($scope, $element, oldTitle, data, function() { - hb.align(); - }); - } else { - hb.align(); - } - }); - - // If a nav page changes the left or right buttons, update our scope vars - $scope.$parent.$on('navRouter.leftButtonsChanged', function(e, data) { - $scope.leftButtons = data; - }); - $scope.$parent.$on('navRouter.rightButtonsChanged', function(e, data) { - $scope.rightButtons = data; - }); - - /* - $scope.$parent.$on('navigation.push', function() { - backButton = angular.element($element[0].querySelector('.button')); - backButton.addClass($scope.backButtonType); - hb.align(); - }); - $scope.$parent.$on('navigation.pop', function() { - hb.align(); - }); - */ - - $scope.$on('$destroy', function() { - // - }); - } - }; -}]) - -.directive('navPage', ['$parse', function($parse) { - return { - restrict: 'E', - require: '^navRouter', - scope: { - leftButtons: '=', - rightButtons: '=', - title: '=', - icon: '@', - iconOn: '@', - iconOff: '@', - type: '@', - alignTitle: '@', - hideBackButton: '@', - hideNavBar: '@', - animate: '@', - }, - link: function($scope, $element, $attr, navCtrl) { - $element.addClass('pane'); - - // Should we hide a back button when this tab is shown - $scope.hideBackButton = $scope.$eval($scope.hideBackButton); - - $scope.hideNavBar = $scope.$eval($scope.hideNavBar); - - navCtrl.navBar.isVisible = !$scope.hideNavBar; - - if($scope.hideBackButton === true) { - $scope.$emit('navRouter.hideBackButton'); - } else { - $scope.$emit('navRouter.showBackButton'); - } - - // Whether we should animate on tab change, also impacts whether we - // tell any parent nav controller to animate - $scope.animate = $scope.$eval($scope.animate); - - - // watch for changes in the left buttons - $scope.$watch('leftButtons', function(value) { - $scope.$emit('navRouter.leftButtonsChanged', $scope.leftButtons); - }); - - $scope.$watch('rightButtons', function(val) { - $scope.$emit('navRouter.rightButtonsChanged', $scope.rightButtons); - }); - - /* - $scope.$watch('hideBackButton', function(value) { - if(value === true) { - navCtrl.hideBackButton(); - } else { - navCtrl.showBackButton(); - } - }); - */ - - // watch for changes in the title - $scope.$watch('title', function(value) { - $scope.$emit('navRouter.titleChanged', { - title: value, - animate: $scope.animate - }); - }); - } - }; -}]) - -.directive('navBack', ['$window', '$rootScope', 'Gesture', function($window, $rootScope, Gesture) { - return { - restrict: 'AC', - link: function($scope, $element, $attr, navCtrl) { - var goBack = function(e) { - // Only trigger back if the stack is greater than zero - if($rootScope.stackCursorPosition > 0) { - $window.history.back(); - - // Fallback for bad history supporting devices - $scope.$emit('navRouter.goBack'); - } - e.alreadyHandled = true; - return false; - }; - $element.bind('click', goBack); - } - }; -}]); - -})(); diff --git a/js/ext/angular/src/directive/ionicTabBar.js b/js/ext/angular/src/directive/ionicTabBar.js index 23cd691597..098e185cd2 100644 --- a/js/ext/angular/src/directive/ionicTabBar.js +++ b/js/ext/angular/src/directive/ionicTabBar.js @@ -1,4 +1,4 @@ -angular.module('ionic.ui.tabs', ['ngAnimate']) +angular.module('ionic.ui.tabs', ['ionic.service.view']) /** * @description @@ -7,15 +7,19 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) * on a tab bar. Modelled off of UITabBarController. */ -.directive('tabs', function() { +.directive('tabs', [function() { return { restrict: 'E', replace: true, scope: true, transclude: true, - controller: ['$scope', '$element', '$animate', function($scope, $element, $animate) { + controller: ['$scope', '$element', function($scope, $element) { var _this = this; + $scope.tabCount = 0; + $scope.selectedIndex = -1; + $scope.$enableViewRegister = false; + angular.extend(this, ionic.controllers.TabBarController.prototype); @@ -35,24 +39,55 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) } }); - this.add = function(controller) { - this.addController(controller); - this.select(0); + this.add = function(tabScope) { + tabScope.tabIndex = $scope.tabCount; + this.addController(tabScope); + if(tabScope.tabIndex === 0) { + this.select(0); + } + $scope.tabCount++; }; - this.select = function(controllerIndex) { - $scope.activeAnimation = $scope.animation; - _this.selectController(controllerIndex); + this.select = function(tabIndex, emitChange) { + if(tabIndex !== $scope.selectedIndex) { + + $scope.selectedIndex = tabIndex; + $scope.activeAnimation = $scope.animation; + _this.selectController(tabIndex); + + var viewData = { + type: 'tab', + typeIndex: tabIndex + }; + + for(var x=0; x', + compile: function(element, attr, transclude, tabsCtrl) { - return function($scope, $element, $attr) { + return function link($scope, $element, $attr) { + var tabs = $element[0].querySelector('.tabs'); $scope.tabsType = $attr.tabsType || 'tabs-positive'; @@ -83,26 +118,35 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) transclude($scope, function(cloned) { $element.prepend(cloned); }); + }; } }; -}) +}]) // Generic controller directive -.directive('tab', ['$animate', '$parse', function($animate, $parse) { +.directive('tab', ['ViewService', '$rootScope', '$animate', '$parse', function(ViewService, $rootScope, $animate, $parse) { return { restrict: 'E', require: '^tabs', scope: true, transclude: 'element', compile: function(element, attr, transclude) { - return function($scope, $element, $attr, tabsCtrl) { + + return function link($scope, $element, $attr, tabsCtrl) { var childScope, childElement; + ViewService.registerHistory($scope); + $scope.title = $attr.title; $scope.icon = $attr.icon; $scope.iconOn = $attr.iconOn; $scope.iconOff = $attr.iconOff; + $scope.viewSref = $attr.uiSref; + $scope.url = $attr.href; + if($scope.url && $scope.url.indexOf('#') === 0) { + $scope.url = $scope.url.replace('#', ''); + } // Should we hide a back button when this tab is shown $scope.hideBackButton = $scope.$eval($attr.hideBackButton); @@ -115,17 +159,11 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) // tell any parent nav controller to animate $scope.animate = $scope.$eval($attr.animate); - // Grab whether we should update any parent nav router on tab changes - $scope.doesUpdateNavRouter = $scope.$eval($attr.doesUpdateNavRouter); - if($scope.doesUpdateNavRouter !== false) { - $scope.doesUpdateNavRouter = true; - } - var leftButtonsGet = $parse($attr.leftButtons); $scope.$watch(leftButtonsGet, function(value) { $scope.leftButtons = value; if($scope.doesUpdateNavRouter) { - $scope.$emit('navRouter.leftButtonsChanged', $scope.rightButtons); + $scope.$emit('viewState.leftButtonsChanged', $scope.rightButtons); } }); @@ -135,7 +173,7 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) }); tabsCtrl.add($scope); - + $scope.$watch('isVisible', function(value) { if(childElement) { $animate.leave(childElement); @@ -155,23 +193,32 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) $animate.enter(clone, $element.parent(), $element); - if($scope.title) { - // Send the title up in case we are inside of a nav controller - if($scope.doesUpdateNavRouter) { - $scope.$emit('navRouter.pageShown', { - title: $scope.title, - rightButtons: $scope.rightButtons, - leftButtons: $scope.leftButtons, - hideBackButton: $scope.hideBackButton, - animate: $scope.animateNav - }); - } - //$scope.$emit('navRouter.titleChanged', $scope.title); - } $scope.$broadcast('tab.shown'); }); } }); + + // check if it has a ui-view in it + transclude($scope.$new(), function(clone) { + var navViewEle = clone[0].getElementsByTagName("nav-view"); + $scope.hasNavView = (navViewEle.length > 0); + if($scope.hasNavView) { + // this tab has a ui-view + $scope.navViewName = navViewEle[0].getAttribute('name'); + if( ViewService.isCurrentStateNavView( $scope.navViewName ) ) { + // this tab's ui-view is the current one, go to it! + tabsCtrl.select($scope.tabIndex); + } + } + }); + + $rootScope.$on('$stateChangeSuccess', function(value){ + if( ViewService.isCurrentStateNavView($scope.navViewName) && + $scope.tabIndex !== tabsCtrl.selectedIndex) { + tabsCtrl.select($scope.tabIndex); + } + }); + }; } }; @@ -186,7 +233,7 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) replace: true, scope: true, template: '
    ' + - '' + + '' + '
    ', link: function($scope, $element, $attr, tabsCtrl) { $element.addClass($scope.tabsType); @@ -195,13 +242,13 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) }; }) -.directive('tabControllerItem', function() { +.directive('tabControllerItem', ['$window', function($window) { return { restrict: 'E', replace: true, require: '^tabs', scope: { - title: '@', + iconTitle: '@', icon: '@', iconOn: '@', iconOff: '@', @@ -213,26 +260,26 @@ angular.module('ionic.ui.tabs', ['ngAnimate']) if(attrs.icon) { scope.iconOn = scope.iconOff = attrs.icon; } - scope.selectTab = function(index) { - tabsCtrl.select(scope.index); + + scope.selectTab = function() { + tabsCtrl.select(scope.index, true); }; }, template: '' + - '' + + '' + '' + - ' {{title}}' + + ' {{iconTitle}}' + '' }; -}) +}]) .directive('tabBar', function() { return { restrict: 'E', replace: true, transclude: true, - template: '
    ' + - '
    ' + template: '
    ' }; }); diff --git a/js/ext/angular/src/directive/ionicViewState.js b/js/ext/angular/src/directive/ionicViewState.js new file mode 100644 index 0000000000..2b762a92c7 --- /dev/null +++ b/js/ext/angular/src/directive/ionicViewState.js @@ -0,0 +1,339 @@ +(function() { +'use strict'; + +/** + * @description + * The NavController is a navigation stack View Controller modelled off of + * UINavigationController from Cocoa Touch. With the Nav Controller, you can + * "push" new "pages" on to the navigation stack, and then pop them off to go + * back. The NavController controls a navigation bar with a back button and title + * which updates as the pages switch. + * + * The NavController makes sure to not recycle scopes of old pages + * so that a pop will still show the same state that the user left. + * + * However, once a page is popped, its scope is destroyed and will have to be + * recreated then next time it is pushed. + * + */ + +angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gesture']) + +/** + * Our Nav Bar directive which updates as the controller state changes. + */ +.directive('navBar', ['ViewService', '$rootScope', '$animate', '$compile', + function( ViewService, $rootScope, $animate, $compile) { + + /** + * Perform an animation between one tab bar state and the next. + * Right now this just animates the titles. + */ + var animate = function($scope, $element, oldTitle, data, cb) { + var title, nTitle, oTitle, titles = $element[0].querySelectorAll('.title'); + + var newTitle = data.title; + if(!oldTitle || oldTitle === newTitle) { + cb(); + return; + } + + // Clone the old title and add a new one so we can show two animating in and out + // add ng-leave and ng-enter during creation to prevent flickering when they are swapped during animation + title = angular.element(titles[0]); + oTitle = $compile('

    ')($scope); + title.replaceWith(oTitle); + nTitle = $compile('

    ')($scope); + + var insert = $element[0].firstElementChild || null; + + // Insert the new title + $animate.enter(nTitle, $element, insert && angular.element(insert), function() { + cb(); + }); + + // Remove the old title + $animate.leave(angular.element(oTitle), function() { + }); + }; + + return { + restrict: 'E', + replace: true, + scope: { + type: '@', + backButtonType: '@', + backButtonLabel: '@', + backButtonIcon: '@', + alignTitle: '@' + }, + template: '', + link: function($scope, $element, $attr, navCtrl) { + + // Create the back button content and show/hide it based on scope settings + $scope.enableBackButton = true; + $scope.backButtonClass = $attr.backButtonType; + if($attr.backButtonIcon) { + $scope.backButtonClass += ' icon ' + $attr.backButtonIcon; + } + + // Listen for changes in the stack cursor position to indicate whether a back + // button should be shown (this can still be disabled by the $scope.enableBackButton + $rootScope.$watch('$viewHistory.backView', function(backView) { + if(backView) { + var currentView = ViewService.getCurrentView(); + if(currentView) { + if(backView.historyId === currentView.historyId) { + $scope.showBackButton = true; + return; + } + } + } + $scope.showBackButton = false; + }); + + // Store a reference to our nav controller + $scope.navController = navCtrl; + + // Initialize our header bar view which will handle resizing and aligning our title labels + var hb = new ionic.views.HeaderBar({ + el: $element[0], + alignTitle: $scope.alignTitle || 'center' + }); + $scope.headerBarView = hb; + + // Add the type of header bar class to this element + $element.addClass($scope.type); + + var updateHeaderData = function(data) { + var oldTitle = $scope.currentTitle; + $scope.oldTitle = oldTitle; + + if(typeof data.title !== 'undefined') { + $scope.currentTitle = data.title; + } + + $scope.leftButtons = data.leftButtons; + $scope.rightButtons = data.rightButtons; + + if(typeof data.hideBackButton !== 'undefined') { + $scope.enableBackButton = data.hideBackButton !== true; + } + + if(data.animate !== false && $attr.animation && data.title && data.navDirection) { + + $element[0].classList.add($attr.animation); + if(data.navDirection === 'back') { + $element[0].classList.add('reverse'); + } else { + $element[0].classList.remove('reverse'); + } + + animate($scope, $element, oldTitle, data, function() { + hb.align(); + }); + } else { + hb.align(); + } + }; + + $rootScope.$on('viewState.viewEnter', function(e, data) { + updateHeaderData(data); + }); + + // If a nav page changes the left or right buttons, update our scope vars + $scope.$parent.$on('viewState.leftButtonsChanged', function(e, data) { + $scope.leftButtons = data; + }); + $scope.$parent.$on('viewState.rightButtonsChanged', function(e, data) { + $scope.rightButtons = data; + }); + + } + }; +}]) + + +.directive('view', ['ViewService', '$rootScope', '$animate', + function( ViewService, $rootScope, $animate) { + return { + restrict: 'EA', + priority: 1000, + scope: { + leftButtons: '=', + rightButtons: '=', + title: '=', + icon: '@', + iconOn: '@', + iconOff: '@', + type: '@', + alignTitle: '@', + hideBackButton: '@', + hideNavBar: '@', + animation: '@' + }, + + compile: function(tElement, tAttrs, transclude) { + tElement.addClass('pane'); + tElement[0].removeAttribute('title'); + + return function link($scope, $element, $attr) { + // Should we hide a back button when this tab is shown + $scope.hideBackButton = $scope.$eval($scope.hideBackButton); + + $scope.hideNavBar = $scope.$eval($scope.hideNavBar); + + if($scope.hideBackButton === true) { + $scope.$emit('viewState.hideBackButton'); + } else { + $scope.$emit('viewState.showBackButton'); + } + + // watch for changes in the left buttons + $scope.$watch('leftButtons', function(value) { + $scope.$emit('viewState.leftButtonsChanged', $scope.leftButtons); + }); + + $scope.$watch('rightButtons', function(val) { + $scope.$emit('viewState.rightButtonsChanged', $scope.rightButtons); + }); + + }; + } + }; +}]) + + +.directive('viewBack', ['ViewService', function(ViewService) { + var goBack = function(e) { + var backView = ViewService.getBackView(); + backView && backView.go(); + e.alreadyHandled = true; + return false; + }; + + return { + restrict: 'AC', + link: function($scope, $element) { + $element.bind('click', goBack); + } + }; +}]) + + +.directive('navView', ['ViewService', '$state', '$anchorScroll', '$compile', '$controller', '$animate', + function( ViewService, $state, $anchorScroll, $compile, $controller, $animate) { + + var viewIsUpdating = false; + var animation; + + var directive = { + restrict: 'E', + terminal: true, + priority: 2000, + transclude: true, + + link: function(scope, $element, attr, ctrl, $transclude) { + var currentElement, + autoScrollExp = attr.autoscroll, + onloadExp = attr.onload || '', + viewLocals, + viewScope, + name = attr[directive.name] || attr.name || '', + parent = $element.parent().inheritedData('$uiView'); + + if (name.indexOf('@') < 0) name = name + '@' + (parent ? parent.state.name : ''); + var view = { name: name, state: null, animation: null }; + $element.data('$uiView', view); + + var climbElement = $element[0]; + while(!animation && climbElement) { + animation = climbElement.getAttribute('animation'); + climbElement = climbElement.parentElement; + } + + var eventHook = function() { + if (viewIsUpdating) return; + viewIsUpdating = true; + + try { update(true); } catch (e) { + viewIsUpdating = false; + throw e; + } + viewIsUpdating = false; + }; + + scope.$on('$stateChangeSuccess', eventHook); + scope.$on('$viewContentLoading', eventHook); + update(false); + + function update(doAnimation) { + var locals = $state.$current && $state.$current.locals[name], + template = (locals && locals.$template ? locals.$template.trim() : null); + + if (locals === viewLocals) return; // nothing to do here, go about your business + + var transitionOptions = { + parentElement: $element, + doAnimation: doAnimation, + leavingScope: viewScope, + leavingElement: currentElement, + navDirection: null + }; + + if (template) { + currentElement = angular.element(template); + + var registerData = {}; + if(currentElement[0].tagName !== 'TABS') { + // the tabs directive shouldn't register in the view history (its tab will) + registerData = ViewService.register(scope); + transitionOptions.navDirection = registerData.navDirection; + } + + viewLocals = locals; + view.state = locals.$$state; + + var link = $compile(currentElement), + current = $state.current; + + viewScope = current.scope = scope.$new(); + + if (locals.$$controller) { + locals.$scope = viewScope; + var controller = $controller(locals.$$controller, locals); + if (current.controllerAs) { + viewScope[current.controllerAs] = controller; + } + currentElement.data('$ngControllerController', controller); + currentElement.children().data('$ngControllerController', controller); + } + + link(viewScope); + + viewScope.$emit('$viewContentLoaded'); + viewScope.$eval(onloadExp); + viewScope.animation = animation; + + transitionOptions.enteringScope = viewScope.$$childHead; + transitionOptions.enteringElement = currentElement; + } + + ViewService.transition(transitionOptions); + } + } + }; + return directive; +}]); + + +})(); \ No newline at end of file diff --git a/js/ext/angular/src/ionicAngular.js b/js/ext/angular/src/ionicAngular.js index 79f76758da..42d592bec1 100644 --- a/js/ext/angular/src/ionicAngular.js +++ b/js/ext/angular/src/ionicAngular.js @@ -9,7 +9,8 @@ angular.module('ionic.service', [ 'ionic.service.loading', 'ionic.service.modal', 'ionic.service.popup', - 'ionic.service.templateLoad' + 'ionic.service.templateLoad', + 'ionic.service.view' ]); // UI specific services and delegates @@ -21,7 +22,7 @@ angular.module('ionic.ui', [ 'ionic.ui.content', 'ionic.ui.scroll', 'ionic.ui.tabs', - 'ionic.ui.navRouter', + 'ionic.ui.viewState', 'ionic.ui.header', 'ionic.ui.sideMenu', 'ionic.ui.slideBox', @@ -41,5 +42,6 @@ angular.module('ionic', [ 'ngAnimate', 'ngRoute', 'ngTouch', - 'ngSanitize' + 'ngSanitize', + 'ui.router' ]); diff --git a/js/ext/angular/src/service/ionicView.js b/js/ext/angular/src/service/ionicView.js new file mode 100644 index 0000000000..c2069dde61 --- /dev/null +++ b/js/ext/angular/src/service/ionicView.js @@ -0,0 +1,375 @@ +angular.module('ionic.service.view', ['ui.router']) + + +.run( ['$rootScope', '$state', '$location', '$document', + function( $rootScope, $state, $location, $document) { + + // init the variables that keep track of the view history + $rootScope.$viewHistory = { + histories: { root: { historyId: 'root', parentHistoryId: null, stack: [], cursor: -1 } }, + backView: null, + forwardView: null, + currentView: null + }; + + $rootScope.$on('viewState.changeHistory', function(e, data) { + if(!data) return; + + var hist = (data.historyId ? $rootScope.$viewHistory.histories[ data.historyId ] : null ); + if(hist && hist.cursor > -1 && hist.cursor < hist.stack.length) { + // the history they're going to already exists + // go to it's last view in its stack + var view = hist.stack[ hist.cursor ]; + return view.go(data); + } + + // this history does not have a URL, but it does have a uiSref + // figure out its URL from the uiSref + if(!data.url && data.uiSref) { + data.url = $state.href(data.uiSref); + } + + if(data.url) { + // don't let it start with a #, messes with $location.url() + if(data.url.indexOf('#') === 0) { + data.url = data.url.replace('#', ''); + } + if(data.url !== $location.url()) { + // we've got a good URL, ready GO! + $location.url(data.url); + } + } + }); + + // Set the document title when a new view is shown + $rootScope.$on('viewState.viewEnter', function(e, data) { + if(data && data.title) { + $document[0].title = data.title; + } + }); + +}]) + +.factory('ViewService', ['$rootScope', '$state', '$location', '$window', '$injector', + function( $rootScope, $state, $location, $window, $injector) { + var $animate = $injector.has('$animate') ? $injector.get('$animate') : false; + + var View = function(){}; + View.prototype.initialize = function(data) { + if(data) { + for(var name in data) this[name] = data[name]; + return this; + } + return null; + }; + View.prototype.go = function(opts) { + if(this.url && this.url !== $location.url() && (!opts || opts.enableUrlChange !== false)) { + + if($rootScope.$viewHistory.backView === this) { + return $window.history.go(-1); + } else if($rootScope.$viewHistory.forwardView === this) { + return $window.history.go(1); + } + + return $location.url(this.url); + } + + if(this.stateName) { + return $state.go(this.stateName, this.stateParams); + } + + return null; + }; + View.prototype.destory = function() { + if(this.scope) { + this.scope.destory && this.scope.destory(); + this.scope = null; + } + }; + + function createViewId(stateId) { + return ('_' + stateId + '_' + Math.round(Math.random() * 99999999)).replace(/\./g, '_'); + } + + return { + + register: function(containerScope) { + var viewHistory = $rootScope.$viewHistory, + currentStateId = this.getCurrentStateId(), + hist = this._getHistory(containerScope), + currentView = viewHistory.currentView, + backView = viewHistory.backView, + forwardView = viewHistory.forwardView, + rsp = { + viewId: null, + navAction: null, + navDirection: null, + historyId: hist.historyId + }; + + if(currentView && + currentView.stateId === currentStateId && + currentView.historyId === hist.historyId) { + // do nothing if its the same stateId in the same history + rsp.navAction = 'noChange'; + return rsp; + } + + if(backView && backView.stateId === currentStateId) { + // they went back one, set the old current view as a forward view + rsp.viewId = backView.viewId; + rsp.navAction = 'moveBack'; + if(backView.historyId === currentView.historyId) { + // went back in the same history + rsp.navDirection = 'back'; + } + + } else if(forwardView && forwardView.stateId === currentStateId) { + // they went to the forward one, set the forward view to no longer a forward view + rsp.viewId = forwardView.viewId; + rsp.navAction = 'moveForward'; + if(forwardView.historyId === currentView.historyId) { + rsp.navDirection = 'forward'; + } + + var parentHistory = this._getParentHistoryObj(containerScope); + if(forwardView.historyId && parentHistory.scope) { + // if a history has already been created by the forward view then make sure it stays the same + parentHistory.scope.$historyId = forwardView.historyId; + rsp.historyId = forwardView.historyId; + } + + } else { + + // set a new unique viewId + rsp.viewId = createViewId(currentStateId); + + if(currentView) { + // set the forward view if there is a current view (ie: if its not the first view) + currentView.forwardViewId = rsp.viewId; + + // its only moving forward if its in the same history + if(hist.historyId === currentView.historyId) { + rsp.navDirection = 'forward'; + } + rsp.navAction = 'newView'; + + // check if there is a new forward view + if(forwardView && currentView.stateId !== forwardView.stateId) { + // they navigated to a new view but the stack already has a forward view + // since its a new view remove any forwards that existed + var forwardsHistory = this._getView(forwardView.historyId); + if(forwardsHistory) { + // the forward has a history + for(var x=forwardsHistory.stack.length - 1; x >= forwardView.index; x--) { + // starting from the end destory all forwards in this history from this point + forwardsHistory.stack[x].destory(); + forwardsHistory.stack.splice(x); + } + } + } + + } else { + // there's no current view, so this must be the initial view + rsp.navAction = 'initialView'; + } + + // add the new view to the stack + viewHistory.histories[rsp.viewId] = this.createView({ + viewId: rsp.viewId, + index: hist.stack.length, + historyId: hist.historyId, + backViewId: (currentView && currentView.viewId ? currentView.viewId : null), + forwardViewId: null, + stateId: currentStateId, + stateName: this.getCurrentStateName(), + stateParams: this.getCurrentStateParams(), + url: $location.url() + }); + + // add the new view to this history's stack + hist.stack.push(viewHistory.histories[rsp.viewId]); + } + + viewHistory.currentView = this._getView(rsp.viewId); + viewHistory.backView = this._getBackView(viewHistory.currentView); + viewHistory.forwardView = this._getForwardView(viewHistory.currentView); + + hist.cursor = viewHistory.currentView.index; + + return rsp; + }, + + registerHistory: function(scope) { + scope.$historyId = 'h' + Math.round(Math.random() * 99999999999); + }, + + createView: function(data) { + var newView = new View(); + return newView.initialize(data); + }, + + getCurrentView: function() { + return $rootScope.$viewHistory.currentView; + }, + + getBackView: function() { + return $rootScope.$viewHistory.backView; + }, + + getForwardView: function() { + return $rootScope.$viewHistory.forwardView; + }, + + getNavDirection: function() { + return $rootScope.$viewHistory.navDirection; + }, + + getCurrentStateName: function() { + return ($state && $state.current ? $state.current.name : null); + }, + + isCurrentStateNavView: function(navView) { + return ($state && + $state.current && + $state.current.views && + $state.current.views[navView] ? true : false); + }, + + getCurrentStateParams: function() { + var rtn; + if ($state && $state.params) { + for(var key in $state.params) { + if($state.params.hasOwnProperty(key)) { + rtn = rtn || {}; + rtn[key] = $state.params[key]; + } + } + } + return rtn; + }, + + getCurrentStateId: function() { + var id; + if($state && $state.current && $state.current.name) { + id = $state.current.name; + if($state.params) { + for(var key in $state.params) { + if($state.params.hasOwnProperty(key) && $state.params[key]) { + id += "_" + key + "=" + $state.params[key]; + } + } + } + return id; + } + // if something goes wrong make sure its got a unique stateId + return 'r' + Math.round(Math.random() * 9999999); + }, + + _getView: function(viewId) { + return (viewId ? $rootScope.$viewHistory.histories[ viewId ] : null ); + }, + + _getBackView: function(view) { + return (view ? this._getView(view.backViewId) : null ); + }, + + _getForwardView: function(view) { + return (view ? this._getView(view.forwardViewId) : null ); + }, + + _getHistory: function(scope) { + var histObj = this._getParentHistoryObj(scope); + + if( !$rootScope.$viewHistory.histories[ histObj.historyId ] ) { + // this history object exists in parent scope, but doesn't + // exist in the history data yet + $rootScope.$viewHistory.histories[ histObj.historyId ] = { + historyId: histObj.historyId, + parentHistoryId: this._getParentHistoryObj(histObj.scope.$parent).historyId, + stack: [], + cursor: -1 + }; + } + + return $rootScope.$viewHistory.histories[ histObj.historyId ]; + }, + + _getParentHistoryObj: function(scope) { + var parentScope = scope; + while(parentScope) { + if(parentScope.hasOwnProperty('$historyId')) { + // this parent scope has a historyId + return { historyId: parentScope.$historyId, scope: parentScope }; + } + // nothing found keep climbing up + parentScope = parentScope.$parent; + } + // no history for for the parent, use the root + return { historyId: 'root', scope: $rootScope }; + }, + + transition: function(opts) { + if(!opts || !opts.enteringElement) return; + + if (opts.leavingScope) { + opts.leavingScope.$destroy(); + opts.leavingScope = null; + } + + // use the directive's animation attribute first + // if it doesn't exist, then use the given animation + var animationClass = opts.animation || getAnimationClass(); + + if($animate && animationClass && opts.doAnimation !== false && opts.navDirection) { + // set the animation we're gonna use + this.setAnimationClass(opts.parentElement, animationClass, opts.navDirection); + + // start the animations + if(opts.leavingElement) { + $animate.leave(opts.leavingElement); + } + $animate.enter(opts.enteringElement, opts.parentElement); + + } else { + // no animation, just plain ol' add/remove DOM elements + if(opts.leavingElement) { + opts.leavingElement.remove(); + } + opts.parentElement.append(opts.enteringElement); + } + + $rootScope.$broadcast('viewState.viewEnter', { + title: (opts.enteringScope ? opts.enteringScope.title : null), + navDirection: (opts.navDirection ? opts.navDirection : null) + }); + + function getAnimationClass(){ + // go up the ancestors looking for an animation value + var climbScope = opts.enteringScope; + while(climbScope) { + if(climbScope.animation) { + return climbScope.animation; + } + climbScope = climbScope.$parent; + } + } + }, + + setAnimationClass: function(element, animationClass, navDirection) { + // add the animation we're gonna use + element[0].classList.add(animationClass); + + if(navDirection === 'back') { + // animate backward + element[0].classList.add('reverse'); + } else { + // defaults to animate forward + // make sure the reverse class isn't already added + element[0].classList.remove('reverse'); + } + } + + }; + +}]); diff --git a/js/ext/angular/test/actionSheet.html b/js/ext/angular/test/actionSheet.html index 37878313d8..00df79006d 100644 --- a/js/ext/angular/test/actionSheet.html +++ b/js/ext/angular/test/actionSheet.html @@ -19,119 +19,123 @@ + -
    -
    -
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + diff --git a/package.json b/package.json index 3aa8c3e43f..3cf944da10 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ionic", "private": false, - "version": "0.9.18", + "version": "0.9.19", "devDependencies": { "karma": "~0.10", "grunt": "~0.4.1", diff --git a/scss/_animations.scss b/scss/_animations.scss index 75ef886f9c..b06b2d0e87 100644 --- a/scss/_animations.scss +++ b/scss/_animations.scss @@ -197,12 +197,10 @@ $slide-in-up-function: cubic-bezier(.1, .7, .1, 1); > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active { /* NEW content ACTIVELY sliding IN from the RIGHT */ @include translate3d(0, 0, 0); - //.scroll { background: purple; } //for debugging } > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active { /* OLD content ACTIVELY sliding OUT to the LEFT */ @include translate3d(-100%, 0, 0); - //.scroll { background: green; } //for debugging } &.reverse { @@ -221,12 +219,10 @@ $slide-in-up-function: cubic-bezier(.1, .7, .1, 1); > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active { /* NEW content ACTIVELY sliding IN from the LEFT */ @include translate3d(0, 0, 0); - //.scroll { background: blue; } //for debugging } > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active { /* OLD content ACTIVELY sliding OUT to the RIGHT */ @include translate3d(100%, 0, 0); - //.scroll { background: yellow; } //for debugging } } } @@ -258,12 +254,10 @@ $ios7-transition-duration: 250ms; > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active { /* NEW content ACTIVELY sliding IN from the RIGHT */ @include translate3d(0, 0, 0); - //.scroll { background: red; } //for debugging } > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active { /* OLD content ACTIVELY sliding OUT to the LEFT */ @include translate3d(-15%, 0, 0); - //.scroll { background: blue; } //for debugging } &.reverse { @@ -284,12 +278,10 @@ $ios7-transition-duration: 250ms; > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active { /* NEW content ACTIVELY sliding IN from the LEFT */ @include translate3d(0, 0, 0); - //.scroll { background: orange; } //for debugging } > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active { /* OLD content ACTIVELY sliding OUT to the RIGHT */ @include translate3d(15%, 0, 0); - //.scroll { background: maroon; } //for debugging } } } @@ -476,7 +468,7 @@ $ios7-transition-duration: 250ms; /** * Some component specific animations */ -$nav-title-slide-ios7-delay: 350ms; +$nav-title-slide-ios7-delay: 250ms; .nav-title-slide-ios7 { > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave { @@ -497,13 +489,10 @@ $nav-title-slide-ios7-delay: 350ms; opacity: 0; } -} -.reverse { - .nav-title-slide-ios7 { + &.reverse { > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave { - @include transition(all $nav-title-slide-ios7-delay); - @include transition-timing-function($ios7-timing-function); + @include transition(all ease-in-out $transition-duration); opacity: 1; } > .ng-enter, &.ng-enter { diff --git a/scss/ionic.scss b/scss/ionic.scss index 8896da6517..025c0905a5 100644 --- a/scss/ionic.scss +++ b/scss/ionic.scss @@ -1,7 +1,7 @@ @charset "UTF-8"; /*! - * Copyright 2013 Drifty Co. + * Copyright 2014 Drifty Co. * http://drifty.com/ * * Ionic, v{{ VERSION }}