├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── _config.yml ├── _includes ├── action.html ├── beispiele.html ├── faq.html ├── footer.html ├── head.html ├── header-small.html ├── header.html ├── how.html ├── js.html └── why.html ├── _layouts ├── default.html └── single.html ├── css ├── agency.css ├── bootstrap.min.css ├── fonts.css └── style.css ├── data └── plz2lkr.csv ├── favicon.ico ├── favicon.png ├── fonts ├── droid-serif-latin-400.woff ├── droid-serif-latin-400.woff2 ├── droid-serif-latin-400italic.woff ├── droid-serif-latin-400italic.woff2 ├── droid-serif-latin-700.woff ├── droid-serif-latin-700.woff2 ├── droid-serif-latin-700italic.woff ├── droid-serif-latin-700italic.woff2 ├── montserrat-v25-latin-700.woff ├── montserrat-v25-latin-700.woff2 ├── montserrat-v25-latin-regular.woff ├── montserrat-v25-latin-regular.woff2 ├── roboto-slab-v24-latin-100.woff ├── roboto-slab-v24-latin-100.woff2 ├── roboto-slab-v24-latin-300.woff ├── roboto-slab-v24-latin-300.woff2 ├── roboto-slab-v24-latin-700.woff ├── roboto-slab-v24-latin-700.woff2 ├── roboto-slab-v24-latin-regular.woff └── roboto-slab-v24-latin-regular.woff2 ├── img ├── about │ ├── 1.jpg │ ├── 3.jpg │ └── 4.jpg ├── okfn-logo.svg ├── opendata-map.png ├── share │ ├── alexa.jpg │ ├── befoerderungsfall.jpg │ ├── escalator.jpg │ ├── fahrplan.jpg │ ├── mainframe.jpg │ ├── netzplan.jpg │ ├── preisauskunft.jpg │ ├── startup.jpg │ ├── uber.jpg │ └── underground.jpg └── why │ ├── future.jpg │ ├── preisauskunft.jpg │ └── rails.jpg ├── index.html ├── js ├── agency.js ├── deps.js ├── html5shiv.js ├── libs │ ├── bootstrap.min.js │ ├── cbpAnimatedHeader.js │ ├── cbpAnimatedHeader.min.js │ ├── classie.js │ ├── jqBootstrapValidation.js │ ├── jquery-1.11.0.js │ ├── jquery.easing.min.js │ ├── jspdf-1.3.2.min.js │ ├── papaparse.min.js │ └── tabletop-1.5.1.min.js ├── lobbyingo.js ├── respond.min.js └── webfont.js ├── landkreise ├── geonames-missing.csv ├── landkreise.gnumeric ├── ort2kreis.json ├── plz2kreisschluessel.csv └── plzort2kreisschluessel.csv ├── ogimage.png └── status.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.swp 3 | *~ 4 | .DS_Store 5 | .analysis 6 | .bundle/ 7 | .byebug_history 8 | .jekyll-metadata 9 | .ruby-gemset 10 | .ruby-version 11 | .sass-cache 12 | /test/source/file_name.txt 13 | /vendor 14 | Gemfile.lock 15 | _site/ 16 | bin/ 17 | bbin/ 18 | coverage 19 | gh-pages/ 20 | pkg/ 21 | site/_site/ 22 | test/dest 23 | tmp/* 24 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | rettedeinennahverkehr.de -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rette deinen Nahverkehr 2 | 3 | Offene Fahrplandaten statt vernagelter Systeme. 4 | [rettedeinennahverkehr.de](https://rettedeinennahverkehr.de/) 5 | 6 | ## Aktionswebseite 7 | 8 | Diese Seite basiert auf [jekyll](https://jekyllrb.com). 9 | 10 | Für die Auflösung PLZ -> Ansprechpartner, passieren zwei Schritte: 11 | * PLZ zu Landkreiskennzahl (adminCode3) über die [`data/plz2lkr.csv`](data/plz2lkr.csv) (Q: [http://opendata.blattspinat.com](http://opendata.blattspinat.com)) 12 | * Nachschlagen von Ansprechpartner, Verkehrsverbund, etc. durch [tabletop](https://github.com/jsoma/tabletop) in [Google Sheets](https://docs.google.com/spreadsheets/d/1MNPMJGdsoKYNwmdMAE3R8rZSO0B5jxrtlvadrFfMyQ8/pubhtml) 13 | 14 | Die Daten stammen aus der OpenStreetMap, GeoBasis-DE / BKG 2015, Wikidata und manueller Sammlung aus Stadt-/Landkreiswebsites. 15 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | url: https://rettedeinennahverkehr.de 2 | baseurl: "" 3 | 4 | # Site settings 5 | title: Rette Deinen Nahverkehr 6 | email: info@okfn.de 7 | description: "Rette deinen Nahverkehr! Offene Fahrplandaten statt vernagelter Systeme" 8 | 9 | # Color settings (hex-codes without the leading hash-tag) 10 | color: 11 | primary: fed136 12 | secondary: fec503 13 | secondary-dark: 333 14 | 15 | # Build settings 16 | markdown: kramdown 17 | permalink: pretty 18 | exclude: 19 | - README.md 20 | - CNAME 21 | - LICENSE -------------------------------------------------------------------------------- /_includes/action.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

Wie kann auch Dein Verbund Daten beitragen?

7 |

Wir brauchen den politischen Willen, offene Daten für die Mobilität von morgen anzubieten. Hilf mit, deinen Verbund zu öffnen!

8 |
9 |
10 |
11 |
12 |

Offene Daten statt teurer Projekte

13 |

Obwohl sie seit dem 1. Dezember 2019 durch EU-Verordnung dazu verpflichtet sind, bieten noch lange nicht alle Verkehrsverbünde und -unternehmen ihre Fahrpläne als Open Data an. Viele Verbünde sind immer noch der Ansicht, den Routenplaner für die Zukunft ganz alleine stemmen zu können, und investieren gemeinsam viele Millionen Euro aus Steuergeldern für nicht sonderlich innovative Großprojekte. Du kannst mithelfen, diesen Kurs zu ändern!

14 |

Leider täuschen auch einige Verbünde ihre Gesellschafter (die Landkreise und kreisfreien Städte), indem sie vorgeben, Open Data bereitzustellen, während sie in Wirklichkeit Openwashing betreiben: Sie stellen zwar Daten bereit, diese sind jedoch nicht diskriminierungs- und barrierefrei erhältlich. So stellt beispielsweise eine ganze Reihe von Verbünden ihre Daten unter – theoretisch – freier Lizenz bereit, erwartet von Dir jedoch, dass Du Dich dafür ganz ohne Not bei einer privatwirtschaftlich betriebenen Plattform registrierst, die von Dir auch wissen will, zu welchem Zweck Du die Daten verwendest. Das halten wir für eine unzulässige Hürde, zumal nicht gesichert ist, dass Du die Daten wirklich zu jedem Zweck nutzen darfst. Wir rufen Dich daher dazu auf, die zuständigen LandrätInnen zur Bereitstellung der Daten ohne jede Hürde aufzufordern!

15 | 16 | 17 |
18 |
19 | 20 |
21 | 22 |
23 |
24 |
25 | 26 |
27 | 31 |
32 | 33 |
34 | 38 |

39 | Aber das ist nicht schlimm, du kannst trotzdem eine 40 | 41 | 42 | Briefvorlage herunterladen 43 | 44 |

45 |
46 | 47 |
48 | 52 |

53 | Es gibt aber noch viele viele Verkehrsverbünde, wo das nicht der Fall ist. 54 |

55 |

56 | Zeig' diese Seite Deinen Freunden und hilf auch ihnen, ihren Nahverkehr zu retten: 57 | Twitter 58 | • 59 | Facebook 60 |

61 |
62 | 63 |
64 |
65 | 79 |
80 | 81 |
82 |
83 |

Schreibe den Verantwortlichen in den Gebietskörperschaften Deines Verkehrsverbundes – und zwar keine E-Mail, sondern einen ganz klassischen Brief! Wir haben Dir einen Vorschlag vorformuliert, du musst nur noch Unterschreiben und abdingsen.

84 | 85 |

Wenn du möchtest, kann der Brief gleich mit deinem Namen und Adresse befüllt werden:

86 |
87 |
88 | 89 |
90 | 91 |
92 |
93 |
94 | 95 |
96 | 97 |
98 |
99 |
100 | 101 |
102 |
103 |
104 | 105 |
106 |
107 |
108 | 109 |
110 |

Falls du eine mögliche Antwort lieber als E-Mail statt als Brief bekommen möchtest:

111 | 112 | 113 |
114 | 115 |
116 |
117 |
118 | 119 | 120 | 121 | Brief herunterladen 122 | 123 | 124 |

Der Brief wird komplett in deinem Browser erstellt, deine Daten wandern nicht übers Internet und werden somit auch nicht gespeichert.

125 | 126 |
127 | 131 |
132 | 133 |

Du möchtest den Brieftext selbst noch etwas anpassen? Brieftext kopieren

134 |

Die vorgeschlagene Person stimmt nicht (mehr)? Melde dich bei uns

135 | 136 | 137 | 138 |
139 | 143 |

144 | Zeig' diese Seite Deinen Freunden und hilf auch ihnen, ihren Nahverkehr zu retten: 145 | Twitter 146 | • 147 | Facebook 148 |

149 |
150 |
151 |
152 |

Rufe die Verantwortlichen in den Gebietskörperschaften Deines Verkehrsverbundes an!

153 | 154 |

155 |

Lass dich zu verbinden.

156 | 157 |
158 |

159 | Warum diese Person? Die meisten Landrät*innen und (Ober-)Bürgermeister*innen sitzen im (Aufsichts-)Rat ihrer jeweiligen Verkehrsverbünde. Somit hast du direkten Kontakt zu jemanden, der dort politisch etwas bewegen kann. 160 |

161 |

Hinweise:

162 |

163 | Falls du nicht direkt mit sprechen kannst: nicht schlimm. 164 | Versuche beim Sekretariat/Vorzimmer eine Notiz aufnehmen zu lassen. 165 |

166 |

Wir haben dir unten in den FAQ Argumente und Statements für die wichtigsten Punkte vorformuliert. Lies sie dir am besten vor dem Anruf kurz durch um dich vorzubereiten.

167 |
168 | 169 |
170 | 174 |

175 | Zeig' diese Seite Deinen Freunden und hilf auch ihnen, ihren Nahverkehr zu retten: 176 | Twitter 177 | • 178 | Facebook 179 |

180 |
181 |
182 |
183 |
184 |
185 |
186 |

187 |
188 |
189 |
190 |
191 |

192 | Du hast bereits eine Antwort oder Rückfragen erhalten? Wir helfen gerne weiter - und freuen uns über Rückmeldungen. 193 |

194 |
195 |
196 |
197 |
198 | -------------------------------------------------------------------------------- /_includes/beispiele.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

Beispiele

7 |

Wie bereits jetzt Nahverkehr besser gemacht wird.

8 |
9 |
10 |
11 | {% for post in site.posts %} 12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 | 20 |
21 |
22 |

{{ post.title }}

23 |

{{ post.subtitle }}

24 |
25 |
26 | {% endfor %} 27 |
28 |
29 |
30 | -------------------------------------------------------------------------------- /_includes/faq.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

FAQ: Offene Fahrplan­daten

7 |
8 |
9 |
10 |
11 |
12 |
Moderne Fahrplanauskunft
13 |
Eine Fahrplanauskunft gehört zu den Grundaufgaben eines Verkehrsverbundes. In Zeiten von Internet und Smartphones sind Papierfahrpläne oder PDFs nicht mehr zeitgemäß. Mit dem öffentlichen Bereitstellen von maschinenlesbaren Fahrplandaten können sich kleine Verkehrsverbünde die teure Entwicklung eigener Apps ersparen. Aber auch Verkehrsverbünde, welche bereits eigene Apps haben müssen so nicht selbst auf jede neue Technologie aufspringen (wie z.B. sprachgesteuerte Auskünfte auf dem Amazon Echo), weil sich durch die Bereitstellung der Daten private Software-Entwickler oder Firmen finden werden, die innovative Anwendungen entwickeln werden oder die Fahrpläne des Verkehrsverbundes in schon bestehende Anwendungen integrieren können.
14 |
Gerade für Fahrgäste, die in verschiedenen Regionen mit dem ÖPNV unterwegs sind oder Touristen, können offene Fahrplandaten eine große Hilfe sein, weil sie nicht für jede Region oder Stadt eine eigene App herunter laden müssen oder sich die Adressen der verschiedenen Fahrplanauskunftsseiten merken müssen. 15 | Sind die Fahrplandaten offen, können Entwickler viele Verbünde in einer App vereinen. Beispiele für solche Anwendungen sind z.B. TransitApp oder Citymapper.
16 |
Mit Freien/Open-Source-Lösungen wie dem auf OpenTripPlanner basierenden digitransit lassen sich zudem auch ganz andere Mobilitätsmodi mit dem Nahverkehr vereinen: Neben Bus und Bahn werden dort dann auch Leihräder, E-Scooter oder gar Mitfahrgelegenheiten in die Auskunft einbinden.
17 | 18 |
Der gibt die Daten bereits an Google
19 |
Google erhält für Google Maps bereits die Fahrplandaten des . Google zahlt dafür kein Geld. Außerdem liegen damit die Fahrplandaten schon im passendem Format beim Verkehrsverbund vor. Es entsteht also kein weiterer Aufwand und keine weiteren Kosten beim Verbund für den Export der Daten.
20 | 21 |
Barrierefreiheit
22 |
Mit freien Fahrplandaten ist es möglich Anwendungen zu entwickeln, die angepasste Fahrplanauskünfte für eine spezielle Zielgruppe geben können. So sind Anwendungen, speziell für Rollstuhlfahrer denkbar, die auch auf andere OpenData-Quellen zugreifen und so z.B. bei der Routenberechnung beachten, dass ein Aufzug temporär nicht funktionsfähig ist.
23 |
Aber auch Anwendungen für blinde Menschen, mit denen die Auskunft per Sprachausgabe realisiet wird, sind mit offenen Fahrplandaten möglich.
24 | 25 |
Verkehrsplanung
26 |
Auch für die Verkehrsplanung können die Daten interessant sein. Es gibt z.B. schon eine fertige Anwendung, welche aus GTFS-Daten eine ÖPNV-Erreichbarkeitsanalyse für jeden beliebigen Ort (im Fahrplanbereich) in Sekundenschnelle erzeugt. In der Zwischenzeit sind Anwendungen wie Remix entstanden, mit denen VerkehrsplanerInnen GTFS-Fahrpläne sowie statistische Daten ihrer Stadt importieren und live sehen können, wie sich Änderungen in der Linienführung auf die Bevölkerung auswirken würde.
27 | 28 |
Tourismus & Verkehr
29 |
Mit offenen Fahrplandaten können Fahrplanauskünfte auch in Apps integriert werden, deren Hauptzweck nicht die Fahrplanauskunft ist. So können Auto-Navigationssysteme z.B. Park&Ride Parkplätze besser in ihre Routenführung integrieren oder Stadtführerapps die Gäste der Stadt mit dem ÖPNV zu Sehenswürdigkeiten leiten.
30 |
Mit solch einer Verbreitung in Apps können neue Benutzergruppen für den ÖPNV gewonnen werden, welche sonst nur das Auto benutzt hätten.
31 |
Aber auch für innovative Verkehrsleitsysteme und bei Großveranstaltungen sind offene Fahrplandaten ein wichtiger Baustein und können so zur Entspannung der Park- und Verkehrssituation beitragen.
32 |
Offene Fahrplandaten sind somit auch ein Bestandteil der intelligenten Stadt der Zukunft.
33 | 34 |
Keine Verträge
35 |
Allein in Deutschland gibt es über hundert Verkehrsverbünde. Alle Softwareentwickler*innen, die mit Verkehrsdaten arbeiten wollen, müssen momentan bei allen diesen Verbünden nachfragen und eigene Verträge aushandeln. Damit bleibt keine Zeit mehr für die Umsetzung der eigentlichen Idee. Diese Verhandlungen sind Arbeit, welche sich vielleicht riesige Firmen wie Google oder Apple leisten können, für ehrenamtliche Entwickler*innen oder lokale Startups ist dieser Aufwand allerdings nicht zu stemmen. Dies hält momentan viele Menschen mit innovativen Ideen davon ab, Anwendungen für den ÖPNV zu entwickeln. Deswegen ist es wichtig, dass die Fahrplandaten ohne Anträge, Verträge, NDAs oder anderen Zusatzbedingungen unter einer freien, allgemein bekannten Lizenz – oder als Faktendaten gleich vollständig gemeinfrei – als OpenData bereit gestellt werden.
36 | 37 |
Keine Angst vor falschen Auskünften
38 |
Oft haben die Verbünde Angst, dass mit freien Fahrplandaten falsche Auskünfte gegeben werden. Allerdings ist dieses Problem ohne freie, offizielle Daten noch viel wahrscheinlicher, weil aufgrund der fehlenden offiziellen Daten eigene Datensätze erzeugt und benutzt werden. Diese Daten sind dann oft unvollständig, veraltet oder fehlerhaft. Sobald es einen offiziellen Datensatz gibt, werden alle Anwendungen auf diesen umsteigen und können so verlässlichere Auskünfte geben.
39 | 40 |
Warum GTFS?
41 |
GTFS ist ein weltweit verbreitetes Format zum Austausch von Sollfahrplänen. Durch diese weite Verbreitung müssen Anwendungen nur einmal geschrieben werden und können dann an jedem Ort auf diesem Planeten, an dem GTFS-Fahrpläne veröffentlicht werden, ohne große Anpassungen genutzt werden. Außerdem handelt es sich bei GTFS-Dateien um Rohdaten und nicht um eine Schnittstelle deren Stabilität und Verfügbarkeit man als Entwickler nicht beeinflussen kann. Erst durch Rohdaten wird ein angepasstes Routing möglich, welches andere Datenquellen wie z.B. den Betriebszustand von Aufzügen mit in die Routenberechnung einbeziehen kann.
42 | 43 |
Und wie sieht es mit Echtzeitdaten aus?
44 |
GTFS unterstützt auch Abweichungen vom Fahrplan — dafür gibt es die GTFS Realtime Extension. Zusätzlich zum normalen Sollfahrplan im GTFS-Format gibt es dann Feeds, die Abweichungen, Störungen und die Echtzeitpositionen der Fahrzeuge übertragen.
45 |
46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 |
54 |
55 |

FAQ: Rette deinen Nahverkehr

56 |
57 |
58 |
59 |
60 |
61 |
Warum schicken wir nicht einfach eine E-Mail?
62 |
E-Mails lassen sich einfach in den üblichen Mailprogrammen wegfiltern - Briefe und Anrufe erzeugen jedoch Aufmerksamkeit, da sich jemand damit zumindest kurz beschäftigen muss. Du kannst aber trotzdem deine E-Mail-Adresse auf dem Briefkopf eintragen, sodass du eine mögliche Antwort schneller erhälst.
63 | 64 |
Warum muss ich meine Postleitzahl eingeben?
65 |
Nahverkehr ist ein sehr lokales Thema. Obwohl sich die Verkehrsverbünde auch deutschlandweit zusammenschließen, müssen wir immernoch jeden Verbund einzeln überzeugen, Daten zu öffnen. Damit wir gleich deinen passenden Verbund und deine Ansprechpartner*in anzeigen und die Briefvorlage befüllen können, benötigen wir deine PLZ. Diese wird jedoch nicht an den Server übertragen - das Heraussuchen des Verbundes und der passenden Person erfolgt komplett in deinem Browser.
66 | 67 |
Warum bekommt genau die angezeigte Person den Brief?
68 |
Recht einfach: Die meisten Landrät*innen und (Ober-)Bürgermeister*innen sitzen im (Aufsichts-)Rat/Mitgliederversammlungen/... ihrer jeweiligen Verkehrsverbünde. Da die Verbünde bislang "aus Gründen" eher ablehnend reagierten, passiert nun der direkte Kontakt zu jemanden, der/die dort politisch etwas bewegen kann.
69 | 70 |
Welche Briefmarke brauche ich?
71 |
Wenn du mit der Deutschen Post verschickst, brauchst du eine 85ct Briefmarke. Oft geht es am Briefmarkenautomaten am schnellsten.
72 | 73 |
Woher stammen die Adressen und Telefonnummern der Ansprechpartner?
74 |
Es gab anscheinend bislang keine fertige Liste aller Landrät*innen und Oberbürgermeister*innen. Daher haben wir in den Wochen nach dem Future Mobility Camp 2017 über 400 Landkreis- und Städtewebseiten besucht und Namen, Adressen und Telefonnummern von Hand eingesammelt (zum Dokument).
75 | 76 |
Die Adresse/Telefonnummer stimmt nicht.
77 |
Oh, dann ist uns entweder beim Einsammeln von den Landkreis-/Städtewebseiten ein Fehler unterlaufen, oder auf der jeweiligen Webseite standen veraltete Daten. Schicke uns eine E-Mail, dann korrigieren wir es schnellstmöglich.
78 | 79 |
Aber das ist doch nicht das einzige/wichtigste Problem bei unserem Verbund?!
80 |
Ja - eine solide Grundfinanzierung und andere Dinge sind bei den Verbünden wichtiger. Jedoch bearbeiten und beobachten wir nun die Verfügbarkeit von Fahrplandaten in Deutschland nun seit 2010 und teilweise noch länger - und es hat sich insbesondere im internationalen Vergleich leider immer noch zu wenig getan. Und anstatt als Verbund auf jeden neuen Zug (wie z.B. sprachgesteuerte Auskünfte auf dem Amazon Echo, VR, ...) aufspringen zu müssen, ist es einfacher und günstiger, die Fahrplandaten einfach offen herauszugeben - dann können freiwillige Entwickler*innen innovative Angebote schaffen, die dem ganzen Verbund und uns allen zu gute kommen.
81 |
82 |
83 |
84 |
85 |
86 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 25 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /_includes/header-small.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 | 2 | 42 | 43 | 44 |
45 |
46 |
47 |
Rette deinen Nah­verkehr!
48 |
Offene Fahrplan­daten statt vernagelter Systeme
49 |
Für die Mobilität von morgen brauchen wir offene Fahrplandaten für alle.
50 | Momentan geben die Verkehrs­verbünde ihre Daten aber nicht heraus.
51 | 54 |
55 |
56 |
57 | -------------------------------------------------------------------------------- /_includes/how.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

Wie geht das?

7 |

Mit offenen Daten und offenen Standards.

8 |
9 |
10 |
11 |
12 | 123 |
124 |
125 |
126 |
127 | -------------------------------------------------------------------------------- /_includes/js.html: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% if jekyll.environment == "production" %} 26 | 27 | 40 | 41 | {% else %} 42 | 43 | {% endif %} 44 | -------------------------------------------------------------------------------- /_includes/why.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

Warum sind Offene Fahrplan­daten wichtig?

7 |

So könnte moderner, angenehmer Nahverkehr aussehen!

8 |
9 |
10 |
11 |
12 |

13 |
14 |
15 |

Deine ganz persönliche Fahrplanauskunft anstatt One-Size-Fits-All

16 |

Du kannst auf deiner Pendelstrecke schneller umsteigen als alle anderen? Du fährst beim Stadturlaub lieber mit dem Bus die schöne Uferstrecke entlang, auch wenn das drei Minuten länger dauert? Oder benötigst Du einen Aufzug, um barrierefrei vom und zum Gleis zu kommen? Bisherige Auskunftapps meinen besser zu wissen als Du, was für Dich richtig ist. Dein Verkehrsverbund lässt Dich nur sehr eingeschränkt eigene Einstellungen vornehmen. Mit offenen Fahrplandaten findest Du eine App, die genau auf Deine Bedürfnisse zugeschnitten ist.

17 |
18 |
19 | 20 |
21 |
22 |

23 |
24 |
25 |

Fahrrad, Stadtbus, Carsharing – alles aus einer Hand!

26 |

Einfach nur Bus fahren war gestern. In Zeiten von Bike- und Carsharing willst Du eine App, die Dich lückenlos von A nach B bringt – egal in welcher Stadt Du bist und egal, welche Verkehrsmittelkombination Du verwenden möchtest. 27 |
Auch Verbundgrenzen sind kein Problem mehr. „Preisauskunft nicht möglich“? Vergangenheit! Egal von wo, egal wohin, egal womit du fährst. Einfach, schmerzfrei, auf Dich und Deine Bedürfnisse zugeschnitten.

28 |
29 |
30 | 31 |
32 |
33 |

34 |
35 |
36 |

Innovation für alle, anstatt Google das Feld überlassen

37 |

Viele Verkehrsverbünde halten ihre Fahrpläne bereits im weltweiten Austauschformat GTFS vor – stellen sie aber allein Google für den Routenplaner auf Google Maps zur Verfügung. Während Hacker*innen, Entwickler*innen oder Designer*innen keine Chance haben, an die Fahrplandaten zu kommen, wird Google zum Quasi-Monopolisten für deutschlandweite Fahrplanauskünfte. Offene Fahrplandaten gemeinfrei bereitgestellt oder – genau dann, wenn zweifelsfrei Urheber- oder Leistungsschutzrechte zum tragen kommen – wenigstens unter freier Lizenz ebnen das Spielfeld ein und gewähren allen die Entwicklung spannender neuer Anwendungen.

38 |
39 |
40 | 41 |
42 |
43 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {% include header.html %} 6 | {{ content }} 7 | {% include footer.html %} 8 | {% include js.html %} 9 | 10 | 11 | -------------------------------------------------------------------------------- /_layouts/single.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {% include header-small.html %} 6 |
7 |
8 |
9 |
10 | {{ content }} 11 |
12 |
13 |
14 |
15 | {% include footer.html %} 16 | 17 | 18 | -------------------------------------------------------------------------------- /css/agency.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Agency Bootstrap Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | body { 8 | overflow-x: hidden; 9 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 10 | color: #{{ site.color.secondary-dark }}; 11 | } 12 | 13 | body.wf-active { 14 | font-family: "Roboto Slab","Helvetica Neue",Helvetica,Arial,sans-serif; 15 | } 16 | 17 | .text-muted { 18 | color: #777; 19 | } 20 | 21 | .text-primary { 22 | color: #{{ site.color.primary }}; 23 | } 24 | 25 | p { 26 | font-size: 14px; 27 | line-height: 1.75; 28 | } 29 | 30 | p.large { 31 | font-size: 16px; 32 | } 33 | 34 | a, 35 | a:hover, 36 | a:focus, 37 | a:active, 38 | a.active { 39 | outline: 0; 40 | } 41 | 42 | a { 43 | color: #4caf50; 44 | } 45 | 46 | a:hover, 47 | a:focus, 48 | a:active, 49 | a.active { 50 | color: #4caf50; 51 | } 52 | 53 | h1, 54 | h2, 55 | h3, 56 | h4, 57 | h5, 58 | h6 { 59 | text-transform: uppercase; 60 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 61 | font-weight: 700; 62 | } 63 | 64 | .wf-active h1, 65 | .wf-active h2, 66 | .wf-active h3, 67 | .wf-active h4, 68 | .wf-active h5, 69 | .wf-active h6 { 70 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 71 | } 72 | 73 | .img-centered { 74 | margin: 0 auto; 75 | } 76 | 77 | .bg-light-gray { 78 | background-color: #f7f7f7; 79 | } 80 | 81 | .bg-darkest-gray { 82 | background-color: #222; 83 | } 84 | 85 | .btn-primary { 86 | border-color: #{{ site.color.primary }}; 87 | text-transform: uppercase; 88 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 89 | font-weight: 700; 90 | color: #fff; 91 | background-color: #{{ site.color.primary }}; 92 | } 93 | 94 | .wf-active .btn-primary { 95 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 96 | } 97 | 98 | .btn-primary:hover, 99 | .btn-primary:focus, 100 | .btn-primary:active, 101 | .btn-primary.active, 102 | .open .dropdown-toggle.btn-primary { 103 | border-color: #{{ site.color.primary }}; 104 | color: #fff; 105 | background-color: #{{ site.color.secondary }}; 106 | } 107 | 108 | .btn-primary:active, 109 | .btn-primary.active, 110 | .open .dropdown-toggle.btn-primary { 111 | background-image: none; 112 | } 113 | 114 | .btn-primary .badge { 115 | color: #{{ site.color.primary }}; 116 | background-color: #fff; 117 | } 118 | 119 | .btn-xl { 120 | padding: 20px 40px; 121 | border-color: #{{ site.color.primary }}; 122 | border-radius: 3px; 123 | text-transform: uppercase; 124 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 125 | font-size: 18px; 126 | font-weight: 700; 127 | color: #fff; 128 | background-color: #{{ site.color.primary }}; 129 | } 130 | 131 | .wf-active .btn-xl { 132 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 133 | } 134 | 135 | .btn-xl:hover, 136 | .btn-xl:focus, 137 | .btn-xl:active, 138 | .btn-xl.active, 139 | .open .dropdown-toggle.btn-xl { 140 | border-color: #{{ site.color.primary }}; 141 | color: #fff; 142 | background-color: #{{ site.color.secondary }}; 143 | } 144 | 145 | .btn-xl:active, 146 | .btn-xl.active, 147 | .open .dropdown-toggle.btn-xl { 148 | background-image: none; 149 | } 150 | 151 | .navbar-default { 152 | border-color: transparent; 153 | background-color: #4CAF50; 154 | display: none; 155 | } 156 | 157 | .navbar-default .navbar-brand { 158 | text-transform: uppercase; 159 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 160 | font-weight: 400; 161 | color: #fff; 162 | } 163 | 164 | .wf-active .navbar-default .navbar-brand { 165 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 166 | } 167 | 168 | .navbar-default .navbar-brand:hover, 169 | .navbar-default .navbar-brand:focus, 170 | .navbar-default .navbar-brand:active, 171 | .navbar-default .navbar-brand.active { 172 | color: #{{ site.color.secondary }}; 173 | } 174 | 175 | .navbar-default .navbar-collapse { 176 | border-color: rgba(255,255,255,.02); 177 | } 178 | 179 | .navbar-default .navbar-toggle { 180 | border-color: #{{ site.color.primary }}; 181 | background-color: #{{ site.color.primary }}; 182 | } 183 | 184 | .navbar-default .navbar-toggle .icon-bar { 185 | background-color: #fff; 186 | } 187 | 188 | .navbar-default .navbar-toggle:hover, 189 | .navbar-default .navbar-toggle:focus { 190 | background-color: #{{ site.color.primary }}; 191 | } 192 | 193 | .navbar-default .nav li a { 194 | text-transform: uppercase; 195 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 196 | font-weight: 400; 197 | letter-spacing: 1px; 198 | color: #fff; 199 | } 200 | 201 | .wf-active .navbar-default .nav li a { 202 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 203 | } 204 | 205 | .navbar-default .nav li a:hover, 206 | .navbar-default .nav li a:focus { 207 | outline: 0; 208 | color: #{{ site.color.primary }}; 209 | } 210 | 211 | .navbar-default .navbar-nav>.active>a { 212 | border-radius: 0; 213 | color: #fff; 214 | background-color: #{{ site.color.primary }}; 215 | } 216 | 217 | .navbar-default .navbar-nav>.active>a:hover, 218 | .navbar-default .navbar-nav>.active>a:focus { 219 | color: #fff; 220 | background-color: #{{ site.color.secondary }}; 221 | } 222 | 223 | .navbar-default.navbar-shrink { 224 | display: block; 225 | } 226 | 227 | @media(min-width:768px) { 228 | .navbar-default { 229 | padding: 25px 0; 230 | border: 0; 231 | background-color: transparent; 232 | -webkit-transition: padding .3s; 233 | -moz-transition: padding .3s; 234 | transition: padding .3s; 235 | } 236 | 237 | .navbar-default .navbar-brand { 238 | font-size: 2em; 239 | -webkit-transition: all .3s; 240 | -moz-transition: all .3s; 241 | transition: all .3s; 242 | } 243 | 244 | .navbar-default .navbar-nav>.active>a { 245 | border-radius: 3px; 246 | } 247 | 248 | .navbar-default.navbar-shrink { 249 | padding: 10px 0; 250 | background-color: #4CAF50; 251 | } 252 | 253 | .navbar-default.navbar-shrink .navbar-brand { 254 | font-size: 1.5em; 255 | } 256 | } 257 | 258 | header { 259 | text-align: center; 260 | color: #fff; 261 | background-color: #4CAF50; 262 | } 263 | 264 | header .intro-text { 265 | position: relative; 266 | padding-top: 50px; 267 | padding-bottom: 60px; 268 | } 269 | 270 | header .intro-text .intro-lead-in { 271 | margin-bottom: 25px; 272 | font-family: serif; 273 | font-size: 22px; 274 | font-style: italic; 275 | line-height: 1.5; 276 | } 277 | 278 | .wf-active header .intro-text .intro-lead-in { 279 | font-family: "Droid Serif",serif; 280 | } 281 | 282 | header .intro-text .intro-heading { 283 | margin-bottom: 25px; 284 | text-transform: uppercase; 285 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 286 | font-size: 50px; 287 | font-weight: 700; 288 | line-height: 50px; 289 | } 290 | 291 | header .intro-text .intro-sublead { 292 | margin-bottom: 20px; 293 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 294 | font-size: 15px; 295 | font-weight: 500; 296 | line-height: 1.6; 297 | } 298 | 299 | .wf-active header .intro-text .intro-sublead, 300 | .wf-active header .intro-text .intro-heading { 301 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 302 | } 303 | 304 | header .intro-cta { 305 | position: absolute; 306 | width: 100%; 307 | padding-top: 10px; 308 | } 309 | 310 | header .intro-cta .btn { 311 | word-break: break-word; 312 | white-space: normal; 313 | max-width: 100%; 314 | text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); 315 | } 316 | 317 | @media(min-width:768px) { 318 | header .intro-text { 319 | padding-top: 100px; 320 | padding-bottom: 85px; 321 | } 322 | 323 | header .intro-text .intro-lead-in { 324 | margin-bottom: 25px; 325 | font-size: 30px; 326 | font-style: italic; 327 | line-height: 40px; 328 | } 329 | 330 | header .intro-text .intro-heading { 331 | margin-bottom: 20px; 332 | font-size: 60px; 333 | font-weight: 700; 334 | line-height: 65px; 335 | } 336 | 337 | header .intro-text .intro-sublead { 338 | margin-bottom: 40px; 339 | font-size: 20px; 340 | font-weight: 500; 341 | line-height: 25px; 342 | } 343 | 344 | header .intro-cta { 345 | padding-top: 50px; 346 | } 347 | } 348 | 349 | section { 350 | padding: 100px 0; 351 | } 352 | 353 | section h2.section-heading { 354 | margin-top: 0; 355 | margin-bottom: 15px; 356 | font-size: 40px; 357 | } 358 | 359 | section h3.section-subheading { 360 | margin-bottom: 75px; 361 | text-transform: none; 362 | font-family: serif; 363 | font-size: 16px; 364 | font-style: italic; 365 | font-weight: 400; 366 | line-height: 1.7; 367 | } 368 | 369 | .wf-active section h3.section-subheading { 370 | font-family: "Droid Serif",serif; 371 | } 372 | 373 | .service-heading { 374 | margin: 15px 0; 375 | text-transform: none; 376 | } 377 | 378 | #warum img { 379 | max-width: 100%; 380 | } 381 | 382 | .timeline { 383 | position: relative; 384 | padding: 0; 385 | list-style: none; 386 | } 387 | 388 | .timeline:before { 389 | content: ""; 390 | position: absolute; 391 | top: 0; 392 | bottom: 0; 393 | left: 40px; 394 | width: 2px; 395 | margin-left: -1.5px; 396 | background-color: #f1f1f1; 397 | } 398 | 399 | .timeline>li { 400 | position: relative; 401 | margin-bottom: 50px; 402 | min-height: 50px; 403 | } 404 | 405 | .timeline>li:before, 406 | .timeline>li:after { 407 | content: " "; 408 | display: table; 409 | } 410 | 411 | .timeline>li:after { 412 | clear: both; 413 | } 414 | 415 | .timeline>li .timeline-panel { 416 | float: right; 417 | position: relative; 418 | width: 100%; 419 | padding: 0 20px 0 100px; 420 | text-align: left; 421 | } 422 | 423 | .timeline>li .timeline-panel:before { 424 | right: auto; 425 | left: -15px; 426 | border-right-width: 15px; 427 | border-left-width: 0; 428 | } 429 | 430 | .timeline>li .timeline-panel:after { 431 | right: auto; 432 | left: -14px; 433 | border-right-width: 14px; 434 | border-left-width: 0; 435 | } 436 | 437 | .timeline>li .timeline-image { 438 | z-index: 100; 439 | position: absolute; 440 | left: 0; 441 | width: 80px; 442 | height: 80px; 443 | margin-left: 0; 444 | border: 7px solid #f1f1f1; 445 | border-radius: 100%; 446 | text-align: center; 447 | color: #fff; 448 | background-color: #{{ site.color.primary }}; 449 | } 450 | 451 | .timeline>li .timeline-image a { 452 | color: #fff; 453 | text-decoration: none; 454 | } 455 | 456 | .timeline>li .timeline-image h4 { 457 | margin-top: 12px; 458 | font-size: 10px; 459 | line-height: 14px; 460 | } 461 | 462 | .timeline>li.timeline-inverted>.timeline-panel { 463 | float: right; 464 | padding: 0 20px 0 100px; 465 | text-align: left; 466 | } 467 | 468 | .timeline>li.timeline-inverted>.timeline-panel:before { 469 | right: auto; 470 | left: -15px; 471 | border-right-width: 15px; 472 | border-left-width: 0; 473 | } 474 | 475 | .timeline>li.timeline-inverted>.timeline-panel:after { 476 | right: auto; 477 | left: -14px; 478 | border-right-width: 14px; 479 | border-left-width: 0; 480 | } 481 | 482 | .timeline>li:last-child { 483 | margin-bottom: 0; 484 | } 485 | 486 | .timeline .timeline-heading h4 { 487 | margin-top: 0; 488 | color: inherit; 489 | } 490 | 491 | .timeline .timeline-heading h4.subheading { 492 | text-transform: none; 493 | } 494 | 495 | .timeline .timeline-body>p, 496 | .timeline .timeline-body>ul { 497 | margin-bottom: 0; 498 | } 499 | 500 | @media(min-width:768px) { 501 | .timeline:before { 502 | left: 50%; 503 | } 504 | 505 | .timeline>li { 506 | margin-bottom: 100px; 507 | min-height: 100px; 508 | } 509 | 510 | .timeline>li .timeline-panel { 511 | float: left; 512 | width: 41%; 513 | padding: 0 20px 20px 30px; 514 | text-align: right; 515 | } 516 | 517 | .timeline>li .timeline-image { 518 | left: 50%; 519 | width: 100px; 520 | height: 100px; 521 | margin-left: -50px; 522 | } 523 | 524 | .timeline>li .timeline-image h4 { 525 | margin-top: 16px; 526 | font-size: 13px; 527 | line-height: 18px; 528 | } 529 | 530 | .timeline>li.timeline-inverted>.timeline-panel { 531 | float: right; 532 | padding: 0 30px 20px 20px; 533 | text-align: left; 534 | } 535 | } 536 | 537 | @media(min-width:992px) { 538 | .timeline>li { 539 | min-height: 150px; 540 | } 541 | 542 | .timeline>li .timeline-panel { 543 | padding: 0 20px 20px; 544 | } 545 | 546 | .timeline>li .timeline-image { 547 | width: 150px; 548 | height: 150px; 549 | margin-left: -75px; 550 | } 551 | 552 | .timeline>li .timeline-image h4 { 553 | margin-top: 30px; 554 | font-size: 18px; 555 | line-height: 26px; 556 | } 557 | 558 | .timeline>li.timeline-inverted>.timeline-panel { 559 | padding: 0 20px 20px; 560 | } 561 | } 562 | 563 | @media(min-width:1200px) { 564 | .timeline>li { 565 | min-height: 170px; 566 | } 567 | 568 | .timeline>li .timeline-panel { 569 | padding: 0 20px 20px 100px; 570 | } 571 | 572 | .timeline>li .timeline-image { 573 | width: 170px; 574 | height: 170px; 575 | margin-left: -85px; 576 | } 577 | 578 | .timeline>li .timeline-image h4 { 579 | margin-top: 40px; 580 | } 581 | 582 | .timeline>li.timeline-inverted>.timeline-panel { 583 | padding: 0 100px 20px 20px; 584 | } 585 | } 586 | 587 | .timeline-bus { 588 | margin: 15px; 589 | width: 35px; 590 | height: 35px; 591 | } 592 | 593 | @media(min-width:768px) { 594 | .timeline-bus { 595 | margin: 25px; 596 | } 597 | } 598 | 599 | @media(min-width:992px) { 600 | .timeline-bus { 601 | margin: 30px; 602 | width: 70px; 603 | height: 70px; 604 | } 605 | } 606 | 607 | @media(min-width:1200px) { 608 | .timeline-bus { 609 | margin: 40px; 610 | } 611 | } 612 | 613 | .timeline-last .timeline-heading { 614 | display: block; 615 | } 616 | 617 | @media(min-width:992px) { 618 | .timeline-last .timeline-heading { 619 | display: none; 620 | } 621 | } 622 | 623 | #action { 624 | padding-bottom: 25px; 625 | } 626 | 627 | #plz-form { 628 | background: #fed136; 629 | padding: 1em 1em 0.1em; 630 | margin-bottom: 1.5em; 631 | border-radius: 3px; 632 | } 633 | 634 | .action-plz-label { 635 | font-size: 1.4em; 636 | } 637 | 638 | #actionError, 639 | #actionStillLoading, 640 | #actionResult, 641 | #actionResultHasData { 642 | display: none; 643 | } 644 | 645 | .action-tabs { 646 | text-align: center; 647 | } 648 | 649 | .action-tabs li { 650 | width: 50%; 651 | } 652 | 653 | .action-tabs svg { 654 | display: block; 655 | margin: 0 auto; 656 | } 657 | 658 | .tab-content { 659 | text-align: center; 660 | padding-top: 1.5em; 661 | } 662 | 663 | .action-phone { 664 | font-size: 2em; 665 | font-weight: bold; 666 | color: inherit; 667 | text-decoration: none; 668 | } 669 | 670 | #actionMailBtn { 671 | margin: 1em 0; 672 | } 673 | 674 | .action-local { 675 | font-size: 0.9em; 676 | color: #AAA; 677 | } 678 | 679 | .svg-icon { 680 | vertical-align: middle; 681 | } 682 | 683 | .action-phone-support { 684 | text-align: left; 685 | } 686 | 687 | .action-thankyou, 688 | .action-error-openpdf { 689 | display: none; 690 | } 691 | 692 | .show-if-gtfs { 693 | display: none; 694 | } 695 | 696 | .has-google-gtfs .show-if-gtfs { 697 | display: block; 698 | } 699 | 700 | .letter-text { 701 | display: none; 702 | width: 100%; 703 | min-height: 150px; 704 | } 705 | 706 | .action-feedback { 707 | margin-top: 2em; 708 | padding-top: 2.5em; 709 | padding-bottom: 0; 710 | border-top: 1px solid #DADADA; 711 | } 712 | 713 | dd { 714 | padding-left: 1.5em; 715 | line-height: 1.7; 716 | margin-bottom: 1em; 717 | } 718 | 719 | footer { 720 | padding: 25px 0; 721 | text-align: left; 722 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 723 | line-height: 1.4; 724 | } 725 | 726 | .wf-active footer { 727 | font-family: Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif; 728 | } 729 | 730 | .btn:focus, 731 | .btn:active, 732 | .btn.active, 733 | .btn:active:focus { 734 | outline: 0; 735 | } 736 | 737 | ::-moz-selection { 738 | text-shadow: none; 739 | background: #{{ site.color.primary }}; 740 | } 741 | 742 | ::selection { 743 | text-shadow: none; 744 | background: #{{ site.color.primary }}; 745 | } 746 | 747 | img::selection { 748 | background: 0 0; 749 | } 750 | 751 | img::-moz-selection { 752 | background: 0 0; 753 | } 754 | 755 | body { 756 | webkit-tap-highlight-color: #{{ site.color.primary }}; 757 | } 758 | -------------------------------------------------------------------------------- /css/fonts.css: -------------------------------------------------------------------------------- 1 | /* montserrat-regular - latin */ 2 | @font-face { 3 | font-family: 'Montserrat'; 4 | font-style: normal; 5 | font-display: swap; 6 | font-weight: 400; 7 | src: local(''), 8 | url('/fonts/montserrat-v25-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 9 | url('/fonts/montserrat-v25-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 10 | } 11 | /* montserrat-700 - latin */ 12 | @font-face { 13 | font-family: 'Montserrat'; 14 | font-style: normal; 15 | font-display: swap; 16 | font-weight: 700; 17 | src: local(''), 18 | url('/fonts/montserrat-v25-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 19 | url('/fonts/montserrat-v25-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 20 | } 21 | /* roboto-slab-100 - latin */ 22 | @font-face { 23 | font-family: 'Roboto Slab'; 24 | font-style: normal; 25 | font-display: swap; 26 | font-weight: 100; 27 | src: local(''), 28 | url('/fonts/roboto-slab-v24-latin-100.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 29 | url('/fonts/roboto-slab-v24-latin-100.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 30 | } 31 | /* roboto-slab-300 - latin */ 32 | @font-face { 33 | font-family: 'Roboto Slab'; 34 | font-style: normal; 35 | font-display: swap; 36 | font-weight: 300; 37 | src: local(''), 38 | url('/fonts/roboto-slab-v24-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 39 | url('/fonts/roboto-slab-v24-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 40 | } 41 | /* roboto-slab-regular - latin */ 42 | @font-face { 43 | font-family: 'Roboto Slab'; 44 | font-style: normal; 45 | font-display: swap; 46 | font-weight: 400; 47 | src: local(''), 48 | url('/fonts/roboto-slab-v24-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 49 | url('/fonts/roboto-slab-v24-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 50 | } 51 | /* roboto-slab-700 - latin */ 52 | @font-face { 53 | font-family: 'Roboto Slab'; 54 | font-style: normal; 55 | font-display: swap; 56 | font-weight: 700; 57 | src: local(''), 58 | url('/fonts/roboto-slab-v24-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 59 | url('/fonts/roboto-slab-v24-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 60 | } 61 | /* droid-serif-400normal - latin */ 62 | @font-face { 63 | font-family: 'Droid Serif'; 64 | font-style: normal; 65 | font-display: swap; 66 | font-weight: 400; 67 | src: local('Droid Serif Regular '), 68 | local('Droid Serif-Regular'), 69 | url('/fonts/droid-serif-latin-400.woff2') format('woff2'), /* Super Modern Browsers */ 70 | url('/fonts/droid-serif-latin-400.woff') format('woff'); /* Modern Browsers */ 71 | } 72 | /* droid-serif-400italic - latin */ 73 | @font-face { 74 | font-family: 'Droid Serif'; 75 | font-style: italic; 76 | font-display: swap; 77 | font-weight: 400; 78 | src: 79 | local('Droid Serif Regular italic'), 80 | local('Droid Serif-Regularitalic'), 81 | url('/fonts/droid-serif-latin-400italic.woff2') format('woff2'), /* Super Modern Browsers */ 82 | url('/fonts/droid-serif-latin-400italic.woff') format('woff'); /* Modern Browsers */ 83 | } 84 | /* droid-serif-700normal - latin */ 85 | @font-face { 86 | font-family: 'Droid Serif'; 87 | font-style: normal; 88 | font-display: swap; 89 | font-weight: 700; 90 | src: local('Droid Serif Bold '), 91 | local('Droid Serif-Bold'), 92 | url('/fonts/droid-serif-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ 93 | url('/fonts/droid-serif-latin-700.woff') format('woff'); /* Modern Browsers */ 94 | } 95 | /* droid-serif-700italic - latin */ 96 | @font-face { 97 | font-family: 'Droid Serif'; 98 | font-style: italic; 99 | font-display: swap; 100 | font-weight: 700; 101 | src: local('Droid Serif Bold italic'), 102 | local('Droid Serif-Bolditalic'), 103 | url('/fonts/droid-serif-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */ 104 | url('/fonts/droid-serif-latin-700italic.woff') format('woff'); /* Modern Browsers */ 105 | } 106 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | {% include_relative fonts.css %} 6 | {% include_relative bootstrap.min.css %} 7 | {% include_relative agency.css %} -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/favicon.ico -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/favicon.png -------------------------------------------------------------------------------- /fonts/droid-serif-latin-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-400.woff -------------------------------------------------------------------------------- /fonts/droid-serif-latin-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-400.woff2 -------------------------------------------------------------------------------- /fonts/droid-serif-latin-400italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-400italic.woff -------------------------------------------------------------------------------- /fonts/droid-serif-latin-400italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-400italic.woff2 -------------------------------------------------------------------------------- /fonts/droid-serif-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-700.woff -------------------------------------------------------------------------------- /fonts/droid-serif-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-700.woff2 -------------------------------------------------------------------------------- /fonts/droid-serif-latin-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-700italic.woff -------------------------------------------------------------------------------- /fonts/droid-serif-latin-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/droid-serif-latin-700italic.woff2 -------------------------------------------------------------------------------- /fonts/montserrat-v25-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/montserrat-v25-latin-700.woff -------------------------------------------------------------------------------- /fonts/montserrat-v25-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/montserrat-v25-latin-700.woff2 -------------------------------------------------------------------------------- /fonts/montserrat-v25-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/montserrat-v25-latin-regular.woff -------------------------------------------------------------------------------- /fonts/montserrat-v25-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/montserrat-v25-latin-regular.woff2 -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-100.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-100.woff -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-100.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-100.woff2 -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-300.woff -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-300.woff2 -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-700.woff -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-700.woff2 -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-regular.woff -------------------------------------------------------------------------------- /fonts/roboto-slab-v24-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/fonts/roboto-slab-v24-latin-regular.woff2 -------------------------------------------------------------------------------- /img/about/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/about/1.jpg -------------------------------------------------------------------------------- /img/about/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/about/3.jpg -------------------------------------------------------------------------------- /img/about/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/about/4.jpg -------------------------------------------------------------------------------- /img/okfn-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/opendata-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/opendata-map.png -------------------------------------------------------------------------------- /img/share/alexa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/alexa.jpg -------------------------------------------------------------------------------- /img/share/befoerderungsfall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/befoerderungsfall.jpg -------------------------------------------------------------------------------- /img/share/escalator.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/escalator.jpg -------------------------------------------------------------------------------- /img/share/fahrplan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/fahrplan.jpg -------------------------------------------------------------------------------- /img/share/mainframe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/mainframe.jpg -------------------------------------------------------------------------------- /img/share/netzplan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/netzplan.jpg -------------------------------------------------------------------------------- /img/share/preisauskunft.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/preisauskunft.jpg -------------------------------------------------------------------------------- /img/share/startup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/startup.jpg -------------------------------------------------------------------------------- /img/share/uber.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/uber.jpg -------------------------------------------------------------------------------- /img/share/underground.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/share/underground.jpg -------------------------------------------------------------------------------- /img/why/future.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/why/future.jpg -------------------------------------------------------------------------------- /img/why/preisauskunft.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/why/preisauskunft.jpg -------------------------------------------------------------------------------- /img/why/rails.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfde/rettedeinennahverkehr/f5846c2eca2441a675243ba09147ff725ed1a0ad/img/why/rails.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% include action.html %} 6 | {% include why.html %} 7 | {% include how.html %} 8 | {% include faq.html %} 9 | -------------------------------------------------------------------------------- /js/agency.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Agnecy Bootstrap Theme (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | // jQuery for page scrolling feature - requires jQuery Easing plugin 8 | $(function() { 9 | $('a.page-scroll').bind('click', function(event) { 10 | var $anchor = $(this); 11 | $('html, body').stop().animate({ 12 | scrollTop: $($anchor.attr('href')).offset().top 13 | }, 1500, 'easeInOutExpo'); 14 | event.preventDefault(); 15 | }); 16 | }); 17 | 18 | // Highlight the top nav as scrolling occurs 19 | $('body').scrollspy({ 20 | target: '.navbar-fixed-top' 21 | }) 22 | 23 | // Closes the Responsive Menu on Menu Item Click 24 | $('.navbar-collapse ul li a').click(function() { 25 | $('.navbar-toggle:visible').click(); 26 | }); -------------------------------------------------------------------------------- /js/deps.js: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | {% include_relative libs/jquery-1.11.0.js %} 6 | {% include_relative libs/bootstrap.min.js %} 7 | {% include_relative libs/jquery.easing.min.js %} 8 | {% include_relative libs/classie.js %} 9 | {% include_relative libs/cbpAnimatedHeader.js %} 10 | {% include_relative libs/jspdf-1.3.2.min.js %} 11 | {% include_relative libs/papaparse.min.js %} 12 | {% include_relative libs/tabletop-1.5.1.min.js %} -------------------------------------------------------------------------------- /js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); 8 | if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.tab");n||i.data("bs.tab",n=new s(this)),"string"==typeof e&&n[e]()})}var s=function(e){this.element=t(e)};s.VERSION="3.3.7",s.TRANSITION_DURATION=150,s.prototype.show=function(){var e=this.element,s=e.closest("ul:not(.dropdown-menu)"),i=e.data("target");if(i||(i=e.attr("href"),i=i&&i.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=s.find(".active:last a"),a=t.Event("hide.bs.tab",{relatedTarget:e[0]}),r=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(a),e.trigger(r),!r.isDefaultPrevented()&&!a.isDefaultPrevented()){var o=t(i);this.activate(e.closest("li"),s),this.activate(o,o.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},s.prototype.activate=function(e,i,n){function a(){r.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),o?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var r=i.find("> .active"),o=n&&t.support.transition&&(r.length&&r.hasClass("fade")||!!i.find("> .fade").length);r.length&&o?r.one("bsTransitionEnd",a).emulateTransitionEnd(s.TRANSITION_DURATION):a(),r.removeClass("in")};var i=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=s,t.fn.tab.noConflict=function(){return t.fn.tab=i,this};var n=function(s){s.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){var s,i=e.attr("data-target")||(s=e.attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"");return t(i)}function s(e){return this.each(function(){var s=t(this),n=s.data("bs.collapse"),a=t.extend({},i.DEFAULTS,s.data(),"object"==typeof e&&e);!n&&a.toggle&&/show|hide/.test(e)&&(a.toggle=!1),n||s.data("bs.collapse",n=new i(this,a)),"string"==typeof e&&n[e]()})}var i=function(e,s){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,s),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};i.VERSION="3.3.7",i.TRANSITION_DURATION=350,i.DEFAULTS={toggle:!0},i.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},i.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var a=t.Event("show.bs.collapse");if(this.$element.trigger(a),!a.isDefaultPrevented()){n&&n.length&&(s.call(n,"hide"),e||n.data("bs.collapse",null));var r=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[r](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var o=function(){this.$element.removeClass("collapsing").addClass("collapse in")[r](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return o.call(this);var l=t.camelCase(["scroll",r].join("-"));this.$element.one("bsTransitionEnd",t.proxy(o,this)).emulateTransitionEnd(i.TRANSITION_DURATION)[r](this.$element[0][l])}}}},i.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var s=this.dimension();this.$element[s](this.$element[s]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[s](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(i.TRANSITION_DURATION):n.call(this)}}},i.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},i.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(s,i){var n=t(i);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},i.prototype.addAriaAndCollapsedClass=function(t,e){var s=t.hasClass("in");t.attr("aria-expanded",s),e.toggleClass("collapsed",!s).attr("aria-expanded",s)};var n=t.fn.collapse;t.fn.collapse=s,t.fn.collapse.Constructor=i,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(i){var n=t(this);n.attr("data-target")||i.preventDefault();var a=e(n),r=a.data("bs.collapse"),o=r?"toggle":n.data();s.call(a,o)})}(jQuery),+function(t){"use strict";function e(s,i){this.$body=t(document.body),this.$scrollElement=t(t(s).is(document.body)?window:s),this.options=t.extend({},e.DEFAULTS,i),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function s(s){return this.each(function(){var i=t(this),n=i.data("bs.scrollspy"),a="object"==typeof s&&s;n||i.data("bs.scrollspy",n=new e(this,a)),"string"==typeof s&&n[s]()})}e.VERSION="3.3.7",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,s="offset",i=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(s="position",i=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),n=e.data("target")||e.attr("href"),a=/^#./.test(n)&&t(n);return a&&a.length&&a.is(":visible")&&[[a[s]().top+i,n]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,s=this.getScrollHeight(),i=this.options.offset+s-this.$scrollElement.height(),n=this.offsets,a=this.targets,r=this.activeTarget;if(this.scrollHeight!=s&&this.refresh(),e>=i)return r!=(t=a[a.length-1])&&this.activate(t);if(r&&e=n[t]&&(void 0===n[t+1]||e= changeHeaderOn ) { 30 | classie.add( header, 'navbar-shrink' ); 31 | } 32 | else { 33 | classie.remove( header, 'navbar-shrink' ); 34 | } 35 | didScroll = false; 36 | } 37 | 38 | function scrollY() { 39 | return window.pageYOffset || docElem.scrollTop; 40 | } 41 | 42 | init(); 43 | 44 | })(); -------------------------------------------------------------------------------- /js/libs/cbpAnimatedHeader.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * cbpAnimatedHeader.min.js v1.0.0 3 | * http://www.codrops.com 4 | * 5 | * Licensed under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 8 | * Copyright 2013, Codrops 9 | * http://www.codrops.com 10 | */ 11 | var cbpAnimatedHeader=(function(){var b=document.documentElement,g=document.querySelector(".cbp-af-header"),e=false,a=300;function f(){window.addEventListener("scroll",function(h){if(!e){e=true;setTimeout(d,250)}},false)}function d(){var h=c();if(h>=a){classie.add(g,"cbp-af-header-shrink")}else{classie.remove(g,"cbp-af-header-shrink")}e=false}function c(){return window.pageYOffset||b.scrollTop}f()})(); -------------------------------------------------------------------------------- /js/libs/classie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * classie - class helper functions 3 | * from bonzo https://github.com/ded/bonzo 4 | * 5 | * classie.has( elem, 'my-class' ) -> true/false 6 | * classie.add( elem, 'my-new-class' ) 7 | * classie.remove( elem, 'my-unwanted-class' ) 8 | * classie.toggle( elem, 'my-class' ) 9 | */ 10 | 11 | /*jshint browser: true, strict: true, undef: true */ 12 | /*global define: false */ 13 | 14 | ( function( window ) { 15 | 16 | 'use strict'; 17 | 18 | // class helper functions from bonzo https://github.com/ded/bonzo 19 | 20 | function classReg( className ) { 21 | return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); 22 | } 23 | 24 | // classList support for class management 25 | // altho to be fair, the api sucks because it won't accept multiple classes at once 26 | var hasClass, addClass, removeClass; 27 | 28 | if ( 'classList' in document.documentElement ) { 29 | hasClass = function( elem, c ) { 30 | return elem.classList.contains( c ); 31 | }; 32 | addClass = function( elem, c ) { 33 | elem.classList.add( c ); 34 | }; 35 | removeClass = function( elem, c ) { 36 | elem.classList.remove( c ); 37 | }; 38 | } 39 | else { 40 | hasClass = function( elem, c ) { 41 | return classReg( c ).test( elem.className ); 42 | }; 43 | addClass = function( elem, c ) { 44 | if ( !hasClass( elem, c ) ) { 45 | elem.className = elem.className + ' ' + c; 46 | } 47 | }; 48 | removeClass = function( elem, c ) { 49 | elem.className = elem.className.replace( classReg( c ), ' ' ); 50 | }; 51 | } 52 | 53 | function toggleClass( elem, c ) { 54 | var fn = hasClass( elem, c ) ? removeClass : addClass; 55 | fn( elem, c ); 56 | } 57 | 58 | var classie = { 59 | // full names 60 | hasClass: hasClass, 61 | addClass: addClass, 62 | removeClass: removeClass, 63 | toggleClass: toggleClass, 64 | // short names 65 | has: hasClass, 66 | add: addClass, 67 | remove: removeClass, 68 | toggle: toggleClass 69 | }; 70 | 71 | // transport 72 | if ( typeof define === 'function' && define.amd ) { 73 | // AMD 74 | define( classie ); 75 | } else { 76 | // browser global 77 | window.classie = classie; 78 | } 79 | 80 | })( window ); 81 | -------------------------------------------------------------------------------- /js/libs/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ 3 | * 4 | * Uses the built in easing capabilities added In jQuery 1.1 5 | * to offer multiple easing options 6 | * 7 | * TERMS OF USE - EASING EQUATIONS 8 | * 9 | * Open source under the BSD License. 10 | * 11 | * Copyright © 2001 Robert Penner 12 | * All rights reserved. 13 | * 14 | * TERMS OF USE - jQuery Easing 15 | * 16 | * Open source under the BSD License. 17 | * 18 | * Copyright © 2008 George McGinley Smith 19 | * All rights reserved. 20 | * 21 | * Redistribution and use in source and binary forms, with or without modification, 22 | * are permitted provided that the following conditions are met: 23 | * 24 | * Redistributions of source code must retain the above copyright notice, this list of 25 | * conditions and the following disclaimer. 26 | * Redistributions in binary form must reproduce the above copyright notice, this list 27 | * of conditions and the following disclaimer in the documentation and/or other materials 28 | * provided with the distribution. 29 | * 30 | * Neither the name of the author nor the names of contributors may be used to endorse 31 | * or promote products derived from this software without specific prior written permission. 32 | * 33 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 34 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 35 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 36 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 37 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 38 | * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 39 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 40 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 41 | * OF THE POSSIBILITY OF SUCH DAMAGE. 42 | * 43 | */ 44 | jQuery.easing.jswing=jQuery.easing.swing;jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(e,f,a,h,g){return jQuery.easing[jQuery.easing.def](e,f,a,h,g)},easeInQuad:function(e,f,a,h,g){return h*(f/=g)*f+a},easeOutQuad:function(e,f,a,h,g){return -h*(f/=g)*(f-2)+a},easeInOutQuad:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f+a}return -h/2*((--f)*(f-2)-1)+a},easeInCubic:function(e,f,a,h,g){return h*(f/=g)*f*f+a},easeOutCubic:function(e,f,a,h,g){return h*((f=f/g-1)*f*f+1)+a},easeInOutCubic:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f+a}return h/2*((f-=2)*f*f+2)+a},easeInQuart:function(e,f,a,h,g){return h*(f/=g)*f*f*f+a},easeOutQuart:function(e,f,a,h,g){return -h*((f=f/g-1)*f*f*f-1)+a},easeInOutQuart:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f+a}return -h/2*((f-=2)*f*f*f-2)+a},easeInQuint:function(e,f,a,h,g){return h*(f/=g)*f*f*f*f+a},easeOutQuint:function(e,f,a,h,g){return h*((f=f/g-1)*f*f*f*f+1)+a},easeInOutQuint:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f*f+a}return h/2*((f-=2)*f*f*f*f+2)+a},easeInSine:function(e,f,a,h,g){return -h*Math.cos(f/g*(Math.PI/2))+h+a},easeOutSine:function(e,f,a,h,g){return h*Math.sin(f/g*(Math.PI/2))+a},easeInOutSine:function(e,f,a,h,g){return -h/2*(Math.cos(Math.PI*f/g)-1)+a},easeInExpo:function(e,f,a,h,g){return(f==0)?a:h*Math.pow(2,10*(f/g-1))+a},easeOutExpo:function(e,f,a,h,g){return(f==g)?a+h:h*(-Math.pow(2,-10*f/g)+1)+a},easeInOutExpo:function(e,f,a,h,g){if(f==0){return a}if(f==g){return a+h}if((f/=g/2)<1){return h/2*Math.pow(2,10*(f-1))+a}return h/2*(-Math.pow(2,-10*--f)+2)+a},easeInCirc:function(e,f,a,h,g){return -h*(Math.sqrt(1-(f/=g)*f)-1)+a},easeOutCirc:function(e,f,a,h,g){return h*Math.sqrt(1-(f=f/g-1)*f)+a},easeInOutCirc:function(e,f,a,h,g){if((f/=g/2)<1){return -h/2*(Math.sqrt(1-f*f)-1)+a}return h/2*(Math.sqrt(1-(f-=2)*f)+1)+a},easeInElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k)==1){return e+l}if(!j){j=k*0.3}if(g0,i=!(t[0]instanceof Array);if(n){for(var a=0;a0&&(r+=u),r+=s(e[a],a);t.length>0&&(r+=h)}for(var o=0;oc;c++){c>0&&(r+=u);var d=n&&i?e[c]:c;r+=s(t[o][d],c)}o-1||" "==e.charAt(0)||" "==e.charAt(e.length-1);return r?'"'+e+'"':e}function a(e,t){for(var r=0;r-1)return!0;return!1}var o=!1,u=",",h="\r\n";if(r(),"string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return i(null,e);if("object"==typeof e[0])return i(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),i(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(t){function r(e){var t=_(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new o(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},r.call(this,t),this.parseChunk=function(t){if(this.isFirstChunk&&m(this._config.beforeFirstChunk)){var r=this._config.beforeFirstChunk(t);void 0!==r&&(t=r)}this.isFirstChunk=!1;var n=this._partialLine+t;this._partialLine="";var i=this._handle.parse(n,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=i.meta.cursor;this._finished||(this._partialLine=n.substring(s-this._baseIndex),this._baseIndex=s),i&&i.data&&(this._rowCount+=i.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(y)e.postMessage({results:i,workerId:S.WORKER_ID,finished:a});else if(m(this._config.chunk)){if(this._config.chunk(i,this._handle),this._paused)return;i=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),!a||!m(this._config.complete)||i&&i.meta.aborted||this._config.complete(this._completeResults),a||i&&i.meta.paused||this._nextChunk(),i}},this._sendError=function(t){m(this._config.error)?this._config.error(t):y&&this._config.error&&e.postMessage({workerId:S.WORKER_ID,error:t,finished:!1})}}function i(e){function t(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=S.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=k?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,k||(r.onload=g(this._chunkLoaded,this),r.onerror=g(this._chunkError,this)),r.open("GET",this._input,!k),this._config.chunkSize){var e=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+e),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(t){this._chunkError(t.message)}k&&0==r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function s(e){e=e||{},e.chunkSize||(e.chunkSize=S.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=g(this._chunkLoaded,this),t.onerror=g(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function a(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function o(e){function t(){if(b&&d&&(h("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+S.DefaultDelimiter+"'"),d=!1),e.skipEmptyLines)for(var t=0;t=y.length?(r.__parsed_extra||(r.__parsed_extra=[]),r.__parsed_extra.push(b.data[t][n])):r[y[n]]=b.data[t][n])}e.header&&(b.data[t]=r,n>y.length?h("FieldMismatch","TooManyFields","Too many fields: expected "+y.length+" fields but parsed "+n,t):n1&&(h+=Math.abs(l-i),i=l):i=l}c.data.length>0&&(f/=c.data.length),("undefined"==typeof n||n>h)&&f>1.99&&(n=h,r=o)}return e.delimiter=r,{successful:!!r,bestDelimiter:r}}function a(e){e=e.substr(0,1048576);var t=e.split("\r");if(1==t.length)return"\n";for(var r=0,n=0;n=t.length/2?"\r\n":"\r"}function o(e){var t=l.test(e);return t?parseFloat(e):e}function h(e,t,r,n){b.errors.push({type:e,code:t,message:r,row:n})}var f,c,d,l=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,p=this,g=0,v=!1,k=!1,y=[],b={data:[],errors:[],meta:{}};if(m(e.step)){var R=e.step;e.step=function(n){if(b=n,r())t();else{if(t(),0==b.data.length)return;g+=n.data.length,e.preview&&g>e.preview?c.abort():R(b,p)}}}this.parse=function(r,n,i){if(e.newline||(e.newline=a(r)),d=!1,!e.delimiter){var o=s(r);o.successful?e.delimiter=o.bestDelimiter:(d=!0,e.delimiter=S.DefaultDelimiter),b.meta.delimiter=e.delimiter}var h=_(e);return e.preview&&e.header&&h.preview++,f=r,c=new u(h),b=c.parse(f,n,i),t(),v?{meta:{paused:!0}}:b||{meta:{paused:!1}}},this.paused=function(){return v},this.pause=function(){v=!0,c.abort(),f=f.substr(c.getCharIndex())},this.resume=function(){v=!1,p.streamer.parseChunk(f)},this.aborted=function(){return k},this.abort=function(){k=!0,c.abort(),b.meta.aborted=!0,m(e.complete)&&e.complete(b),f=""}}function u(e){e=e||{};var t=e.delimiter,r=e.newline,n=e.comments,i=e.step,s=e.preview,a=e.fastMode;if(("string"!=typeof t||S.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),n===t)throw"Comment character same as delimiter";n===!0?n="#":("string"!=typeof n||S.BAD_DELIMITERS.indexOf(n)>-1)&&(n=!1),"\n"!=r&&"\r"!=r&&"\r\n"!=r&&(r="\n");var o=0,u=!1;this.parse=function(e,h,f){function c(e){b.push(e),S=o}function d(t){return f?p():("undefined"==typeof t&&(t=e.substr(o)),w.push(t),o=g,c(w),y&&_(),p())}function l(t){o=t,c(w),w=[],O=e.indexOf(r,o)}function p(e){return{data:b,errors:R,meta:{delimiter:t,linebreak:r,aborted:u,truncated:!!e,cursor:S+(h||0)}}}function _(){i(p()),b=[],R=[]}if("string"!=typeof e)throw"Input must be a string";var g=e.length,m=t.length,v=r.length,k=n.length,y="function"==typeof i;o=0;var b=[],R=[],w=[],S=0;if(!e)return p();if(a||a!==!1&&-1===e.indexOf('"')){for(var C=e.split(r),E=0;E=s)return b=b.slice(0,s),p(!0)}}return p()}for(var x=e.indexOf(t,o),O=e.indexOf(r,o);;)if('"'!=e[o])if(n&&0===w.length&&e.substr(o,k)===n){if(-1==O)return p();o=O+v,O=e.indexOf(r,o),x=e.indexOf(t,o)}else if(-1!==x&&(O>x||-1===O))w.push(e.substring(o,x)),o=x+m,x=e.indexOf(t,o);else{if(-1===O)break;if(w.push(e.substring(o,O)),l(O+v),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0)}else{var I=o;for(o++;;){var I=e.indexOf('"',I+1);if(-1===I)return f||R.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:o}),d();if(I===g-1){var D=e.substring(o,I).replace(/""/g,'"');return d(D)}if('"'!=e[I+1]){if(e[I+1]==t){w.push(e.substring(o,I).replace(/""/g,'"')),o=I+1+m,x=e.indexOf(t,o),O=e.indexOf(r,o);break}if(e.substr(I+1,v)===r){if(w.push(e.substring(o,I).replace(/""/g,'"')),l(I+1+v),x=e.indexOf(t,o),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0);break}}else I++}}return d()},this.abort=function(){u=!0},this.getCharIndex=function(){return o}}function h(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function f(){if(!S.WORKERS_SUPPORTED)return!1;if(!b&&null===S.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var t=S.SCRIPT_PATH||v;t+=(-1!==t.indexOf("?")?"&":"?")+"papaworker";var r=new e.Worker(t);return r.onmessage=c,r.id=w++,R[r.id]=r,r}function c(e){var t=e.data,r=R[t.workerId],n=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){n=!0,d(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},s={abort:i,pause:l,resume:l};if(m(r.userStep)){for(var a=0;a1&&this.debug&&this.log("WARNING You have more than one sheet but are using simple sheet mode! Don't blame me when something goes wrong."),this.models[this.modelNames[0]].all()):this.models},addWanted:function(e){a(this.wanted,e)===-1&&this.wanted.push(e)},loadSheets:function(t){var i,n,o=[];for(this.googleSheetName=t.feed.title.$t,this.foundSheetNames=[],i=0,n=t.feed.entry.length;i 0 && ar.length > 0 && lnn.length > 0) { 10 | intro = sge + " " + ar + " " + lnn + ","; 11 | leading = 'l'; 12 | } 13 | 14 | var h = true; 15 | if (vbd == "") { 16 | h = false; 17 | } 18 | 19 | var text = (intro + "\n\n" + 20 | leading + "eider musste ich feststellen, dass unser Verkehrsverbund " + (h ? vbd + " ": "") + "keinen Fahrplandatensatz für Softwareentwickler " + 21 | "in einem maschinenlesbaren Format zur Verfügung stellt, obwohl dies seit 1.12.2019 durch die " + 22 | "Delegierte Verordnung (EU) 1926/2017 gefordert wird und mittlerweile vielerorts üblich ist. Mit diesen Daten könnten " + 23 | "Softwareentwickler (private, ehrenamtliche Entwickler*innen sowie auch Firmen) innovative " + 24 | "Apps " + (h ? "für das " + vbd + "-Gebiet " : "") + "bereitstellen.\n" + 25 | "\n" + 26 | (goog ? 27 | "Aktuell werden die " + vbd + "-Sollfahrplandaten im GTFS-Format wohl exklusiv an Google abgegeben. " + 28 | "Das heißt, die Daten liegen schon im passenden Format vor, werden aber nicht der Allgemeinheit " + 29 | "zur Verfügung gestellt. Es wäre sehr schade, wenn nur Google oder Firmen mit großer Rechtsabteilung an " + 30 | "zukunftsträchtigen Mobilitätslösungen bei uns arbeiten dürften.\n" + 31 | "\n" : "") + 32 | "Vor allem Apps für spezielle Anwendungsfälle, wie z.B. Auskunftsapps für blinde Menschen " + 33 | "mit Auskunft per Sprachausgabe, können von freigegebenen Fahrplandaten profitieren. " + 34 | "Für die Entwicklung von solchen Spezialanwendungen fehlen beim Verbund wahrscheinlich die Ressourcen, " + 35 | "aber durch die Freigabe der Daten können diese Anwendungen dennoch ohne Zusatzkosten für den Verbund entstehen." + 36 | "\n" + 37 | "Besonders für Touristen wird es durch die Datenfreigabe einfacher sich im ÖPNV zu bewegen, " + 38 | "weil sich diese nicht für jeden Ort erst die lokale Nahverkehrsapp herunterladen müssen. " + 39 | "Denn so können Reisende bereits vorhandene und verbreitete Apps nutzen, welche verbundübergreifend funktionieren, " + 40 | "da die Anwendungen auf das etablierte GTFS-Format setzen." + 41 | "\n" + 42 | "Auch werden Apps möglich, welche die schönsten, mit dem ÖPNV erreichbaren Ausflugsziele der Region anbieten " + 43 | "und so neue Nutzergruppen für den ÖPNV und die Region begeistern können.\n" + 44 | "\n" + 45 | "Dabei wäre es sehr wichtig, dass die " + (h ? vbd + "-" : "") + "Fahrplandaten barrierefrei unter einer offenen Lizenz bereitgestellt werden. " + 46 | "Nur so können Entwickler Anwendungen mit diesen Daten entwickeln oder in bestehende Apps integrieren, " + 47 | "ohne sich bei jedem Verkehrsbetreiber wieder neu mit rechtlichen Fragen und Verträgen zu beschäftigen, " + 48 | "was die Entwicklung massiv behindert bzw. sogar unmöglich macht.\n" + 49 | "\n" + 50 | "Ich würde mich sehr freuen, wenn Sie bei der nächsten " + (h ? vbd + "-" : "") + "Mitgliederversammlung darauf " + 51 | "hinwirken, dass die " + (h ? vbd + "-" : "") + "Fahrplandaten gemäß der EU-Verordnung unter " + 52 | "offener Lizenz allen interessierten Entwickler*innen ohne jegliche Einschränkung als Open Data zur Verfügung " + 53 | "gestellt werden.\n" + 54 | "\n" + 55 | "Ich freue mich auf Ihre Antwort und stehe bei Rückfragen gerne zur Verfügung.\n" + 56 | "\n" + 57 | "Mit freundlichen Grüßen"); 58 | return text; 59 | } 60 | 61 | function renderPDF() { 62 | var name= $("#name").val(); 63 | var address= $("#address").val(); 64 | var city = $("#city").val(); 65 | var email = $("#email").val(); 66 | var intro = ''; 67 | 68 | if (sge.length > 0 && ar.length > 0 && lnn.length > 0) { 69 | intro = sge + " " + ar + " " + lnn + ","; 70 | } 71 | 72 | var text = generateText(); 73 | 74 | var d = new Date(), 75 | months = 'Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember'.split(','), 76 | datum = d.getDate() + ". " + months[d.getMonth()] + " "+ d.getFullYear(); 77 | 78 | var sender = "\n\n", senderpos = 150; 79 | if (name.length > 0 && address.length > 0 && city.length > 0) { 80 | sender = name + "\n" + address + "\n" + plz + " " + city; 81 | } 82 | if (email.length > 0) { 83 | sender += "\n" + email; 84 | } 85 | if (name.length > 23 || address.length > 23 || email.length > 20) { 86 | senderpos -= 15; 87 | } 88 | 89 | var doc = new jsPDF(); 90 | doc.setFontSize(11); 91 | doc.text(20, 45, lra + "\n\n" + arn + " " + lvn + " " + lnn + "\n" + str + "\n" + lraplz + " " + stt); 92 | doc.text(senderpos, 27, sender + "\n\n" + datum); 93 | 94 | lines = doc.splitTextToSize(text, 160); 95 | doc.text(20, 85, lines); 96 | doc.setDrawColor(100, 100, 100); 97 | 98 | var y = 240; 99 | if (goog) { 100 | y = 270; 101 | } 102 | 103 | //wenn der Name des Verbundes sehr lang ist, kann es sonst passieren, dass der name und die Grußformel überlagern 104 | if (vbd.length > 10) { 105 | y = y + 10; 106 | } 107 | 108 | // doc.line(20, y, 80, y); 109 | doc.text(20, y + 10, name); 110 | 111 | var pdfurl = doc.output("dataurlstring"); 112 | if (!!window.chrome){ 113 | var iframe = "" 114 | var win = window.open(); 115 | win.document.open(); 116 | win.document.write(iframe); 117 | win.document.close(); 118 | } else { 119 | var win = window.open(pdfurl, '_blank'); 120 | } 121 | 122 | try { 123 | win.focus(); 124 | } catch (e) { 125 | $('.action-error-openpdf').show(); 126 | } 127 | 128 | (window._paq || []).push(['trackEvent', 'renderPDF']); 129 | } 130 | 131 | function hideAll() { 132 | $('#actionError').hide(); 133 | $('#actionStillLoading').hide(); 134 | $('#actionResult').hide(); 135 | $('#actionResultHasData').hide(); 136 | $('.letter-text').hide(); 137 | $('.action-error-openpdf').hide(); 138 | } 139 | 140 | var sheetUrl = 'https://docs.google.com/spreadsheets/d/1MNPMJGdsoKYNwmdMAE3R8rZSO0B5jxrtlvadrFfMyQ8/pub?output=csv', 141 | lkrData = {}, 142 | plzData = {}, 143 | loaded = 0, 144 | thanked = false; 145 | 146 | $(document).ready(function() { 147 | Papa.parse(sheetUrl, { 148 | download: true, 149 | header: true, 150 | //postProcess: function(row) { 151 | // row['gtfs'] = (row['gtfs'].toLowerCase() == 'true'); 152 | //}, 153 | complete: function(results) { 154 | var data = results.data 155 | $.each(data, function(idx, row) { 156 | lkrData[row['AdminCode3']] = row; 157 | }); 158 | loaded++; 159 | // if somebody already tried to use it, do it again (now with data) 160 | $('#plz').trigger('change'); 161 | } 162 | }); 163 | 164 | Papa.parse('data/plz2lkr.csv', { 165 | download: true, 166 | header: true, 167 | step: function(row) { 168 | plzData[row.data[0].plz] = row.data[0]; 169 | }, 170 | complete: function() { 171 | loaded++; 172 | $('#plz').trigger('change'); 173 | } 174 | }); 175 | 176 | $('#plz-form').on('submit', function(ev) { 177 | ev.preventDefault(); 178 | return false; 179 | }); 180 | 181 | $('#plz').on('keyup change', function() { 182 | plz = $(this).val(); 183 | if (plz.length <= 4) { 184 | hideAll(); 185 | return; 186 | } 187 | if (loaded < 2) { 188 | $('#actionStillLoading').show(); 189 | return; 190 | } 191 | hideAll(); 192 | 193 | if (typeof plzData[plz] == "undefined") { 194 | $('#actionError').show(); 195 | return; 196 | } 197 | 198 | ort = plzData[plz].ort; 199 | landkreis = plzData[plz].landkreis; 200 | ags = plzData[plz].ags; 201 | if (typeof ags == "undefined") { 202 | hideAll(); 203 | $('#actionError').show(); 204 | } 205 | 206 | $('#plzrepeat').text(plz); 207 | 208 | var data = lkrData[ags]; 209 | if (typeof data == "undefined") { 210 | $('#actionError').show(); 211 | return; 212 | } 213 | 214 | vbd = data['Verbund']; 215 | $('.data-vbd').text(vbd); 216 | if (data['gtfs']) { 217 | $('.gtfs-link').attr("href", data['gtfs-link']) 218 | $('#actionResultHasData').show(); 219 | return; 220 | } 221 | 222 | lra = data['Behörde']; 223 | ar = data['ChefHerrFrau']; 224 | arn = data['CHFn']; 225 | sge = data['Anrede']; 226 | lvn = data['ChefVorname']; 227 | lnn = data['ChefNachname']; 228 | str = data['Sitz (Straße)']; 229 | lraplz = data['Sitz (PLZ)']; 230 | 231 | if (data['AbwPostAdr'] != "" && data['AbwPLZ'] != "") { 232 | str = data['AbwPostAdr']; 233 | lraplz = data['AbwPLZ']; 234 | } 235 | 236 | stt = data['Sitz (Gemeinde)']; 237 | tel = data['Telefon']; 238 | var cleanTel = (tel || '').replace(/\D/g, ''); 239 | 240 | goog = (data['google'].toLowerCase() == 'true'); 241 | 242 | $('body')[goog ? 'addClass' : 'removeClass']('has-google-gtfs'); 243 | $('#city').val(ort); 244 | $('.data-tel').attr('href', 'tel:' + cleanTel).text(tel); 245 | $('.data-tel-name').text(arn + " " + lvn + " " + lnn); 246 | $('.data-mail-name').text("(" + arn + " " + lvn + " " + lnn + ")"); 247 | $('#actionResult').show(); 248 | }); 249 | 250 | $('.action-generate-pdf').click(function(ev) { 251 | ev.preventDefault(); 252 | renderPDF(); 253 | $('.action-thankyou').show(); 254 | }); 255 | 256 | $('.action-copy-text').click(function(ev) { 257 | ev.preventDefault(); 258 | var address = lra + "\n" + arn + " " + lvn + " " + lnn + "\n" + str + "\n" + lraplz + " " + stt + "\n\n"; 259 | $('.letter-text').text(address + generateText()).show(); 260 | $('.letter-text').get(0).select(); 261 | $('.action-thankyou').show(); 262 | }); 263 | 264 | $('.tab-link-telephone').click(function() { 265 | if (thanked) { 266 | return; 267 | } 268 | setTimeout(function() { 269 | $('.action-thankyou').show(); 270 | thanked = true; 271 | }, 10*1000); 272 | }); 273 | }); 274 | -------------------------------------------------------------------------------- /js/respond.min.js: -------------------------------------------------------------------------------- 1 | /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl 2 | * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT 3 | * */ 4 | 5 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,d){setTimeout(d,b.f)});Promise.race([e,d]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a= 22 | P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)}; 23 | function ma(a,b,c){for(var d in S)if(S.hasOwnProperty(d)&&b===a.f[S[d]]&&c===a.f[S[d]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=U()&&ma(a,b,c));d?q()-a.A>=a.w?U()&&ma(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)}; 24 | W.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,d,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)}; 25 | function ra(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=d||null||{};if(0===c.length&&f)M(b.a);else{b.f+=c.length;f&&(b.j=f);var h,m=[];for(h=0;h