├── favicon.ico ├── img ├── _RPP.ai ├── heart-12.png ├── heart-18.png ├── logo_green.png ├── logo_grey.png ├── heart-12@2x.png ├── heart-18@2x.png ├── text-overlap.gif ├── hotlink-ok │ ├── icon.jpg │ ├── icon.png │ ├── icon@2x.jpg │ ├── icon@2x.png │ ├── share-image.jpg │ ├── share-image.png │ ├── new-share-image.png │ ├── icon_Icon.svg │ ├── load-logo.svg │ ├── load-logo-01.svg │ └── icon-01.svg ├── icons │ ├── 5BC4F568CD6FC6B1.png │ ├── 5BC4F568CD6FC6B2.png │ ├── meter_orange.svg │ ├── rpp_blue.svg │ ├── valet-v-24-blue.svg │ ├── meter_white.svg │ ├── rpp_pink.svg │ ├── valet-v-24-green.svg │ ├── valet-v-24-teal.svg │ ├── valet-v-24-orange.svg │ ├── valet-v-24-violet.svg │ ├── valet-v-24-grey.svg │ ├── LibertyBell.svg │ ├── meter_grey.svg │ ├── meter.svg │ ├── green_meter.svg │ ├── RPP.svg │ ├── scooter-circle-24.svg │ ├── scooter-24-circle-grey.svg │ ├── logo.svg │ ├── 4D9ABD2646ECCC65._t_ │ └── valet-24-dude.svg ├── Screenshot_2016-01-26-13-11-57.png ├── green_meter.svg ├── LibertyBell.svg ├── _meter.svg ├── heart-12.svg └── codeforliberty.svg ├── meta ├── favicon.ico ├── mstile-70x70.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── mstile-144x144.png ├── mstile-150x150.png ├── mstile-310x150.png ├── mstile-310x310.png ├── apple-touch-icon.png ├── favicon-194x194.png ├── android-chrome-144x144.png ├── android-chrome-192x192.png ├── android-chrome-36x36.png ├── android-chrome-48x48.png ├── android-chrome-72x72.png ├── android-chrome-96x96.png ├── apple-touch-icon-57x57.png ├── apple-touch-icon-60x60.png ├── apple-touch-icon-72x72.png ├── apple-touch-icon-76x76.png ├── apple-touch-icon-114x114.png ├── apple-touch-icon-120x120.png ├── apple-touch-icon-144x144.png ├── apple-touch-icon-152x152.png ├── apple-touch-icon-180x180.png ├── apple-touch-icon-precomposed.png ├── browserconfig.xml ├── manifest.json ├── safari-pinned-tab.svg └── favicon.svg ├── fonts ├── ionicons.eot ├── ionicons.ttf ├── ionicons.woff ├── fontawesome-webfont 2.ttf ├── fontawesome-webfont.eot ├── fontawesome-webfont.eot 2 ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff └── fontawesome-webfont.woff 2 ├── css ├── images │ ├── icons-000000@2x.png │ └── icons-ffffff@2x.png ├── fonts │ ├── ufonts.com_fortuna-webfont.eot │ ├── ufonts.com_fortuna-webfont.ttf │ ├── ufonts.com_fortuna-webfont.woff │ └── ufonts.com_fortuna-webfont.woff2 ├── vendor │ ├── dialog-polyfill.css │ ├── please-wait.css │ └── mapboxgl_0-12-3.css ├── data.css ├── style.css └── font-awesome.min.css ├── iframe.html ├── js ├── regulation_template_stub.js ├── meters.js ├── vendor │ ├── geojson.min.js │ ├── please-wait.min.js │ ├── autotrack.js │ ├── please-wait.js │ └── dialog-polyfill.js └── debug.js ├── .gitignore ├── README.md ├── help.html └── debug.html /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/favicon.ico -------------------------------------------------------------------------------- /img/_RPP.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/_RPP.ai -------------------------------------------------------------------------------- /img/heart-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/heart-12.png -------------------------------------------------------------------------------- /img/heart-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/heart-18.png -------------------------------------------------------------------------------- /meta/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/favicon.ico -------------------------------------------------------------------------------- /fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/ionicons.eot -------------------------------------------------------------------------------- /fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/ionicons.ttf -------------------------------------------------------------------------------- /img/logo_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/logo_green.png -------------------------------------------------------------------------------- /img/logo_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/logo_grey.png -------------------------------------------------------------------------------- /fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/ionicons.woff -------------------------------------------------------------------------------- /img/heart-12@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/heart-12@2x.png -------------------------------------------------------------------------------- /img/heart-18@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/heart-18@2x.png -------------------------------------------------------------------------------- /img/text-overlap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/text-overlap.gif -------------------------------------------------------------------------------- /meta/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/mstile-70x70.png -------------------------------------------------------------------------------- /img/hotlink-ok/icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/icon.jpg -------------------------------------------------------------------------------- /img/hotlink-ok/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/icon.png -------------------------------------------------------------------------------- /meta/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/favicon-16x16.png -------------------------------------------------------------------------------- /meta/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/favicon-32x32.png -------------------------------------------------------------------------------- /meta/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/favicon-96x96.png -------------------------------------------------------------------------------- /meta/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/mstile-144x144.png -------------------------------------------------------------------------------- /meta/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/mstile-150x150.png -------------------------------------------------------------------------------- /meta/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/mstile-310x150.png -------------------------------------------------------------------------------- /meta/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/mstile-310x310.png -------------------------------------------------------------------------------- /img/hotlink-ok/icon@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/icon@2x.jpg -------------------------------------------------------------------------------- /img/hotlink-ok/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/icon@2x.png -------------------------------------------------------------------------------- /meta/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon.png -------------------------------------------------------------------------------- /meta/favicon-194x194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/favicon-194x194.png -------------------------------------------------------------------------------- /css/images/icons-000000@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/images/icons-000000@2x.png -------------------------------------------------------------------------------- /css/images/icons-ffffff@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/images/icons-ffffff@2x.png -------------------------------------------------------------------------------- /fonts/fontawesome-webfont 2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont 2.ttf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.eot 2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont.eot 2 -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /img/hotlink-ok/share-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/share-image.jpg -------------------------------------------------------------------------------- /img/hotlink-ok/share-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/share-image.png -------------------------------------------------------------------------------- /img/icons/5BC4F568CD6FC6B1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/icons/5BC4F568CD6FC6B1.png -------------------------------------------------------------------------------- /img/icons/5BC4F568CD6FC6B2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/icons/5BC4F568CD6FC6B2.png -------------------------------------------------------------------------------- /meta/android-chrome-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-144x144.png -------------------------------------------------------------------------------- /meta/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-192x192.png -------------------------------------------------------------------------------- /meta/android-chrome-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-36x36.png -------------------------------------------------------------------------------- /meta/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-48x48.png -------------------------------------------------------------------------------- /meta/android-chrome-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-72x72.png -------------------------------------------------------------------------------- /meta/android-chrome-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/android-chrome-96x96.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff 2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/fonts/fontawesome-webfont.woff 2 -------------------------------------------------------------------------------- /meta/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /img/hotlink-ok/new-share-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/hotlink-ok/new-share-image.png -------------------------------------------------------------------------------- /img/Screenshot_2016-01-26-13-11-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/img/Screenshot_2016-01-26-13-11-57.png -------------------------------------------------------------------------------- /meta/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/meta/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /css/fonts/ufonts.com_fortuna-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/fonts/ufonts.com_fortuna-webfont.eot -------------------------------------------------------------------------------- /css/fonts/ufonts.com_fortuna-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/fonts/ufonts.com_fortuna-webfont.ttf -------------------------------------------------------------------------------- /css/fonts/ufonts.com_fortuna-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/fonts/ufonts.com_fortuna-webfont.woff -------------------------------------------------------------------------------- /css/fonts/ufonts.com_fortuna-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laurenancona/parkadelphia/HEAD/css/fonts/ufonts.com_fortuna-webfont.woff2 -------------------------------------------------------------------------------- /img/icons/meter_orange.svg: -------------------------------------------------------------------------------- 1 | rpp_pink -------------------------------------------------------------------------------- /img/icons/rpp_blue.svg: -------------------------------------------------------------------------------- 1 | valet-v-24-green -------------------------------------------------------------------------------- /iframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Untitled Document 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /js/regulation_template_stub.js: -------------------------------------------------------------------------------- 1 | var tpl = document.getElementById('sidebar-tpl').innerHTML; 2 | var output = Mustache.render(tpl, data); 3 | document.getElementById('stats').innerHTML = output; 4 | console.log(data.rows); 5 | 6 | 7 | {{#rows}} 8 | {{reg_id}} 9 | {{fromDay}}-{{toDay}} 10 | {{fromHour}}-{{toHour}} 11 | {{rate}} | {{limit}} 12 | {{/rows}} -------------------------------------------------------------------------------- /img/icons/valet-v-24-blue.svg: -------------------------------------------------------------------------------- 1 | valet-v-24-green -------------------------------------------------------------------------------- /js/meters.js: -------------------------------------------------------------------------------- 1 | <% properties.street %>   |   <% properties.side %> Side
' + '<% properties.from_day %> - <% properties.to_day %>   |   <% properties.from_time %> - <% properties.to_time %>
' + '$<% properties.rate %>/hr   |   Limit: <% #properties.limit_hr %><% . %> hr<% /properties.limit_hr %> <% #properties.limit_min %><% . %> min <% /properties.limit_min %>   |   <% properties.seg_id %>

' + '<% /features %>'); 2 | -------------------------------------------------------------------------------- /meta/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #cddc39 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | img/OGimage.psd 6 | 7 | 8 | img/hotlink-ok/load-logo-01-01.svg 9 | 10 | img/hotlink-ok/load-logo-02.svg 11 | 12 | js/new_appgl.js 13 | <<<<<<< HEAD 14 | ======= 15 | 16 | working_index.html 17 | 18 | index-testing.html 19 | 20 | index-testing.html 21 | >>>>>>> gh-pages 22 | 23 | index-testing.html 24 | 25 | working_index.html 26 | 27 | index-testing.html 28 | 29 | index-testing.html 30 | 31 | working_index.html 32 | 33 | default 34 | 35 | Untitled-1 36 | 37 | img/share-image 38 | 39 | img/icons/meter_grey.svg 40 | -------------------------------------------------------------------------------- /img/icons/meter_white.svg: -------------------------------------------------------------------------------- 1 | meter_grey -------------------------------------------------------------------------------- /img/green_meter.svg: -------------------------------------------------------------------------------- 1 | green_meter -------------------------------------------------------------------------------- /img/icons/rpp_pink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /img/hotlink-ok/icon_Icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /css/vendor/dialog-polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: none; 16 | } 17 | 18 | dialog[open] { 19 | display: block; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | /* for small devices, modal dialogs go full-screen */ 29 | @media screen and (max-width: 540px) { 30 | dialog[_polyfill_modal] { /* TODO: implement */ 31 | top: 0; 32 | width: auto; 33 | margin: 1em; 34 | } 35 | } 36 | 37 | ._dialog_overlay { 38 | position: fixed; 39 | top: 0; right: 0; bottom: 0; left: 0; 40 | } -------------------------------------------------------------------------------- /img/icons/valet-v-24-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | V 11 | 12 | -------------------------------------------------------------------------------- /img/icons/valet-v-24-teal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /img/icons/valet-v-24-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /img/icons/valet-v-24-violet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /meta/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Parkadelphia", 3 | "icons": [ 4 | { 5 | "src": "\/meta\/android-chrome-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": 0.75 9 | }, 10 | { 11 | "src": "\/meta\/android-chrome-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": 1 15 | }, 16 | { 17 | "src": "\/meta\/android-chrome-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": 1.5 21 | }, 22 | { 23 | "src": "\/meta\/android-chrome-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": 2 27 | }, 28 | { 29 | "src": "\/meta\/android-chrome-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": 3 33 | }, 34 | { 35 | "src": "\/meta\/android-chrome-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": 4 39 | } 40 | ], 41 | "start_url": "https:\/\/parkadelphia.com\/", 42 | "display": "standalone" 43 | } 44 | -------------------------------------------------------------------------------- /img/icons/valet-v-24-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | V 12 | 13 | -------------------------------------------------------------------------------- /img/LibertyBell.svg: -------------------------------------------------------------------------------- 1 | Untitled-1 -------------------------------------------------------------------------------- /img/icons/LibertyBell.svg: -------------------------------------------------------------------------------- 1 | Untitled-1 -------------------------------------------------------------------------------- /meta/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/icons/meter_grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | meter 9 | 14 | 15 | -------------------------------------------------------------------------------- /img/_meter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /img/icons/meter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | meter 9 | 15 | 16 | -------------------------------------------------------------------------------- /img/icons/green_meter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /meta/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 27 | 30 | 34 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /img/icons/RPP.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 14 | RPP 15 | 16 | -------------------------------------------------------------------------------- /img/hotlink-ok/load-logo.svg: -------------------------------------------------------------------------------- 1 | load-logoPARKADELPHIA -------------------------------------------------------------------------------- /img/hotlink-ok/load-logo-01.svg: -------------------------------------------------------------------------------- 1 | load-logoPARKADELPHIA -------------------------------------------------------------------------------- /img/icons/scooter-circle-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/icons/scooter-24-circle-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/icons/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | PARKADELPHIA 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/hotlink-ok/icon-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | PARKADELPHIA 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # parkadelphia 2 | 3 | [![Join the chat at https://gitter.im/laurenancona/parkadelphia](https://badges.gitter.im/laurenancona/parkadelphia.svg)](https://gitter.im/laurenancona/parkadelphia?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![](https://img.shields.io/badge/licence-GNU%20AGPLv3-blue.svg)](http://www.gnu.org/licenses/agpl-3.0.txt) 4 | 5 | 6 | *Note:* _If you're interested in working to create a draft specification for parking data, follow [this repository](https://github.com/laurenancona/open-parking-data-spec)_ 7 | 8 | #### Purpose 9 | 10 | 1. Procure public data releases via the City's Open Data program to support analysis of relevant regulations. 11 | 2. Build web application to present all layers of geospatial data related to on-street and city-owned off-street parking in Philadelphia County. Native applications may be on the roadmap at some point, but the first priority is being accessible to the largest number of users. 12 | 3. Using Google Tag Manager, Google Analytics, and [analytics-reporter](https://github.com/18F/analytics-reporter), collect and aggregate anonymous usage data via custom events. Data is made publicly available in an s3 bucket, refreshed daily with lookback of 30 days (for now), and rendered atop a second map view for simple analysis. 13 | 14 | #### Current Layers 15 | - [X] Residential Permit Parking Blocks 16 | - [X] Residential Permit Districts (manually created) 17 | - [X] Partial (Center City) Meter Coordinates (manually plotted) 18 | - [X] Metered Automobile Parking 19 | - [X] Metered Motorcyle/Scooter Corrals (manually plotted) 20 | - [X] City Owned/Managed Off-Street Lots/Garages (manually plotted) 21 | - [X] Valet Parking Locations 22 | - [X] Snow Emergency Routes 23 | 24 | ##### TODO 25 | - [ ] Handicapped Spaces 26 | - [ ] Balance of Meter Coordinates 27 | - [ ] Updated RPP Blocks from data generated 3/22/16 28 | 29 | 30 | #### Choosing layers to include 31 | 32 | - does the layer contain data that affects when a motorized vehicle may be parked on a public street or in a city-owned, off-street lot/garage? 33 | _That's it_. 34 | -------------------------------------------------------------------------------- /js/vendor/geojson.min.js: -------------------------------------------------------------------------------- 1 | // geojson.js - v0.3.0 2 | // (c) 2016 Casey Thomas, MIT License 3 | !function(a){function b(a,b){var c=a||{};for(var d in b)b.hasOwnProperty(d)&&!c[d]&&(c[d]=b[d]);return c}function c(a,b){if(b.crs&&d(b.crs)&&(a.crs=b.crs),b.bbox&&(a.bbox=b.bbox),b.extraGlobal){a.properties={};for(var c in b.extraGlobal)a.properties[c]=b.extraGlobal[c]}}function d(a){if("name"===a.type){if(a.properties&&a.properties.name)return!0;throw new Error('Invalid CRS. Properties must contain "name" key')}if("link"===a.type){if(a.properties&&a.properties.href&&a.properties.type)return!0;throw new Error('Invalid CRS. Properties must contain "href" and "type" key')}throw new Error('Invald CRS. Type attribute must be "name" or "link"')}function e(a){a.geom={};for(var b in a)a.hasOwnProperty(b)&&-1!==k.indexOf(b)&&(a.geom[b]=a[b],delete a[b]);f(a.geom)}function f(a){for(var b in a)a.hasOwnProperty(b)&&("string"==typeof a[b]?l.push(a[b]):"object"==typeof a[b]&&(l.push(a[b][0]),l.push(a[b][1])));if(0===l.length)throw new Error("No geometry attributes specified")}function g(a,b,c){var d={type:"Feature"};return d.geometry=h(a,b),d.properties=c.call(a),d}function h(a,b){var c={};for(var d in b.geom){var e=b.geom[d];"string"==typeof e&&a.hasOwnProperty(e)?(c.type=d,c.coordinates=a[e]):Array.isArray(e)&&a.hasOwnProperty(e[0])&&a.hasOwnProperty(e[1])&&(c.type=d,c.coordinates=[a[e[1]],a[e[0]]])}return c}function i(a){var b;return a.exclude||a.include?a.include?b=function(b){a.include.forEach(function(a){b[a]=this[a]},this)}:a.exclude&&(b=function(b){for(var c in this)this.hasOwnProperty(c)&&-1===l.indexOf(c)&&-1===a.exclude.indexOf(c)&&(b[c]=this[c])}):b=function(a){for(var b in this)this.hasOwnProperty(b)&&-1===l.indexOf(b)&&(a[b]=this[b])},function(){var c={};return b.call(this,c),a.extra&&j(c,a.extra),c}}function j(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}a.version="0.3.0",a.defaults={},a.parse=function(a,d,f){var h,j={type:"FeatureCollection",features:[]},k=b(d,this.defaults);return l.length=0,e(k),h=i(k),a.forEach(function(a){j.features.push(g(a,k,h))}),c(j,k),f&&"function"==typeof f?void f(j):j};var k=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],l=[]}("object"==typeof module?module.exports:window.GeoJSON={}); -------------------------------------------------------------------------------- /img/icons/4D9ABD2646ECCC65._t_: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 15 | 16 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /img/icons/valet-24-dude.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /img/heart-12.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 29 | 33 | 36 | 41 | 46 | 47 | 48 | 55 | 56 | -------------------------------------------------------------------------------- /help.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Parkadelphia 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 46 | 62 | 63 | 64 |
Keyboard Shortcuts
65 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /css/data.css: -------------------------------------------------------------------------------- 1 | /* DATA FORMATS */ 2 | 3 | .location { 4 | letter-spacing: .1rem; 5 | font-weight: 100; 6 | font-family: 'montserrat', sans-serif; 7 | font-size: 1.2rem; 8 | line-height: .8; 9 | margin-top: 12px; 10 | padding-bottom: 9px; 11 | border-bottom: 1px dotted #EEE; 12 | display: block; 13 | width: 100%; 14 | margin-bottom: -14px; 15 | } 16 | 17 | .side { 18 | font-size: 1rem; 19 | text-transform: uppercase; 20 | /*padding-bottom: 3px;*/ 21 | /*padding-top: 3px;*/ 22 | /* padding-left: 5px; */ 23 | /* padding-top: 5px; */ 24 | /* color: #98C626; */ 25 | /* padding-bottom: 10px; */ 26 | } 27 | 28 | .detail { 29 | font-family: 'Open Sans', 'sans-serif'!important; 30 | line-height: 1.2rem; 31 | font-weight: 200; 32 | font-size: .7rem; 33 | letter-spacing: .07rem; 34 | /* line-height: 1.1rem; */ 35 | text-align: left; 36 | /* float: left; */ 37 | /* padding-left: 20px; */ 38 | width: 310px; 39 | margin-right: auto; 40 | margin-left: auto; 41 | margin-top: 13px; 42 | position: relative; 43 | display: block; 44 | padding-bottom: 3px; 45 | /* border-bottom: 1px dotted #eee; */ 46 | } 47 | 48 | .tariff { 49 | /* margin-top: 8px; */ 50 | text-align: left; 51 | float: left; 52 | display: block; 53 | padding-left: 13px; 54 | border-left: 1px dotted #eee; 55 | } 56 | 57 | .exceptions { 58 | margin-right: auto; 59 | margin-left: auto; 60 | margin-top: 2px; 61 | border-top: 1px dotted #EEE; 62 | padding-top: 3px; 63 | /* float: left; */ 64 | margin-bottom: 10px; 65 | width: 300px; 66 | display: inline-block; 67 | line-height: 1.3rem; 68 | } 69 | 70 | .limit { 71 | border-left: 1px dotted #EEE; 72 | padding-left: 5px; 73 | } 74 | 75 | .rate { 76 | /* border-right: 1px dotted white; */ 77 | text-transform: lowercase; 78 | display: block; 79 | float: left; 80 | height: 40px; 81 | /* margin-right: 10px; */ 82 | /* margin-left: 20%; */ 83 | padding-right: 10px; 84 | padding-left: 13px; 85 | /* position: relative; */ 86 | width: 40px; 87 | color: #CDDC39; 88 | text-align: center; 89 | } 90 | 91 | .rate img { 92 | margin-top: 6px; 93 | width: 25px; 94 | } 95 | 96 | .regulations { 97 | margin-left: auto; 98 | margin-right: auto; 99 | /* text-align: left; */ 100 | /* float: left; */ 101 | width: 325px; 102 | /* display: block; */ 103 | /* margin-bottom: 3px; */ 104 | padding-bottom: 5px; 105 | margin-right: auto; 106 | /* display: inline-block;*/ 107 | /* clear: right; */ 108 | line-height: 1.3rem; 109 | } 110 | 111 | .period { 112 | font-size: .5rem; 113 | } 114 | 115 | .no-parking { 116 | margin-top: 5px; 117 | text-align: left; 118 | float: left; 119 | display: block; 120 | padding-left: 13px; 121 | padding-top: 2px; 122 | border-left: 1px dotted #EEE; 123 | /* border-top: 1px dotted #EEE; */ 124 | /* clear: both; */ 125 | /* width: 100%; */ 126 | } 127 | 128 | .loading-icons { 129 | /* text-transform: lowercase; */ 130 | display: inline-block; 131 | float: left; 132 | height: 40px; 133 | /* margin-right: 10px; */ 134 | /* margin-left: 20%; */ 135 | padding-right: 10px; 136 | padding-top: 7px; 137 | position: relative; 138 | width: 40px; 139 | color: #F70F45; 140 | font-size: 1.2rem; 141 | } 142 | 143 | .material-icons > img, 144 | .loading-icons > img { 145 | color: #EEE; 146 | /* font-size: 1.4rem; */ 147 | margin-left: auto; 148 | margin-right: auto; 149 | vertical-align: middle; 150 | position: relative; 151 | margin-top: -7px; 152 | display: inline-block; 153 | width: 30px; 154 | text-transform: uppercase; 155 | } 156 | 157 | span.regulations-side { 158 | text-transform: uppercase; 159 | display: inline-block; 160 | position: relative; 161 | /* float: left; */ 162 | margin-bottom: 9px; 163 | padding-bottom: 1px; 164 | padding-top: 0; 165 | width: 300px; 166 | text-align: left; 167 | border-bottom: 1px dotted #EEE; 168 | } 169 | 170 | .clearfix:after { 171 | content: ""; 172 | display: table; 173 | clear: both; 174 | } 175 | 176 | .rpp { 177 | margin-left: auto; 178 | margin-right: auto; 179 | display: block; 180 | width: 300px; 181 | } -------------------------------------------------------------------------------- /css/vendor/please-wait.css: -------------------------------------------------------------------------------- 1 | /* line 17, ../src/please-wait.scss */ 2 | 3 | body.pg-loading { 4 | overflow: hidden; 5 | } 6 | 7 | 8 | /* line 21, ../src/please-wait.scss */ 9 | 10 | .pg-loading-screen { 11 | position: fixed; 12 | bottom: 0; 13 | left: 0; 14 | right: 0; 15 | top: 0; 16 | z-index: 1000000; 17 | opacity: 1; 18 | background-color: #FFF; 19 | -webkit-transition: background-color 0.4s ease-in-out 0s; 20 | -moz-transition: background-color 0.4s ease-in-out 0s; 21 | -ms-transition: background-color 0.4s ease-in-out 0s; 22 | -o-transition: background-color 0.4s ease-in-out 0s; 23 | transition: background-color 0.4s ease-in-out 0s; 24 | } 25 | 26 | 27 | /* line 32, ../src/please-wait.scss */ 28 | 29 | .pg-loading-screen.pg-loaded { 30 | opacity: 0; 31 | -webkit-animation: pgAnimLoaded 0.5s cubic-bezier(0.7, 0, 0.3, 1) both; 32 | -moz-animation: pgAnimLoaded 0.5s cubic-bezier(0.7, 0, 0.3, 1) both; 33 | -ms-animation: pgAnimLoaded 0.5s cubic-bezier(0.7, 0, 0.3, 1) both; 34 | -o-animation: pgAnimLoaded 0.5s cubic-bezier(0.7, 0, 0.3, 1) both; 35 | animation: pgAnimLoaded 0.5s cubic-bezier(0.7, 0, 0.3, 1) both; 36 | } 37 | 38 | 39 | /* line 38, ../src/please-wait.scss */ 40 | 41 | .pg-loading-screen.pg-loading .pg-loading-logo-header, 42 | .pg-loading-screen.pg-loading .pg-loading-html { 43 | opacity: 1; 44 | } 45 | 46 | 47 | /* line 42, ../src/please-wait.scss */ 48 | 49 | .pg-loading-screen.pg-loading .pg-loading-logo-header, 50 | .pg-loading-screen.pg-loading .pg-loading-html:not(.pg-loaded) { 51 | -webkit-animation: pgAnimLoading 1s cubic-bezier(0.7, 0, 0.3, 1) both; 52 | -moz-animation: pgAnimLoading 1s cubic-bezier(0.7, 0, 0.3, 1) both; 53 | -ms-animation: pgAnimLoading 1s cubic-bezier(0.7, 0, 0.3, 1) both; 54 | -o-animation: pgAnimLoading 1s cubic-bezier(0.7, 0, 0.3, 1) both; 55 | animation: pgAnimLoading 1s cubic-bezier(0.7, 0, 0.3, 1) both; 56 | } 57 | 58 | 59 | /* line 46, ../src/please-wait.scss */ 60 | 61 | .pg-loading-screen.pg-loading .pg-loading-html:not(.pg-loaded) { 62 | -webkit-animation-delay: 0.3s; 63 | -moz-animation-delay: 0.3s; 64 | -ms-animation-delay: 0.3s; 65 | -o-animation-delay: 0.3s; 66 | animation-delay: 0.3s; 67 | } 68 | 69 | 70 | /* line 51, ../src/please-wait.scss */ 71 | 72 | .pg-loading-screen .pg-loading-inner { 73 | height: 100%; 74 | width: 100%; 75 | margin: 0; 76 | padding: 0; 77 | position: static; 78 | } 79 | 80 | 81 | /* line 59, ../src/please-wait.scss */ 82 | 83 | .pg-loading-screen .pg-loading-center-outer { 84 | width: 100%; 85 | padding: 0; 86 | display: table !important; 87 | height: 100%; 88 | position: absolute; 89 | top: 0; 90 | left: 0; 91 | margin: 0; 92 | } 93 | 94 | 95 | /* line 70, ../src/please-wait.scss */ 96 | 97 | .pg-loading-screen .pg-loading-center-middle { 98 | padding: 0; 99 | vertical-align: middle; 100 | display: table-cell !important; 101 | margin: 0; 102 | text-align: center; 103 | } 104 | 105 | 106 | /* line 78, ../src/please-wait.scss */ 107 | 108 | .pg-loading-screen .pg-loading-logo-header, 109 | .pg-loading-screen .pg-loading-html { 110 | width: 100%; 111 | opacity: 0; 112 | } 113 | 114 | 115 | /* line 83, ../src/please-wait.scss */ 116 | 117 | .pg-loading-screen .pg-loading-logo-header { 118 | text-align: center; 119 | } 120 | 121 | 122 | /* line 86, ../src/please-wait.scss */ 123 | 124 | .pg-loading-screen .pg-loading-logo-header img { 125 | display: inline-block !important; 126 | } 127 | 128 | 129 | /* line 91, ../src/please-wait.scss */ 130 | 131 | .pg-loading-screen .pg-loading-html { 132 | margin-top: 110px; 133 | } 134 | 135 | 136 | /* line 94, ../src/please-wait.scss */ 137 | 138 | .pg-loading-screen .pg-loading-html.pg-loaded { 139 | -webkit-transition: opacity 0.5s cubic-bezier(0.7, 0, 0.3, 1); 140 | -moz-transition: opacity 0.5s cubic-bezier(0.7, 0, 0.3, 1); 141 | -ms-transition: opacity 0.5s cubic-bezier(0.7, 0, 0.3, 1); 142 | -o-transition: opacity 0.5s cubic-bezier(0.7, 0, 0.3, 1); 143 | transition: opacity 0.5s cubic-bezier(0.7, 0, 0.3, 1); 144 | } 145 | 146 | 147 | /* line 97, ../src/please-wait.scss */ 148 | 149 | .pg-loading-screen .pg-loading-html.pg-loaded.pg-removing { 150 | opacity: 0; 151 | } 152 | 153 | 154 | /* line 101, ../src/please-wait.scss */ 155 | 156 | .pg-loading-screen .pg-loading-html.pg-loaded.pg-loading { 157 | opacity: 1; 158 | } 159 | 160 | @-webkit-keyframes pgAnimLoading { 161 | from { 162 | opacity: 0; 163 | } 164 | } 165 | 166 | @-moz-keyframes pgAnimLoading { 167 | from { 168 | opacity: 0; 169 | } 170 | } 171 | 172 | @-o-keyframes pgAnimLoading { 173 | from { 174 | opacity: 0; 175 | } 176 | } 177 | 178 | @-ms-keyframes pgAnimLoading { 179 | from { 180 | opacity: 0; 181 | } 182 | } 183 | 184 | @keyframes pgAnimLoading { 185 | from { 186 | opacity: 0; 187 | } 188 | } 189 | 190 | @-webkit-keyframes pgAnimLoaded { 191 | from { 192 | opacity: 1; 193 | } 194 | } 195 | 196 | @-moz-keyframes pgAnimLoaded { 197 | from { 198 | opacity: 1; 199 | } 200 | } 201 | 202 | @-o-keyframes pgAnimLoaded { 203 | from { 204 | opacity: 1; 205 | } 206 | } 207 | 208 | @-ms-keyframes pgAnimLoaded { 209 | from { 210 | opacity: 1; 211 | } 212 | } 213 | 214 | @keyframes pgAnimLoaded { 215 | from { 216 | opacity: 1; 217 | } 218 | } -------------------------------------------------------------------------------- /img/codeforliberty.svg: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | CfB9AnyfAN8nwPcJ8J1y7QnwfQJ8nwDfJ8D3CfB9AnyfAN8nwPcJ8H0CfJ8A3yfA9wnw/Q8J+P5R 69 | 4eQnTPgJE37ChJ8w4X+fmPAfiZw9wcZPsPG/U9j4T3pi4CqseNIdhRbbcAfixXO8gxDjZbSjMOM5 70 | 3mGo8TLeUbjxsp8HIcfLcEdhx3O8w9BjG+84/HgOdxiCPMc7DEO28Y5DkWcDw8Nw5GW8Y5Bk64l5 71 | HJZswx2HJt8NdxCePMc7DFG28Q7ElO/GOwZVXrbzKFx5Wd5RyPIy3lHY8hzvMHTZxrsCX36Y7hJh 72 | foBug0MtQu0xlPmO7iCceY53FNK8tN49CmteNNdRaPMc7zC8eRoeRyHOi51zEOY8hzsIdX7AT969 73 | olcgz/tku4LmGvR5vjJwFQI9hdKjGPQ+3RbJnUL6URx6n26L5y6u/2NY9D7d/riP49F7VA+MeQUm 74 | fd1Z/Fu9MXAVUr00uz8Iq2a4x9HqheoYvHqOdgxiPQc7CrNedvIY1Hoy06O49cKcRyHX84WFw7Br 75 | 2/Ur0Ou5D4/i13P+hyHYc7zDMOw/532BayDrSXcYaG3jHQhb23hXANfLPjwGXc/5HwZez3kdBl/P 76 | J1AeBbAXumMg7DnaQSD2HO0gGHvZyaOA7MlRj0LZk+4wMPsHe2HgKvx6oTsKwZ7jHYVh23BXoNh2 77 | yAfi2HO8w5Bs24crsOxJdxia/Se+MuDtZy8+uHn2/k/zy4/efPHi1R9ef3t7e/Ps2d+8+vXrv/32 78 | 1Zdfvf725tffvfr/Xp9evXlDr+zXv9XfnH797evv3n7z7Wt5UN/8np/oVxbyZ88++sXHN/8bDwMk 79 | XQ== 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /js/vendor/please-wait.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * please-wait 3 | * Display a nice loading screen while your app loads 4 | 5 | * @author Pathgather 6 | * @copyright Pathgather 2015 7 | * @license MIT 8 | * @link https://github.com/Pathgather/please-wait 9 | * @module please-wait 10 | * @version 0.0.5 11 | */ 12 | ! function (a, b) { 13 | "object" == typeof exports ? b(exports) : "function" == typeof define && define.amd ? define(["exports"], b) : b(a) 14 | }(this, function (a) { 15 | var b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q; 16 | g = document.createElement("fakeelement"), e = !1, n = !1, d = "animationend", m = null, f = "Webkit Moz O ms".split(" "), l = { 17 | WebkitTransition: "webkitTransitionEnd", 18 | MozTransition: "transitionend", 19 | OTransition: "oTransitionEnd", 20 | msTransition: "MSTransitionEnd", 21 | transition: "transitionend" 22 | }; 23 | for (h in l) 24 | if (o = l[h], null != g.style[h]) { 25 | m = o, n = !0; 26 | break 27 | } 28 | if (null != g.style.animationName && (e = !0), !e) 29 | for (p = 0, q = f.length; q > p; p++) 30 | if (i = f[p], null != g.style["" + i + "AnimationName"]) { 31 | switch (i) { 32 | case "Webkit": 33 | d = "webkitAnimationEnd"; 34 | break; 35 | case "Moz": 36 | d = "animationend"; 37 | break; 38 | case "O": 39 | d = "oanimationend"; 40 | break; 41 | case "ms": 42 | d = "MSAnimationEnd" 43 | } 44 | e = !0; 45 | break 46 | } 47 | return c = function (a, b) { 48 | return b.classList ? b.classList.add(a) : b.className += " " + a 49 | }, k = function (a, b) { 50 | return b.classList ? b.classList.remove(a) : b.className = b.className.replace(a, "").trim() 51 | }, b = function () { 52 | function a(a) { 53 | var b, f, g, h; 54 | b = this.constructor._defaultOptions, this.options = {}, this.loaded = !1, this.finishing = !1; 55 | for (f in b) h = b[f], this.options[f] = null != a[f] ? a[f] : h; 56 | this._loadingElem = document.createElement("div"), this._loadingHtmlToDisplay = [], this._loadingElem.className = "pg-loading-screen", null != this.options.backgroundColor && (this._loadingElem.style.backgroundColor = this.options.backgroundColor), this._loadingElem.innerHTML = this.options.template, this._loadingHtmlElem = this._loadingElem.getElementsByClassName("pg-loading-html")[0], null != this._loadingHtmlElem && (this._loadingHtmlElem.innerHTML = this.options.loadingHtml), this._readyToShowLoadingHtml = !1, this._logoElem = this._loadingElem.getElementsByClassName("pg-loading-logo")[0], null != this._logoElem && (this._logoElem.src = this.options.logo), k("pg-loaded", document.body), c("pg-loading", document.body), document.body.appendChild(this._loadingElem), c("pg-loading", this._loadingElem), this._onLoadedCallback = this.options.onLoadedCallback, g = function (a) { 57 | return function (b) { 58 | return a.loaded = !0, a._readyToShowLoadingHtml = !0, c("pg-loaded", a._loadingHtmlElem), e && a._loadingHtmlElem.removeEventListener(d, g), a._loadingHtmlToDisplay.length > 0 && a._changeLoadingHtml(), a.finishing ? (null != b && b.stopPropagation(), a._finish()) : void 0 59 | } 60 | }(this), null != this._loadingHtmlElem && (e ? this._loadingHtmlElem.addEventListener(d, g) : g(), this._loadingHtmlListener = function (a) { 61 | return function () { 62 | return a._readyToShowLoadingHtml = !0, k("pg-loading", a._loadingHtmlElem), n && a._loadingHtmlElem.removeEventListener(m, a._loadingHtmlListener), a._loadingHtmlToDisplay.length > 0 ? a._changeLoadingHtml() : void 0 63 | } 64 | }(this), this._removingHtmlListener = function (a) { 65 | return function () { 66 | return a._loadingHtmlElem.innerHTML = a._loadingHtmlToDisplay.shift(), k("pg-removing", a._loadingHtmlElem), c("pg-loading", a._loadingHtmlElem), n ? (a._loadingHtmlElem.removeEventListener(m, a._removingHtmlListener), a._loadingHtmlElem.addEventListener(m, a._loadingHtmlListener)) : a._loadingHtmlListener() 67 | } 68 | }(this)) 69 | } 70 | return a._defaultOptions = { 71 | backgroundColor: null, 72 | logo: null, 73 | loadingHtml: null, 74 | template: "
\n
\n
\n

\n \n

\n
\n
\n
\n
\n
", 75 | onLoadedCallback: null 76 | }, a.prototype.finish = function (a, b) { 77 | return null == a && (a = !1), window.document.hidden && (a = !0), this.finishing = !0, null != b && this.updateOption("onLoadedCallback", b), this.loaded || a ? this._finish(a) : void 0 78 | }, a.prototype.updateOption = function (a, b) { 79 | switch (a) { 80 | case "backgroundColor": 81 | return this._loadingElem.style.backgroundColor = b; 82 | case "logo": 83 | return this._logoElem.src = b; 84 | case "loadingHtml": 85 | return this.updateLoadingHtml(b); 86 | case "onLoadedCallback": 87 | return this._onLoadedCallback = b; 88 | default: 89 | throw new Error("Unknown option '" + a + "'") 90 | } 91 | }, a.prototype.updateOptions = function (a) { 92 | var b, c, d; 93 | null == a && (a = {}), d = []; 94 | for (b in a) c = a[b], d.push(this.updateOption(b, c)); 95 | return d 96 | }, a.prototype.updateLoadingHtml = function (a, b) { 97 | if (null == b && (b = !1), null == this._loadingHtmlElem) throw new Error("The loading template does not have an element of class 'pg-loading-html'"); 98 | return b ? (this._loadingHtmlToDisplay = [a], this._readyToShowLoadingHtml = !0) : this._loadingHtmlToDisplay.push(a), this._readyToShowLoadingHtml ? this._changeLoadingHtml() : void 0 99 | }, a.prototype._changeLoadingHtml = function () { 100 | return this._readyToShowLoadingHtml = !1, this._loadingHtmlElem.removeEventListener(m, this._loadingHtmlListener), this._loadingHtmlElem.removeEventListener(m, this._removingHtmlListener), k("pg-loading", this._loadingHtmlElem), k("pg-removing", this._loadingHtmlElem), n ? (c("pg-removing", this._loadingHtmlElem), this._loadingHtmlElem.addEventListener(m, this._removingHtmlListener)) : this._removingHtmlListener() 101 | }, a.prototype._finish = function (a) { 102 | var b; 103 | return null == a && (a = !1), null != this._loadingElem ? (c("pg-loaded", document.body), "function" == typeof this._onLoadedCallback && this._onLoadedCallback.apply(this), b = function (a) { 104 | return function () { 105 | return document.body.removeChild(a._loadingElem), k("pg-loading", document.body), e && a._loadingElem.removeEventListener(d, b), a._loadingElem = null 106 | } 107 | }(this), !a && e ? (c("pg-loaded", this._loadingElem), this._loadingElem.addEventListener(d, b)) : b()) : void 0 108 | }, a 109 | }(), j = function (a) { 110 | return null == a && (a = {}), new b(a) 111 | }, a.pleaseWait = j, j 112 | }); -------------------------------------------------------------------------------- /css/vendor/mapboxgl_0-12-3.css: -------------------------------------------------------------------------------- 1 | .mapboxgl-map { 2 | font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; 3 | overflow: hidden; 4 | position: relative; 5 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 6 | } 7 | 8 | .mapboxgl-canvas-container.mapboxgl-interactive, 9 | .mapboxgl-ctrl-nav-compass { 10 | cursor: -webkit-grab; 11 | cursor: -moz-grab; 12 | cursor: grab; 13 | } 14 | 15 | .mapboxgl-canvas-container.mapboxgl-interactive:active, 16 | .mapboxgl-ctrl-nav-compass:active { 17 | cursor: -webkit-grabbing; 18 | cursor: -moz-grabbing; 19 | cursor: grabbing; 20 | } 21 | 22 | .mapboxgl-ctrl-top-left, 23 | .mapboxgl-ctrl-top-right, 24 | .mapboxgl-ctrl-bottom-left, 25 | .mapboxgl-ctrl-bottom-right { 26 | position: absolute; 27 | } 28 | 29 | .mapboxgl-ctrl-top-left { 30 | top: 0; 31 | left: 0; 32 | } 33 | 34 | .mapboxgl-ctrl-top-right { 35 | top: 0; 36 | right: 0; 37 | } 38 | 39 | .mapboxgl-ctrl-bottom-left { 40 | bottom: 0; 41 | left: 0; 42 | } 43 | 44 | .mapboxgl-ctrl-bottom-right { 45 | right: 0; 46 | bottom: 0; 47 | } 48 | 49 | .mapboxgl-ctrl { 50 | clear: both; 51 | } 52 | 53 | .mapboxgl-ctrl-top-left .mapboxgl-ctrl { 54 | margin: 10px 0 0 10px; 55 | float: left; 56 | } 57 | 58 | .mapboxgl-ctrl-top-right .mapboxgl-ctrl { 59 | margin: 10px 10px 0 0; 60 | float: right; 61 | } 62 | 63 | .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl { 64 | margin: 0 0 10px 10px; 65 | float: left; 66 | } 67 | 68 | .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl { 69 | margin: 0 10px 10px 0; 70 | float: right; 71 | } 72 | 73 | .mapboxgl-ctrl-group { 74 | border-radius: 4px; 75 | -moz-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.1); 76 | -webkit-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.1); 77 | box-shadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.1); 78 | overflow: hidden; 79 | background: #fff; 80 | } 81 | 82 | .mapboxgl-ctrl-group > button { 83 | width: 30px; 84 | height: 30px; 85 | display: block; 86 | padding: 0; 87 | outline: none; 88 | border: none; 89 | border-bottom: 1px solid #ddd; 90 | box-sizing: border-box; 91 | background-color: rgba(0, 0, 0, 0); 92 | cursor: pointer; 93 | } 94 | 95 | 96 | /* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ 97 | 98 | .mapboxgl-ctrl > button::-moz-focus-inner { 99 | border: 0; 100 | padding: 0; 101 | } 102 | 103 | .mapboxgl-ctrl > button:last-child { 104 | border-bottom: 0; 105 | } 106 | 107 | .mapboxgl-ctrl > button:hover { 108 | background-color: rgba(0, 0, 0, 0.05); 109 | } 110 | 111 | .mapboxgl-ctrl-icon, 112 | .mapboxgl-ctrl-icon > div.arrow { 113 | speak: none; 114 | -webkit-font-smoothing: antialiased; 115 | -moz-osx-font-smoothing: grayscale; 116 | } 117 | 118 | .mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { 119 | padding: 5px; 120 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); 121 | } 122 | 123 | .mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { 124 | padding: 5px; 125 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); 126 | } 127 | 128 | .mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > div.arrow { 129 | width: 20px; 130 | height: 20px; 131 | margin: 5px; 132 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E"); 133 | background-repeat: no-repeat; 134 | } 135 | 136 | .mapboxgl-ctrl.mapboxgl-ctrl-attrib { 137 | padding: 0 5px; 138 | background-color: rgba(255, 255, 255, 0.5); 139 | margin: 0; 140 | } 141 | 142 | .mapboxgl-ctrl-attrib a { 143 | color: rgba(0, 0, 0, 0.75); 144 | text-decoration: none; 145 | } 146 | 147 | .mapboxgl-ctrl-attrib a:hover { 148 | color: inherit; 149 | text-decoration: underline; 150 | } 151 | 152 | .mapboxgl-ctrl-attrib .mapbox-improve-map { 153 | font-weight: bold; 154 | margin-left: 2px; 155 | } 156 | 157 | .mapboxgl-popup { 158 | position: absolute; 159 | display: -webkit-flex; 160 | display: flex; 161 | will-change: transform; 162 | pointer-events: none; 163 | } 164 | 165 | .mapboxgl-popup-anchor-top, 166 | .mapboxgl-popup-anchor-top-left, 167 | .mapboxgl-popup-anchor-top-right { 168 | -webkit-flex-direction: column; 169 | flex-direction: column; 170 | } 171 | 172 | .mapboxgl-popup-anchor-bottom, 173 | .mapboxgl-popup-anchor-bottom-left, 174 | .mapboxgl-popup-anchor-bottom-right { 175 | -webkit-flex-direction: column-reverse; 176 | flex-direction: column-reverse; 177 | } 178 | 179 | .mapboxgl-popup-anchor-left { 180 | -webkit-flex-direction: row; 181 | flex-direction: row; 182 | } 183 | 184 | .mapboxgl-popup-anchor-right { 185 | -webkit-flex-direction: row-reverse; 186 | flex-direction: row-reverse; 187 | } 188 | 189 | .mapboxgl-popup-tip { 190 | width: 0; 191 | height: 0; 192 | border: 10px solid transparent; 193 | z-index: 1; 194 | } 195 | 196 | .mapboxgl-popup-anchor-top .mapboxgl-popup-tip { 197 | -webkit-align-self: center; 198 | align-self: center; 199 | border-top: none; 200 | border-bottom-color: #fff; 201 | } 202 | 203 | .mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip { 204 | -webkit-align-self: flex-start; 205 | align-self: flex-start; 206 | border-top: none; 207 | border-left: none; 208 | border-bottom-color: #fff; 209 | } 210 | 211 | .mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip { 212 | -webkit-align-self: flex-end; 213 | align-self: flex-end; 214 | border-top: none; 215 | border-right: none; 216 | border-bottom-color: #fff; 217 | } 218 | 219 | .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip { 220 | -webkit-align-self: center; 221 | align-self: center; 222 | border-bottom: none; 223 | border-top-color: #fff; 224 | } 225 | 226 | .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip { 227 | -webkit-align-self: flex-start; 228 | align-self: flex-start; 229 | border-bottom: none; 230 | border-left: none; 231 | border-top-color: #fff; 232 | } 233 | 234 | .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip { 235 | -webkit-align-self: flex-end; 236 | align-self: flex-end; 237 | border-bottom: none; 238 | border-right: none; 239 | border-top-color: #fff; 240 | } 241 | 242 | .mapboxgl-popup-anchor-left .mapboxgl-popup-tip { 243 | -webkit-align-self: center; 244 | align-self: center; 245 | border-left: none; 246 | border-right-color: #fff; 247 | } 248 | 249 | .mapboxgl-popup-anchor-right .mapboxgl-popup-tip { 250 | -webkit-align-self: center; 251 | align-self: center; 252 | border-right: none; 253 | border-left-color: #fff; 254 | } 255 | 256 | .mapboxgl-popup-close-button { 257 | position: absolute; 258 | right: 0; 259 | top: 0; 260 | border: none; 261 | border-radius: 0 3px 0 0; 262 | cursor: pointer; 263 | background-color: rgba(0, 0, 0, 0); 264 | } 265 | 266 | .mapboxgl-popup-close-button:hover { 267 | background-color: rgba(0, 0, 0, 0.05); 268 | } 269 | 270 | .mapboxgl-popup-content { 271 | position: relative; 272 | background: #fff; 273 | border-radius: 3px; 274 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.10); 275 | padding: 10px 10px 15px; 276 | pointer-events: auto; 277 | } 278 | 279 | .mapboxgl-popup-anchor-top-left .mapboxgl-popup-content { 280 | border-top-left-radius: 0; 281 | } 282 | 283 | .mapboxgl-popup-anchor-top-right .mapboxgl-popup-content { 284 | border-top-right-radius: 0; 285 | } 286 | 287 | .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content { 288 | border-bottom-left-radius: 0; 289 | } 290 | 291 | .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content { 292 | border-bottom-right-radius: 0; 293 | } 294 | 295 | .mapboxgl-crosshair, 296 | .mapboxgl-crosshair .mapboxgl-interactive, 297 | .mapboxgl-crosshair .mapboxgl-interactive:active { 298 | cursor: crosshair; 299 | } 300 | 301 | .mapboxgl-boxzoom { 302 | position: absolute; 303 | top: 0; 304 | left: 0; 305 | width: 0; 306 | height: 0; 307 | background: #fff; 308 | border: 2px dotted #202020; 309 | opacity: 0.5; 310 | } 311 | 312 | @media print { 313 | .mapbox-improve-map { 314 | display: none; 315 | } 316 | } -------------------------------------------------------------------------------- /js/vendor/autotrack.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright 2016 Google Inc. All Rights Reserved. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | /*! autotrack.js v0.6.3 */ 19 | !function t(e,i,n){function r(o,s){if(!i[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var d=i[o]={exports:{}};e[o][0].call(d.exports,function(t){var i=e[o][1][t];return r(i?i:t)},d,d.exports,t,e,i,n)}return i[o].exports}for(var a="function"==typeof require&&require,o=0;o "+e},c("mediaQueryTracker",n)},{"../provide":8,"../utilities":9,debounce:12}],4:[function(t,e,i){function n(t,e){window.gaplugins=window.gaplugins||{},gaplugins.OutboundFormTracker=n,window.addEventListener&&(this.opts=r(e,{shouldTrackOutboundForm:this.shouldTrackOutboundForm}),this.tracker=t,a(document,"form","submit",this.handleFormSubmits.bind(this)))}var r=t("../utilities").defaults,a=t("delegate"),o=t("../provide"),s=t("../utilities");n.prototype.handleFormSubmits=function(t){var e=t.delegateTarget,i=e.getAttribute("action"),n={transport:"beacon"};this.opts.shouldTrackOutboundForm(e)&&(navigator.sendBeacon||(t.preventDefault(),n.hitCallback=s.withTimeout(function(){e.submit()})),this.tracker.send("event","Outbound Form","submit",i,n))},n.prototype.shouldTrackOutboundForm=function(t){var e=t.getAttribute("action");return e&&0===e.indexOf("http")&&e.indexOf(location.hostname)<0},o("outboundFormTracker",n)},{"../provide":8,"../utilities":9,delegate:13}],5:[function(t,e,i){function n(t,e){window.gaplugins=window.gaplugins||{},gaplugins.OutboundLinkTracker=n,window.addEventListener&&(this.opts=r(e,{shouldTrackOutboundLink:this.shouldTrackOutboundLink}),this.tracker=t,a(document,"a","click",this.handleLinkClicks.bind(this)))}var r=t("../utilities").defaults,a=t("delegate"),o=t("../provide");n.prototype.handleLinkClicks=function(t){var e=t.delegateTarget;this.opts.shouldTrackOutboundLink(e)&&(navigator.sendBeacon||(e.target="_blank"),this.tracker.send("event","Outbound Link","click",e.href,{transport:"beacon"}))},n.prototype.shouldTrackOutboundLink=function(t){return t.hostname!=location.hostname},o("outboundLinkTracker",n)},{"../provide":8,"../utilities":9,delegate:13}],6:[function(t,e,i){function n(t,e){if(window.gaplugins=window.gaplugins||{},gaplugins.SocialTracker=n,window.addEventListener){this.opts=r(e,{attributePrefix:"data-"}),this.tracker=t;var i=this.opts.attributePrefix,o="["+i+"social-network]["+i+"social-action]["+i+"social-target]";a(document,o,"click",this.handleSocialClicks.bind(this)),this.detectLibraryLoad("FB","facebook-jssdk",this.addFacebookEventHandlers.bind(this)),this.detectLibraryLoad("twttr","twitter-wjs",this.addTwitterEventHandlers.bind(this))}}var r=t("../utilities").defaults,a=t("delegate"),o=t("../provide");n.prototype.handleSocialClicks=function(t){var e=t.delegateTarget,i=this.opts.attributePrefix;this.tracker.send("social",{socialNetwork:e.getAttribute(i+"social-network"),socialAction:e.getAttribute(i+"social-action"),socialTarget:e.getAttribute(i+"social-target")})},n.prototype.detectLibraryLoad=function(t,e,i){if(window[t])i();else{var n=document.getElementById(e);n&&(n.onload=i)}},n.prototype.addTwitterEventHandlers=function(){try{twttr.ready(function(){twttr.events.bind("tweet",function(t){if("tweet"==t.region){var e=t.data.url||t.target.getAttribute("data-url")||location.href;this.tracker.send("social","Twitter","tweet",e)}}.bind(this)),twttr.events.bind("follow",function(t){if("follow"==t.region){var e=t.data.screen_name||t.target.getAttribute("data-screen-name");this.tracker.send("social","Twitter","follow",e)}}.bind(this))}.bind(this))}catch(t){}},n.prototype.addFacebookEventHandlers=function(){try{FB.Event.subscribe("edge.create",function(t){this.tracker.send("social","Facebook","like",t)}.bind(this)),FB.Event.subscribe("edge.remove",function(t){this.tracker.send("social","Facebook","unlike",t)}.bind(this))}catch(t){}},o("socialTracker",n)},{"../provide":8,"../utilities":9,delegate:13}],7:[function(t,e,i){function n(t,e){if(window.gaplugins=window.gaplugins||{},gaplugins.UrlChangeTracker=n,history.pushState&&window.addEventListener){this.opts=a(e,{shouldTrackUrlChange:this.shouldTrackUrlChange}),this.tracker=t,this.path=r();var i=history.pushState;history.pushState=function(t,e,n){o(t)&&e&&(t.title=e),i.call(history,t,e,n),this.updateTrackerData()}.bind(this);var s=history.replaceState;history.replaceState=function(t,e,i){o(t)&&e&&(t.title=e),s.call(history,t,e,i),this.updateTrackerData(!1)}.bind(this),window.addEventListener("popstate",this.updateTrackerData.bind(this))}}function r(){return location.pathname+location.search}var a=t("../utilities").defaults,o=t("../utilities").isObject,s=t("../provide");n.prototype.updateTrackerData=function(t){t=t===!1?!1:!0,setTimeout(function(){var e=this.path,i=r();e!=i&&this.opts.shouldTrackUrlChange.call(this,i,e)&&(this.path=i,this.tracker.set({page:i,title:o(history.state)&&history.state.title||document.title}),t&&this.tracker.send("pageview"))}.bind(this),0)},n.prototype.shouldTrackUrlChange=function(t,e){return!0},s("urlChangeTracker",n)},{"../provide":8,"../utilities":9}],8:[function(t,e,i){var n=t("./constants");(window.gaDevIds=window.gaDevIds||[]).push(n.DEV_ID),e.exports=function(t,e){var i=window,n=i.GoogleAnalyticsObject||"ga";i[n]=i[n]||function(){(i[n].q=i[n].q||[]).push(arguments)},i[n].l=i[n].l||+new Date,i[n]("provide",t,e)}},{"./constants":1}],9:[function(t,e,i){var n={withTimeout:function(t,e){var i=!1;return setTimeout(t,e||2e3),function(){i||(i=!0,t())}},defaults:function(t,e){var i={};"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});for(var n in e)e.hasOwnProperty(n)&&(i[n]=t.hasOwnProperty(n)?t[n]:e[n]);return i},isObject:function(t){return"object"==typeof t&&null!==t},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},toArray:function(t){return n.isArray(t)?t:[t]}};e.exports=n},{}],10:[function(t,e,i){var n=t("matches-selector");e.exports=function(t,e,i){for(var r=i?t:t.parentNode;r&&r!==document;){if(n(r,e))return r;r=r.parentNode}}},{"matches-selector":14}],11:[function(t,e,i){function n(){return(new Date).getTime()}e.exports=Date.now||n},{}],12:[function(t,e,i){var n=t("date-now");e.exports=function(t,e,i){function r(){var d=n()-u;e>d&&d>0?a=setTimeout(r,e-d):(a=null,i||(c=t.apply(s,o),a||(s=o=null)))}var a,o,s,u,c;return null==e&&(e=100),function(){s=this,o=arguments,u=n();var d=i&&!a;return a||(a=setTimeout(r,e)),d&&(c=t.apply(s,o),s=o=null),c}}},{"date-now":11}],13:[function(t,e,i){function n(t,e,i,n,a){var o=r.apply(this,arguments);return t.addEventListener(i,o,a),{destroy:function(){t.removeEventListener(i,o,a)}}}function r(t,e,i,n){return function(i){i.delegateTarget=a(i.target,e,!0),i.delegateTarget&&n.call(t,i)}}var a=t("closest");e.exports=n},{closest:10}],14:[function(t,e,i){function n(t,e){if(a)return a.call(t,e);for(var i=t.parentNode.querySelectorAll(e),n=0;n 6 | * @copyright Pathgather 2015 7 | * @license MIT 8 | * @link https://github.com/Pathgather/please-wait 9 | * @module please-wait 10 | * @version 0.0.5 11 | */ 12 | (function (root, factory) { 13 | if (typeof exports === "object") { 14 | factory(exports); 15 | } else if (typeof define === "function" && define.amd) { 16 | define(["exports"], factory); 17 | } else { 18 | factory(root); 19 | } 20 | })(this, function (exports) { 21 | var PleaseWait, addClass, animationEvent, animationSupport, domPrefixes, elm, key, pfx, pleaseWait, removeClass, transEndEventNames, transitionEvent, transitionSupport, val, _i, _len; 22 | elm = document.createElement('fakeelement'); 23 | animationSupport = false; 24 | transitionSupport = false; 25 | animationEvent = 'animationend'; 26 | transitionEvent = null; 27 | domPrefixes = 'Webkit Moz O ms'.split(' '); 28 | transEndEventNames = { 29 | 'WebkitTransition': 'webkitTransitionEnd', 30 | 'MozTransition': 'transitionend', 31 | 'OTransition': 'oTransitionEnd', 32 | 'msTransition': 'MSTransitionEnd', 33 | 'transition': 'transitionend' 34 | }; 35 | for (key in transEndEventNames) { 36 | val = transEndEventNames[key]; 37 | if (elm.style[key] != null) { 38 | transitionEvent = val; 39 | transitionSupport = true; 40 | break; 41 | } 42 | } 43 | if (elm.style.animationName != null) { 44 | animationSupport = true; 45 | } 46 | if (!animationSupport) { 47 | for (_i = 0, _len = domPrefixes.length; _i < _len; _i++) { 48 | pfx = domPrefixes[_i]; 49 | if (elm.style["" + pfx + "AnimationName"] != null) { 50 | switch (pfx) { 51 | case 'Webkit': 52 | animationEvent = 'webkitAnimationEnd'; 53 | break; 54 | case 'Moz': 55 | animationEvent = 'animationend'; 56 | break; 57 | case 'O': 58 | animationEvent = 'oanimationend'; 59 | break; 60 | case 'ms': 61 | animationEvent = 'MSAnimationEnd'; 62 | } 63 | animationSupport = true; 64 | break; 65 | } 66 | } 67 | } 68 | addClass = function (classname, elem) { 69 | if (elem.classList) { 70 | return elem.classList.add(classname); 71 | } else { 72 | return elem.className += " " + classname; 73 | } 74 | }; 75 | removeClass = function (classname, elem) { 76 | if (elem.classList) { 77 | return elem.classList.remove(classname); 78 | } else { 79 | return elem.className = elem.className.replace(classname, "").trim(); 80 | } 81 | }; 82 | PleaseWait = (function () { 83 | PleaseWait._defaultOptions = { 84 | backgroundColor: null, 85 | logo: null, 86 | loadingHtml: null, 87 | template: "
\n
\n
\n

\n \n

\n
\n
\n
\n
\n
", 88 | onLoadedCallback: null 89 | }; 90 | 91 | function PleaseWait(options) { 92 | var defaultOptions, k, listener, v; 93 | defaultOptions = this.constructor._defaultOptions; 94 | this.options = {}; 95 | this.loaded = false; 96 | this.finishing = false; 97 | for (k in defaultOptions) { 98 | v = defaultOptions[k]; 99 | this.options[k] = options[k] != null ? options[k] : v; 100 | } 101 | this._loadingElem = document.createElement("div"); 102 | this._loadingHtmlToDisplay = []; 103 | this._loadingElem.className = "pg-loading-screen"; 104 | if (this.options.backgroundColor != null) { 105 | this._loadingElem.style.backgroundColor = this.options.backgroundColor; 106 | } 107 | this._loadingElem.innerHTML = this.options.template; 108 | this._loadingHtmlElem = this._loadingElem.getElementsByClassName("pg-loading-html")[0]; 109 | if (this._loadingHtmlElem != null) { 110 | this._loadingHtmlElem.innerHTML = this.options.loadingHtml; 111 | } 112 | this._readyToShowLoadingHtml = false; 113 | this._logoElem = this._loadingElem.getElementsByClassName("pg-loading-logo")[0]; 114 | if (this._logoElem != null) { 115 | this._logoElem.src = this.options.logo; 116 | } 117 | removeClass("pg-loaded", document.body); 118 | addClass("pg-loading", document.body); 119 | document.body.appendChild(this._loadingElem); 120 | addClass("pg-loading", this._loadingElem); 121 | this._onLoadedCallback = this.options.onLoadedCallback; 122 | listener = (function (_this) { 123 | return function (evt) { 124 | _this.loaded = true; 125 | _this._readyToShowLoadingHtml = true; 126 | addClass("pg-loaded", _this._loadingHtmlElem); 127 | if (animationSupport) { 128 | _this._loadingHtmlElem.removeEventListener(animationEvent, listener); 129 | } 130 | if (_this._loadingHtmlToDisplay.length > 0) { 131 | _this._changeLoadingHtml(); 132 | } 133 | if (_this.finishing) { 134 | if (evt != null) { 135 | evt.stopPropagation(); 136 | } 137 | return _this._finish(); 138 | } 139 | }; 140 | })(this); 141 | if (this._loadingHtmlElem != null) { 142 | if (animationSupport) { 143 | this._loadingHtmlElem.addEventListener(animationEvent, listener); 144 | } else { 145 | listener(); 146 | } 147 | this._loadingHtmlListener = (function (_this) { 148 | return function () { 149 | _this._readyToShowLoadingHtml = true; 150 | removeClass("pg-loading", _this._loadingHtmlElem); 151 | if (transitionSupport) { 152 | _this._loadingHtmlElem.removeEventListener(transitionEvent, _this._loadingHtmlListener); 153 | } 154 | if (_this._loadingHtmlToDisplay.length > 0) { 155 | return _this._changeLoadingHtml(); 156 | } 157 | }; 158 | })(this); 159 | this._removingHtmlListener = (function (_this) { 160 | return function () { 161 | _this._loadingHtmlElem.innerHTML = _this._loadingHtmlToDisplay.shift(); 162 | removeClass("pg-removing", _this._loadingHtmlElem); 163 | addClass("pg-loading", _this._loadingHtmlElem); 164 | if (transitionSupport) { 165 | _this._loadingHtmlElem.removeEventListener(transitionEvent, _this._removingHtmlListener); 166 | return _this._loadingHtmlElem.addEventListener(transitionEvent, _this._loadingHtmlListener); 167 | } else { 168 | return _this._loadingHtmlListener(); 169 | } 170 | }; 171 | })(this); 172 | } 173 | } 174 | 175 | PleaseWait.prototype.finish = function (immediately, onLoadedCallback) { 176 | if (immediately == null) { 177 | immediately = false; 178 | } 179 | if (window.document.hidden) { 180 | immediately = true; 181 | } 182 | this.finishing = true; 183 | if (onLoadedCallback != null) { 184 | this.updateOption('onLoadedCallback', onLoadedCallback); 185 | } 186 | if (this.loaded || immediately) { 187 | return this._finish(immediately); 188 | } 189 | }; 190 | 191 | PleaseWait.prototype.updateOption = function (option, value) { 192 | switch (option) { 193 | case 'backgroundColor': 194 | return this._loadingElem.style.backgroundColor = value; 195 | case 'logo': 196 | return this._logoElem.src = value; 197 | case 'loadingHtml': 198 | return this.updateLoadingHtml(value); 199 | case 'onLoadedCallback': 200 | return this._onLoadedCallback = value; 201 | default: 202 | throw new Error("Unknown option '" + option + "'"); 203 | } 204 | }; 205 | 206 | PleaseWait.prototype.updateOptions = function (options) { 207 | var k, v, _results; 208 | if (options == null) { 209 | options = {}; 210 | } 211 | _results = []; 212 | for (k in options) { 213 | v = options[k]; 214 | _results.push(this.updateOption(k, v)); 215 | } 216 | return _results; 217 | }; 218 | 219 | PleaseWait.prototype.updateLoadingHtml = function (loadingHtml, immediately) { 220 | if (immediately == null) { 221 | immediately = false; 222 | } 223 | if (this._loadingHtmlElem == null) { 224 | throw new Error("The loading template does not have an element of class 'pg-loading-html'"); 225 | } 226 | if (immediately) { 227 | this._loadingHtmlToDisplay = [loadingHtml]; 228 | this._readyToShowLoadingHtml = true; 229 | } else { 230 | this._loadingHtmlToDisplay.push(loadingHtml); 231 | } 232 | if (this._readyToShowLoadingHtml) { 233 | return this._changeLoadingHtml(); 234 | } 235 | }; 236 | 237 | PleaseWait.prototype._changeLoadingHtml = function () { 238 | this._readyToShowLoadingHtml = false; 239 | this._loadingHtmlElem.removeEventListener(transitionEvent, this._loadingHtmlListener); 240 | this._loadingHtmlElem.removeEventListener(transitionEvent, this._removingHtmlListener); 241 | removeClass("pg-loading", this._loadingHtmlElem); 242 | removeClass("pg-removing", this._loadingHtmlElem); 243 | if (transitionSupport) { 244 | addClass("pg-removing", this._loadingHtmlElem); 245 | return this._loadingHtmlElem.addEventListener(transitionEvent, this._removingHtmlListener); 246 | } else { 247 | return this._removingHtmlListener(); 248 | } 249 | }; 250 | 251 | PleaseWait.prototype._finish = function (immediately) { 252 | var listener; 253 | if (immediately == null) { 254 | immediately = false; 255 | } 256 | if (this._loadingElem == null) { 257 | return; 258 | } 259 | addClass("pg-loaded", document.body); 260 | if (typeof this._onLoadedCallback === "function") { 261 | this._onLoadedCallback.apply(this); 262 | } 263 | listener = (function (_this) { 264 | return function () { 265 | document.body.removeChild(_this._loadingElem); 266 | removeClass("pg-loading", document.body); 267 | if (animationSupport) { 268 | _this._loadingElem.removeEventListener(animationEvent, listener); 269 | } 270 | return _this._loadingElem = null; 271 | }; 272 | })(this); 273 | if (!immediately && animationSupport) { 274 | addClass("pg-loaded", this._loadingElem); 275 | return this._loadingElem.addEventListener(animationEvent, listener); 276 | } else { 277 | return listener(); 278 | } 279 | }; 280 | 281 | return PleaseWait; 282 | 283 | })(); 284 | pleaseWait = function (options) { 285 | if (options == null) { 286 | options = {}; 287 | } 288 | return new PleaseWait(options); 289 | }; 290 | exports.pleaseWait = pleaseWait; 291 | return pleaseWait; 292 | }); -------------------------------------------------------------------------------- /js/debug.js: -------------------------------------------------------------------------------- 1 | var PopeMap = PopeMap || {}; 2 | 3 | (function() { 4 | 'use strict'; 5 | 6 | var mapLayers = {}; 7 | var layerNames = ['highways','walking','screens','hospitals','transit','entrances','poperide','parking']; 8 | var accessToken = 'pk.eyJ1IjoibGF1cmVuYW5jb25hIiwiYSI6IjYxNGUxN2ExMmQzZWVkMThhZjY2MGE0YmQxZWZlN2Q2In0.18vQmCC7jmOvuHNnDh8Ybw'; 9 | 10 | var INTERACTIVE_PATTERN = /\.i$/; 11 | var isInteractive = function(feature) { 12 | /* Check whether the given feature belongs to an 13 | * interactive layer. 14 | */ 15 | var layerName = feature.layer.id; 16 | return INTERACTIVE_PATTERN.test(layerName); 17 | }; 18 | 19 | var featuresAt = function(map, point, options, callback) { 20 | /* A wrapper around mapboxgl.Map.featuresAt that will 21 | * only take interactive layers into account. Layer 22 | * interactivity is determined by the isInteractive 23 | * function. 24 | * 25 | * TODO: Allow overriding the isInteractive method from 26 | * within the options. 27 | */ 28 | 29 | // Hijack the callback. 30 | var hijacked = function(err, features) { 31 | var filteredFeatures = [], i; 32 | for (i = 0; i < features.length; i++) { 33 | if (isInteractive(features[i])) { 34 | filteredFeatures.push(features[i]); 35 | } 36 | } 37 | callback(err, filteredFeatures); 38 | }; 39 | 40 | // Call mapboxgl.Map.featuresAt with the hijacked 41 | // callback function. 42 | map.featuresAt(point, options, hijacked); 43 | }; 44 | 45 | PopeMap.initFancyMap = function() { 46 | var map; 47 | 48 | L.mapbox.accessToken = accessToken; 49 | mapboxgl.accessToken = accessToken; 50 | 51 | // Construct a bounding box 52 | 53 | // var southWest = L.latLng(39.864439, -75.387541), 54 | // northEast = L.latLng(40.156325, -74.883544), 55 | // bounds = L.latLngBounds(southWest, northEast); 56 | 57 | map = PopeMap.map = new mapboxgl.Map({ 58 | container: 'map', 59 | style: 'mapbox://styles/laurenancona/cieykpfrt0gy5swkrmrt2aeh7', 60 | center: [-75.1575, 39.9572], 61 | bearing: 9.2, // Rotate Philly ~9° off of north 62 | zoom: 14, 63 | maxZoom: 18, 64 | minZoom: 13, 65 | // maxBounds: bounds, 66 | hash: true, 67 | }); 68 | 69 | map.addControl(new mapboxgl.Navigation({position: 'top-left'})); 70 | 71 | // map.dragRotate.disable(); 72 | 73 | var getPoint = function(evt) { 74 | // MapboxGL will call it `point`, leaflet `containerPoint`. 75 | return evt.point || evt.containerPoint; 76 | } 77 | 78 | PopeMap.map.on('mousemove', function(evt) { 79 | if (map.loaded()) { 80 | var point = getPoint(evt); 81 | featuresAt(map, point, {radius: 15}, function(err, features) { 82 | if (err) throw err; 83 | PopeMap.map._container.classList.toggle('interacting', features.length > 0); 84 | }); 85 | } 86 | }); 87 | 88 | PopeMap.map.on('click', function(evt) { 89 | if (map.loaded()) { 90 | var point = getPoint(evt); 91 | 92 | // Find what was clicked on 93 | featuresAt(map, point, {radius: 15}, function(err, features) { 94 | var layerName, feature; 95 | 96 | if (err) throw err; 97 | 98 | if (features.length > 0) { 99 | feature = features[0]; 100 | layerName = feature.layer.id; 101 | showInfo(layerName, feature); 102 | } 103 | }); 104 | } 105 | }); 106 | 107 | var updateLayerVisibility = function(layerName) { 108 | var toggledLayers = mapLayers[layerName] || []; 109 | if (document.getElementById(layerName).checked) { 110 | toggledLayers.forEach(function(layer) { 111 | map.setLayoutProperty(layer.id, 'visibility', 'visible'); 112 | }); 113 | } else { 114 | toggledLayers.forEach(function(layer) { 115 | map.setLayoutProperty(layer.id, 'visibility', 'none'); 116 | }); 117 | } 118 | }; 119 | 120 | map.on('load', function() { 121 | var layerAssociation = { //using '.i' in GL layernames we want to be interactive 122 | 'highways': ['highways.i'], 123 | 'walking': ['walking.i'], 124 | 'screens': ['screens.i'], 125 | 'hospitals': ['hospitals.i'], 126 | 'transit': ['transit.i'], 127 | 'entrances': ['entrances.i','entrances.halo.i'], 128 | 'poperide': ['poperide.i','poperide.route.i'], 129 | 'parking': ['parking.i'] 130 | }; 131 | 132 | layerNames.forEach(function(layerName, index){ 133 | // Associate the map layers with a layerName. 134 | var interactiveLayerNames = layerAssociation[layerName]; 135 | interactiveLayerNames.forEach(function(interactiveLayerName) { 136 | var interactiveLayer = map.style.getLayer(interactiveLayerName); 137 | if (!mapLayers[layerName]) { mapLayers[layerName] = []; } 138 | if (interactiveLayer) { mapLayers[layerName].push(interactiveLayer); } 139 | }); 140 | 141 | // Bind the checkbox change to update layer visibility. 142 | document.getElementById(layerName).addEventListener('change', function(){ 143 | updateLayerVisibility(layerName); 144 | }); 145 | 146 | // Set the initial layer visibility to match the toggle. 147 | updateLayerVisibility(layerName); 148 | }); 149 | }); 150 | }; 151 | 152 | // Vector tiles fallback 153 | PopeMap.initClassicMap = function() { 154 | var map; 155 | 156 | L.mapbox.accessToken = accessToken; 157 | 158 | // Construct a bounding box 159 | 160 | var southWest = L.latLng(39.864439, -75.387541), 161 | northEast = L.latLng(40.156325, -74.883544), 162 | bounds = L.latLngBounds(southWest, northEast); 163 | 164 | map = PopeMap.map = L.mapbox.map('map', 'laurenancona.2ff8c154', { // Popemap polygons baselayer 165 | // set that bounding box as maxBounds to restrict moving the map (http://leafletjs.com/reference.html#map-maxbounds) 166 | // maxBounds: bounds, 167 | infoControl: false, 168 | attributionControl: false, 169 | maxZoom: 18, 170 | minZoom: 13, 171 | center: [39.9572, -75.1575], 172 | zoom: 14 173 | }); 174 | 175 | // Map controls and additions for URL hash, geocoding, and locate-me 176 | 177 | PopeMap.map.addControl(L.mapbox.geocoderControl('mapbox.places', { 178 | autocomplete: true 179 | })); 180 | L.control.locate().addTo(PopeMap.map); 181 | L.hash(PopeMap.map); // append (z)/(x)/(y) to URL for deep linking to locations 182 | 183 | // Here be our data layers 184 | 185 | var highways = L.mapbox.featureLayer(); //.addTo(map); 186 | highways.loadURL('data/highways.geojson'); 187 | mapLayers['highways'] = highways; 188 | 189 | var walking = L.mapbox.featureLayer(); //.addTo(map); 190 | walking.loadURL('data/walking.geojson'); 191 | mapLayers['walking'] = walking; 192 | 193 | var screens = L.mapbox.featureLayer();//.addTo(map); 194 | screens.loadURL('data/jumbotrons.geojson'); 195 | mapLayers['screens'] = screens; 196 | 197 | var hospitals = L.mapbox.featureLayer();//.addTo(map); 198 | hospitals.loadURL('data/hospitals.geojson'); 199 | mapLayers['hospitals'] = hospitals; 200 | 201 | var transit = L.mapbox.featureLayer().addTo(map); 202 | transit.loadURL('https://gist.githubusercontent.com/laurenancona/f6fc6dee346781538cf7/raw/9ef66b848017b61a972eaa27179541ddfe90d990/septa-train-stations.geojson') 203 | mapLayers['transit'] = transit; 204 | 205 | var entrances = L.mapbox.featureLayer(); //.addTo(map); 206 | entrances.loadURL('https://gist.githubusercontent.com/laurenancona/222ac7fbcb959208a93a/raw/b8953400ac6c945380203e98d6107505f9e9f0c9/entrances.geojson'); 207 | mapLayers['entrances'] = entrances; 208 | 209 | var poperide = L.mapbox.featureLayer(); //.addTo(map); 210 | poperide.loadURL('data/poperide.geojson'); 211 | mapLayers['poperide'] = poperide; 212 | 213 | var parking = L.mapbox.featureLayer().addTo(map); 214 | parking.loadURL('data/parking.geojson'); 215 | mapLayers['parking'] = parking; 216 | 217 | layerNames.forEach(function(layerName, index){ 218 | var layer = mapLayers[layerName]; 219 | document.getElementById(layerName).addEventListener('change', function(){ 220 | if (document.getElementById(layerName).checked) 221 | layer.addTo(map); 222 | else 223 | map.removeLayer(layer); 224 | }); 225 | }); 226 | 227 | //============================================================// 228 | 229 | // UTF Grid interactivity, testing w/ multiple layers 230 | // var blocksTiles = blocks.addTo(map); 231 | var infoGrid = L.mapbox.gridLayer('laurenancona.2ff8c154').addTo(map); //, 232 | // lotsGrid = L.mapbox.gridLayer('laurenancona.fc7871b8').addTo(map); 233 | // var blocksControl = L.mapbox.gridControl(blocksGrid ).addTo(map); //, 234 | // lotsControl = L.mapbox.gridControl('laurenancona.fc7871b8').addTo(map); 235 | 236 | // Listen for individual marker clicks. 237 | 238 | entrances.on('click', function (e) { 239 | e.layer.closePopup(); // Force the popup closed. 240 | showInfo('entrances', e.layer.feature); 241 | }); 242 | 243 | transit.on('click', function (e) { 244 | e.layer.closePopup(); 245 | showInfo('transit', e.layer.feature); 246 | }); 247 | 248 | poperide.on('click', function (e) { 249 | e.layer.closePopup(); 250 | showInfo('poperide', e.layer.feature); 251 | }); 252 | 253 | parking.on('click', function (e) { 254 | e.layer.closePopup(); 255 | showInfo('parking', e.layer.feature); 256 | }); 257 | 258 | highways.on('click', function (e) { 259 | e.layer.closePopup(); 260 | showInfo('highways', e.layer.feature); 261 | }); 262 | 263 | hospitals.on('click', function (e) { 264 | e.layer.closePopup(); 265 | showInfo('hospitals', e.layer.feature); 266 | }); 267 | }; 268 | 269 | 270 | //============================================================// 271 | 272 | var showInfo = function(tpl, feature) { 273 | var content; 274 | 275 | switch (tpl) { 276 | case 'entrances': 277 | case 'entrances.i': 278 | content = '
' + feature.properties.name + '' + 279 | '

Ticketed? ' + feature.properties.ticketed + '

'; 280 | break; 281 | 282 | case 'transit': 283 | case 'transit.i': 284 | content = '
' + feature.properties.name + '' + 285 | feature.properties.description + '
'; 286 | // '

' + feature.properties.Tickets + '

' + 287 | // '

VISIT SITE

'; 288 | break; 289 | 290 | case 'poperide': 291 | case 'poperide.i': 292 | content = '
Pope Bike Ride' + 293 | '

' + feature.properties.name + '

'; 294 | break; 295 | 296 | case 'parking': 297 | case 'parking.i': 298 | content = '
' + feature.properties.name + '' + 299 | '

Deadline to move vehicles: ' + '

' + 300 | '

' +feature.properties.desc + '

' + 301 | '

VISIT SITE

'; 302 | break; 303 | 304 | case 'highways': 305 | case 'highways.i': 306 | content = '
' + feature.properties.name + '' + 307 | '

Closed to inbound traffic

'; 308 | break; 309 | 310 | case 'hospitals': 311 | case 'hospitals.i': 312 | content = '
' + feature.properties.name + '' + 313 | '

' + feature.properties.address + '

' + 314 | '

PHILADELPHIA, PA ' + feature.properties.zip + '

' + 315 | '

' + feature.properties.phone + '

'; 316 | break; 317 | 318 | default: 319 | content = '
' + feature.properties.name + '' + 320 | '

' + feature.properties.description + '

'; 321 | break; 322 | } 323 | info.innerHTML = content; 324 | }; 325 | 326 | if (PopeMap.allowFancyMap && mapboxgl.supported()) { 327 | PopeMap.initFancyMap(); 328 | } else { 329 | PopeMap.initClassicMap(); 330 | } 331 | 332 | // Clear the tooltip when map is clicked. 333 | PopeMap.map.on('move', empty); 334 | 335 | // Trigger empty contents when the script has loaded on the page. 336 | empty(); 337 | 338 | function empty() { 339 | info.innerHTML = '

Choose layers at left, then click features for info

'; 340 | } 341 | 342 | })(); 343 | 344 | 345 | // ht @konklone for console.log-fication example 346 | // for sad, sad IE: 347 | if (window._ie) { 348 | console.log("Hey there."); 349 | console.log("If you're into this kind of thing and want to help out, let me know."); 350 | console.log("http://github.com/laurenancona or @laurenancona"); 351 | } 352 | 353 | // otherwise, style it up: 354 | else { 355 | var styles = { 356 | medium: "font-size: 10pt, font-weight: bold;color: #1B3B56", 357 | medium_link: "font-size: 10pt; font-weight: bold; color: #027ea4", 358 | }; 359 | console.log("%cHey there", styles.medium); 360 | console.log("%cIf you're into this kind of thing and want to help out, let me know.", styles.medium); 361 | console.log("%chttp://github.com/laurenancona or @laurenancona", styles.medium); 362 | } 363 | -------------------------------------------------------------------------------- /debug.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | Philly Pope Map 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 83 | 84 | 144 |
145 | 146 |
147 | Philly Pope Map 148 | VIEW TIMELINE 149 |
225 | 226 |
227 | 228 |
229 |
230 | 231 | 232 |
233 | 234 | 235 | 236 | 237 | 238 | 239 | 242 | 243 |
244 |
245 |
246 |
247 | 248 | 249 | 253 | 254 | 255 | 256 | 259 | 260 |
261 |
262 | 263 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /js/vendor/dialog-polyfill.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | var supportCustomEvent = window.CustomEvent; 4 | if (!supportCustomEvent || typeof supportCustomEvent == 'object') { 5 | supportCustomEvent = function CustomEvent(event, x) { 6 | x = x || {}; 7 | var ev = document.createEvent('CustomEvent'); 8 | ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null); 9 | return ev; 10 | }; 11 | supportCustomEvent.prototype = window.Event.prototype; 12 | } 13 | 14 | /** 15 | * Finds the nearest from the passed element. 16 | * 17 | * @param {Element} el to search from 18 | * @return {HTMLDialogElement} dialog found 19 | */ 20 | function findNearestDialog(el) { 21 | while (el) { 22 | if (el.nodeName.toUpperCase() == 'DIALOG') { 23 | return /** @type {HTMLDialogElement} */ (el); 24 | } 25 | el = el.parentElement; 26 | } 27 | return null; 28 | } 29 | 30 | /** 31 | * Blur the specified element, as long as it's not the HTML body element. 32 | * This works around an IE9/10 bug - blurring the body causes Windows to 33 | * blur the whole application. 34 | * 35 | * @param {Element} el to blur 36 | */ 37 | function safeBlur(el) { 38 | if (el && el.blur && el != document.body) { 39 | el.blur(); 40 | } 41 | } 42 | 43 | /** 44 | * @param {!NodeList} nodeList to search 45 | * @param {Node} node to find 46 | * @return {boolean} whether node is inside nodeList 47 | */ 48 | function inNodeList(nodeList, node) { 49 | for (var i = 0; i < nodeList.length; ++i) { 50 | if (nodeList[i] == node) { 51 | return true; 52 | } 53 | } 54 | return false; 55 | } 56 | 57 | /** 58 | * @param {!HTMLDialogElement} dialog to upgrade 59 | * @constructor 60 | */ 61 | function dialogPolyfillInfo(dialog) { 62 | this.dialog_ = dialog; 63 | this.replacedStyleTop_ = false; 64 | this.openAsModal_ = false; 65 | 66 | // Set a11y role. Browsers that support dialog implicitly know this already. 67 | if (!dialog.hasAttribute('role')) { 68 | dialog.setAttribute('role', 'dialog'); 69 | } 70 | 71 | dialog.show = this.show.bind(this); 72 | dialog.showModal = this.showModal.bind(this); 73 | dialog.close = this.close.bind(this); 74 | 75 | if (!('returnValue' in dialog)) { 76 | dialog.returnValue = ''; 77 | } 78 | 79 | this.maybeHideModal = this.maybeHideModal.bind(this); 80 | if ('MutationObserver' in window) { 81 | // IE11+, most other browsers. 82 | var mo = new MutationObserver(this.maybeHideModal); 83 | mo.observe(dialog, { attributes: true, attributeFilter: ['open'] }); 84 | } else { 85 | dialog.addEventListener('DOMAttrModified', this.maybeHideModal); 86 | } 87 | // Note that the DOM is observed inside DialogManager while any dialog 88 | // is being displayed as a modal, to catch modal removal from the DOM. 89 | 90 | Object.defineProperty(dialog, 'open', { 91 | set: this.setOpen.bind(this), 92 | get: dialog.hasAttribute.bind(dialog, 'open') 93 | }); 94 | 95 | this.backdrop_ = document.createElement('div'); 96 | this.backdrop_.className = 'backdrop'; 97 | this.backdropClick_ = this.backdropClick_.bind(this); 98 | } 99 | 100 | dialogPolyfillInfo.prototype = { 101 | 102 | get dialog() { 103 | return this.dialog_; 104 | }, 105 | 106 | /** 107 | * Maybe remove this dialog from the modal top layer. This is called when 108 | * a modal dialog may no longer be tenable, e.g., when the dialog is no 109 | * longer open or is no longer part of the DOM. 110 | */ 111 | maybeHideModal: function() { 112 | if (!this.openAsModal_) { return; } 113 | if (this.dialog_.hasAttribute('open') && 114 | document.body.contains(this.dialog_)) { return; } 115 | 116 | this.openAsModal_ = false; 117 | this.dialog_.style.zIndex = ''; 118 | 119 | // This won't match the native exactly because if the user set 120 | // top on a centered polyfill dialog, that top gets thrown away when the 121 | // dialog is closed. Not sure it's possible to polyfill this perfectly. 122 | if (this.replacedStyleTop_) { 123 | this.dialog_.style.top = ''; 124 | this.replacedStyleTop_ = false; 125 | } 126 | 127 | // Optimistically clear the modal part of this . 128 | this.backdrop_.removeEventListener('click', this.backdropClick_); 129 | if (this.backdrop_.parentElement) { 130 | this.backdrop_.parentElement.removeChild(this.backdrop_); 131 | } 132 | dialogPolyfill.dm.removeDialog(this); 133 | }, 134 | 135 | /** 136 | * @param {boolean} value whether to open or close this dialog 137 | */ 138 | setOpen: function(value) { 139 | if (value) { 140 | this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', ''); 141 | } else { 142 | this.dialog_.removeAttribute('open'); 143 | this.maybeHideModal(); // nb. redundant with MutationObserver 144 | } 145 | }, 146 | 147 | /** 148 | * Handles clicks on the fake .backdrop element, redirecting them as if 149 | * they were on the dialog itself. 150 | * 151 | * @param {!Event} e to redirect 152 | */ 153 | backdropClick_: function(e) { 154 | var redirectedEvent = document.createEvent('MouseEvents'); 155 | redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window, 156 | e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, 157 | e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget); 158 | this.dialog_.dispatchEvent(redirectedEvent); 159 | e.stopPropagation(); 160 | }, 161 | 162 | /** 163 | * Sets the zIndex for the backdrop and dialog. 164 | * 165 | * @param {number} backdropZ 166 | * @param {number} dialogZ 167 | */ 168 | updateZIndex: function(backdropZ, dialogZ) { 169 | this.backdrop_.style.zIndex = backdropZ; 170 | this.dialog_.style.zIndex = dialogZ; 171 | }, 172 | 173 | /** 174 | * Shows the dialog. This is idempotent and will always succeed. 175 | */ 176 | show: function() { 177 | this.setOpen(true); 178 | }, 179 | 180 | /** 181 | * Show this dialog modally. 182 | */ 183 | showModal: function() { 184 | if (this.dialog_.hasAttribute('open')) { 185 | throw new Error('Failed to execute \'showModal\' on dialog: The element is already open, and therefore cannot be opened modally.'); 186 | } 187 | if (!document.body.contains(this.dialog_)) { 188 | throw new Error('Failed to execute \'showModal\' on dialog: The element is not in a Document.'); 189 | } 190 | if (!dialogPolyfill.dm.pushDialog(this)) { 191 | throw new Error('Failed to execute \'showModal\' on dialog: There are too many open modal dialogs.'); 192 | } 193 | this.show(); 194 | this.openAsModal_ = true; 195 | 196 | // Optionally center vertically, relative to the current viewport. 197 | if (dialogPolyfill.needsCentering(this.dialog_)) { 198 | dialogPolyfill.reposition(this.dialog_); 199 | this.replacedStyleTop_ = true; 200 | } else { 201 | this.replacedStyleTop_ = false; 202 | } 203 | 204 | // Insert backdrop. 205 | this.backdrop_.addEventListener('click', this.backdropClick_); 206 | this.dialog_.parentNode.insertBefore(this.backdrop_, 207 | this.dialog_.nextSibling); 208 | 209 | // Find element with `autofocus` attribute or first form control. 210 | var target = this.dialog_.querySelector('[autofocus]:not([disabled])'); 211 | if (!target) { 212 | // TODO: technically this is 'any focusable area' 213 | var opts = ['button', 'input', 'keygen', 'select', 'textarea']; 214 | var query = opts.map(function(el) { 215 | return el + ':not([disabled])'; 216 | }).join(', '); 217 | target = this.dialog_.querySelector(query); 218 | } 219 | safeBlur(document.activeElement); 220 | target && target.focus(); 221 | }, 222 | 223 | /** 224 | * Closes this HTMLDialogElement. This is optional vs clearing the open 225 | * attribute, however this fires a 'close' event. 226 | * 227 | * @param {string=} opt_returnValue to use as the returnValue 228 | */ 229 | close: function(opt_returnValue) { 230 | if (!this.dialog_.hasAttribute('open')) { 231 | throw new Error('Failed to execute \'close\' on dialog: The element does not have an \'open\' attribute, and therefore cannot be closed.'); 232 | } 233 | this.setOpen(false); 234 | 235 | // Leave returnValue untouched in case it was set directly on the element 236 | if (opt_returnValue !== undefined) { 237 | this.dialog_.returnValue = opt_returnValue; 238 | } 239 | 240 | // Triggering "close" event for any attached listeners on the . 241 | var closeEvent = new supportCustomEvent('close', { 242 | bubbles: false, 243 | cancelable: false 244 | }); 245 | this.dialog_.dispatchEvent(closeEvent); 246 | } 247 | 248 | }; 249 | 250 | var dialogPolyfill = {}; 251 | 252 | dialogPolyfill.reposition = function(element) { 253 | var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; 254 | var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2; 255 | element.style.top = Math.max(scrollTop, topValue) + 'px'; 256 | }; 257 | 258 | dialogPolyfill.isInlinePositionSetByStylesheet = function(element) { 259 | for (var i = 0; i < document.styleSheets.length; ++i) { 260 | var styleSheet = document.styleSheets[i]; 261 | var cssRules = null; 262 | // Some browsers throw on cssRules. 263 | try { 264 | cssRules = styleSheet.cssRules; 265 | } catch (e) {} 266 | if (!cssRules) 267 | continue; 268 | for (var j = 0; j < cssRules.length; ++j) { 269 | var rule = cssRules[j]; 270 | var selectedNodes = null; 271 | // Ignore errors on invalid selector texts. 272 | try { 273 | selectedNodes = document.querySelectorAll(rule.selectorText); 274 | } catch(e) {} 275 | if (!selectedNodes || !inNodeList(selectedNodes, element)) 276 | continue; 277 | var cssTop = rule.style.getPropertyValue('top'); 278 | var cssBottom = rule.style.getPropertyValue('bottom'); 279 | if ((cssTop && cssTop != 'auto') || (cssBottom && cssBottom != 'auto')) 280 | return true; 281 | } 282 | } 283 | return false; 284 | }; 285 | 286 | dialogPolyfill.needsCentering = function(dialog) { 287 | var computedStyle = window.getComputedStyle(dialog); 288 | if (computedStyle.position != 'absolute') { 289 | return false; 290 | } 291 | 292 | // We must determine whether the top/bottom specified value is non-auto. In 293 | // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but 294 | // Firefox returns the used value. So we do this crazy thing instead: check 295 | // the inline style and then go through CSS rules. 296 | if ((dialog.style.top != 'auto' && dialog.style.top != '') || 297 | (dialog.style.bottom != 'auto' && dialog.style.bottom != '')) 298 | return false; 299 | return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog); 300 | }; 301 | 302 | /** 303 | * @param {!Element} element to force upgrade 304 | */ 305 | dialogPolyfill.forceRegisterDialog = function(element) { 306 | if (element.showModal) { 307 | console.warn('This browser already supports , the polyfill ' + 308 | 'may not work correctly', element); 309 | } 310 | if (element.nodeName.toUpperCase() != 'DIALOG') { 311 | throw new Error('Failed to register dialog: The element is not a dialog.'); 312 | } 313 | new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element)); 314 | }; 315 | 316 | /** 317 | * @param {!Element} element to upgrade 318 | */ 319 | dialogPolyfill.registerDialog = function(element) { 320 | if (element.showModal) { 321 | console.warn('Can\'t upgrade : already supported', element); 322 | } else { 323 | dialogPolyfill.forceRegisterDialog(element); 324 | } 325 | }; 326 | 327 | /** 328 | * @constructor 329 | */ 330 | dialogPolyfill.DialogManager = function() { 331 | /** @type {!Array} */ 332 | this.pendingDialogStack = []; 333 | 334 | // The overlay is used to simulate how a modal dialog blocks the document. 335 | // The blocking dialog is positioned on top of the overlay, and the rest of 336 | // the dialogs on the pending dialog stack are positioned below it. In the 337 | // actual implementation, the modal dialog stacking is controlled by the 338 | // top layer, where z-index has no effect. 339 | this.overlay = document.createElement('div'); 340 | this.overlay.className = '_dialog_overlay'; 341 | this.overlay.addEventListener('click', function(e) { 342 | e.stopPropagation(); 343 | }); 344 | 345 | this.handleKey_ = this.handleKey_.bind(this); 346 | this.handleFocus_ = this.handleFocus_.bind(this); 347 | this.handleRemove_ = this.handleRemove_.bind(this); 348 | 349 | this.zIndexLow_ = 100000; 350 | this.zIndexHigh_ = 100000 + 150; 351 | }; 352 | 353 | /** 354 | * @return {Element} the top HTML dialog element, if any 355 | */ 356 | dialogPolyfill.DialogManager.prototype.topDialogElement = function() { 357 | if (this.pendingDialogStack.length) { 358 | var t = this.pendingDialogStack[this.pendingDialogStack.length - 1]; 359 | return t.dialog; 360 | } 361 | return null; 362 | }; 363 | 364 | /** 365 | * Called on the first modal dialog being shown. Adds the overlay and related 366 | * handlers. 367 | */ 368 | dialogPolyfill.DialogManager.prototype.blockDocument = function() { 369 | document.body.appendChild(this.overlay); 370 | document.body.addEventListener('focus', this.handleFocus_, true); 371 | document.addEventListener('keydown', this.handleKey_); 372 | document.addEventListener('DOMNodeRemoved', this.handleRemove_); 373 | }; 374 | 375 | /** 376 | * Called on the first modal dialog being removed, i.e., when no more modal 377 | * dialogs are visible. 378 | */ 379 | dialogPolyfill.DialogManager.prototype.unblockDocument = function() { 380 | document.body.removeChild(this.overlay); 381 | document.body.removeEventListener('focus', this.handleFocus_, true); 382 | document.removeEventListener('keydown', this.handleKey_); 383 | document.removeEventListener('DOMNodeRemoved', this.handleRemove_); 384 | }; 385 | 386 | dialogPolyfill.DialogManager.prototype.updateStacking = function() { 387 | var zIndex = this.zIndexLow_; 388 | 389 | for (var i = 0; i < this.pendingDialogStack.length; i++) { 390 | if (i == this.pendingDialogStack.length - 1) { 391 | this.overlay.style.zIndex = zIndex++; 392 | } 393 | this.pendingDialogStack[i].updateZIndex(zIndex++, zIndex++); 394 | } 395 | }; 396 | 397 | dialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) { 398 | var candidate = findNearestDialog(/** @type {Element} */ (event.target)); 399 | if (candidate != this.topDialogElement()) { 400 | event.preventDefault(); 401 | event.stopPropagation(); 402 | safeBlur(/** @type {Element} */ (event.target)); 403 | // TODO: Focus on the browser chrome (aka document) or the dialog itself 404 | // depending on the tab direction. 405 | return false; 406 | } 407 | }; 408 | 409 | dialogPolyfill.DialogManager.prototype.handleKey_ = function(event) { 410 | if (event.keyCode == 27) { 411 | event.preventDefault(); 412 | event.stopPropagation(); 413 | var cancelEvent = new supportCustomEvent('cancel', { 414 | bubbles: false, 415 | cancelable: true 416 | }); 417 | var dialog = this.topDialogElement(); 418 | if (dialog.dispatchEvent(cancelEvent)) { 419 | dialog.close(); 420 | } 421 | } 422 | }; 423 | 424 | dialogPolyfill.DialogManager.prototype.handleRemove_ = function(event) { 425 | if (event.target.nodeName.toUpperCase() != 'DIALOG') { return; } 426 | 427 | var dialog = /** @type {HTMLDialogElement} */ (event.target); 428 | if (!dialog.open) { return; } 429 | 430 | // Find a dialogPolyfillInfo which matches the removed . 431 | this.pendingDialogStack.some(function(dpi) { 432 | if (dpi.dialog == dialog) { 433 | // This call will clear the dialogPolyfillInfo on this DialogManager 434 | // as a side effect. 435 | dpi.maybeHideModal(); 436 | return true; 437 | } 438 | }); 439 | }; 440 | 441 | /** 442 | * @param {!dialogPolyfillInfo} dpi 443 | * @return {boolean} whether the dialog was allowed 444 | */ 445 | dialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) { 446 | var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1; 447 | if (this.pendingDialogStack.length >= allowed) { 448 | return false; 449 | } 450 | this.pendingDialogStack.push(dpi); 451 | if (this.pendingDialogStack.length == 1) { 452 | this.blockDocument(); 453 | } 454 | this.updateStacking(); 455 | return true; 456 | }; 457 | 458 | /** 459 | * @param {dialogPolyfillInfo} dpi 460 | */ 461 | dialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) { 462 | var index = this.pendingDialogStack.indexOf(dpi); 463 | if (index == -1) { return; } 464 | 465 | this.pendingDialogStack.splice(index, 1); 466 | this.updateStacking(); 467 | if (this.pendingDialogStack.length == 0) { 468 | this.unblockDocument(); 469 | } 470 | }; 471 | 472 | dialogPolyfill.dm = new dialogPolyfill.DialogManager(); 473 | 474 | /** 475 | * Global form 'dialog' method handler. Closes a dialog correctly on submit 476 | * and possibly sets its return value. 477 | */ 478 | document.addEventListener('submit', function(ev) { 479 | var target = ev.target; 480 | if (!target || !target.hasAttribute('method')) { return; } 481 | if (target.getAttribute('method').toLowerCase() != 'dialog') { return; } 482 | ev.preventDefault(); 483 | 484 | var dialog = findNearestDialog(/** @type {Element} */ (ev.target)); 485 | if (!dialog) { return; } 486 | 487 | // FIXME: The original event doesn't contain the element used to submit the 488 | // form (if any). Look in some possible places. 489 | var returnValue; 490 | var cands = [document.activeElement, ev.explicitOriginalTarget]; 491 | var els = ['BUTTON', 'INPUT']; 492 | cands.some(function(cand) { 493 | if (cand && cand.form == ev.target && els.indexOf(cand.nodeName.toUpperCase()) != -1) { 494 | returnValue = cand.value; 495 | return true; 496 | } 497 | }); 498 | dialog.close(returnValue); 499 | }, true); 500 | 501 | dialogPolyfill['forceRegisterDialog'] = dialogPolyfill.forceRegisterDialog; 502 | dialogPolyfill['registerDialog'] = dialogPolyfill.registerDialog; 503 | 504 | if (typeof module === 'object' && typeof module['exports'] === 'object') { 505 | // CommonJS support 506 | module['exports'] = dialogPolyfill; 507 | } else if (typeof define === 'function' && 'amd' in define) { 508 | // AMD support 509 | define(function() { return dialogPolyfill; }); 510 | } else { 511 | // all others 512 | window['dialogPolyfill'] = dialogPolyfill; 513 | } 514 | })(); 515 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | /*LOAD SCREEN*/ 2 | 3 | /*Spinner styles from Spinkit http://tobiasahlin.com/spinkit/*/ 4 | 5 | .pg-loading-logo { 6 | max-width: 250px; 7 | margin-top: 80px!important; 8 | } 9 | 10 | .loading_text { 11 | color: white; 12 | font-size: 1.2rem; 13 | } 14 | .back{ 15 | top: -1px; 16 | color: #757575; 17 | position: absolute; 18 | float: right; 19 | display: block; 20 | right: 20px; 21 | top: 15px; 22 | z-index: 1; 23 | font-size: 19px; 24 | } 25 | .spinner { 26 | width: 40px; 27 | height: 40px; 28 | position: relative; 29 | margin: 100px auto; 30 | } 31 | 32 | .double-bounce1 { 33 | background-color: rgba(21,200,209,1); 34 | opacity: 0.8; 35 | } 36 | 37 | .double-bounce2 { 38 | background-color: #fff; 39 | opacity: 0.6; 40 | } 41 | 42 | .double-bounce1, .double-bounce2 { 43 | width: 100%; 44 | height: 100%; 45 | border-radius: 50%; 46 | position: absolute; 47 | top: 0; 48 | left: 0; 49 | -webkit-animation: sk-bounce 2.0s infinite ease-in-out; 50 | animation: sk-bounce 2.0s infinite ease-in-out; 51 | } 52 | 53 | .double-bounce2 { 54 | -webkit-animation-delay: -1.0s; 55 | animation-delay: -1.0s; 56 | } 57 | 58 | @-webkit-keyframes sk-bounce { 59 | 0%, 100% { -webkit-transform: scale(0.0) } 60 | 50% { -webkit-transform: scale(1.0) } 61 | } 62 | 63 | @keyframes sk-bounce { 64 | 0%, 100% { 65 | transform: scale(0.0); 66 | -webkit-transform: scale(0.0); 67 | } 50% { 68 | transform: scale(1.0); 69 | -webkit-transform: scale(1.0); 70 | } 71 | } 72 | 73 | /* MAPBOX-GL GEOCODER */ 74 | 75 | .quiet { 76 | display: none; 77 | } 78 | #geocoder-container { 79 | top: 35px; 80 | /* display: none;*/ 81 | /* width: 100%;*/ 82 | /* margin-top: 10px;*/ 83 | position: fixed!important; 84 | width: 100%; 85 | /* bottom: 80px;*/ 86 | z-index: 10000!important; 87 | } 88 | #geocoder-container > div { 89 | min-width:100%; 90 | /* margin-left:25%;*/ 91 | /* z-index: 9; */ 92 | } 93 | .mapboxgl-ctrl-geocoder { 94 | border-radius: 0; 95 | background-color: rgba(0, 0, 0, 0.71)!important 96 | width: 100%; 97 | /* opacity: 0.9;*/ 98 | } 99 | .mapboxgl-ctrl-geocoder input[type='text'] { 100 | font-weight: 300; 101 | font-size: 1rem; 102 | color: rgba(0, 0, 0, 0.71)!important; 103 | } 104 | #geocoder-container > div > input[type="text"] > div#inner-editor { 105 | font-weight: 500; 106 | font-size: 1rem; 107 | color: rgba(0, 0, 0, 0.71)!important; 108 | } 109 | div#placeholder { 110 | color: black; 111 | } 112 | html { 113 | /* 114 | margin: 0 auto; 115 | padding: 0; 116 | overflow-x: hidden; 117 | */ 118 | } 119 | body { 120 | margin: 0; 121 | padding: 0; 122 | height: 100%; 123 | color: white; 124 | background-color: #40403B!important; 125 | line-height: 15px!important; 126 | font-family: 'Open Sans'; 127 | } 128 | dialog.mdl-dialog { 129 | color: #eee; 130 | background-color:#46474A!important; 131 | height: 90%!important; 132 | width: 80%; 133 | } 134 | dialog.mdl-dialog p{ 135 | color: #eee; 136 | } 137 | .close { 138 | top: 10px!important; 139 | right: 10px!important; 140 | position: absolute; 141 | } 142 | form#51738395059163 { 143 | margin-top: 0px; 144 | } 145 | .direct-embed-widgets { 146 | z-index: 1!important; 147 | } 148 | .map-wrapper { 149 | position: absolute; 150 | display: block; 151 | top: 0px; 152 | bottom: 0px; 153 | /* bottom: 40px;*/ 154 | width: 100%; 155 | height: 100%; 156 | overflow-x: hidden!important; 157 | overflow-y: hidden!important; 158 | } 159 | footer { 160 | z-index: 3!important; 161 | position: fixed; 162 | bottom: 0px!important; 163 | } 164 | .feedback-icon > a > i { 165 | right: 12px; 166 | top: 7px; 167 | float: right; 168 | color: white; 169 | position: absolute; 170 | /* font-size: 1rem!important; */ 171 | z-index: 1000; 172 | width: 20px!important; 173 | min-width: 30px!important; 174 | } 175 | .share-icon { 176 | /*width: 20px;*/ 177 | /*position: absolute;*/ 178 | } 179 | .share-icon a{ 180 | color: white!important; 181 | } 182 | .detail-icon img { 183 | fill: white; 184 | width: 22px; 185 | margin-right: 10px; 186 | border-right: 1px dotted white; 187 | padding-right: 10px; 188 | } 189 | .share-label { 190 | position: absolute; 191 | float: left; 192 | margin-left: 15px; 193 | color: white; 194 | font-size: .7rem; 195 | text-transform: uppercase; 196 | letter-spacing: .05rem; 197 | } 198 | #contributors li a { 199 | color: #CDDC39!important; 200 | } 201 | #contributors > li { 202 | list-style-type: none; 203 | line-height: 1.3rem; 204 | } 205 | #roadmap > ul > li, #thank-you > ul > li { 206 | list-style-type: none!important; 207 | line-height: 1.2rem; 208 | margin-left: -24px; 209 | text-indent: -8px; 210 | } 211 | #roadmap > ul > li > span.icon { 212 | color: #CDDC39!important; 213 | } 214 | #roadmap > ul { 215 | list-style-type: none!important; 216 | } 217 | a { 218 | color: inherit!important; 219 | } 220 | dialog li { 221 | color: #eee; 222 | line-height: 1.4rem; 223 | font-size: 1rem; 224 | } 225 | li a { 226 | /* font-size: 1.6em!important;*/ 227 | text-decoration: none!important; 228 | } 229 | hr { 230 | border-top: 1px dotted grey!important; 231 | } 232 | h5 { 233 | font-family: 'montserrat', sans-serif!important; 234 | text-transform: uppercase!important; 235 | font-size: .8rem!important; 236 | color: #eee!important; 237 | margin: 16px 0!important; 238 | letter-spacing: .1rem!important; 239 | /* text-align: center!important;*/ 240 | } 241 | s { 242 | color: darkgrey; 243 | } 244 | ul { 245 | font-size: 10px!important; 246 | line-height: 1.1em!important; 247 | } 248 | p { 249 | font-size: 0.8rem!important; 250 | line-height: 1.6em!important; 251 | margin: 0 0 8px; 252 | } 253 | p a { 254 | color: rgb(205, 220, 57)!important; 255 | text-decoration: none!important; 256 | } 257 | #container { 258 | overflow-x: hidden; 259 | position: relative; 260 | } 261 | #contributors { 262 | margin-top: -10px; 263 | -webkit-column-count: 2; 264 | /* Chrome, Safari, Opera */ 265 | -moz-column-count: 2; 266 | /* Firefox */ 267 | column-count: 2; 268 | -webkit-column-gap: 10px; 269 | /* Chrome, Safari, Opera */ 270 | -moz-column-gap: 10px; 271 | /* Firefox */ 272 | column-gap: 10px; 273 | -webkit-column-rule-width: 1px solid lightgrey; 274 | /* Chrome, Safari, Opera */ 275 | -moz-column-rule-width: 1px solid lightgrey; 276 | /* Firefox */ 277 | column-rule-width: 1px solid lightgrey; 278 | } 279 | #contributors a { 280 | text-decoration: none!important; 281 | color: rgb(205, 220, 57); 282 | font-size: 0.8rem; 283 | } 284 | #contributors h5 { 285 | -webkit-column-span: all; 286 | /* Chrome, Safari, Opera */ 287 | column-span: all; 288 | -webkit-margin-before: 1rem; 289 | -webkit-margin-after: 1rem; 290 | } 291 | #text { 292 | margin-left: auto; 293 | margin-right: auto; 294 | opacity: 1!important; 295 | /*z-index:100; text-shadow:1px 1px 2px #888888;*/ 296 | font-family: 'Cabin', sans-serif; 297 | font-size: .7em; 298 | font-weight: 500; 299 | color: #fff; 300 | text-transform: uppercase; 301 | text-align: center; 302 | } 303 | #attrib a { 304 | text-decoration: none!important; 305 | } 306 | #attrib { 307 | position: absolute; 308 | float: right; 309 | bottom: 38px; 310 | right: 4px; 311 | font-size: .5rem; 312 | color: #EEE; 313 | display: block; 314 | } 315 | #bottom-icons { 316 | position: fixed; 317 | bottom: -1px; 318 | background-color: rgb(205,220,57)!important; 319 | color: white; 320 | height: 40px; 321 | width: 100%; 322 | /* display: table;*/ 323 | } 324 | #icon-group { 325 | margin-left: auto; 326 | margin-right: auto; 327 | text-align: center; 328 | overflow-x: hidden; 329 | max-width: 350px; 330 | padding-top: 2px; 331 | } 332 | #map-settings, 333 | #settings, 334 | #search, 335 | #share, 336 | #locate, 337 | #time { 338 | display: inline-block; 339 | height: 40px; 340 | width: 20%; 341 | text-align: center; 342 | font-size: 1.8rem; 343 | line-height: 40px!important; 344 | padding: 0px 0px!important; 345 | margin-left: auto!important; 346 | margin-right: auto!important; 347 | color: #434343!important; 348 | z-index: 1000; 349 | } 350 | .icon a { 351 | color: #434343!important; 352 | /* 353 | font-size: 2rem; 354 | text-align: center; 355 | line-height: 40px; 356 | */ 357 | } 358 | #menu-icon { 359 | color: white; 360 | } 361 | #status-icon { 362 | font-size: 1.7rem; 363 | top: 12px; 364 | right: 19px; 365 | float: right; 366 | position: absolute; 367 | color: #EFFC1C; 368 | /* outline: 1px solid white; */ 369 | z-index: 2; 370 | } 371 | 372 | /*.legend label, 373 | .legend span { 374 | display: block; 375 | float: left; 376 | height:15px; 377 | width:20%; 378 | text-align:center; 379 | font-size:9px; 380 | color:#808080; 381 | }*/ 382 | #warning { 383 | position: absolute; 384 | /* z-index: 100;*/ 385 | width: 100%; 386 | height: 20px; 387 | background-color: #F2360C; 388 | opacity: 0.8; 389 | text-align: center!important; 390 | color: #fff!important; 391 | } 392 | #warning-text { 393 | font-family: 'Cabin', sans-serif; 394 | text-transform: uppercase; 395 | font-size: .8em; 396 | /* z-index: 100;*/ 397 | width: 100%; 398 | opacity: 1!important; 399 | font-weight: 700; 400 | } 401 | #warning a:link, 402 | #warning a:visited { 403 | color: #fff!important; 404 | } 405 | .pad { 406 | margin-bottom: 3px; 407 | } 408 | 409 | /*MAPBOX/LEAFLET OVERRIDES*/ 410 | 411 | .mapboxgl-ctrl.mapboxgl-ctrl-attrib { 412 | display: none; 413 | } 414 | 415 | .mapboxgl-ctrl-geocoder ul > li.active > a { 416 | background-color: #6B7173; 417 | } 418 | 419 | .mapboxgl-ctrl-geocoder ul { 420 | background-color: #444; 421 | } 422 | 423 | /*MDL OVERRIDES*/ 424 | 425 | .mdl-menu__item a { 426 | display: block; 427 | z-index: 1000; 428 | } 429 | .mdl-snackbar--active { 430 | transform: translate(0, -40px); 431 | } 432 | .mdl-progress { 433 | width: 100%; 434 | } 435 | .mdl-layout__container { 436 | /* z-index: 10; */ 437 | } 438 | .mdl-menu__container { 439 | bottom: 42px; 440 | /* background-color: #404040; */ 441 | color: white; 442 | } 443 | .mdl-menu--top-left { 444 | background-color: #404040; 445 | color: white!important; 446 | } 447 | .mdl-menu__item:hover { 448 | background-color: #4A4A4A; 449 | } 450 | .mdl-menu__outline { 451 | background-color: #404040; 452 | } 453 | .mdl-grid { 454 | padding: 0px!important; 455 | } 456 | .mdl-cell { 457 | /* margin: 0px!important; */ 458 | } 459 | .mdl-layout { 460 | z-index:auto; 461 | overflow-y: hidden!important; 462 | } 463 | .mdl-layout__header-row { 464 | padding-left: 65px; 465 | /* min-height: 54px!important;*/ 466 | height: 32px!important; 467 | background-color: #46474A!important; 468 | margin-left: auto; 469 | margin-right: auto; 470 | } 471 | body > div > div > div > header > img, 472 | .mdl-layout__drawer-button { 473 | z-index: inherit!important; 474 | color: white!important; 475 | /* width: 18px!important;*/ 476 | margin-top: -3px!important; 477 | background-color: none!important; 478 | } 479 | .mdl-button.mdl-js-button.mdl-button--icon { 480 | margin-top: 7px!important; 481 | } 482 | body > div > div > div > div.mdl-layout__drawer.is-visible > span > img { 483 | margin-left: -6px; 484 | } 485 | .mdl-switch__label { 486 | font-size: 1em!important; 487 | font-weight: normal!important; 488 | line-height: 21px; 489 | } 490 | .mdl-tabs__panel { 491 | /* padding-top: 20px;*/ 492 | } 493 | /*.mdl-layout__header-row,*/ 494 | header.mdl-layout__header { 495 | min-height: 35px!important; 496 | z-index: inherit!important; 497 | } 498 | .mdl-layout__drawer>.mdl-layout__title {/* letter-spacing: .2rem!important;*/line-height: 54px!important;/* margin-left: 15px; */font-weight: 100;} 499 | 500 | /*This is a strange thing that obscures the #map on iOS*/ 501 | 502 | .mdl-layout__content { 503 | -webkit-overflow-scrolling: auto!important; 504 | overflow-y: hidden; 505 | } 506 | .mdl-tabs__tab { 507 | color: white!important; 508 | font-size: .8rem!important; 509 | } 510 | .mdl-layout__drawer { 511 | /* background-color: #71767E;*/ 512 | background-color: #46474A!important; 513 | border-right: 1px solid #46474A!important; 514 | } 515 | .drawer-icon { 516 | width: 20px; 517 | position: absolute!important; 518 | margin-top: 16px!important; 519 | margin-left: 16px!important; 520 | } 521 | .mdl-navigation { 522 | padding-left: 15px!important; 523 | padding-right: 15px!important; 524 | color: #eee!important; 525 | padding-top: 0px!important; 526 | font-size: .8rem!important; 527 | } 528 | .mdl-layout__header { 529 | background-color: #46474A!important; 530 | } 531 | .mdl-layout__header .mdl-layout__drawer-button { 532 | background-color: rgba(0,0,0,0) 533 | ;} 534 | 535 | /*TOGGLES*/ 536 | 537 | .mdl-switch__label { 538 | left: 18px 539 | } 540 | .mdl-switch__thumb { 541 | height: 15px!important; 542 | width: 15px!important; 543 | } 544 | .mdl-switch__track { 545 | height: 10px!important; 546 | width: 30px!important; 547 | } 548 | .mdl-switch__ripple-container { 549 | height: 24px; 550 | width: 24px; 551 | } 552 | 553 | /*TITLE*/ 554 | .mdl-layout__title { 555 | font-family: 'Montserrat', sans-serif!important; 556 | text-transform: uppercase!important; 557 | font-size: 1em!important; 558 | color: grey!important; 559 | text-align: center!important; 560 | margin-right: auto; 561 | margin-left: auto; 562 | margin-top: 4px; 563 | } 564 | .app-title { 565 | margin-top: 3px!important; 566 | /* margin-left: 35px; */ 567 | color: #eee!important; 568 | letter-spacing: .3rem!important; 569 | /* vertical-align: middle; */ 570 | font-weight: 100; 571 | } 572 | .mdl-tooltip { 573 | letter-spacing: normal!important; 574 | /* text-transform: lowercase;*/ 575 | font-family: 'open sans', sans-serif; 576 | font-size: .8rem; 577 | color: white; 578 | letter-spacing: .1rem; 579 | margin-top: 10px; 580 | background-color: rgba(242, 54, 12, 0.9); 581 | } 582 | .mdl-tooltip a { 583 | text-decoration: none; 584 | font-weight: bold; 585 | /*color: #F2360C;*/ 586 | } 587 | mdl-layout__header.mdl-layout__drawer-button { 588 | background-color: none!important; 589 | } 590 | .app-title a { 591 | text-decoration: none!important; 592 | color: #eee; 593 | font-size: 1rem; 594 | letter-spacing: .3rem; 595 | } 596 | 597 | /*LAYERS*/ 598 | 599 | .layer-groups { 600 | padding: 0 10px!important; 601 | } 602 | 603 | /* For debugging */ 604 | #features { 605 | position: absolute; 606 | top: 0; 607 | right: 200px; 608 | bottom: 0; 609 | width: 200px; 610 | overflow: auto; 611 | background: rgba(255, 255, 255, 0.8); 612 | z-index: 1000; 613 | } 614 | .info-text { 615 | padding: 0 10px; 616 | } 617 | .info { 618 | position: absolute; 619 | bottom: 38px; 620 | font-size: .8rem; 621 | color: #eee; 622 | /* width: 100%!important; */ 623 | z-index: 3; 624 | max-height: 250px; 625 | overflow: auto; 626 | margin-left: auto; 627 | margin-right: auto; 628 | background-color: #434343; 629 | text-align: center; 630 | } 631 | 632 | .info p { 633 | /* line-height: 1rem; */ 634 | padding: 5px 10px; 635 | /* text-decoration: none;*/ 636 | } 637 | 638 | .info a { 639 | /* color: red;*/ 640 | font-size: 0.9em; 641 | /* text-decoration: none;*/ 642 | } 643 | 644 | #infoblock { 645 | /* background: #434343; */ 646 | width: 100%; 647 | /* padding: 5px 7px; */ 648 | /* bottom: -10px; */ 649 | margin-bottom: 0px; 650 | letter-spacing: .05rem; 651 | } 652 | 653 | #meter-info { 654 | margin-top: 0px; 655 | margin-left: auto; 656 | margin-right: auto; 657 | } 658 | 659 | /*ICONS*/ 660 | 661 | #back i.material-icons { 662 | color: white; 663 | left: 10px; 664 | top: 6px; 665 | position: absolute; 666 | } 667 | #map.interacting .mapboxgl-canvas-container.mapboxgl-interactive, 668 | #map.interacting .mapboxgl-ctrl-nav-compass, 669 | #map.interacting.leaflet-container { 670 | cursor: pointer; 671 | } 672 | .ui-select { 673 | background: #fff; 674 | position: absolute; 675 | top: 10px; 676 | right: 10px; 677 | z-index: 100; 678 | padding: 10px; 679 | border-radius: 3px; 680 | } 681 | 682 | /*MAP*/ 683 | 684 | #map { 685 | position: absolute; 686 | top: 0; 687 | bottom: 0px; 688 | width: 100%; 689 | } 690 | 691 | @media only screen and (min-width: 992px) { 692 | .mapboxgl-control-container .leaflet-control-locate { 693 | /* display: none;*/ 694 | } 695 | } 696 | 697 | @media only screen and (max-width: 855px) { 698 | #map, 699 | .info { 700 | padding-left: 0px; 701 | margin-left: 0px!important; 702 | } 703 | .leaflet-top { 704 | top: 50px; 705 | } 706 | .mapboxgl-ctrl-top-left { 707 | top: 50px; 708 | left: 1px; 709 | } 710 | } 711 | 712 | .mapbox-maplogo { 713 | position: fixed; 714 | display: block; 715 | height: 20px; 716 | width: 65px; 717 | right: 10px; 718 | bottom: 50px; 719 | text-indent: -9999px; 720 | z-index: 3; 721 | overflow: hidden; 722 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAAoCAMAAAAFWtJHAAAAwFBMVEUAAAAAAAAAAABtbW0AAAAAAAAAAAAAAAAAAAAAAAClpaUAAADp6ekAAAD5+fna2toAAAAMDAzv7+/Nzc0AAAA2Njb8/Pz9/f3T09MAAAAAAAD7+/sAAAArKyuxsbH39/fs7OwbGxuIiIjz8/N8fHyenp7u7u74+PgAAAC8vLxWVlbx8fF1dXXl5eVcXFyUlJTQ0NDFxcVCQkLAwMC4uLj19fXo6OjW1tarq6ve3t77+/vi4uL6+vrKysrNzc3///8w7gSSAAAAP3RSTlMAOQNdPSYBPywKexLLGPCxNEHXnzFL+v2nGwf1IEiE6dBFad9jd9PuLo1V2mDDV3Cjl06SiuXIq4C3973ym6BQMVUPAAAEXElEQVR4Ae2WCVP6OBiH05L0l1IqrVbkKHJ54I0oHn+PfP9vtUle0z/YdhbH2XVnd58ZnRJIeHiPJOx//mH4vQSAN+8FjAhFxgHIaPvJeZ99hxwEElon5iAQbj85Y98g8ODwjEOMAvGFyeE3FEKgodTBqj0BJGN9DhyNd5Ta3ean9QEopfaA+LsKhnEKRExqg4FSP6Og7oEkAjBWnxSCgBX4xF+kcLoPcOBQrSv0e5kH7s1j37jECQieCTPiFGxL5VHw2zQWCeeJiPt6kjRQw0XSkIdVChf67xGa4alSnZlT6HEQ8CK9ANbhvXUF9xlDkBfTuHDWScgC9+z5FQpPI12TlwC6+sV7ixR8CUMKiwjm2GQeOQWHMGuHGdbnObJAwCEqFJpNU5H6uaPUaEIKiQfg+PHk1+u4OwW9PlWW2ctbA4BHCtp+cNK+H8Jos4gDmC5ar4Nx9waaG/2B13NgDqS7+vm2RgEtEws82P+kwIHhs/pgkQKcFIhfd7CogtGNjYMHTLpurD0ERbYFw4JaD3GlQuNAL/JEsSAF4HqlCnaHACk4WhOn4OgCkMD5hSpYNYDJTD8Y46n+jsE1kPhVCuR6QBXhFK7MUOu9O6b1SWF3b+/9ZVWMGOlu93E8UDaAhgc7bfH+0DHqKXCkHzoNDFfU+zxiVQrUC9QXTuHYtKpN59OA3IxCG4b7jh6ZFuVockaNTW09mkJzOaPU49a6mE9cAchZpQJNpUWcwgV9r6FJswsFKrITp2B5pMBMdnS0z2HZNy2+BNKxSZxZfglkrFYBJxQnpzA5sN/HheR2aFQoZBLAi149dQoyAYYjW0hHlHguBAdMcR0DuDZ5omevX6+AI8qcU7ikKT3GBHCnXwydgmCC0tRwCnGQ2Wp6Be71yNIWfQSkOl9vAI1SBCNWrwC01RROgX7BuT2HI4r7tFAw086p/NwZEdOEa7R1uAFuNmQPuKAEAjYNQ0CyeoUEWHYBnpQVQgpvc0Ph+gsKlAnKg1+vEHsw5LKciLKCAJobiWBzYFGbCKpHqkZZrxBFHEASyFI59vJPCskcwNVGOWZAOqsrR+pKbaNeAMT1CixMEtlnsqopNxUMzVJT3tY35aXZm6a6Y9QhwMN6BUJWbE1lhbMO1WehkO7poO0sK7em9MJGxp1XSbC1gtugzzSLQmGsX7VntJGSwsPZ2d2z3bIPKzdoOp3Wzqt8G4XyMVUoFIxLx1S7+piaHtCvR3FeRVsq0GFdp9C5TbGpcNqsPqyHKxcfd14h21KhuLKUFU4f3osrC7F6uV3WXFnadL7wyAPeKDXw2RoJCO5GY4DouYvb/gepVXheLoewzPseQG9N/vzilrMIjoStE3++zvle4eSurw7XEe76ynI4aq+v7lEyt1x5awiFlFLQbHKIpabnM3eJLym4Szzzc/du7SU+zOXv9UNpECH7IoH/gecURPlN9vdQpeD47yhIFNX0U0QgvID9nENm+yxk/xb+AGAjNfRZuk9qAAAAAElFTkSuQmCC); 723 | background-repeat: no-repeat; 724 | background-position: 0 0; 725 | background-size: 65px 20px; 726 | } 727 | 728 | .mapboxgl-control-container a { 729 | padding-left: 10px; 730 | padding-top: 4px; 731 | } 732 | 733 | .mapboxgl-control-container a { 734 | /* 735 | width: 20px; 736 | height: 25px; 737 | border-bottom: none; 738 | */ 739 | } 740 | 741 | .mapboxgl-control-container a { 742 | /* border-color: rgba(.75, .75, .75, .4);*/ 743 | } 744 | #made-in-philly img { 745 | width: 10px; 746 | } 747 | #made-in-philly { 748 | position: absolute; 749 | float: left; 750 | left: 0px; 751 | bottom: 39px; 752 | z-index: 2; 753 | /* display: block; */ 754 | color: white; 755 | font-size: .8rem; 756 | padding-right: 2px; 757 | padding-bottom: 2px; 758 | background-color: rgba(146,153,165, 0.8); 759 | border-top-right-radius: 2px; 760 | padding-left: 3px; 761 | font-family: 'Open Sans', sans-serif; 762 | } 763 | #analytics-legend { 764 | left: 10px; 765 | bottom: 60px; 766 | position: fixed; 767 | display: block; 768 | width: 150px; 769 | height: 100px; 770 | background-color: #666; 771 | opacity: 0.8; 772 | z-index: 2; 773 | padding: 3px; 774 | } 775 | #analytics-legend h6 { 776 | text-align: center; 777 | margin-top: 1px; 778 | font-size: .7rem; 779 | } 780 | -------------------------------------------------------------------------------- /css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} --------------------------------------------------------------------------------