├── client ├── css │ ├── images │ │ ├── back_light.svg │ │ ├── call.svg │ │ ├── chat.svg │ │ ├── email.svg │ │ ├── ic_action_dialog.png │ │ ├── ic_action_mail.png │ │ ├── ic_action_monolog.png │ │ ├── ic_action_phone_outgoing.png │ │ ├── ic_action_user.png │ │ ├── ic_action_users.png │ │ ├── icon-back.png │ │ ├── next.svg │ │ └── next_blue.svg │ └── styles.css ├── index.html ├── js │ ├── app.js │ ├── controllers.js │ ├── memory-services.js │ └── rest-services.js ├── lib │ ├── angular-animate.js │ ├── angular-resource.js │ ├── angular-route.js │ ├── angular-touch.js │ └── angular.js ├── partials │ ├── employee-detail.html │ ├── employee-list.html │ └── report-list.html ├── pics │ ├── amy_jones.jpg │ ├── eugene_lee.jpg │ ├── gary_donovan.jpg │ ├── james_king.jpg │ ├── john_williams.jpg │ ├── julie_taylor.jpg │ ├── kathleen_byrne.jpg │ ├── lisa_wong.jpg │ ├── paul_jones.jpg │ ├── paula_gates.jpg │ ├── ray_moore.jpg │ └── steven_wells.jpg └── topcoat │ ├── css │ ├── topcoat-mobile-light.css │ └── topcoat-mobile-light.min.css │ ├── font │ ├── LICENSE.txt │ ├── SourceCodePro-Black.otf │ ├── SourceCodePro-Bold.otf │ ├── SourceCodePro-ExtraLight.otf │ ├── SourceCodePro-Light.otf │ ├── SourceCodePro-Regular.otf │ ├── SourceCodePro-Semibold.otf │ ├── SourceSansPro-Black.otf │ ├── SourceSansPro-BlackIt.otf │ ├── SourceSansPro-Bold.otf │ ├── SourceSansPro-BoldIt.otf │ ├── SourceSansPro-ExtraLight.otf │ ├── SourceSansPro-ExtraLightIt.otf │ ├── SourceSansPro-It.otf │ ├── SourceSansPro-Light.otf │ ├── SourceSansPro-LightIt.otf │ ├── SourceSansPro-Regular.otf │ ├── SourceSansPro-Semibold.otf │ └── SourceSansPro-SemiboldIt.otf │ └── img │ ├── avatar.png │ ├── bg_dark.png │ ├── breadcrumb.png │ ├── checkbox_checked.png │ ├── checkbox_checked_dark.png │ ├── checkbox_unchecked.png │ ├── checkbox_unchecked_dark.png │ ├── checkmark_bw.svg │ ├── dark-combo-box-bg.png │ ├── dark-combo-box-bg2x.png │ ├── dark-grips.png │ ├── dark-sprites2x.png │ ├── dialog-zone-bg.png │ ├── drop-down-triangle-dark.png │ ├── drop-down-triangle.png │ ├── hamburger_bw.svg │ ├── hamburger_dark.svg │ ├── hamburger_light.svg │ ├── light-combo-box-bg.png │ ├── light-combo-box-bg2x.png │ ├── light-grips.png │ ├── light-sprites2x.png │ ├── pop-up-triangle-dark.png │ ├── pop-up-triangle.png │ ├── search-bg.png │ ├── search-bg2x.png │ ├── search.svg │ ├── search_bw.svg │ ├── search_dark.svg │ ├── search_light.svg │ ├── spinner.png │ └── spinner2x.png └── server ├── package.json ├── routes └── employee.js └── server.js /client/css/images/back_light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /client/css/images/call.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /client/css/images/chat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /client/css/images/email.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /client/css/images/ic_action_dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_dialog.png -------------------------------------------------------------------------------- /client/css/images/ic_action_mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_mail.png -------------------------------------------------------------------------------- /client/css/images/ic_action_monolog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_monolog.png -------------------------------------------------------------------------------- /client/css/images/ic_action_phone_outgoing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_phone_outgoing.png -------------------------------------------------------------------------------- /client/css/images/ic_action_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_user.png -------------------------------------------------------------------------------- /client/css/images/ic_action_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/ic_action_users.png -------------------------------------------------------------------------------- /client/css/images/icon-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/css/images/icon-back.png -------------------------------------------------------------------------------- /client/css/images/next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /client/css/images/next_blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /client/css/styles.css: -------------------------------------------------------------------------------- 1 | .back-button { 2 | top: 10px; 3 | position: absolute; 4 | } 5 | 6 | .scroller { 7 | overflow: auto; 8 | -webkit-overflow-scrolling: touch; 9 | position: absolute; 10 | top: 168px; 11 | bottom: 0px; 12 | left: 0px; 13 | right: 0px; 14 | } 15 | 16 | .topcoat-icon--back { 17 | background: url("images/back_light.svg") no-repeat; 18 | -webkit-background-size: cover; 19 | -moz-background-size: cover; 20 | background-size: cover; 21 | } 22 | 23 | .count { 24 | color: #5DC1FF; 25 | position: absolute; 26 | right: 50px; 27 | top: 26px; 28 | font-weight: bold; 29 | } 30 | 31 | .search-bar { 32 | padding:10px 10px 12px 8px; 33 | } 34 | 35 | .search-bar > input { 36 | width: 100%; 37 | } 38 | 39 | a { 40 | text-decoration: none; 41 | color: inherit; 42 | -webkit-touch-callout: none; 43 | -webkit-tap-highlight-color: rgb(0, 0, 0); 44 | } 45 | 46 | .details { 47 | margin: auto; 48 | } 49 | 50 | .details>img { 51 | float:left; 52 | margin:10px; 53 | width: 80px; 54 | height: 80px; 55 | } 56 | 57 | .details h1 { 58 | padding: 12px 0px 4px 0px; 59 | margin: 0px 0px 0px 0px; 60 | font-size: 1.2rem; 61 | } 62 | 63 | .details h2 { 64 | padding: 0px 0px 0px 0px; 65 | margin: 0px 0px 0px 0px; 66 | font-size: 1.1rem; 67 | font-weight: normal; 68 | color: #888; 69 | } 70 | 71 | .list { 72 | list-style-type: none; 73 | } 74 | 75 | .list > li { 76 | position: relative; 77 | clear: both; 78 | padding: 0px; 79 | margin: 0px; 80 | } 81 | 82 | .list > li:nth-of-type(1) { 83 | border-top: none; 84 | } 85 | 86 | .list > li > a { 87 | margin: 0px; 88 | display: block; 89 | height: 57px; 90 | padding: 4px; 91 | } 92 | 93 | 94 | .list > li > a > p:nth-of-type(1) { 95 | margin: 8px 0px 0px 0px; 96 | font-weight: bold; 97 | } 98 | 99 | .list > li p:nth-of-type(2) { 100 | margin: 0px; 101 | color: #777; 102 | } 103 | 104 | .list > li img { 105 | width: 57px; 106 | height: 57px; 107 | float: left; 108 | margin-right: 8px; 109 | } 110 | 111 | .list li:active { 112 | background-color: #d6d6d6; 113 | } 114 | 115 | .actions > li > a { 116 | padding-left: 12px; 117 | } 118 | 119 | .action-icon { 120 | position: absolute !important; 121 | top: 18px; 122 | right: 20px !important; 123 | width: 28px !important; 124 | height: 28px; 125 | } 126 | 127 | .actions li p:nth-of-type(1) { 128 | color: #5DC1FF; 129 | font-size: 0.9em; 130 | font-weight: lighter; 131 | } 132 | 133 | .actions li p:nth-of-type(2) { 134 | color: inherit; 135 | } 136 | 137 | ul { 138 | clear:both; 139 | border-top: none !important; 140 | } 141 | 142 | .icon-call { 143 | background: transparent url(images/call.svg); 144 | background-repeat: no-repeat; 145 | -webkit-background-size: cover; 146 | -moz-background-size: cover; 147 | background-size: cover; 148 | } 149 | 150 | .icon-sms { 151 | background: transparent url(images/chat.svg); 152 | background-repeat: no-repeat; 153 | -webkit-background-size: cover; 154 | -moz-background-size: cover; 155 | background-size: cover; 156 | } 157 | 158 | .icon-mail { 159 | background: transparent url(images/email.svg); 160 | background-repeat: no-repeat; 161 | -webkit-background-size: cover; 162 | -moz-background-size: cover; 163 | background-size: cover; 164 | } 165 | 166 | .icon-manager { 167 | background: transparent url(images/next.svg); 168 | background-repeat: no-repeat; 169 | -webkit-background-size: cover; 170 | -moz-background-size: cover; 171 | background-size: cover; 172 | } 173 | 174 | .icon-reports { 175 | background: transparent url(images/next.svg); 176 | background-repeat: no-repeat; 177 | -webkit-background-size: cover; 178 | -moz-background-size: cover; 179 | background-size: cover; 180 | } 181 | 182 | .chevron { 183 | background: transparent url(images/next_blue.svg); 184 | background-repeat: no-repeat; 185 | background-size: contain; 186 | width: 20px; 187 | height: 20px; 188 | position: absolute; 189 | right: 12px; 190 | top: 22px; 191 | height: 50px; 192 | width: 28px; 193 | } 194 | 195 | .slide-left.ng-enter, 196 | .slide-left.ng-leave, 197 | .slide-right.ng-enter, 198 | .slide-right.ng-leave { 199 | position: absolute; 200 | top: 0; right: 0; bottom: 0; left: 0; 201 | background: inherit; 202 | -ms-transition: .25s ease-in-out; 203 | -webkit-transition: .25s ease-in-out; 204 | transition: .25s ease-in-out; 205 | } 206 | 207 | 208 | .slide-left.ng-enter { 209 | z-index: 101; 210 | -webkit-transform: translateX(100%); 211 | transform: translateX(100%); 212 | } 213 | 214 | .slide-left.ng-enter.ng-enter-active { 215 | -webkit-transform: translateX(0); 216 | transform: translateX(0); 217 | } 218 | 219 | .slide-left.ng-leave { 220 | z-index: 100; 221 | -webkit-transform: translateX(0); 222 | transform: translateX(0); 223 | } 224 | 225 | .slide-left.ng-leave.ng-leave-active { 226 | -webkit-transform: translateX(-100%); 227 | transform: translateX(-100%); 228 | } 229 | 230 | .slide-right.ng-enter { 231 | z-index: 100; 232 | -webkit-transform: translateX(-100%); 233 | transform: translateX(-100%); 234 | } 235 | 236 | .slide-right.ng-enter.ng-enter-active { 237 | -webkit-transform: translateX(0); 238 | transform: translateX(0); 239 | } 240 | 241 | .slide-right.ng-leave { 242 | z-index: 101; 243 | -webkit-transform: translateX(0); 244 | transform: translateX(0); 245 | } 246 | 247 | .slide-right.ng-leave.ng-leave-active { 248 | -webkit-transform: translateX(100%); 249 | transform: translateX(100%); 250 | } -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /client/js/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('myApp', [ 4 | 'ngTouch', 5 | 'ngRoute', 6 | 'ngAnimate', 7 | 'myApp.controllers', 8 | 'myApp.memoryServices' 9 | ]). 10 | config(['$routeProvider', function ($routeProvider) { 11 | $routeProvider.when('/employees', {templateUrl: 'partials/employee-list.html', controller: 'EmployeeListCtrl'}); 12 | $routeProvider.when('/employees/:employeeId', {templateUrl: 'partials/employee-detail.html', controller: 'EmployeeDetailCtrl'}); 13 | $routeProvider.when('/employees/:employeeId/reports', {templateUrl: 'partials/report-list.html', controller: 'ReportListCtrl'}); 14 | $routeProvider.otherwise({redirectTo: '/employees'}); 15 | }]); -------------------------------------------------------------------------------- /client/js/controllers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('myApp.controllers', []) 4 | .controller('MainCtrl', ['$scope', '$rootScope', '$window', '$location', function ($scope, $rootScope, $window, $location) { 5 | $scope.slide = ''; 6 | $rootScope.back = function() { 7 | $scope.slide = 'slide-right'; 8 | $window.history.back(); 9 | } 10 | $rootScope.go = function(path){ 11 | $scope.slide = 'slide-left'; 12 | $location.url(path); 13 | } 14 | }]) 15 | .controller('EmployeeListCtrl', ['$scope', 'Employee', function ($scope, Employee) { 16 | $scope.employees = Employee.query(); 17 | }]) 18 | .controller('EmployeeDetailCtrl', ['$scope', '$routeParams', 'Employee', function ($scope, $routeParams, Employee) { 19 | $scope.employee = Employee.get({employeeId: $routeParams.employeeId}); 20 | }]) 21 | .controller('ReportListCtrl', ['$scope', '$routeParams', 'Report', function ($scope, $routeParams, Report) { 22 | $scope.employees = Report.query({employeeId: $routeParams.employeeId}); 23 | }]); 24 | -------------------------------------------------------------------------------- /client/js/memory-services.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | (function () { 4 | 5 | var employees = [ 6 | {"id": 1, "firstName": "James", "lastName": "King", "managerId": 0, "managerName": "", "reports": 4, "title": "President and CEO", "department": "Corporate", "cellPhone": "617-000-0001", "officePhone": "781-000-0001", "email": "jking@fakemail.com", "city": "Boston, MA", "pic": "james_king.jpg", "twitterId": "@fakejking", "blog": "http://coenraets.org"}, 7 | {"id": 2, "firstName": "Julie", "lastName": "Taylor", "managerId": 1, "managerName": "James King", "reports": 2, "title": "VP of Marketing", "department": "Marketing", "cellPhone": "617-000-0002", "officePhone": "781-000-0002", "email": "jtaylor@fakemail.com", "city": "Boston, MA", "pic": "julie_taylor.jpg", "twitterId": "@fakejtaylor", "blog": "http://coenraets.org"}, 8 | {"id": 3, "firstName": "Eugene", "lastName": "Lee", "managerId": 1, "managerName": "James King", "reports": 0, "title": "CFO", "department": "Accounting", "cellPhone": "617-000-0003", "officePhone": "781-000-0003", "email": "elee@fakemail.com", "city": "Boston, MA", "pic": "eugene_lee.jpg", "twitterId": "@fakeelee", "blog": "http://coenraets.org"}, 9 | {"id": 4, "firstName": "John", "lastName": "Williams", "managerId": 1, "managerName": "James King", "reports": 3, "title": "VP of Engineering", "department": "Engineering", "cellPhone": "617-000-0004", "officePhone": "781-000-0004", "email": "jwilliams@fakemail.com", "city": "Boston, MA", "pic": "john_williams.jpg", "twitterId": "@fakejwilliams", "blog": "http://coenraets.org"}, 10 | {"id": 5, "firstName": "Ray", "lastName": "Moore", "managerId": 1, "managerName": "James King", "reports": 2, "title": "VP of Sales", "department": "Sales", "cellPhone": "617-000-0005", "officePhone": "781-000-0005", "email": "rmoore@fakemail.com", "city": "Boston, MA", "pic": "ray_moore.jpg", "twitterId": "@fakermoore", "blog": "http://coenraets.org"}, 11 | {"id": 6, "firstName": "Paul", "lastName": "Jones", "managerId": 4, "managerName": "John Williams", "reports": 0, "title": "QA Manager", "department": "Engineering", "cellPhone": "617-000-0006", "officePhone": "781-000-0006", "email": "pjones@fakemail.com", "city": "Boston, MA", "pic": "paul_jones.jpg", "twitterId": "@fakepjones", "blog": "http://coenraets.org"}, 12 | {"id": 7, "firstName": "Paula", "lastName": "Gates", "managerId": 4, "managerName": "John Williams", "reports": 0, "title": "Software Architect", "department": "Engineering", "cellPhone": "617-000-0007", "officePhone": "781-000-0007", "email": "pgates@fakemail.com", "city": "Boston, MA", "pic": "paula_gates.jpg", "twitterId": "@fakepgates", "blog": "http://coenraets.org"}, 13 | {"id": 8, "firstName": "Lisa", "lastName": "Wong", "managerId": 2, "managerName": "Julie Taylor", "reports": 0, "title": "Marketing Manager", "department": "Marketing", "cellPhone": "617-000-0008", "officePhone": "781-000-0008", "email": "lwong@fakemail.com", "city": "Boston, MA", "pic": "lisa_wong.jpg", "twitterId": "@fakelwong", "blog": "http://coenraets.org"}, 14 | {"id": 9, "firstName": "Gary", "lastName": "Donovan", "managerId": 2, "managerName": "Julie Taylor", "reports": 0, "title": "Marketing Manager", "department": "Marketing", "cellPhone": "617-000-0009", "officePhone": "781-000-0009", "email": "gdonovan@fakemail.com", "city": "Boston, MA", "pic": "gary_donovan.jpg", "twitterId": "@fakegdonovan", "blog": "http://coenraets.org"}, 15 | {"id": 10, "firstName": "Kathleen", "lastName": "Byrne", "managerId": 5, "managerName": "Ray Moore", "reports": 0, "title": "Sales Representative", "department": "Sales", "cellPhone": "617-000-0010", "officePhone": "781-000-0010", "email": "kbyrne@fakemail.com", "city": "Boston, MA", "pic": "kathleen_byrne.jpg", "twitterId": "@fakekbyrne", "blog": "http://coenraets.org"}, 16 | {"id": 11, "firstName": "Amy", "lastName": "Jones", "managerId": 5, "managerName": "Ray Moore", "reports": 0, "title": "Sales Representative", "department": "Sales", "cellPhone": "617-000-0011", "officePhone": "781-000-0011", "email": "ajones@fakemail.com", "city": "Boston, MA", "pic": "amy_jones.jpg", "twitterId": "@fakeajones", "blog": "http://coenraets.org"}, 17 | {"id": 12, "firstName": "Steven", "lastName": "Wells", "managerId": 4, "managerName": "John Williams", "reports": 0, "title": "Software Architect", "department": "Engineering", "cellPhone": "617-000-0012", "officePhone": "781-000-0012", "email": "swells@fakemail.com", "city": "Boston, MA", "pic": "steven_wells.jpg", "twitterId": "@fakeswells", "blog": "http://coenraets.org"} 18 | ], 19 | 20 | findById = function (id) { 21 | var employee = null, 22 | l = employees.length, 23 | i; 24 | for (i = 0; i < l; i = i + 1) { 25 | if (employees[i].id === id) { 26 | employee = employees[i]; 27 | break; 28 | } 29 | } 30 | return employee; 31 | }, 32 | 33 | findByManager = function (managerId) { 34 | var results = employees.filter(function (element) { 35 | return managerId === element.managerId; 36 | }); 37 | return results; 38 | }; 39 | 40 | 41 | angular.module('myApp.memoryServices', []) 42 | .factory('Employee', [ 43 | function () { 44 | return { 45 | query: function () { 46 | return employees; 47 | }, 48 | get: function (employee) { 49 | return findById(parseInt(employee.employeeId)); 50 | } 51 | } 52 | 53 | }]) 54 | .factory('Report', [ 55 | function () { 56 | return { 57 | query: function (employee) { 58 | return findByManager(parseInt(employee.employeeId)); 59 | } 60 | } 61 | 62 | }]); 63 | 64 | }()); -------------------------------------------------------------------------------- /client/js/rest-services.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('myApp.restServices', ['ngResource']) 4 | .factory('Employee', ['$resource', 5 | function ($resource) { 6 | return $resource('http://localhost:3000/employees/:employeeId', {}); 7 | }]) 8 | 9 | .factory('Report', ['$resource', 10 | function ($resource) { 11 | return $resource('http://localhost:3000/employees/:employeeId/reports', {}); 12 | }]); -------------------------------------------------------------------------------- /client/lib/angular-animate.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.2.0-rc.3 3 | (c) 2010-2012 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(m,f,n){'use strict';f.module("ngAnimate",["ng"]).config(["$provide","$animateProvider",function(A,s){var v=f.noop,w=f.forEach,B=s.$$selectors,k="$$ngAnimateState",x="ng-animate",u={running:!0};A.decorator("$animate",["$delegate","$injector","$sniffer","$rootElement","$timeout","$rootScope",function(q,m,y,n,p,g){function G(a){if(a){var c=[],b={};a=a.substr(1).split(".");(y.transitions||y.animations)&&a.push("");for(var e=0;e=m&&a.elapsedTime>=k&&e()}var h=x(c);if(!(0 totalY, we send preventDefault() and treat this as a swipe. 126 | // - On totalY > totalX, we let the browser handle it as a scroll. 127 | 128 | if (!startCoords) return; 129 | var coords = getCoordinates(event); 130 | 131 | totalX += Math.abs(coords.x - lastPos.x); 132 | totalY += Math.abs(coords.y - lastPos.y); 133 | 134 | lastPos = coords; 135 | 136 | if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) { 137 | return; 138 | } 139 | 140 | // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll. 141 | if (totalY > totalX) { 142 | // Allow native scrolling to take over. 143 | active = false; 144 | eventHandlers['cancel'] && eventHandlers['cancel'](event); 145 | return; 146 | } else { 147 | // Prevent the browser from scrolling. 148 | event.preventDefault(); 149 | eventHandlers['move'] && eventHandlers['move'](coords, event); 150 | } 151 | }); 152 | 153 | element.on('touchend mouseup', function(event) { 154 | if (!active) return; 155 | active = false; 156 | eventHandlers['end'] && eventHandlers['end'](getCoordinates(event), event); 157 | }); 158 | } 159 | }; 160 | }]); 161 | 162 | /** 163 | * @ngdoc directive 164 | * @name ngTouch.directive:ngClick 165 | * 166 | * @description 167 | * A more powerful replacement for the default ngClick designed to be used on touchscreen 168 | * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending 169 | * the click event. This version handles them immediately, and then prevents the 170 | * following click event from propagating. 171 | * 172 | * Requires the {@link ngTouch `ngTouch`} module to be installed. 173 | * 174 | * This directive can fall back to using an ordinary click event, and so works on desktop 175 | * browsers as well as mobile. 176 | * 177 | * This directive also sets the CSS class `ng-click-active` while the element is being held 178 | * down (by a mouse click or touch) so you can restyle the depressed element if you wish. 179 | * 180 | * @element ANY 181 | * @param {expression} ngClick {@link guide/expression Expression} to evaluate 182 | * upon tap. (Event object is available as `$event`) 183 | * 184 | * @example 185 | 186 | 187 | 190 | count: {{ count }} 191 | 192 | 193 | */ 194 | 195 | ngTouch.config(['$provide', function($provide) { 196 | $provide.decorator('ngClickDirective', ['$delegate', function($delegate) { 197 | // drop the default ngClick directive 198 | $delegate.shift(); 199 | return $delegate; 200 | }]); 201 | }]); 202 | 203 | ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement', 204 | function($parse, $timeout, $rootElement) { 205 | var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag. 206 | var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers. 207 | var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click 208 | var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks. 209 | 210 | var ACTIVE_CLASS_NAME = 'ng-click-active'; 211 | var lastPreventedTime; 212 | var touchCoordinates; 213 | 214 | 215 | // TAP EVENTS AND GHOST CLICKS 216 | // 217 | // Why tap events? 218 | // Mobile browsers detect a tap, then wait a moment (usually ~300ms) to see if you're 219 | // double-tapping, and then fire a click event. 220 | // 221 | // This delay sucks and makes mobile apps feel unresponsive. 222 | // So we detect touchstart, touchmove, touchcancel and touchend ourselves and determine when 223 | // the user has tapped on something. 224 | // 225 | // What happens when the browser then generates a click event? 226 | // The browser, of course, also detects the tap and fires a click after a delay. This results in 227 | // tapping/clicking twice. So we do "clickbusting" to prevent it. 228 | // 229 | // How does it work? 230 | // We attach global touchstart and click handlers, that run during the capture (early) phase. 231 | // So the sequence for a tap is: 232 | // - global touchstart: Sets an "allowable region" at the point touched. 233 | // - element's touchstart: Starts a touch 234 | // (- touchmove or touchcancel ends the touch, no click follows) 235 | // - element's touchend: Determines if the tap is valid (didn't move too far away, didn't hold 236 | // too long) and fires the user's tap handler. The touchend also calls preventGhostClick(). 237 | // - preventGhostClick() removes the allowable region the global touchstart created. 238 | // - The browser generates a click event. 239 | // - The global click handler catches the click, and checks whether it was in an allowable region. 240 | // - If preventGhostClick was called, the region will have been removed, the click is busted. 241 | // - If the region is still there, the click proceeds normally. Therefore clicks on links and 242 | // other elements without ngTap on them work normally. 243 | // 244 | // This is an ugly, terrible hack! 245 | // Yeah, tell me about it. The alternatives are using the slow click events, or making our users 246 | // deal with the ghost clicks, so I consider this the least of evils. Fortunately Angular 247 | // encapsulates this ugly logic away from the user. 248 | // 249 | // Why not just put click handlers on the element? 250 | // We do that too, just to be sure. The problem is that the tap event might have caused the DOM 251 | // to change, so that the click fires in the same position but something else is there now. So 252 | // the handlers are global and care only about coordinates and not elements. 253 | 254 | // Checks if the coordinates are close enough to be within the region. 255 | function hit(x1, y1, x2, y2) { 256 | return Math.abs(x1 - x2) < CLICKBUSTER_THRESHOLD && Math.abs(y1 - y2) < CLICKBUSTER_THRESHOLD; 257 | } 258 | 259 | // Checks a list of allowable regions against a click location. 260 | // Returns true if the click should be allowed. 261 | // Splices out the allowable region from the list after it has been used. 262 | function checkAllowableRegions(touchCoordinates, x, y) { 263 | for (var i = 0; i < touchCoordinates.length; i += 2) { 264 | if (hit(touchCoordinates[i], touchCoordinates[i+1], x, y)) { 265 | touchCoordinates.splice(i, i + 2); 266 | return true; // allowable region 267 | } 268 | } 269 | return false; // No allowable region; bust it. 270 | } 271 | 272 | // Global click handler that prevents the click if it's in a bustable zone and preventGhostClick 273 | // was called recently. 274 | function onClick(event) { 275 | if (Date.now() - lastPreventedTime > PREVENT_DURATION) { 276 | return; // Too old. 277 | } 278 | 279 | var touches = event.touches && event.touches.length ? event.touches : [event]; 280 | var x = touches[0].clientX; 281 | var y = touches[0].clientY; 282 | // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label 283 | // and on the input element). Depending on the exact browser, this second click we don't want 284 | // to bust has either (0,0) or negative coordinates. 285 | if (x < 1 && y < 1) { 286 | return; // offscreen 287 | } 288 | 289 | // Look for an allowable region containing this click. 290 | // If we find one, that means it was created by touchstart and not removed by 291 | // preventGhostClick, so we don't bust it. 292 | if (checkAllowableRegions(touchCoordinates, x, y)) { 293 | return; 294 | } 295 | 296 | // If we didn't find an allowable region, bust the click. 297 | event.stopPropagation(); 298 | event.preventDefault(); 299 | 300 | // Blur focused form elements 301 | event.target && event.target.blur(); 302 | } 303 | 304 | 305 | // Global touchstart handler that creates an allowable region for a click event. 306 | // This allowable region can be removed by preventGhostClick if we want to bust it. 307 | function onTouchStart(event) { 308 | var touches = event.touches && event.touches.length ? event.touches : [event]; 309 | var x = touches[0].clientX; 310 | var y = touches[0].clientY; 311 | touchCoordinates.push(x, y); 312 | 313 | $timeout(function() { 314 | // Remove the allowable region. 315 | for (var i = 0; i < touchCoordinates.length; i += 2) { 316 | if (touchCoordinates[i] == x && touchCoordinates[i+1] == y) { 317 | touchCoordinates.splice(i, i + 2); 318 | return; 319 | } 320 | } 321 | }, PREVENT_DURATION, false); 322 | } 323 | 324 | // On the first call, attaches some event handlers. Then whenever it gets called, it creates a 325 | // zone around the touchstart where clicks will get busted. 326 | function preventGhostClick(x, y) { 327 | if (!touchCoordinates) { 328 | $rootElement[0].addEventListener('click', onClick, true); 329 | $rootElement[0].addEventListener('touchstart', onTouchStart, true); 330 | touchCoordinates = []; 331 | } 332 | 333 | lastPreventedTime = Date.now(); 334 | 335 | checkAllowableRegions(touchCoordinates, x, y); 336 | } 337 | 338 | // Actual linking function. 339 | return function(scope, element, attr) { 340 | var clickHandler = $parse(attr.ngClick), 341 | tapping = false, 342 | tapElement, // Used to blur the element after a tap. 343 | startTime, // Used to check if the tap was held too long. 344 | touchStartX, 345 | touchStartY; 346 | 347 | function resetState() { 348 | tapping = false; 349 | element.removeClass(ACTIVE_CLASS_NAME); 350 | } 351 | 352 | element.on('touchstart', function(event) { 353 | tapping = true; 354 | tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement. 355 | // Hack for Safari, which can target text nodes instead of containers. 356 | if(tapElement.nodeType == 3) { 357 | tapElement = tapElement.parentNode; 358 | } 359 | 360 | element.addClass(ACTIVE_CLASS_NAME); 361 | 362 | startTime = Date.now(); 363 | 364 | var touches = event.touches && event.touches.length ? event.touches : [event]; 365 | var e = touches[0].originalEvent || touches[0]; 366 | touchStartX = e.clientX; 367 | touchStartY = e.clientY; 368 | }); 369 | 370 | element.on('touchmove', function(event) { 371 | resetState(); 372 | }); 373 | 374 | element.on('touchcancel', function(event) { 375 | resetState(); 376 | }); 377 | 378 | element.on('touchend', function(event) { 379 | var diff = Date.now() - startTime; 380 | 381 | var touches = (event.changedTouches && event.changedTouches.length) ? event.changedTouches : 382 | ((event.touches && event.touches.length) ? event.touches : [event]); 383 | var e = touches[0].originalEvent || touches[0]; 384 | var x = e.clientX; 385 | var y = e.clientY; 386 | var dist = Math.sqrt( Math.pow(x - touchStartX, 2) + Math.pow(y - touchStartY, 2) ); 387 | 388 | if (tapping && diff < TAP_DURATION && dist < MOVE_TOLERANCE) { 389 | // Call preventGhostClick so the clickbuster will catch the corresponding click. 390 | preventGhostClick(x, y); 391 | 392 | // Blur the focused element (the button, probably) before firing the callback. 393 | // This doesn't work perfectly on Android Chrome, but seems to work elsewhere. 394 | // I couldn't get anything to work reliably on Android Chrome. 395 | if (tapElement) { 396 | tapElement.blur(); 397 | } 398 | 399 | if (!angular.isDefined(attr.disabled) || attr.disabled === false) { 400 | element.triggerHandler('click', [event]); 401 | } 402 | } 403 | 404 | resetState(); 405 | }); 406 | 407 | // Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click 408 | // something else nearby. 409 | element.onclick = function(event) { }; 410 | 411 | // Actual click handler. 412 | // There are three different kinds of clicks, only two of which reach this point. 413 | // - On desktop browsers without touch events, their clicks will always come here. 414 | // - On mobile browsers, the simulated "fast" click will call this. 415 | // - But the browser's follow-up slow click will be "busted" before it reaches this handler. 416 | // Therefore it's safe to use this directive on both mobile and desktop. 417 | element.on('click', function(event, touchend) { 418 | scope.$apply(function() { 419 | clickHandler(scope, {$event: (touchend || event)}); 420 | }); 421 | }); 422 | 423 | element.on('mousedown', function(event) { 424 | element.addClass(ACTIVE_CLASS_NAME); 425 | }); 426 | 427 | element.on('mousemove mouseup', function(event) { 428 | element.removeClass(ACTIVE_CLASS_NAME); 429 | }); 430 | 431 | }; 432 | }]); 433 | 434 | /** 435 | * @ngdoc directive 436 | * @name ngTouch.directive:ngSwipeLeft 437 | * 438 | * @description 439 | * Specify custom behavior when an element is swiped to the left on a touchscreen device. 440 | * A leftward swipe is a quick, right-to-left slide of the finger. 441 | * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag too. 442 | * 443 | * Requires the {@link ngTouch `ngTouch`} module to be installed. 444 | * 445 | * @element ANY 446 | * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate 447 | * upon left swipe. (Event object is available as `$event`) 448 | * 449 | * @example 450 | 451 | 452 |
453 | Some list content, like an email in the inbox 454 |
455 |
456 | 457 | 458 |
459 |
460 |
461 | */ 462 | 463 | /** 464 | * @ngdoc directive 465 | * @name ngTouch.directive:ngSwipeRight 466 | * 467 | * @description 468 | * Specify custom behavior when an element is swiped to the right on a touchscreen device. 469 | * A rightward swipe is a quick, left-to-right slide of the finger. 470 | * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag too. 471 | * 472 | * Requires the {@link ngTouch `ngTouch`} module to be installed. 473 | * 474 | * @element ANY 475 | * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate 476 | * upon right swipe. (Event object is available as `$event`) 477 | * 478 | * @example 479 | 480 | 481 |
482 | Some list content, like an email in the inbox 483 |
484 |
485 | 486 | 487 |
488 |
489 |
490 | */ 491 | 492 | function makeSwipeDirective(directiveName, direction, eventName) { 493 | ngTouch.directive(directiveName, ['$parse', '$swipe', function($parse, $swipe) { 494 | // The maximum vertical delta for a swipe should be less than 75px. 495 | var MAX_VERTICAL_DISTANCE = 75; 496 | // Vertical distance should not be more than a fraction of the horizontal distance. 497 | var MAX_VERTICAL_RATIO = 0.3; 498 | // At least a 30px lateral motion is necessary for a swipe. 499 | var MIN_HORIZONTAL_DISTANCE = 30; 500 | 501 | return function(scope, element, attr) { 502 | var swipeHandler = $parse(attr[directiveName]); 503 | 504 | var startCoords, valid; 505 | 506 | function validSwipe(coords) { 507 | // Check that it's within the coordinates. 508 | // Absolute vertical distance must be within tolerances. 509 | // Horizontal distance, we take the current X - the starting X. 510 | // This is negative for leftward swipes and positive for rightward swipes. 511 | // After multiplying by the direction (-1 for left, +1 for right), legal swipes 512 | // (ie. same direction as the directive wants) will have a positive delta and 513 | // illegal ones a negative delta. 514 | // Therefore this delta must be positive, and larger than the minimum. 515 | if (!startCoords) return false; 516 | var deltaY = Math.abs(coords.y - startCoords.y); 517 | var deltaX = (coords.x - startCoords.x) * direction; 518 | return valid && // Short circuit for already-invalidated swipes. 519 | deltaY < MAX_VERTICAL_DISTANCE && 520 | deltaX > 0 && 521 | deltaX > MIN_HORIZONTAL_DISTANCE && 522 | deltaY / deltaX < MAX_VERTICAL_RATIO; 523 | } 524 | 525 | $swipe.bind(element, { 526 | 'start': function(coords, event) { 527 | startCoords = coords; 528 | valid = true; 529 | }, 530 | 'cancel': function(event) { 531 | valid = false; 532 | }, 533 | 'end': function(coords, event) { 534 | if (validSwipe(coords)) { 535 | scope.$apply(function() { 536 | element.triggerHandler(eventName); 537 | swipeHandler(scope, {$event: event}); 538 | }); 539 | } 540 | } 541 | }); 542 | }; 543 | }]); 544 | } 545 | 546 | // Left is negative X-coordinate, right is positive. 547 | makeSwipeDirective('ngSwipeLeft', -1, 'swipeleft'); 548 | makeSwipeDirective('ngSwipeRight', 1, 'swiperight'); 549 | 550 | 551 | 552 | })(window, window.angular); 553 | -------------------------------------------------------------------------------- /client/lib/angular.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.2.0-rc.3 3 | (c) 2010-2012 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(Y,R,s){'use strict';function D(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/undefined/"+(b?b+"/":"")+a;for(c=1;c").append(b).html();try{return 3===b[0].nodeType?B(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+B(b)})}catch(d){return B(c)}}function Pb(b){try{return decodeURIComponent(b)}catch(a){}}function Qb(b){var a={},c,d;p((b||"").split("&"),function(b){b&&(c=b.split("="),d=Pb(c[0]), 15 | w(d)&&(b=w(c[1])?Pb(c[1]):!0,a[d]?H(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Rb(b){var a=[];p(b,function(b,d){H(b)?p(b,function(b){a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))}):a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))});return a.length?a.join("&"):""}function qb(b){return va(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function va(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g, 16 | a?"%20":"+")}function Mc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;p(g,function(a){g[a]=!0;c(R.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(p(b.querySelectorAll("."+a),c),p(b.querySelectorAll("."+a+"\\:"),c),p(b.querySelectorAll("["+a+"]"),c))});p(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):p(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}}); 17 | e&&a(e,f?[f]:[])}function Sb(b,a){var c=function(){b=x(b);if(b.injector()){var c=b[0]===R?"document":ga(b);throw Ja("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=Tb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)});e.enabled(!0)}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(Y&&!d.test(Y.name))return c();Y.name=Y.name.replace(d,"");Za.resumeBootstrap= 18 | function(b){p(b,function(b){a.push(b)});c()}}function $a(b,a){a=a||"_";return b.replace(Nc,function(b,d){return(d?a:"")+b.toLowerCase()})}function rb(b,a,c){if(!b)throw Ja("areq",a||"?",c||"required");return b}function La(b,a,c){c&&H(b)&&(b=b[b.length-1]);rb(E(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b));return b}function pa(b,a){if("hasOwnProperty"===b)throw Ja("badname",a);}function sb(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g= 19 | 0;g "+b;a.removeChild(a.firstChild);vb(this,a.childNodes);x(R.createDocumentFragment()).append(this)}else vb(this,b)}function wb(b){return b.cloneNode(!0)}function Na(b){Ub(b);var a=0;for(b=b.childNodes||[];a=Q?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ca(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=Va()):c=b;return a+":"+c}function Pa(b){p(b, 27 | this.put,this)}function $b(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(Tc,""),c=c.match(Uc),p(c[1].split(Vc),function(b){b.replace(Wc,function(b,c,d){a.push(d)})})),b.$inject=a):H(b)?(c=b.length-1,La(b[c],"fn"),a=b.slice(0,c)):La(b,"fn",!0);return a}function Tb(b){function a(a){return function(b,c){if(S(b))p(b,Mb(a));else return a(b,c)}}function c(a,b){pa(a,"service");if(E(b)||H(b))b=r.instantiate(b);if(!b.$get)throw Qa("pget",a);return l[a+h]=b}function d(a, 28 | b){return c(a,{$get:b})}function e(a){var b=[];p(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(F(a)){var c=Ra(a);b=b.concat(e(c.requires)).concat(c._runBlocks);for(var d=c._invokeQueue,c=0,f=d.length;c 4096 bytes)!"));else{if(m.cookie!==da)for(da=m.cookie,d=da.split("; "),N={},f=0;fk&&this.remove(q.key), 38 | b},get:function(a){var b=l[a];if(b)return e(b),m[a]},remove:function(a){var b=l[a];b&&(b==r&&(r=b.p),b==q&&(q=b.n),f(b.n,b.p),delete l[a],delete m[a],g--)},removeAll:function(){m={};g=0;l={};r=q=null},destroy:function(){l=h=m=null;delete a[b]},info:function(){return G({},h,{size:g})}}}var a={};b.info=function(){var b={};p(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function ad(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function bc(b){var a= 39 | {},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,f=/^\s*(https?|ftp|mailto|tel|file):/,g=/^\s*(https?|ftp|file):|data:image\//,h=/^(on[a-z]+|formaction)$/;this.directive=function k(d,e){pa(d,"directive");F(d)?(rb(e,"directiveFactory"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];p(a[d],function(a,f){try{var k=b.invoke(a);E(k)?k={compile:aa(k)}:!k.compile&&k.link&&(k.compile=aa(k.link));k.priority= 40 | k.priority||0;k.index=f;k.name=k.name||d;k.require=k.require||k.controller&&k.name;k.restrict=k.restrict||"A";e.push(k)}catch(g){c(g)}});return e}])),a[d].push(e)):p(d,Mb(k));return this};this.aHrefSanitizationWhitelist=function(a){return w(a)?(f=a,this):f};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(g=a,this):g};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate",function(b,l,r,q,n,y,A, 41 | C,u,U,M){function t(a,b,c,d,e){a instanceof x||(a=x(a));p(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=x(b).wrap("").parent()[0])});var f=ca(a,b,a,c,d,e);return function(b,c){rb(b,"scope");for(var d=c?Sa.clone.call(a):a,e=0,k=d.length;eI.priority)break;if(w=I.scope)ca=ca||I,I.templateUrl||(P("new/isolated scope",u,I,L),S(w)&&(T(L,"ng-isolate-scope"),u=I),T(L,"ng-scope"));Z=I.name;!I.templateUrl&&I.controller&&(w=I.controller,v=v||{},P("'"+Z+"' controller",v[Z],I,L),v[Z]=I);if(w=I.transclude)"ngRepeat"!==Z&&(P("transclusion",g,I,L),g=I),"element"==w?(C=I.priority,w=da(b,G,D),L=c.$$element=x(R.createComment(" "+Z+": "+c[Z]+" ")),b=L[0],db(e,x(ua.call(w,0)),b),O=t(w,d,C,f&&f.name,{newIsolateScopeDirective:u,transcludeDirective:g, 50 | templateDirective:M})):(w=x(wb(b)).contents(),L.html(""),O=t(w,d));if(I.template)if(P("template",M,I,L),M=I,w=E(I.template)?I.template(L,c):I.template,w=cc(w),I.replace){f=I;w=x("
"+ba(w)+"
").contents();b=w[0];if(1!=w.length||1!==b.nodeType)throw ha("tplrt",Z,"");db(e,L,b);K={$attr:{}};a=a.concat(N(b,a.splice(ma+1,a.length-(ma+1)),K));ac(c,K);K=a.length}else L.html(w);if(I.templateUrl)P("template",M,I,L),M=I,I.replace&&(f=I),U=Bb(a.splice(ma,a.length-ma),L,c,e,O,k,h,{newIsolateScopeDirective:u, 51 | transcludeDirective:g,templateDirective:M}),K=a.length;else if(I.compile)try{B=I.compile(L,c,O),E(B)?n(null,B,G,D):B&&n(B.pre,B.post,G,D)}catch(J){r(J,ga(L))}I.terminal&&(U.terminal=!0,C=Math.max(C,I.priority))}U.scope=ca&&ca.scope;U.transclude=g&&O;return U}function Z(d,e,f,g,h,l,n){if(e===h)return null;h=null;if(a.hasOwnProperty(e)){var q;e=b.get(e+c);for(var y=0,A=e.length;yq.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Hc(q,{$$start:l,$$end:n})),d.push(q),h=q)}catch(C){r(C)}}return h} 52 | function ac(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;p(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});p(b,function(b,f){"class"==f?(T(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?e.attr("style",e.attr("style")+";"+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function Bb(a,b,c,d,e,f,k,g){var h=[],l,r,y=b[0],A=a.shift(),C=G({},A,{templateUrl:null,transclude:null,replace:null}),t=E(A.templateUrl)?A.templateUrl(b,c): 53 | A.templateUrl;b.html("");q.get(U.getTrustedResourceUrl(t),{cache:n}).success(function(n){var q;n=cc(n);if(A.replace){n=x("
"+ba(n)+"
").contents();q=n[0];if(1!=n.length||1!==q.nodeType)throw ha("tplrt",A.name,t);n={$attr:{}};db(d,b,q);N(q,a,n);ac(c,n)}else q=y,b.html(n);a.unshift(C);l=L(a,q,c,e,b,A,f,k,g);p(d,function(a,c){a==q&&(d[c]=b[0])});for(r=ca(b[0].childNodes,e);h.length;){n=h.shift();var U=h.shift(),T=h.shift(),s=h.shift(),u=b[0];U!==y&&(u=wb(q),db(T,x(U),u));l(r,n,u,d,s)}h=null}).error(function(a, 54 | b,c,d){throw ha("tpload",d.url);});return function(a,b,c,d,e){h?(h.push(b),h.push(c),h.push(d),h.push(e)):l(r,b,c,d,e)}}function O(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.namea.status?b:r.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f=function(a){function b(a){var c;p(a,function(b, 63 | d){E(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=G({},a.headers),f,h,c=G({},c.common,c[B(a.method)]);b(c);b(d);a:for(f in c){a=B(f);for(h in d)if(B(h)===a)continue a;d[f]=c[f]}return d}(a);G(d,a);d.headers=f;d.method=Ea(d.method);(a=Cb(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var h=[function(a){f=a.headers;var b=fc(a.data,ec(f),a.transformRequest);z(a.data)&&p(f,function(a,b){"content-type"===B(b)&&delete f[b]});z(a.withCredentials)&& 64 | !z(e.withCredentials)&&(a.withCredentials=e.withCredentials);return y(a,b,f).then(c,c)},s],k=r.when(d);for(p(u,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&h.push(a.response,a.responseError)});h.length;){a=h.shift();var g=h.shift(),k=k.then(a,g)}k.success=function(a){k.then(function(b){a(b.data,b.status,b.headers,d)});return k};k.error=function(a){k.then(null,function(b){a(b.data,b.status,b.headers,d)});return k};return k}function y(b, 65 | c,f){function k(a,b,c){p&&(200<=a&&300>a?p.put(s,[a,b,dc(c)]):p.remove(s));g(b,a,c);d.$$phase||d.$apply()}function g(a,c,d){c=Math.max(c,0);(200<=c&&300>c?q.resolve:q.reject)({data:a,status:c,headers:ec(d),config:b})}function m(){var a=Ya(n.pendingRequests,b);-1!==a&&n.pendingRequests.splice(a,1)}var q=r.defer(),y=q.promise,p,u,s=A(b.url,b.params);n.pendingRequests.push(b);y.then(m,m);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(p=S(b.cache)?b.cache:S(e.cache)?e.cache:C);if(p)if(u=p.get(s), 66 | w(u)){if(u.then)return u.then(m,m),u;H(u)?g(u[1],u[0],fa(u[2])):g(u,200,{})}else p.put(s,y);z(u)&&a(b.method,s,c,k,f,b.timeout,b.withCredentials,b.responseType);return y}function A(a,b){if(!b)return a;var c=[];Gc(b,function(a,b){null!=a&&a!=s&&(H(a)||(a=[a]),p(a,function(a){S(a)&&(a=oa(a));c.push(va(b)+"="+va(a))}))});return a+(-1==a.indexOf("?")?"?":"&")+c.join("&")}var C=c("$http"),u=[];p(f,function(a){u.unshift(F(a)?q.get(a):q.invoke(a))});p(g,function(a,b){var c=F(a)?q.get(a):q.invoke(a);u.splice(b, 67 | 0,{response:function(a){return c(r.when(a))},responseError:function(a){return c(r.reject(a))}})});n.pendingRequests=[];(function(a){p(arguments,function(a){n[a]=function(b,c){return n(G(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){p(arguments,function(a){n[a]=function(b,c,d){return n(G(d||{},{method:a,url:b,data:c}))}})})("post","put");n.defaults=e;return n}]}function gd(){this.$get=["$browser","$window","$document",function(b,a,c){return hd(b,id,b.defer,a.angular.callbacks, 68 | c[0],a.location.protocol.replace(":",""))}]}function hd(b,a,c,d,e,f){function g(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;Q?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c);return d}return function(e,m,k,l,r,q,n,y){function A(){u=-1;M&&M();t&&t.abort()}function C(a,d,e,h){var g=f||wa(m).protocol;T&&c.cancel(T);M=t=null;d="file"==g?e?200:404:d;a(1223==d?204:d, 69 | e,h);b.$$completeOutstandingRequest(v)}var u;b.$$incOutstandingRequestCount();m=m||b.url();if("jsonp"==B(e)){var s="_"+(d.counter++).toString(36);d[s]=function(a){d[s].data=a};var M=g(m.replace("JSON_CALLBACK","angular.callbacks."+s),function(){d[s].data?C(l,200,d[s].data):C(l,u||-2);delete d[s]})}else{var t=new a;t.open(e,m,!0);p(r,function(a,b){w(a)&&t.setRequestHeader(b,a)});t.onreadystatechange=function(){if(4==t.readyState){var a=t.getAllResponseHeaders();C(l,u||t.status,t.responseType?t.response: 70 | t.responseText,a)}};n&&(t.withCredentials=!0);y&&(t.responseType=y);t.send(k||null)}if(0=h&&(r.resolve(n),l(q.$$intervalId),delete e[q.$$intervalId]);y||b.$apply()},g);e[q.$$intervalId]=r;return q}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId], 73 | !0):!1};return d}]}function ld(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), 74 | DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function hc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=qb(b[a]);return b.join("/")}function ic(b,a){var c=wa(b);a.$$protocol= 75 | c.protocol;a.$$host=c.hostname;a.$$port=W(c.port)||md[c.protocol]||null}function jc(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=wa(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=Qb(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function na(b,a){if(0==a.indexOf(b))return a.substr(b.length)}function Ta(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Db(b){return b.substr(0, 76 | Ta(b).lastIndexOf("/")+1)}function kc(b,a){this.$$html5=!0;a=a||"";var c=Db(b);ic(b,this);this.$$parse=function(a){var b=na(c,a);if(!F(b))throw Eb("ipthprfx",a,c);jc(b,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Rb(this.$$search),b=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=hc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=na(b,d))!==s)return d=e,(e=na(a,e))!==s?c+(na("/",e)||e):b+d;if((e=na(c, 77 | d))!==s)return c+e;if(c==d+"/")return c}}function Fb(b,a){var c=Db(b);ic(b,this);this.$$parse=function(d){var e=na(b,d)||na(c,d),e="#"==e.charAt(0)?na(a,e):this.$$html5?e:"";if(!F(e))throw Eb("ihshprfx",d,a);jc(e,this);this.$$compose()};this.$$compose=function(){var c=Rb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=hc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Ta(b)==Ta(a))return a}}function lc(b,a){this.$$html5=!0;Fb.apply(this, 78 | arguments);var c=Db(b);this.$$rewrite=function(d){var e;if(b==Ta(d))return d;if(e=na(c,d))return b+a+e;if(c===d+"/")return c}}function eb(b){return function(){return this[b]}}function mc(b,a){return function(c){if(z(c))return this[b];this[b]=a(c);this.$$compose();return this}}function nd(){var b="",a=!1;this.hashPrefix=function(a){return w(a)?(b=a,this):b};this.html5Mode=function(b){return w(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess", 79 | h.absUrl(),a)}var h,m=d.baseHref(),k=d.url();a?(m=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(m||"/"),e=e.history?kc:lc):(m=Ta(k),e=Fb);h=new e(m,"#"+b);h.$$parse(h.$$rewrite(k));f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=x(a.target);"a"!==B(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=h.$$rewrite(e);e&&(!b.attr("target")&&g&&!a.isDefaultPrevented())&&(a.preventDefault(),g!=d.url()&&(h.$$parse(g),c.$apply(),Y.angular["ff-684208-preventDefault"]= 80 | !0))}});h.absUrl()!=k&&d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$broadcast("$locationChangeStart",a,h.absUrl()).defaultPrevented?d.url(h.absUrl()):(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);g(b)}),c.$$phase||c.$digest()))});var l=0;c.$watch(function(){var a=d.url(),b=h.$$replace;l&&a==h.absUrl()||(l++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),g(a))}));h.$$replace=!1;return l});return h}]} 81 | function od(){var b=!0,a=this;this.debugEnabled=function(a){return w(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||v;return e.apply?function(){var a=[];p(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"), 82 | info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function qa(b,a){if("constructor"===b)throw xa("isecfld",a);return b}function fb(b,a){if(b&&b.constructor===b)throw xa("isecfn",a);if(b&&b.document&&b.location&&b.alert&&b.setInterval)throw xa("isecwindow",a);if(b&&(b.nodeName||b.on&&b.find))throw xa("isecdom",a);return b}function gb(b,a,c,d,e){e=e||{};a=a.split(".");for(var f,g=0;1e?nc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,f){var h=0,g;do g=nc(d[h++],d[h++],d[h++],d[h++],d[h++],c,a)(b,f),f=s,b=g;while(ha)for(b in g++,d)d.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(m--,delete d[b])}else d!==f&&(d=f,g++);return g},function(){b(f,d,c)})},$digest:function(){var c, 96 | e,f,g,m=this.$$asyncQueue,p=this.$$postDigestQueue,s,w,M=b,t,x=[],v,N,da;h("$digest");do{w=!1;for(t=this;m.length;)try{da=m.shift(),da.scope.$eval(da.expression)}catch(ka){d(ka)}do{if(g=t.$$watchers)for(s=g.length;s--;)try{(c=g[s])&&((e=c.get(t))!==(f=c.last)&&!(c.eq?Aa(e,f):"number"==typeof e&&"number"==typeof f&&isNaN(e)&&isNaN(f)))&&(w=!0,c.last=c.eq?fa(e):e,c.fn(e,f===k?e:f,t),5>M&&(v=4-M,x[v]||(x[v]=[]),N=E(c.exp)?"fn: "+(c.exp.name||c.exp.toString()):c.exp,N+="; newVal: "+oa(e)+"; oldVal: "+ 97 | oa(f),x[v].push(N)))}catch(L){d(L)}if(!(g=t.$$childHead||t!==this&&t.$$nextSibling))for(;t!==this&&!(g=t.$$nextSibling);)t=t.$parent}while(t=g);if(w&&!M--)throw l.$$phase=null,a("infdig",b,oa(x));}while(w||m.length);for(l.$$phase=null;p.length;)try{p.shift()()}catch(B){d(B)}},$destroy:function(){if(l!=this&&!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling); 98 | this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return e(a)(this,b)},$evalAsync:function(a){l.$$phase||l.$$asyncQueue.length||f.defer(function(){l.$$asyncQueue.length&&l.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)}, 99 | $apply:function(a){try{return h("$apply"),this.$eval(a)}catch(b){d(b)}finally{l.$$phase=null;try{l.$digest()}catch(c){throw d(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[Ya(c,b)]=null}},$emit:function(a,b){var c=[],e,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(ua.call(arguments,1)),l,m;do{e=f.$$listeners[a]||c;h.currentScope= 100 | f;l=0;for(m=e.length;lc))throw sa("iequirks");var e=fa(ea);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=za);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var f=e.parseAs,g=e.getTrusted,h=e.trustAs;p(ea,function(a,b){var c=B(b);e[Ma("parse_as_"+c)]=function(b){return f(a,b)};e[Ma("get_trusted_"+ 106 | c)]=function(b){return g(a,b)};e[Ma("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function wd(){this.$get=["$window","$document",function(b,a){var c={},d=W((/android (\d+)/.exec(B((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|O|ms)(?=[A-Z])/,m=f.body&&f.body.style,k=!1,l=!1;if(m){for(var r in m)if(k=h.exec(r)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in m&&"webkit");k=!!("transition"in m|| 107 | g+"Transition"in m);l=!!("animation"in m||g+"Animation"in m);!d||k&&l||(k=F(f.body.style.webkitTransition),l=F(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!f.documentMode||7b;b=Math.abs(b);var g=b+"",h="",m=[],k=!1;if(-1!==g.indexOf("e")){var l=g.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?g="0":(h=g,k=!0)}if(k)0b)&&(h=b.toFixed(e));else{g=(g.split(yc)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));g=Math.pow(10,e);b=Math.round(b*g)/g;b=(""+b).split(yc);g=b[0];b=b[1]|| 114 | "";var k=0,l=a.lgSize,r=a.gSize;if(g.length>=l+r)for(var k=g.length-l,q=0;qb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Ib(e,a,d)}}function hb(b,a){return function(c,d){var e=c["get"+b](),f=Ea(a?"SHORT"+b:b);return d[f][e]}}function uc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,m=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=W(b[9]+b[10]),g=W(b[9]+b[11]));h.call(a,W(b[1]),W(b[2])-1,W(b[3]));f=W(b[4]||0)-f;g=W(b[5]||0)-g;h=W(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));m.call(a,f,g,h,b)}return a} 116 | var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var f="",g=[],h,m;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;F(c)&&(c=Ed.test(c)?W(c):a(c));ob(c)&&(c=new Date(c));if(!Ha(c))return c;for(;e;)(m=Fd.exec(e))?(g=g.concat(ua.call(m,1)),e=g.pop()):(g.push(e),e=null);p(g,function(a){h=Gd[a];f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function Ad(){return function(b){return oa(b,!0)}} 117 | function Bd(){return function(b,a){if(!H(b)&&!F(b))return b;a=W(a);if(F(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0a||37<=a&&40>=a)||m()});a.on("change",g);if(e.hasEvent("paste"))a.on("paste cut",m)}d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var k=c.ngPattern,l=function(a,b){if(d.$isEmpty(b)||a.test(b))return d.$setValidity("pattern",!0),b;d.$setValidity("pattern",!1);return s};k&&((e=k.match(/^\/(.*)\/([gim]*)$/))?(k=RegExp(e[1], 122 | e[2]),e=function(a){return l(k,a)}):e=function(c){var d=b.$eval(k);if(!d||!d.test)throw D("ngPattern")("noregexp",k,d,ga(a));return l(d,c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var r=W(c.ngMinlength);e=function(a){if(!d.$isEmpty(a)&&a.lengthq)return d.$setValidity("maxlength", 123 | !1),s;d.$setValidity("maxlength",!0);return a};d.$parsers.push(e);d.$formatters.push(e)}}function Jb(b,a){b="ngClass"+b;return function(){return{restrict:"AC",link:function(c,d,e){function f(b){if(!0===a||c.$index%2===a)h&&!Aa(b,h)&&e.$removeClass(g(h)),e.$addClass(g(b));h=fa(b)}function g(a){if(H(a))return a.join(" ");if(S(a)){var b=[];p(a,function(a,c){a&&b.push(c)});return b.join(" ")}return a}var h=s;c.$watch(e[b],f,!0);e.$observe("class",function(a){f(c.$eval(e[b]))});"ngClass"!==b&&c.$watch("$index", 124 | function(d,f){var h=d&1;h!==f&1&&(h===a?(h=c.$eval(e[b]),e.$addClass(g(h))):(h=c.$eval(e[b]),e.$removeClass(g(h))))})}}}}var B=function(b){return F(b)?b.toLowerCase():b},Ea=function(b){return F(b)?b.toUpperCase():b},Q,x,Ba,ua=[].slice,Hd=[].push,Wa=Object.prototype.toString,Ja=D("ng"),Za=Y.angular||(Y.angular={}),Ra,Da,ia=["0","0","0"];Q=W((/msie (\d+)/.exec(B(navigator.userAgent))||[])[1]);isNaN(Q)&&(Q=W((/trident\/.*; rv:(\d+)/.exec(B(navigator.userAgent))||[])[1]));v.$inject=[];za.$inject=[];var ba= 125 | function(){return String.prototype.trim?function(b){return F(b)?b.trim():b}:function(b){return F(b)?b.replace(/^\s*/,"").replace(/\s*$/,""):b}}();Da=9>Q?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ea(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Nc=/[A-Z]/g,Id={full:"1.2.0-rc.3",major:1,minor:2,dot:0,codeName:"ferocious-twitch"},Oa=J.cache={},ab=J.expando="ng-"+(new Date).getTime(),Rc=1,Ac=Y.document.addEventListener? 126 | function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},xb=Y.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},Pc=/([\:\-\_]+(.))/g,Qc=/^moz([A-Z])/,ub=D("jqLite"),Sa=J.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===R.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),J(Y).on("load",a))},toString:function(){var b=[];p(this,function(a){b.push(""+a)});return"["+b.join(", ")+ 127 | "]"},eq:function(b){return 0<=b?x(this[b]):x(this[this.length+b])},length:0,push:Hd,sort:[].sort,splice:[].splice},cb={};p("multiple selected checked disabled readOnly required open".split(" "),function(b){cb[B(b)]=b});var Zb={};p("input select option textarea button form details".split(" "),function(b){Zb[Ea(b)]=!0});p({data:Wb,inheritedData:bb,scope:function(b){return bb(b,"$scope")},controller:Xb,injector:function(b){return bb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:yb, 128 | css:function(b,a,c){a=Ma(a);if(w(c))b.style[a]=c;else{var d;8>=Q&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=Q&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=B(a);if(cb[d])if(w(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||v).specified?d:s;else if(w(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(w(c))b[a]=c;else return b[a]}, 129 | text:function(){function b(b,d){var e=a[b.nodeType];if(z(d))return e?b[e]:"";b[e]=d}var a=[];9>Q?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(z(a)){if("SELECT"===Da(b)&&b.multiple){var c=[];p(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a, 141 | c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Md={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Hb=function(a){this.options=a};Hb.prototype={constructor:Hb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=w(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw xa("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(Ua.ZERO,a.fn, 156 | this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=oc(d,this.options,this.text);return G(function(c,d,h){return e(h||a(c,d),d)},{assign:function(e,g,h){return gb(a(e,h),d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return G(function(e,f){var g=a(e,f),h=d(e,f),m;if(!g)return s;(g=fb(g[h],c.text))&&(g.then&&c.options.unwrapPromises)&&(m=g,"$$v"in g||(m.$$v=s, 157 | m.then(function(a){m.$$v=a})),g=g.$$v);return g},{assign:function(e,f,g){var h=d(e,g);return fb(a(e,g),c.text)[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(f,g){for(var h=[],m=c?c(f,g):f,k=0;ka.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ib(Math[0=Q&&(c.href||c.name||c.$set("href",""),a.append(R.createComment("IE fix")));return function(a,c){c.on("click",function(a){c.attr("href")||a.preventDefault()})}}}),Kb={};p(cb,function(a,c){if("multiple"!=a){var d=la("ng-"+c);Kb[d]=function(){return{priority:100,compile:function(){return function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}}});p(["src","srcset","href"],function(a){var c=la("ng-"+a);Kb[c]=function(){return{priority:99, 162 | link:function(d,e,f){f.$observe(c,function(c){c&&(f.$set(a,c),Q&&e.prop(a,f[a]))})}}}});var kb={$addControl:v,$removeControl:v,$setValidity:v,$setDirty:v,$setPristine:v};zc.$inject=["$element","$attrs","$scope"];var Bc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:zc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Ac(e[0],"submit",h);e.on("$destroy",function(){c(function(){xb(e[0], 163 | "submit",h)},0,!1)})}var m=e.parent().controller("form"),k=f.name||f.ngForm;k&&gb(a,k,g,k);if(m)e.on("$destroy",function(){m.$removeControl(g);k&&gb(a,k,s,k);G(g,kb)})}}}}}]},Od=Bc(),Pd=Bc(!0),Qd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Rd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/,Sd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Cc={text:mb,number:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Sd.test(a))return e.$setValidity("number", 164 | !0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});if(d.min){var h=parseFloat(d.min);a=function(a){if(!e.$isEmpty(a)&&am)return e.$setValidity("max",!1),s;e.$setValidity("max",!0);return a};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){if(e.$isEmpty(a)|| 165 | ob(a))return e.$setValidity("number",!0),a;e.$setValidity("number",!1);return s})},url:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);a=function(a){if(e.$isEmpty(a)||Qd.test(a))return e.$setValidity("url",!0),a;e.$setValidity("url",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);a=function(a){if(e.$isEmpty(a)||Rd.test(a))return e.$setValidity("email",!0),a;e.$setValidity("email",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d, 166 | e){z(d.name)&&c.attr("name",Va());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;F(f)||(f=!0);F(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a=== 167 | f});e.$parsers.push(function(a){return a?f:g})},hidden:v,button:v,submit:v,reset:v},Dc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,g){g&&(Cc[B(f.type)]||Cc.text)(d,e,f,g,c,a)}}}],jb="ng-valid",ib="ng-invalid",Fa="ng-pristine",lb="ng-dirty",Td=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,f){function g(a,c){c=c?"-"+$a(c,"-"):"";e.removeClass((a?ib:jb)+c).addClass((a?jb:ib)+c)}this.$modelValue=this.$viewValue=Number.NaN; 168 | this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var h=f(d.ngModel),m=h.assign;if(!m)throw D("ngModel")("nonassign",d.ngModel,ga(e));this.$render=v;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var k=e.inheritedData("$formController")||kb,l=0,r=this.$error={};e.addClass(Fa);g(!0);this.$setValidity=function(a,c){r[a]!==!c&&(c?(r[a]&&l--,l||(g(!0),this.$valid=!0,this.$invalid=!1)):(g(!1), 169 | this.$invalid=!0,this.$valid=!1,l++),r[a]=!c,g(c,a),k.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(lb).addClass(Fa)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,e.removeClass(Fa).addClass(lb),k.$setDirty());p(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,m(a,d),p(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var q=this;a.$watch(function(){var c= 170 | h(a);if(q.$modelValue!==c){var d=q.$formatters,e=d.length;for(q.$modelValue=c;e--;)c=d[e](c);q.$viewValue!==c&&(q.$viewValue=c,q.$render())}})}],Ud=function(){return{require:["ngModel","^?form"],controller:Td,link:function(a,c,d,e){var f=e[0],g=e[1]||kb;g.$addControl(f);c.on("$destroy",function(){g.$removeControl(f)})}}},Vd=aa({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ec=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required= 171 | !0;var f=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required",function(){f(e.$viewValue)})}}}},Wd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!z(a)){var c=[];a&&p(a.split(f),function(a){a&&c.push(ba(a))});return c}});e.$formatters.push(function(a){return H(a)?a.join(", "): 172 | s});e.$isEmpty=function(a){return!a||!a.length}}}},Xd=/^(true|false|\d+)$/,Yd=function(){return{priority:100,compile:function(a,c){return Xd.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},Zd=ta(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),$d=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding", 173 | c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],ae=["$sce","$parse",function(a,c){return function(d,e,f){e.addClass("ng-binding").data("$binding",f.ngBindHtml);var g=c(f.ngBindHtml);d.$watch(function(){return(g(d)||"").toString()},function(c){e.html(a.getTrustedHtml(g(d))||"")})}}],be=Jb("",!0),ce=Jb("Odd",0),de=Jb("Even",1),ee=ta({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),fe=[function(){return{scope:!0,controller:"@"}}],ge=["$sniffer",function(a){return{priority:1E3, 174 | compile:function(){a.csp=!0}}}],Fc={};p("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=la("ng-"+a);Fc[c]=["$parse",function(d){return function(e,f,g){var h=d(g[c]);f.on(B(a),function(a){e.$apply(function(){h(e,{$event:a})})})}}]});var he=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",compile:function(c,d,e){return function(c,d,h){var m, 175 | k;c.$watch(h.ngIf,function(h){m&&(a.leave(m),m=s);k&&(k.$destroy(),k=s);Ka(h)&&(k=c.$new(),e(k,function(c){m=c;a.enter(c,d.parent(),d)}))})}}}}],ie=["$http","$templateCache","$anchorScroll","$compile","$animate","$sce",function(a,c,d,e,f,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",compile:function(h,m,k){var l=m.ngInclude||m.src,p=m.onload||"",q=m.autoscroll;return function(h,m){var s=0,C,u,x=function(){C&&(C.$destroy(),C=null);u&&(f.leave(u),u=null)};h.$watch(g.parseAsResourceUrl(l), 176 | function(g){var l=++s;g?(a.get(g,{cache:c}).success(function(a){if(l===s){var c=h.$new();k(c,function(g){x();C=c;u=g;u.html(a);f.enter(u,null,m);e(u.contents())(C);!w(q)||q&&!h.$eval(q)||d();C.$emit("$includeContentLoaded");h.$eval(p)})}}).error(function(){l===s&&x()}),h.$emit("$includeContentRequested")):x()})}}}}],je=ta({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ke=ta({terminal:!0,priority:1E3}),le=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA", 177 | link:function(e,f,g){var h=g.count,m=g.$attr.when&&f.attr(g.$attr.when),k=g.offset||0,l=e.$eval(m)||{},r={},q=c.startSymbol(),n=c.endSymbol(),s=/^when(Minus)?(.+)$/;p(g,function(a,c){s.test(c)&&(l[B(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});p(l,function(a,e){r[e]=c(a.replace(d,q+h+"-"+k+n))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in l||(c=a.pluralCat(c-k));return r[c](e,f,!0)},function(a){f.text(a)})}}}],me=["$parse","$animate",function(a, 178 | c){function d(a){if(a.startNode===a.endNode)return x(a.startNode);var c=a.startNode,d=[c];do{c=c.nextSibling;if(!c)break;d.push(c)}while(c!==a.endNode);return x(d)}var e=D("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,compile:function(f,g,h){return function(f,g,l){var r=l.ngRepeat,q=r.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),n,s,w,C,u,v,B,t={$id:Ca};if(!q)throw e("iexp",r);l=q[1];u=q[2];(q=q[4])?(n=a(q),s=function(a,c,d){B&&(t[B]=a);t[v]=c;t.$index=d;return n(f, 179 | t)}):(w=function(a,c){return Ca(c)},C=function(a){return a});q=l.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!q)throw e("iidexp",l);v=q[3]||q[1];B=q[2];var F={};f.$watchCollection(u,function(a){var l,q,n=g[0],u,t={},G,D,O,P,H,K,z=[];if(nb(a))H=a,u=s||w;else{u=s||C;H=[];for(O in a)a.hasOwnProperty(O)&&"$"!=O.charAt(0)&&H.push(O);H.sort()}G=H.length;q=z.length=H.length;for(l=0;l 190 | A;)x.pop().element.remove()}for(;w.length>z;)w.pop()[0].element.remove()}var k;if(!(k=v.match(d)))throw ve("iexp",v,ga(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],q=c(k[3]||""),p=c(k[2]?k[1]:m),r=c(k[7]),u=k[8]?c(k[8]):null,w=[[{element:f,label:""}]];C&&(a(C)(e),C.removeClass("ng-scope"),C.remove());f.html("");f.on("change",function(){e.$apply(function(){var a,c=r(e)||[],d={},g,k,l,q,t,v,x;if(y)for(k=[],q=0,v=w.length;q@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}'); 197 | //# sourceMappingURL=angular.min.js.map 198 | -------------------------------------------------------------------------------- /client/partials/employee-detail.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 |
8 |

Employee

9 |
10 |
11 | 12 |
13 | 14 |

{{employee.firstName}} {{employee.lastName}}

15 |

{{employee.title}}

16 |

{{employee.city}}

17 | 27 |
28 | -------------------------------------------------------------------------------- /client/partials/employee-list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Employee Directory

4 |
5 |
6 | 9 | -------------------------------------------------------------------------------- /client/partials/report-list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 |
8 |

Direct Reports

9 |
10 |
11 | 12 | -------------------------------------------------------------------------------- /client/pics/amy_jones.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/amy_jones.jpg -------------------------------------------------------------------------------- /client/pics/eugene_lee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/eugene_lee.jpg -------------------------------------------------------------------------------- /client/pics/gary_donovan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/gary_donovan.jpg -------------------------------------------------------------------------------- /client/pics/james_king.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/james_king.jpg -------------------------------------------------------------------------------- /client/pics/john_williams.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/john_williams.jpg -------------------------------------------------------------------------------- /client/pics/julie_taylor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/julie_taylor.jpg -------------------------------------------------------------------------------- /client/pics/kathleen_byrne.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/kathleen_byrne.jpg -------------------------------------------------------------------------------- /client/pics/lisa_wong.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/lisa_wong.jpg -------------------------------------------------------------------------------- /client/pics/paul_jones.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/paul_jones.jpg -------------------------------------------------------------------------------- /client/pics/paula_gates.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/paula_gates.jpg -------------------------------------------------------------------------------- /client/pics/ray_moore.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/ray_moore.jpg -------------------------------------------------------------------------------- /client/pics/steven_wells.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/pics/steven_wells.jpg -------------------------------------------------------------------------------- /client/topcoat/css/topcoat-mobile-light.min.css: -------------------------------------------------------------------------------- 1 | .button-bar{display:table;table-layout:fixed;white-space:nowrap;margin:0;padding:0}.button-bar__item{display:table-cell;width:auto;border-radius:0}.button-bar__item>input{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.button-bar__button{border-radius:inherit}.button-bar__item:disabled{opacity:.3;cursor:default;pointer-events:none}.button,.topcoat-button,.topcoat-button--quiet,.topcoat-button--large,.topcoat-button--large--quiet,.topcoat-button--cta,.topcoat-button--large--cta,.topcoat-button-bar__button,.topcoat-button-bar__button--large{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.button--disabled,.topcoat-button:disabled,.topcoat-button--quiet:disabled,.topcoat-button--large:disabled,.topcoat-button--large--quiet:disabled,.topcoat-button--cta:disabled,.topcoat-button--large--cta:disabled,.topcoat-button-bar__button:disabled,.topcoat-button-bar__button--large:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-button,.topcoat-button--quiet,.topcoat-button--large,.topcoat-button--large--quiet,.topcoat-button--cta,.topcoat-button--large--cta,.topcoat-button-bar__button,.topcoat-button-bar__button--large{padding:0 1.25rem;font-size:16px;line-height:3rem;letter-spacing:1px;color:#454545;text-shadow:0 1px #fff;vertical-align:top;background-color:#e5e9e8;box-shadow:inset 0 1px #fff;border:1px solid #9daca9;border-radius:6px}.topcoat-button:hover,.topcoat-button--quiet:hover,.topcoat-button--large:hover,.topcoat-button--large--quiet:hover,.topcoat-button-bar__button:hover,.topcoat-button-bar__button--large:hover{background-color:#eff1f1}.topcoat-button:focus,.topcoat-button--quiet:focus,.topcoat-button--quiet:hover:focus,.topcoat-button--large:focus,.topcoat-button--large--quiet:focus,.topcoat-button--large--quiet:hover:focus,.topcoat-button--cta:focus,.topcoat-button--large--cta:focus,.topcoat-button-bar__button:focus,.topcoat-button-bar__button--large:focus{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1;outline:0}.topcoat-button:active,.topcoat-button--large:active,.topcoat-button-bar__button:active,.topcoat-button-bar__button--large:active,:checked+.topcoat-button-bar__button{border:1px solid #9daca9;background-color:#d2d6d6;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-button--quiet:hover,.topcoat-button--large--quiet:hover{text-shadow:0 1px #fff;border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-button--quiet:active,.topcoat-button--quiet:focus:active,.topcoat-button--large--quiet:active,.topcoat-button--large--quiet:focus:active{color:#454545;text-shadow:0 1px #fff;background-color:#d2d6d6;border:1px solid #9daca9;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-button--large,.topcoat-button--large--quiet,.topcoat-button-bar__button--large{font-size:1.3rem;font-weight:400;line-height:4.375rem;padding:0 1.25rem}.topcoat-button--large--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-button--cta,.topcoat-button--large--cta{border:1px solid #134f7f;background-color:#288edf;box-shadow:inset 0 1px rgba(255,255,255,.36);color:#fff;font-weight:500;text-shadow:0 -1px rgba(0,0,0,.36)}.topcoat-button--cta:hover,.topcoat-button--large--cta:hover{background-color:#4ca1e4}.topcoat-button--cta:active,.topcoat-button--large--cta:active{background-color:#1e7dc8;box-shadow:inset 0 1px rgba(0,0,0,.12)}.topcoat-button--large--cta{font-size:1.3rem;font-weight:400;line-height:4.375rem;padding:0 1.25rem}.button-bar,.topcoat-button-bar{display:table;table-layout:fixed;white-space:nowrap;margin:0;padding:0}.button-bar__item,.topcoat-button-bar__item{display:table-cell;width:auto;border-radius:0}.button-bar__item>input,.topcoat-button-bar__item>input{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.button-bar__button{border-radius:inherit}.button-bar__item:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-button-bar>.topcoat-button-bar__item:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.topcoat-button-bar>.topcoat-button-bar__item:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.topcoat-button-bar__item:first-child>.topcoat-button-bar__button,.topcoat-button-bar__item:first-child>.topcoat-button-bar__button--large{border-right:0}.topcoat-button-bar__item:last-child>.topcoat-button-bar__button,.topcoat-button-bar__item:last-child>.topcoat-button-bar__button--large{border-left:0}.topcoat-button-bar__button{border-radius:inherit}.topcoat-button-bar__button:focus,.topcoat-button-bar__button--large:focus{z-index:1}.topcoat-button-bar__button--large{border-radius:inherit}.button{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.button--disabled{opacity:.3;cursor:default;pointer-events:none}.button,.topcoat-button,.topcoat-button--quiet,.topcoat-button--large,.topcoat-button--large--quiet,.topcoat-button--cta,.topcoat-button--large--cta{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.button--disabled,.topcoat-button:disabled,.topcoat-button--quiet:disabled,.topcoat-button--large:disabled,.topcoat-button--large--quiet:disabled,.topcoat-button--cta:disabled,.topcoat-button--large--cta:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-button,.topcoat-button--quiet,.topcoat-button--large,.topcoat-button--large--quiet,.topcoat-button--cta,.topcoat-button--large--cta{padding:0 1.25rem;font-size:16px;line-height:3rem;letter-spacing:1px;color:#454545;text-shadow:0 1px #fff;vertical-align:top;background-color:#e5e9e8;box-shadow:inset 0 1px #fff;border:1px solid #9daca9;border-radius:6px}.topcoat-button:hover,.topcoat-button--quiet:hover,.topcoat-button--large:hover,.topcoat-button--large--quiet:hover{background-color:#eff1f1}.topcoat-button:focus,.topcoat-button--quiet:focus,.topcoat-button--quiet:hover:focus,.topcoat-button--large:focus,.topcoat-button--large--quiet:focus,.topcoat-button--large--quiet:hover:focus,.topcoat-button--cta:focus,.topcoat-button--large--cta:focus{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1;outline:0}.topcoat-button:active,.topcoat-button--large:active{border:1px solid #9daca9;background-color:#d2d6d6;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-button--quiet:hover,.topcoat-button--large--quiet:hover{text-shadow:0 1px #fff;border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-button--quiet:active,.topcoat-button--quiet:focus:active,.topcoat-button--large--quiet:active,.topcoat-button--large--quiet:focus:active{color:#454545;text-shadow:0 1px #fff;background-color:#d2d6d6;border:1px solid #9daca9;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-button--large,.topcoat-button--large--quiet{font-size:1.3rem;font-weight:400;line-height:4.375rem;padding:0 1.25rem}.topcoat-button--large--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-button--cta,.topcoat-button--large--cta{border:1px solid #134f7f;background-color:#288edf;box-shadow:inset 0 1px rgba(255,255,255,.36);color:#fff;font-weight:500;text-shadow:0 -1px rgba(0,0,0,.36)}.topcoat-button--cta:hover,.topcoat-button--large--cta:hover{background-color:#4ca1e4}.topcoat-button--cta:active,.topcoat-button--large--cta:active{background-color:#1e7dc8;box-shadow:inset 0 1px rgba(0,0,0,.12)}.topcoat-button--large--cta{font-size:1.3rem;font-weight:400;line-height:4.375rem;padding:0 1.25rem}input[type=checkbox]{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.checkbox{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox__label{position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox--disabled{opacity:.3;cursor:default;pointer-events:none}.checkbox:before,.checkbox:after{content:'';position:absolute}.checkbox:before{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}input[type=checkbox]{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.checkbox,.topcoat-checkbox__checkmark{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox__label,.topcoat-checkbox{position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox--disabled,input[type=checkbox]:disabled+.topcoat-checkbox__checkmark{opacity:.3;cursor:default;pointer-events:none}.checkbox:before,.checkbox:after,.topcoat-checkbox__checkmark:before,.topcoat-checkbox__checkmark:after{content:'';position:absolute}.checkbox:before,.topcoat-checkbox__checkmark:before{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.topcoat-checkbox__checkmark{height:2rem}input[type=checkbox]{height:2rem;width:2rem;margin-top:0;margin-right:-2rem;margin-bottom:-2rem;margin-left:0}input[type=checkbox]:checked+.topcoat-checkbox__checkmark:after{opacity:1}.topcoat-checkbox{line-height:2rem}.topcoat-checkbox__checkmark:before{width:2rem;height:2rem;background:#e5e9e8;border:1px solid #9daca9;border-radius:3px;box-shadow:inset 0 1px #fff}.topcoat-checkbox__checkmark{width:2rem;height:2rem}.topcoat-checkbox__checkmark:after{top:1px;left:2px;opacity:0;width:28px;height:11px;background:transparent;border:7px solid #454545;border-width:7px;border-top:0;border-right:0;border-radius:2px;-webkit-transform:rotate(-50deg);-ms-transform:rotate(-50deg);transform:rotate(-50deg)}input[type=checkbox]:focus+.topcoat-checkbox__checkmark:before{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1}input[type=checkbox]:active+.topcoat-checkbox__checkmark:before{border:1px solid #9daca9;background-color:#d2d6d6;box-shadow:inset 0 1px rgba(0,0,0,.1)}input[type=checkbox]:disabled:active+.topcoat-checkbox__checkmark:before{border:1px solid #9daca9;background:#e5e9e8;box-shadow:inset 0 1px #fff}.button,.topcoat-icon-button,.topcoat-icon-button--quiet,.topcoat-icon-button--large,.topcoat-icon-button--large--quiet{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.button--disabled,.topcoat-icon-button:disabled,.topcoat-icon-button--quiet:disabled,.topcoat-icon-button--large:disabled,.topcoat-icon-button--large--quiet:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-icon-button,.topcoat-icon-button--quiet,.topcoat-icon-button--large,.topcoat-icon-button--large--quiet{padding:0 .75rem;line-height:3rem;letter-spacing:1px;color:#454545;text-shadow:0 1px #fff;vertical-align:baseline;background-color:#e5e9e8;box-shadow:inset 0 1px #fff;border:1px solid #9daca9;border-radius:6px}.topcoat-icon-button:hover,.topcoat-icon-button--quiet:hover,.topcoat-icon-button--large:hover,.topcoat-icon-button--large--quiet:hover{background-color:#eff1f1}.topcoat-icon-button:focus,.topcoat-icon-button--quiet:focus,.topcoat-icon-button--quiet:hover:focus,.topcoat-icon-button--large:focus,.topcoat-icon-button--large--quiet:focus,.topcoat-icon-button--large--quiet:hover:focus{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1;outline:0}.topcoat-icon-button:active,.topcoat-icon-button--large:active{border:1px solid #9daca9;background-color:#d2d6d6;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-icon-button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-icon-button--quiet:hover,.topcoat-icon-button--large--quiet:hover{text-shadow:0 1px #fff;border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-icon-button--quiet:active,.topcoat-icon-button--quiet:focus:active,.topcoat-icon-button--large--quiet:active,.topcoat-icon-button--large--quiet:focus:active{color:#454545;text-shadow:0 1px #fff;background-color:#d2d6d6;border:1px solid #9daca9;box-shadow:inset 0 1px rgba(0,0,0,.1)}.topcoat-icon-button--large,.topcoat-icon-button--large--quiet{width:4.375rem;height:4.375rem;line-height:4.375rem}.topcoat-icon-button--large--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.topcoat-icon,.topcoat-icon--large{position:relative;display:inline-block;vertical-align:top;overflow:hidden;width:1.62rem;height:1.62rem;vertical-align:middle;top:-1px}.topcoat-icon--large{width:2.499999998125rem;height:2.499999998125rem;top:-2px}.input{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0}.input:disabled{opacity:.3;cursor:default;pointer-events:none}.list{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:auto;-webkit-overflow-scrolling:touch}.list__header{margin:0}.list__container{padding:0;margin:0;list-style-type:none}.list__item{margin:0;padding:0}.list,.topcoat-list{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:auto;-webkit-overflow-scrolling:touch}.list__header,.topcoat-list__header{margin:0}.list__container,.topcoat-list__container{padding:0;margin:0;list-style-type:none}.list__item,.topcoat-list__item{margin:0;padding:0}.topcoat-list{border-top:1px solid #9daca9;border-bottom:1px solid #fff;background-color:#e5e9e8}.topcoat-list__header{padding:4px 20px;font-size:.9em;font-weight:400;background-color:#d2d6d6;color:#454545;text-shadow:0 1px 0 rgba(255,255,255,.5);border-top:1px solid rgba(255,255,255,.5);border-bottom:1px solid rgba(255,255,255,.23)}.topcoat-list__container{border-top:1px solid #9daca9;color:#454545}.topcoat-list__item{padding:1.25rem;border-top:1px solid #fff;border-bottom:1px solid #9daca9}.topcoat-list__item:first-child{border-top:1px solid #d6dcdb}.navigation-bar{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;white-space:nowrap;overflow:hidden;word-spacing:0;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navigation-bar__item{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0}.navigation-bar__title{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.navigation-bar,.topcoat-navigation-bar{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;white-space:nowrap;overflow:hidden;word-spacing:0;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navigation-bar__item,.topcoat-navigation-bar__item{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0}.navigation-bar__title,.topcoat-navigation-bar__title{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.topcoat-navigation-bar{height:4.375rem;padding-left:1rem;padding-right:1rem;background:#e5e9e8;color:#454545;box-shadow:inset 0 -1px #9daca9,0 1px #d6dcdb}.topcoat-navigation-bar__item{margin:0;line-height:4.375rem;vertical-align:top}.topcoat-navigation-bar__title{font-size:1.3rem;font-weight:400;color:#454545}.notification{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.notification,.topcoat-notification{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.topcoat-notification{padding:.15em .5em .2em;border-radius:2px;background-color:#ec514e;color:#fff}input[type=radio]{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.radio-button{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.radio-button__label{position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.radio-button:before,.radio-button:after{content:'';position:absolute;border-radius:100%}.radio-button:after{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.radio-button:before{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.radio-button--disabled{opacity:.3;cursor:default;pointer-events:none}input[type=radio]{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.radio-button,.topcoat-radio-button__checkmark{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.radio-button__label,.topcoat-radio-button{position:relative;display:inline-block;vertical-align:top;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.radio-button:before,.radio-button:after,.topcoat-radio-button__checkmark:before,.topcoat-radio-button__checkmark:after{content:'';position:absolute;border-radius:100%}.radio-button:after,.topcoat-radio-button__checkmark:after{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.radio-button:before,.topcoat-radio-button__checkmark:before{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.radio-button--disabled,input[type=radio]:disabled+.topcoat-radio-button__checkmark{opacity:.3;cursor:default;pointer-events:none}input[type=radio]{height:1.875rem;width:1.875rem;margin-top:0;margin-right:-1.875rem;margin-bottom:-1.875rem;margin-left:0}input[type=radio]:checked+.topcoat-radio-button__checkmark:after{opacity:1}.topcoat-radio-button{color:#454545;line-height:1.875rem}.topcoat-radio-button__checkmark:before{width:1.875rem;height:1.875rem;background:#e5e9e8;border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-radio-button__checkmark{position:relative;width:1.875rem;height:1.875rem}.topcoat-radio-button__checkmark:after{opacity:0;width:.875rem;height:.875rem;background:#454545;border:1px solid rgba(0,0,0,.1);box-shadow:0 1px rgba(255,255,255,.5);-webkit-transform:none;-ms-transform:none;transform:none;top:7px;left:7px}input[type=radio]:focus+.topcoat-radio-button__checkmark:before{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1}input[type=radio]:active+.topcoat-radio-button__checkmark:before{border:1px solid #9daca9;background-color:#d2d6d6;box-shadow:inset 0 1px rgba(0,0,0,.1)}input[type=radio]:disabled:active+.topcoat-radio-button__checkmark:before{border:1px solid #9daca9;background:#e5e9e8;box-shadow:inset 0 1px #fff}.range{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0;-webkit-appearance:none}.range__thumb{cursor:pointer}.range__thumb--webkit{cursor:pointer;-webkit-appearance:none}.range:disabled{opacity:.3;cursor:default;pointer-events:none}.range,.topcoat-range{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0;-webkit-appearance:none}.range__thumb,.topcoat-range::-moz-range-thumb{cursor:pointer}.range__thumb--webkit,.topcoat-range::-webkit-slider-thumb{cursor:pointer;-webkit-appearance:none}.range:disabled,.topcoat-range:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-range{border-radius:6px;border:1px solid #9daca9;background-color:#d6dcdb;height:1rem;border-radius:30px}.topcoat-range::-moz-range-track{border-radius:6px;border:1px solid #9daca9;background-color:#d6dcdb;height:1rem;border-radius:30px}.topcoat-range::-webkit-slider-thumb{height:3rem;width:2rem;background-color:#e5e9e8;border:1px solid #9daca9;border-radius:6px;box-shadow:inset 0 1px #fff}.topcoat-range::-moz-range-thumb{height:3rem;width:2rem;background-color:#e5e9e8;border:1px solid #9daca9;border-radius:6px;box-shadow:inset 0 1px #fff}.topcoat-range:focus::-webkit-slider-thumb{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1}.topcoat-range:focus::-moz-range-thumb{border:1px solid #0036ff;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1}.topcoat-range:active::-webkit-slider-thumb{border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-range:active::-moz-range-thumb{border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.search-input{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0;-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.search-input:disabled{opacity:.3;cursor:default;pointer-events:none}.search-input,.topcoat-search-input,.topcoat-search-input--large{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0;-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.search-input:disabled,.topcoat-search-input:disabled,.topcoat-search-input--large:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-search-input,.topcoat-search-input--large{line-height:3rem;height:3rem;font-size:16px;border:1px solid #9daca9;background-color:#fff;box-shadow:inset 0 1px 0 rgba(0,0,0,.23);color:#454545;padding:0 0 0 2rem;border-radius:30px;background-image:url(../img/search.svg);background-position:1rem center;background-repeat:no-repeat;background-size:16px}.topcoat-search-input:focus,.topcoat-search-input--large:focus{background-color:#fff;color:#454545;border:1px solid #0036ff;box-shadow:inset 0 1px 0 rgba(0,0,0,.23),0 0 0 2px #6fb5f1}.topcoat-search-input::-webkit-search-cancel-button,.topcoat-search-input::-webkit-search-decoration,.topcoat-search-input--large::-webkit-search-cancel-button,.topcoat-search-input--large::-webkit-search-decoration{margin-right:5px}.topcoat-search-input:focus::-webkit-input-placeholder,.topcoat-search-input:focus::-webkit-input-placeholder{color:#c6c8c8}.topcoat-search-input:disabled::-webkit-input-placeholder{color:#454545}.topcoat-search-input:disabled::-moz-placeholder{color:#454545}.topcoat-search-input:disabled:-ms-input-placeholder{color:#454545}.topcoat-search-input--large{line-height:4.375rem;height:4.375rem;font-size:1.3rem;font-weight:400;padding:0 0 0 2.9rem;border-radius:40px;background-position:1.2rem center;background-size:1.3rem}.topcoat-search-input--large:disabled{color:#454545}.topcoat-search-input--large:disabled::-webkit-input-placeholder{color:#454545}.topcoat-search-input--large:disabled::-moz-placeholder{color:#454545}.topcoat-search-input--large:disabled:-ms-input-placeholder{color:#454545}.switch{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.switch__input{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.switch__toggle{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch__toggle:before,.switch__toggle:after{content:'';position:absolute;z-index:-1;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.switch--disabled{opacity:.3;cursor:default;pointer-events:none}.switch,.topcoat-switch{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.switch__input,.topcoat-switch__input{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.switch__toggle,.topcoat-switch__toggle{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch__toggle:before,.switch__toggle:after,.topcoat-switch__toggle:before,.topcoat-switch__toggle:after{content:'';position:absolute;z-index:-1;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box}.switch--disabled,.topcoat-switch__input:disabled+.topcoat-switch__toggle{opacity:.3;cursor:default;pointer-events:none}.topcoat-switch{font-size:16px;padding:0 1.25rem;border-radius:6px;border:1px solid #9daca9;overflow:hidden;width:6rem}.topcoat-switch__toggle:before,.topcoat-switch__toggle:after{top:-1px;width:5rem}.topcoat-switch__toggle:before{content:'ON';color:#288edf;background-color:#e5f1fb;right:1rem;padding-left:1.5rem}.topcoat-switch__toggle{line-height:3rem;height:3rem;width:2rem;border-radius:6px;color:#454545;text-shadow:0 1px #fff;background-color:#e5e9e8;border:1px solid #9daca9;margin-left:-1.3rem;margin-bottom:-1px;margin-top:-1px;box-shadow:inset 0 1px #fff;-webkit-transition:margin-left .05s ease-in-out;transition:margin-left .05s ease-in-out}.topcoat-switch__toggle:after{content:'OFF';background-color:#d2d6d6;left:1rem;padding-left:2rem}.topcoat-switch__input:checked+.topcoat-switch__toggle{margin-left:2.7rem}.topcoat-switch__input:active+.topcoat-switch__toggle{border:1px solid #9daca9;box-shadow:inset 0 1px #fff}.topcoat-switch__input:focus+.topcoat-switch__toggle{border:1px solid #0036ff;box-shadow:0 0 0 2px #6fb5f1}.topcoat-switch__input:disabled+.topcoat-switch__toggle:after,.topcoat-switch__input:disabled+.topcoat-switch__toggle:before{background:transparent}.button,.topcoat-tab-bar__button{position:relative;display:inline-block;vertical-align:top;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-decoration:none}.button--quiet{background:transparent;border:1px solid transparent;box-shadow:none}.button--disabled,.topcoat-tab-bar__button:disabled{opacity:.3;cursor:default;pointer-events:none}.button-bar,.topcoat-tab-bar{display:table;table-layout:fixed;white-space:nowrap;margin:0;padding:0}.button-bar__item,.topcoat-tab-bar__item{display:table-cell;width:auto;border-radius:0}.button-bar__item>input,.topcoat-tab-bar__item>input{position:absolute;overflow:hidden;padding:0;border:0;opacity:.001;z-index:1;vertical-align:top;outline:0}.button-bar__button{border-radius:inherit}.button-bar__item:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-tab-bar__button{padding:0 1.25rem;height:3rem;line-height:3rem;letter-spacing:1px;color:#454545;text-shadow:0 1px #fff;vertical-align:top;background-color:#e5e9e8;box-shadow:inset 0 1px #fff;border-top:1px solid #9daca9}.topcoat-tab-bar__button:active,.topcoat-tab-bar__button--large:active,:checked+.topcoat-tab-bar__button{color:#288edf;background-color:#e5f1fb;box-shadow:inset 0 0 1px rgba(0,0,0,.1)}.topcoat-tab-bar__button:focus,.topcoat-tab-bar__button--large:focus{z-index:1;box-shadow:inset 0 1px rgba(255,255,255,.36),0 0 0 2px #6fb5f1;outline:0}.input,.topcoat-text-input,.topcoat-text-input--large{padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;vertical-align:top;outline:0}.input:disabled,.topcoat-text-input:disabled,.topcoat-text-input--large:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-text-input,.topcoat-text-input--large{line-height:3rem;font-size:16px;letter-spacing:1px;padding:0 1.25rem;border:1px solid #9daca9;border-radius:6px;background-color:#fff;box-shadow:inset 0 1px rgba(0,0,0,.1);color:#454545;vertical-align:top}.topcoat-text-input:focus,.topcoat-text-input--large:focus{background-color:#fff;color:#454545;border:1px solid #0036ff;box-shadow:0 0 0 2px #6fb5f1}.topcoat-text-input:disabled::-webkit-input-placeholder{color:#454545}.topcoat-text-input:disabled::-moz-placeholder{color:#454545}.topcoat-text-input:disabled:-ms-input-placeholder{color:#454545}.topcoat-text-input:invalid{border:1px solid #ec514e}.topcoat-text-input--large{line-height:4.375rem;font-size:1.3rem}.topcoat-text-input--large:disabled{color:#454545}.topcoat-text-input--large:disabled::-webkit-input-placeholder{color:#454545}.topcoat-text-input--large:disabled::-moz-placeholder{color:#454545}.topcoat-text-input--large:disabled:-ms-input-placeholder{color:#454545}.topcoat-text-input--large:invalid{border:1px solid #ec514e}.textarea{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;vertical-align:top;resize:none;outline:0}.textarea:disabled{opacity:.3;cursor:default;pointer-events:none}.textarea,.topcoat-textarea,.topcoat-textarea--large{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;vertical-align:top;resize:none;outline:0}.textarea:disabled,.topcoat-textarea:disabled,.topcoat-textarea--large:disabled{opacity:.3;cursor:default;pointer-events:none}.topcoat-textarea,.topcoat-textarea--large{padding:2rem;font-size:2.5rem;font-weight:400;border-radius:6px;line-height:3rem;border:1px solid #9daca9;background-color:#fff;box-shadow:inset 0 1px rgba(0,0,0,.1);color:#454545;letter-spacing:1px}.topcoat-textarea:focus,.topcoat-textarea--large:focus{background-color:#fff;color:#454545;border:1px solid #0036ff;box-shadow:0 0 0 2px #6fb5f1}.topcoat-textarea:disabled::-webkit-input-placeholder{color:#454545}.topcoat-textarea:disabled::-moz-placeholder{color:#454545}.topcoat-textarea:disabled:-ms-input-placeholder{color:#454545}.topcoat-textarea--large{font-size:3rem;line-height:4.375rem}.topcoat-textarea--large:disabled{color:#454545}.topcoat-textarea--large:disabled::-webkit-input-placeholder{color:#454545}.topcoat-textarea--large:disabled::-moz-placeholder{color:#454545}.topcoat-textarea--large:disabled:-ms-input-placeholder{color:#454545}@font-face{font-family:"Source Sans";src:url(../font/SourceSansPro-Regular.otf)}@font-face{font-family:"Source Sans";src:url(../font/SourceSansPro-Light.otf);font-weight:200}@font-face{font-family:"Source Sans";src:url(../font/SourceSansPro-Semibold.otf);font-weight:600}body{margin:0;padding:0;background:#dfe2e2;color:#000;font:16px "Source Sans",helvetica,arial,sans-serif;font-weight:400}:focus{outline-color:transparent;outline-style:none}.topcoat-icon--menu-stack{background:url(../img/hamburger_dark.svg) no-repeat;background-size:cover}.quarter{width:25%}.half{width:50%}.three-quarters{width:75%}.third{width:33.333%}.two-thirds{width:66.666%}.full{width:100%}.left{text-align:left}.center{text-align:center}.right{text-align:right}.reset-ui{-moz-box-sizing:border-box;box-sizing:border-box;background-clip:padding-box;position:relative;display:inline-block;vertical-align:top;padding:0;margin:0;font:inherit;color:inherit;background:transparent;border:0;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden} -------------------------------------------------------------------------------- /client/topcoat/font/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | 5 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-Black.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-Bold.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-ExtraLight.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-Light.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-Regular.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceCodePro-Semibold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceCodePro-Semibold.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-Black.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-BlackIt.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-BlackIt.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-Bold.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-BoldIt.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-BoldIt.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-ExtraLight.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-ExtraLightIt.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-ExtraLightIt.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-It.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-It.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-Light.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-LightIt.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-LightIt.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-Regular.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-Semibold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-Semibold.otf -------------------------------------------------------------------------------- /client/topcoat/font/SourceSansPro-SemiboldIt.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/font/SourceSansPro-SemiboldIt.otf -------------------------------------------------------------------------------- /client/topcoat/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/avatar.png -------------------------------------------------------------------------------- /client/topcoat/img/bg_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/bg_dark.png -------------------------------------------------------------------------------- /client/topcoat/img/breadcrumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/breadcrumb.png -------------------------------------------------------------------------------- /client/topcoat/img/checkbox_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/checkbox_checked.png -------------------------------------------------------------------------------- /client/topcoat/img/checkbox_checked_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/checkbox_checked_dark.png -------------------------------------------------------------------------------- /client/topcoat/img/checkbox_unchecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/checkbox_unchecked.png -------------------------------------------------------------------------------- /client/topcoat/img/checkbox_unchecked_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/checkbox_unchecked_dark.png -------------------------------------------------------------------------------- /client/topcoat/img/checkmark_bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /client/topcoat/img/dark-combo-box-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/dark-combo-box-bg.png -------------------------------------------------------------------------------- /client/topcoat/img/dark-combo-box-bg2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/dark-combo-box-bg2x.png -------------------------------------------------------------------------------- /client/topcoat/img/dark-grips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/dark-grips.png -------------------------------------------------------------------------------- /client/topcoat/img/dark-sprites2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/dark-sprites2x.png -------------------------------------------------------------------------------- /client/topcoat/img/dialog-zone-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/dialog-zone-bg.png -------------------------------------------------------------------------------- /client/topcoat/img/drop-down-triangle-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/drop-down-triangle-dark.png -------------------------------------------------------------------------------- /client/topcoat/img/drop-down-triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/drop-down-triangle.png -------------------------------------------------------------------------------- /client/topcoat/img/light-combo-box-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/light-combo-box-bg.png -------------------------------------------------------------------------------- /client/topcoat/img/light-combo-box-bg2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/light-combo-box-bg2x.png -------------------------------------------------------------------------------- /client/topcoat/img/light-grips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/light-grips.png -------------------------------------------------------------------------------- /client/topcoat/img/light-sprites2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/light-sprites2x.png -------------------------------------------------------------------------------- /client/topcoat/img/pop-up-triangle-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/pop-up-triangle-dark.png -------------------------------------------------------------------------------- /client/topcoat/img/pop-up-triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/pop-up-triangle.png -------------------------------------------------------------------------------- /client/topcoat/img/search-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/search-bg.png -------------------------------------------------------------------------------- /client/topcoat/img/search-bg2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/search-bg2x.png -------------------------------------------------------------------------------- /client/topcoat/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Slice 1 4 | Created with Sketch (http://www.bohemiancoding.com/sketch) 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /client/topcoat/img/search_bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /client/topcoat/img/search_dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /client/topcoat/img/search_light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Slice 1 4 | Created with Sketch (http://www.bohemiancoding.com/sketch) 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /client/topcoat/img/spinner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/spinner.png -------------------------------------------------------------------------------- /client/topcoat/img/spinner2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/angular-directory/3a7910d74de2730333541e5e125ef7c48e11fa6e/client/topcoat/img/spinner2x.png -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "employee-directory-api", 3 | "description": "Employee Directory API", 4 | "version": "0.0.1", 5 | "private": true, 6 | "dependencies": { 7 | "express": "3.x", 8 | "mongodb": "*" 9 | } 10 | } -------------------------------------------------------------------------------- /server/routes/employee.js: -------------------------------------------------------------------------------- 1 | var MongoClient = require('mongodb').MongoClient, 2 | Server = require('mongodb').Server, 3 | db; 4 | 5 | var mongoClient = new MongoClient(new Server('localhost', 27017)); 6 | mongoClient.open(function(err, mongoClient) { 7 | db = mongoClient.db("angular-directory-db"); 8 | db.collection('employees', {strict:true}, function(err, collection) { 9 | if (err) { 10 | console.log("The 'employees' collection doesn't exist. Creating it with sample data..."); 11 | populateDB(); 12 | } 13 | }); 14 | }); 15 | 16 | exports.findById = function(req, res) { 17 | console.log(req.params); 18 | var id = parseInt(req.params.id); 19 | console.log('findById: ' + id); 20 | db.collection('employees', function(err, collection) { 21 | collection.findOne({'id': id}, function(err, item) { 22 | console.log(item); 23 | res.jsonp(item); 24 | }); 25 | }); 26 | }; 27 | 28 | exports.findByManager = function(req, res) { 29 | var id = parseInt(req.params.id); 30 | console.log('findByManager: ' + id); 31 | db.collection('employees', function(err, collection) { 32 | collection.find({'managerId': id}).toArray(function(err, items) { 33 | console.log(items); 34 | res.jsonp(items); 35 | }); 36 | }); 37 | }; 38 | 39 | exports.findAll = function(req, res) { 40 | var name = req.query["name"]; 41 | db.collection('employees', function(err, collection) { 42 | if (name) { 43 | collection.find({"fullName": new RegExp(name, "i")}).toArray(function(err, items) { 44 | res.jsonp(items); 45 | }); 46 | } else { 47 | collection.find().toArray(function(err, items) { 48 | res.jsonp(items); 49 | }); 50 | } 51 | }); 52 | }; 53 | 54 | /*--------------------------------------------------------------------------------------------------------------------*/ 55 | // Populate database with sample data -- Only used once: the first time the application is started. 56 | // You'd typically not find this code in a real-life app, since the database would already exist. 57 | var populateDB = function() { 58 | 59 | console.log("Populating employee database..."); 60 | var employees = [ 61 | {"id": 1, "firstName": "James", "lastName": "King", "fullName": "James King", "managerId": 0, "reports": 4, managerName: "", "title": "President and CEO", "department": "Corporate", "cellPhone": "617-000-0001", "officePhone": "781-000-0001", "email": "jking@fakemail.com", "city": "Boston, MA", "pic": "james_king.jpg", "twitterId": "@fakejking", "blog": "http://coenraets.org"}, 62 | {"id": 2, "firstName": "Julie", "lastName": "Taylor", "fullName": "Julie Taylor", "managerId": 1, "reports": 2, managerName: "James King", "title": "VP of Marketing", "department": "Marketing", "cellPhone": "617-000-0002", "officePhone": "781-000-0002", "email": "jtaylor@fakemail.com", "city": "Boston, MA", "pic": "julie_taylor.jpg", "twitterId": "@fakejtaylor", "blog": "http://coenraets.org"}, 63 | {"id": 3, "firstName": "Eugene", "lastName": "Lee", "fullName": "Eugene Lee", "managerId": 1, "reports": 0, managerName: "James King", "title": "CFO", "department": "Accounting", "cellPhone": "617-000-0003", "officePhone": "781-000-0003", "email": "elee@fakemail.com", "city": "Boston, MA", "pic": "eugene_lee.jpg", "twitterId": "@fakeelee", "blog": "http://coenraets.org"}, 64 | {"id": 4, "firstName": "John", "lastName": "Williams", "fullName": "John Williams", "managerId": 1, "reports": 3, managerName: "James King", "title": "VP of Engineering", "department": "Engineering", "cellPhone": "617-000-0004", "officePhone": "781-000-0004", "email": "jwilliams@fakemail.com", "city": "Boston, MA", "pic": "john_williams.jpg", "twitterId": "@fakejwilliams", "blog": "http://coenraets.org"}, 65 | {"id": 5, "firstName": "Ray", "lastName": "Moore", "fullName": "Ray Moore", "managerId": 1, "reports": 2, managerName: "James King", "title": "VP of Sales", "department": "Sales", "cellPhone": "617-000-0005", "officePhone": "781-000-0005", "email": "rmoore@fakemail.com", "city": "Boston, MA", "pic": "ray_moore.jpg", "twitterId": "@fakermoore", "blog": "http://coenraets.org"}, 66 | {"id": 6, "firstName": "Paul", "lastName": "Jones", "fullName": "Paul Jones", "managerId": 4, "reports": 0, managerName: "John Williams", "title": "QA Manager", "department": "Engineering", "cellPhone": "617-000-0006", "officePhone": "781-000-0006", "email": "pjones@fakemail.com", "city": "Boston, MA", "pic": "paul_jones.jpg", "twitterId": "@fakepjones", "blog": "http://coenraets.org"}, 67 | {"id": 7, "firstName": "Paula", "lastName": "Gates", "fullName": "Paula Gates", "managerId": 4, "reports": 0, managerName: "John Williams", "title": "Software Architect", "department": "Engineering", "cellPhone": "617-000-0007", "officePhone": "781-000-0007", "email": "pgates@fakemail.com", "city": "Boston, MA", "pic": "paula_gates.jpg", "twitterId": "@fakepgates", "blog": "http://coenraets.org"}, 68 | {"id": 8, "firstName": "Lisa", "lastName": "Wong", "fullName": "Lisa Wong", "managerId": 2, "reports": 0, managerName: "Julie Taylor", "title": "Marketing Manager", "department": "Marketing", "cellPhone": "617-000-0008", "officePhone": "781-000-0008", "email": "lwong@fakemail.com", "city": "Boston, MA", "pic": "lisa_wong.jpg", "twitterId": "@fakelwong", "blog": "http://coenraets.org"}, 69 | {"id": 9, "firstName": "Gary", "lastName": "Donovan", "fullName": "Gary Donovan", "managerId": 2, "reports": 0, managerName: "Julie Taylor", "title": "Marketing Manager", "department": "Marketing", "cellPhone": "617-000-0009", "officePhone": "781-000-0009", "email": "gdonovan@fakemail.com", "city": "Boston, MA", "pic": "gary_donovan.jpg", "twitterId": "@fakegdonovan", "blog": "http://coenraets.org"}, 70 | {"id": 10, "firstName": "Kathleen", "lastName": "Byrne", "fullName": "Kathleen Byrne", "managerId": 5, "reports": 0, managerName: "Ray Moore", "title": "Sales Representative", "department": "Sales", "cellPhone": "617-000-0010", "officePhone": "781-000-0010", "email": "kbyrne@fakemail.com", "city": "Boston, MA", "pic": "kathleen_byrne.jpg", "twitterId": "@fakekbyrne", "blog": "http://coenraets.org"}, 71 | {"id": 11, "firstName": "Amy", "lastName": "Jones", "fullName": "Amy Jones", "managerId": 5, "reports": 0, managerName: "Ray Moore", "title": "Sales Representative", "department": "Sales", "cellPhone": "617-000-0011", "officePhone": "781-000-0011", "email": "ajones@fakemail.com", "city": "Boston, MA", "pic": "amy_jones.jpg", "twitterId": "@fakeajones", "blog": "http://coenraets.org"}, 72 | {"id": 12, "firstName": "Steven", "lastName": "Wells", "fullName": "Steven Wells", "managerId": 4, "reports": 0, managerName: "John Williams", "title": "Software Architect", "department": "Engineering", "cellPhone": "617-000-0012", "officePhone": "781-000-0012", "email": "swells@fakemail.com", "city": "Boston, MA", "pic": "steven_wells.jpg", "twitterId": "@fakeswells", "blog": "http://coenraets.org"} 73 | ]; 74 | 75 | db.collection('employees', function(err, collection) { 76 | collection.insert(employees, {safe:true}, function(err, result) {}); 77 | }); 78 | 79 | }; -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | path = require('path'), 3 | employees = require('./routes/employee'); 4 | 5 | var app = express(); 6 | app.use(express.bodyParser()); 7 | app.use(express.static(path.join(__dirname, '../client'))); 8 | 9 | app.get('/employees/:id/reports', employees.findByManager); 10 | app.get('/employees/:id', employees.findById); 11 | app.get('/employees', employees.findAll); 12 | 13 | app.listen(3000); 14 | console.log('Listening on port 3000...'); --------------------------------------------------------------------------------