From 05abd1789b65310b72bbf17262053503a0e5f521 Mon Sep 17 00:00:00 2001 From: Midgard Date: Wed, 17 Jun 2020 20:49:28 +0200 Subject: [PATCH] Initial commit --- htdocs/css/infoboards.css | 147 ++++++++++++++++++ htdocs/css/main.css | 142 +++++++++++++++++ htdocs/css/searchresults.css | 27 ++++ htdocs/img/delijn-pixelperfect.svg | 141 +++++++++++++++++ htdocs/img/delijn.svg | 166 ++++++++++++++++++++ htdocs/img/favicon-32.ico | Bin 0 -> 766 bytes htdocs/img/favicon-32.png | Bin 0 -> 412 bytes htdocs/img/favicon.ico | Bin 0 -> 766 bytes htdocs/img/favicon.png | Bin 0 -> 308 bytes htdocs/index.php | 64 ++++++++ htdocs/main.php | 39 +++++ htdocs/old/haltebord.css | 91 +++++++++++ htdocs/old/index.php | 27 ++++ htdocs/old/main.php | 20 +++ includes/ApiCoreRequest.php | 18 +++ includes/ApiRequest.php | 92 +++++++++++ includes/ApiRequestDummy.php | 96 ++++++++++++ includes/ApiSearchRequest.php | 18 +++ includes/DelayCalculator.php | 32 ++++ includes/DepartureFormatter.php | 43 ++++++ includes/HTMLTools.php | 25 +++ includes/Infoboard.php | 10 ++ includes/LineInfoboard.php | 19 +++ includes/PTElement.php | 54 +++++++ includes/PTLine.php | 79 ++++++++++ includes/PTStop.php | 59 +++++++ includes/ResultsInterface.php | 86 +++++++++++ includes/SearchQuery.php | 38 +++++ includes/SearchUI.php | 31 ++++ includes/StopInfoboard.php | 237 +++++++++++++++++++++++++++++ includes/UI.php | 57 +++++++ omleiding.json | 1 + 32 files changed, 1859 insertions(+) create mode 100644 htdocs/css/infoboards.css create mode 100644 htdocs/css/main.css create mode 100644 htdocs/css/searchresults.css create mode 100644 htdocs/img/delijn-pixelperfect.svg create mode 100644 htdocs/img/delijn.svg create mode 100644 htdocs/img/favicon-32.ico create mode 100644 htdocs/img/favicon-32.png create mode 100644 htdocs/img/favicon.ico create mode 100644 htdocs/img/favicon.png create mode 100644 htdocs/index.php create mode 100644 htdocs/main.php create mode 100644 htdocs/old/haltebord.css create mode 100644 htdocs/old/index.php create mode 100644 htdocs/old/main.php create mode 100644 includes/ApiCoreRequest.php create mode 100644 includes/ApiRequest.php create mode 100644 includes/ApiRequestDummy.php create mode 100644 includes/ApiSearchRequest.php create mode 100644 includes/DelayCalculator.php create mode 100644 includes/DepartureFormatter.php create mode 100644 includes/HTMLTools.php create mode 100644 includes/Infoboard.php create mode 100644 includes/LineInfoboard.php create mode 100644 includes/PTElement.php create mode 100644 includes/PTLine.php create mode 100644 includes/PTStop.php create mode 100644 includes/ResultsInterface.php create mode 100644 includes/SearchQuery.php create mode 100644 includes/SearchUI.php create mode 100644 includes/StopInfoboard.php create mode 100644 includes/UI.php create mode 100644 omleiding.json diff --git a/htdocs/css/infoboards.css b/htdocs/css/infoboards.css new file mode 100644 index 0000000..d8888e9 --- /dev/null +++ b/htdocs/css/infoboards.css @@ -0,0 +1,147 @@ +/*** Stop info board ***************************************************************/ +.stopInfoboard { + width: 100%; + border-spacing: 0; + border-collapse: collapse; + margin: 0 auto 1em; +} +@media (min-width:500px) { + .stopInfoboard { + width: auto; + min-width: 30%; + max-width: 1000px; + } +} + +td { + padding: 0.4em 0.1em; + text-align: left; +} + +@media (min-width:500px) { + td { + padding: 0.4em; + } +} + +.noLines { + font-style: italic; + color: #777; +} + + +/*** Shared info board styles ******************************************************/ +tr.line.even td { + background-color: #eee; +} + +tr.line .lineNumber { + text-align: right; + width: 3em; + font-size: 80%; + font-weight: bold; +} + @media (min-width:500px) { + tr.line .lineNumber { + font-size: 100%; + font-weight: normal; + } + } + +tr.line .destination { + font-size: 85%; + + -webkit-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +} + @media (min-width:500px) { + tr.line .destination { + font-size: 100%; + } + } + +.delay { + font-size: 90%; + color: #daa; + margin-right: 0.5em; + text-align: right; +} + .delay.early { + color: #aad; + } + +.departureH { + width: 0; + text-align: right; + padding-right: 0; +} +.departureSep { + width: 0; + text-align: center; + padding-left: 0; + padding-right: 0; +} +.departureMS { + width: 0; + padding-left: 0; +} + @media (min-width:500px) { + .departureH { + padding-left: 1em; + } + } + + .theoretical { + font-size: 90%; + color: #a00; + font-family: sans; + } + .seconds { + font-size: 90%; + color: #888; + } + table .seconds { + margin-left: 0.2em; + } + + +.disturbance { + background: #fff8e0; + border: 1px solid #ffd800; + max-width: 50em; + margin: 0 auto 1em; + padding: 0.2em 0.4em; +} + .disturbance ul, .disturbance li, .disturbance p { + margin: 0; + margin-top: 0.2em; + padding: 0; + list-style: none; + white-space: pre-wrap; + } + .disturbance h3, .disturbance h4 { + margin: 0; + font-size: 100%; + } + .disturbance h3 { + margin: -0.2em -0.4em 0; + padding: 0.2em 0.4em; + background: #fff0a0; + border-bottom: 1px solid #ffd800; + } + +.disturbance p.affectedLines { + font-size: 70%; + margin-bottom: 1em; +} + .affectedLines .line-nr { + padding: 0 0.05em; + } + +tr.canceled.line.even td { + background: #edd; +} +tr.canceled.line.odd td { + background: #fee; +} diff --git a/htdocs/css/main.css b/htdocs/css/main.css new file mode 100644 index 0000000..ebfe77a --- /dev/null +++ b/htdocs/css/main.css @@ -0,0 +1,142 @@ +body { + font-family: sans-serif; + margin: 0; + padding: 0 0 10px 0; + text-align: center; +} + +.group-text { + display: inline-block; +} + +.deemphasize { + color: #aaa; +} + +input { + font-size: inherit; + max-width: 100%; + box-sizing: border-box; +} +input[type=text] { + font: inherit; +} + + + +/*** Invisible space for correct text wrapping *************************************/ +.invisiblespace { + font-size: 0pt; +} + + +/*** Header and footer *************************************************************/ +.header { + background-color: #2b3034; + color: #fff; + border-bottom: 1px solid #ffd800; + padding: 0.5em 0; + text-align: center; +} +@media (min-width:500px) { + .header { + padding: 1em 0; + } +} + +h1, .subtitle { + display: inline-block; +} +.subtitle { + margin-left: 0.5em; +} + +h1, h2 { + margin: 0; + padding: 0; + font-size: 120%; +} +h1 a { + color: inherit; + text-decoration: none; +} +h2 { + margin-top: 1em; + font-size: 110%; +} + +@media (min-width:500px) { + h1 { + font-size: 160%; + } + h2 { + font-size: 140%; + } +} + + +.info, .footnote { + text-align: center; + padding: 0 1em; +} +.info { + margin-bottom: 1em; +} +.info .stopref { + margin: 0.4em 0; +} + +@media (min-width:500px) { + .info { + width: 400px; + text-align: right; + min-width: 30%; + max-width: 1000px; + margin-left: auto; + margin-right: auto; + } + .info .stopref { + float: left; + margin: 0; + } +} + +.bottom-search div { + margin: 0.3em 0; +} + + +/*** Search elements ***************************************************************/ +.mainsearch input { + font-size: 120%; +} + +@media (min-width:500px) { + .mainsearch input { + font-size: 140%; + } +} + +.search { + margin-top: 1em; +} + +/*** Error messages ***************************************************************/ +.user-error { + color: #333; + margin: 1em 0; + font-size: 150%; +} + +/*** Line numbers ******************************************************************/ +span.line-nr { + display: inline-block; + text-align: center; + width: 2em; + padding: 0.1em; + border: 2px solid transparent; + border-radius: 5px; +} +span.small.line-nr { + font-size: 75%; +} diff --git a/htdocs/css/searchresults.css b/htdocs/css/searchresults.css new file mode 100644 index 0000000..df0a4b4 --- /dev/null +++ b/htdocs/css/searchresults.css @@ -0,0 +1,27 @@ +.search-results .result { + margin: 1em 0; +} + +.search-results a.result.stop { + display: block; + color: inherit; + text-decoration: none; +} + +.search-results .result.stop .name { + font-weight: bold; +} + +.search-results .result.stop .ref { + color: #aaa; +} + +.search-results .result.stop .dest, +.search-results .result.stop .lines { + display: block; +} + +.search-results .result.stop .not-served-msg { + color: #800; +} + diff --git a/htdocs/img/delijn-pixelperfect.svg b/htdocs/img/delijn-pixelperfect.svg new file mode 100644 index 0000000..66a835f --- /dev/null +++ b/htdocs/img/delijn-pixelperfect.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/htdocs/img/delijn.svg b/htdocs/img/delijn.svg new file mode 100644 index 0000000..23c89ab --- /dev/null +++ b/htdocs/img/delijn.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/htdocs/img/favicon-32.ico b/htdocs/img/favicon-32.ico new file mode 100644 index 0000000000000000000000000000000000000000..99441b6db290d3159da56774b2fac0de6934c6f3 GIT binary patch literal 766 zcmZQzU<5)11py$*!tjELfkBLcfk6X^6@b_Qh(Y4Gz!Vn-hSY>`hQgc_hT^<5hLVDG zhVJ%8hUH7=Gi+MFnql*XH4F?l{xjUTewE?wom&k5|NloZYUUsZX9xg6LBTU;1O+XC z_{?!2hVq3#{6a7vXuxSO11JrW2N?)v0Hwiv7%31 gfI$w#XF%|bw0jL2KMIA9t{%S)ltv#)Vi*7p0B*7>SO5S3 literal 0 HcmV?d00001 diff --git a/htdocs/img/favicon-32.png b/htdocs/img/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..bff3cae49cceda0b8690746c5ce09e428f46f18d GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq zq}PKmW1Q4P8K9tKiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}?lAbP( zArY;~f9jhb+8<_MTGqIw<_aSZ5cK^2|6l%QW&>-if|6lxBM=-se6_Q&y?b`z*<)ux zDtNS?oli;tfs(mhR~P)>y?NuQ#odcPZ)|fY_GLZXc{yED0tmKTxhnDMRCnh$!IcdO zA{m)0jDh&_b;hl_vOHqTj)6_eHp^>s=hi)tp_jnp@8QbH7?I`9Ulw%K`A@B+6I0E@ znwVc1VoX3)X%U+fjU7u(dYO`B8UqC`9uiEkWDs+I(j-tHzvJl-8OI=zJNv5pE7)0n z7`6QPEfmteS6Tr?> l!O>%taD{O(pF}AG!>FHk#GP2 literal 0 HcmV?d00001 diff --git a/htdocs/img/favicon.ico b/htdocs/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..99441b6db290d3159da56774b2fac0de6934c6f3 GIT binary patch literal 766 zcmZQzU<5)11py$*!tjELfkBLcfk6X^6@b_Qh(Y4Gz!Vn-hSY>`hQgc_hT^<5hLVDG zhVJ%8hUH7=Gi+MFnql*XH4F?l{xjUTewE?wom&k5|NloZYUUsZX9xg6LBTU;1O+XC z_{?!2hVq3#{6a7vXuxSO11JrW2N?)v0Hwiv7%31 gfI$w#XF%|bw0jL2KMIA9t{%S)ltv#)Vi*7p0B*7>SO5S3 literal 0 HcmV?d00001 diff --git a/htdocs/img/favicon.png b/htdocs/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2672603f7d1d6496ad57e87e93a0ec3061fdbbb GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4Xc%-YZ?be0DQdj9|azx)KNj)9x2Gk5d8KC#1Zt-njW((;m!h+Te2^zZ$- zyw4BcFpxUTy-4Yh%Fc!)eS&2X1lBAgJ$~yMzJ9{+fcgb*@1s67& zN}DHlER@)g^iPKk2-@D?uTL;lIC5Y7ut0^vp*cqn95^sx#?<3L>cE0UOFFU~8uXok qCUi-NUOMRO=Jh3b-jw!6Muv_YyP$b$JllbeXYh3Ob6Mw<&;$U*iEWSo literal 0 HcmV?d00001 diff --git a/htdocs/index.php b/htdocs/index.php new file mode 100644 index 0000000..f934d34 --- /dev/null +++ b/htdocs/index.php @@ -0,0 +1,64 @@ +execute(); + + $ui = new ResultsInterface($stop, $searchresults); + + } + + } + + // Display line info board or search for lines + /* elseif (isset($_GET['l'])) { + $lineRef = $_GET['l']; + + $ui = new LineInfoboard($lineRef); + }*/ + + // Show search interface + else { + $ui = new SearchUI(); + } + + +?> + + + + + + + + + <?php $title = $ui->title(); if ($title) echo $title . ' – '; ?>De Lijn Reisinformatie lite + + + + display(); + ?> + + diff --git a/htdocs/main.php b/htdocs/main.php new file mode 100644 index 0000000..5394721 --- /dev/null +++ b/htdocs/main.php @@ -0,0 +1,39 @@ + diff --git a/htdocs/old/haltebord.css b/htdocs/old/haltebord.css new file mode 100644 index 0000000..89dca7f --- /dev/null +++ b/htdocs/old/haltebord.css @@ -0,0 +1,91 @@ +body { + font-family: sans-serif; + margin: 0; + padding: 10px 0; +} + +h1 { + margin: 0; + padding: 0; + font-size: 120%; + text-align: center; +} + +.info, .footnote { + text-align: center; + padding: 0 1em; +} +.info { + margin-bottom: 1em; +} + +@media (min-width:500px) { + .info { + width: 400px; + text-align: right; + min-width: 30%; + max-width: 1000px; + margin-left: auto; + margin-right: auto; + } + .info .stopref { + float: left; + } +} + +table.stopInfoboard { + min-width: 30%; + max-width: 1000px; + margin: 0 auto; + border-spacing: 0; + border-collapse: collapse; +} + +table.stopInfoboard td { + padding: 0.4em 0.1em; +} + +@media (min-width:500px) { + table.stopInfoboard td { + padding: 0.4em; + } +} + +tr.line.even td { + background-color: #eee; +} + +tr.line .lineNumber { + text-align: right; + width: 3em; +} +tr.line .lineNumber span { + display: inline-block; + text-align: center; + width: 2em; + padding: 0.1em; + margin-right: 0.4em; + border: 2px solid transparent; + border-radius: 5px; +} +tr.line .departure { + text-align: right; + padding: 0 0.2em; +} +@media (min-width:500px) { + tr.line .departure { + padding: 0 1em; + } +} + +.delay { + font-weight: bold; + font-size: 90%; + color: #f00; +} + +.theoretical { + font-size: 90%; + color: #a00; + font-family: Impact, fantasy, serif; +} diff --git a/htdocs/old/index.php b/htdocs/old/index.php new file mode 100644 index 0000000..27a0243 --- /dev/null +++ b/htdocs/old/index.php @@ -0,0 +1,27 @@ + + + + + + + Haltebord lite + + + + make(); + + ?> + + \ No newline at end of file diff --git a/htdocs/old/main.php b/htdocs/old/main.php new file mode 100644 index 0000000..3834d89 --- /dev/null +++ b/htdocs/old/main.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/includes/ApiCoreRequest.php b/includes/ApiCoreRequest.php new file mode 100644 index 0000000..41fe2d5 --- /dev/null +++ b/includes/ApiCoreRequest.php @@ -0,0 +1,18 @@ +action . ', method=' . $this->method . ']'; + } + + public function __construct ($action, $method='GET') { + + parent::__construct(static::$apiName, $action, $method); + + } + + } +?> \ No newline at end of file diff --git a/includes/ApiRequest.php b/includes/ApiRequest.php new file mode 100644 index 0000000..ed3e229 --- /dev/null +++ b/includes/ApiRequest.php @@ -0,0 +1,92 @@ +url . ']'; + } + + public function __construct ($apiPath, $action, $method='GET') { + + if (!is_string($action)) { + throw new InvalidArgumentException('$action must be a string'); + } + $this->apiPath = $apiPath; + $this->action = $action; + $this->url = Static::$baseURL.'/'.$apiPath.'/'.$action; + + if (preg_match('~//.*//~',$this->url) === 1) { + throw new InvalidArgumentException('Resulting URL ('.$this->url.') contains a double slash'); + } + + if (!is_string($method)) { + throw new InvalidArgumentException('$method must be a string'); + } + switch ($method) { + case 'GET': case 'POST': case 'PUT': case 'DELETE': break; + throw new InvalidArgumentException('$method must be one of the following: "GET", "POST", "PUT", "DELETE"'); + } + $this->method = $method; + + } + + public function exec ($dataToSend=null) { + + $opts = array('http' => + array( + 'method' => $this->method + ) + ); + if (!is_null($dataToSend)) { + if (is_array($dataToSend)) { + $opts['http']['content'] = http_build_query($dataToSend); + } else { + throw new InvalidArgumentException('$dataToSend must be either NULL or an array'); + } + } + + $context = stream_context_create($opts); + + $json = @file_get_contents( + $this->url, false, $context + ); + + // Make the HTTP response header available if they want to get it + // If there is no network connection, $http_response_header may be undefined + if (isset($http_response_header)) { + $this->http_response_header = $http_response_header; + } else { + $this->http_response_header = null; + } + + + $result = json_decode($json, true); + + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $result; + break; + case JSON_ERROR_SYNTAX: + throw new Exception('Result was not valid JSON: ' . json_last_error_msg()); + break; + default: + throw new Exception('Result could not be parsed as JSON: ' . json_last_error_msg()); + break; + } + return null; + + } + + public function getHttpResponseHeader () { + return $this->http_response_header; + } + } +?> diff --git a/includes/ApiRequestDummy.php b/includes/ApiRequestDummy.php new file mode 100644 index 0000000..027f7b5 --- /dev/null +++ b/includes/ApiRequestDummy.php @@ -0,0 +1,96 @@ +url . ']'; + } + + public function __construct ($action, $method='GET') { + + if (!is_string($action)) { + throw new InvalidArgumentException('$action must be a string'); + } + $this->action = $action; + $this->url = Static::$baseURL.$action; + + if (preg_match('~.*//.*//~',$this->url) === 1) { + throw new InvalidArgumentException('Resulting URL ('.$this->url.') contains a double slash'); + } + + if (!is_string($method)) { + throw new InvalidArgumentException('$method must be a string'); + } + switch ($method) { + case 'GET': case 'POST': case 'PUT': case 'DELETE': break; + throw new InvalidArgumentException('$method must be one of the following: "GET", "POST", "PUT", "DELETE"'); + } + $this->method = $method; + + } + + public function exec ($dataToSend=null) { + + $opts = array('http' => + array( + 'method' => $this->method + ) + ); + if (!is_null($dataToSend)) { + if (is_array($dataToSend)) { + $opts['http']['content'] = http_build_query($dataToSend); + } else { + throw new InvalidArgumentException('$dataToSend must be either NULL or an array'); + } + } + + $context = stream_context_create($opts); + + $json = '{"bestemmingen":null,"coordinaat":null,"entiteitNummer":0,"halteNummer":0,"huidigeDag":"maandag","huidigeTijd":"1:49","id":0,"interneLijnnummers":null,"laatstGebruikt":null,"lijnen":[{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":25500,"ritOrder":1603,"vertrekCalendar":1434338580000,"vertrekTijd":"5:23"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":45500,"ritOrder":1601,"vertrekCalendar":1434341580000,"vertrekTijd":"6:13"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":85500,"ritOrder":1608,"vertrekCalendar":1434345180000,"vertrekTijd":"7:13"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":105500,"ritOrder":1609,"vertrekCalendar":1434346980000,"vertrekTijd":"7:43"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":125500,"ritOrder":1617,"vertrekCalendar":1434347580000,"vertrekTijd":"7:53"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":145500,"ritOrder":1612,"vertrekCalendar":1434348780000,"vertrekTijd":"8:13"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":185500,"ritOrder":1613,"vertrekCalendar":1434350280000,"vertrekTijd":"8:38"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":225500,"ritOrder":1605,"vertrekCalendar":1434351300000,"vertrekTijd":"8:55"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":245500,"ritOrder":1616,"vertrekCalendar":1434352080000,"vertrekTijd":"9:08"},{"bestemming":"KNOKKE STATION","entiteitNummer":5,"gemeentes":null,"haltes":null,"id":0,"kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":null,"lijnNummer":500,"lijnNummerPubliek":"0 ","lijnRichting":null,"lijnType":"tram","lijnTypeLink":"TRAMLIJN","omschrijving":null,"omschrijvingHighlighted":null,"richtingCode":0,"richtingCodeAndereRichting":0,"ritNummer":265500,"ritOrder":1604,"vertrekCalendar":1434352980000,"vertrekTijd":"9:23"}],"name":null,"omschrijvingGemeente":null,"omschrijvingHighlighted":null,"omschrijvingKort":null,"omschrijvingLang":null}'; + + $this->http_response_header = array( + 'HTTP/1.1 200 OK', + 'connection: close', + 'content-language: nl-BE', + 'content-type: application/json', + 'date: Sun, 14 Jun 2015 23:49:47 GMT', + 'p3p: CP="NON CUR OTPi OUR NOR UNI"', + 'cache-control: no-cache', + 'x-powered-by: Servlet/3.0', + 'access-control-allow-credentials: true', + 'access-control-allow-headers: Content-Type', + 'access-control-allow-methods: HEAD, GET, POST, OPTIONS' + ); + + + $result = json_decode($json, true); + + + + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $result; + break; + case JSON_ERROR_SYNTAX: + throw new Exception('Result was not valid JSON: ' . json_last_error_msg()); + break; + default: + throw new Exception('Result could not be parsed as JSON: ' . json_last_error_msg()); + break; + } + return null; + + } + + public function getHttpResponseHeader () { + return $this->http_response_header; + } + } +?> \ No newline at end of file diff --git a/includes/ApiSearchRequest.php b/includes/ApiSearchRequest.php new file mode 100644 index 0000000..f915cb0 --- /dev/null +++ b/includes/ApiSearchRequest.php @@ -0,0 +1,18 @@ +action . ', method=' . $this->method . ']'; + } + + public function __construct ($action, $method='GET') { + + parent::__construct(static::$apiName, $action, $method); + + } + + } +?> \ No newline at end of file diff --git a/includes/DelayCalculator.php b/includes/DelayCalculator.php new file mode 100644 index 0000000..9733ce6 --- /dev/null +++ b/includes/DelayCalculator.php @@ -0,0 +1,32 @@ +currentTime = new DateTime($currentTime, $GLOBALS['timezone']) ) === false + ) { + throw new InvalidArgumentException('$currentTime must be HH:MM'); + } + #echo PHP_EOL;var_dump($this->currentTime);echo PHP_EOL; + + } + + public function calculateFromRemainingTime (DateInterval $timeToDeparture, DateTime $scheduledTime) { + $ct = clone $this->currentTime; + return $ct->add($timeToDeparture)->diff($scheduledTime); + } + + public function calculateFromExpectedTime (DateTime $departureTime, DateTime $scheduledTime) { + return $departureTime->diff($scheduledTime); + } + + } + +?> \ No newline at end of file diff --git a/includes/DepartureFormatter.php b/includes/DepartureFormatter.php new file mode 100644 index 0000000..bd348c8 --- /dev/null +++ b/includes/DepartureFormatter.php @@ -0,0 +1,43 @@ +diff($scheduleddepartureObj); + + + $realtime = null; + + // Not realtime + if ( preg_match('/([12]?\d):([0-5]\d)/', $realdeparture) === 1 ) { + $realtime = false; + $time = DateTime::createFromFormat("G:i", $realdeparture, $GLOBALS['timezone']); + } + // Realtime + else { + $matches = array(); + if ( preg_match('/(\d+)\'/', $realdeparture, $matches) === 1 ) { + $realtime = true; + $time = new DateTime("now", $GLOBALS['timezone']); + $time->add(new DateInterval("PT".$matches[1]."M")); + } + } + + //$scheduleddepartureObj->setTimezone($GLOBALS['timezone']); + return array( + //$scheduleddepartureObj->format('G:i'), + $time->format('G:i'), + "+0", + //$delay->format('%R%i'), + $realtime + ); + + } + + } + +?> diff --git a/includes/HTMLTools.php b/includes/HTMLTools.php new file mode 100644 index 0000000..1393d4f --- /dev/null +++ b/includes/HTMLTools.php @@ -0,0 +1,25 @@ + '; + + public static function makeSafe ($string) { + + return htmlentities($string); + + } + + public static function makeSafeAndWrapBetter ($string) { + + return preg_replace( + array('~/|-|\.~'), + array(static::$invisibleSpace.'$0'.static::$invisibleSpace), // Put an invisible space before and after each slash, hyphen and period + static::makeSafe($string) + ); + + } + + } + +?> \ No newline at end of file diff --git a/includes/Infoboard.php b/includes/Infoboard.php new file mode 100644 index 0000000..f058e42 --- /dev/null +++ b/includes/Infoboard.php @@ -0,0 +1,10 @@ ++'; + protected static $theoreticalAfter = '+'; + + } + +?> diff --git a/includes/LineInfoboard.php b/includes/LineInfoboard.php new file mode 100644 index 0000000..ec145d6 --- /dev/null +++ b/includes/LineInfoboard.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/includes/PTElement.php b/includes/PTElement.php new file mode 100644 index 0000000..23a7946 --- /dev/null +++ b/includes/PTElement.php @@ -0,0 +1,54 @@ +ref = $ref; + + } + + public function __toString () { + return 'PTElement[' . $this->ref . ']'; + } + + public function getRef () { + return $this->ref; + } + + protected abstract function fetchInfo (); + + + public static function lineTypeTextToConst ($lineTypeText) { + switch ($lineTypeText) { + case 'tram'; + return static::TRAM; + break; + case 'bus'; + return static::BUS; + break; + case 'belbus'; + return static::BELBUS; + break; + default; + return static::UNKNOWN; + break; + } + } + + } + +?> \ No newline at end of file diff --git a/includes/PTLine.php b/includes/PTLine.php new file mode 100644 index 0000000..b78e5a8 --- /dev/null +++ b/includes/PTLine.php @@ -0,0 +1,79 @@ +entity = $entity; + + if (!is_int($direction)) { + throw new InvalidArgumentException('$direction must be an integer'); + } + $this->direction = $direction; + + } + + public function __toString () { + return 'PTLine[' . $this->entity . '/' . $this->ref . '/' . $this->direction . ']'; + } + + public function getRef () { + return $this->ref; + } + + public function getPublicRef () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->publicRef; + } + public function getLineType () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->lineType; + } + public function getDirectionDesc () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->directionDesc; + } + + protected function fetchInfo () { + + $apireq = new ApiCoreRequest('lijnen/titel/' . $this->entity . '/' . $this->ref . '/' . $this->direction); + $response = $apireq->exec(); + + $this->lineType = PTElement::lineTypeTextToConst($response['lijnType']); + $this->publicRef = $response['lijnNummerPubliek']; + $this->directionDesc = $response['lijnRichting']; + + } + + public function getTimetable () { + throw new NotImplementedException(); + } + + public function getTimetableAtStop (PTStop $stop) { + throw new NotImplementedException(); + } + + + public static function htmlElement($bgColor, $bgBorder, $fgColor, $lineNumber, $class='') { + return '' .$lineNumber . ''; + + } + } + +?> diff --git a/includes/PTStop.php b/includes/PTStop.php new file mode 100644 index 0000000..15b3385 --- /dev/null +++ b/includes/PTStop.php @@ -0,0 +1,59 @@ +ref . ']'; + } + + public function getExists () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->exists; + } + public function getMunicipality () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->municipality; + } + public function getName () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->name; + } + public function getFullName () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->fullName; + } + public function getLocation () { + if (!$this->infoFetched) $this->fetchInfo(); + return $this->location; + } + + protected function fetchInfo () { + + $apireq = new ApiCoreRequest('haltes/titel/' . $this->ref); + $response = $apireq->exec(); + + $this->exists = !is_null($response); + + $this->municipality = $response['omschrijvingGemeente']; + $this->name = $response['omschrijvingKort']; + $this->fullName = $response['omschrijvingLang']; + $this->location = array(floatval($response['coordinaat']['lt']), floatval($response['coordinaat']['ln'])); + + } + + public function getImminentVehicles ($numberOfLines) { + + $apireq = new ApiCoreRequest('haltes/doorkomstenditmoment/' . $this->ref . '/' . $numberOfLines); + return $apireq->exec(); + + } + + } + +?> diff --git a/includes/ResultsInterface.php b/includes/ResultsInterface.php new file mode 100644 index 0000000..b96f374 --- /dev/null +++ b/includes/ResultsInterface.php @@ -0,0 +1,86 @@ +query = $searchQuery; + $this->stops = $searchResults['haltes']; + + } + + public function title () { + + return 'Zoekresultaten'; + + } + + public function display() { + + parent::header(); + + echo '
'; + + echo '

Zoeken naar halte

'; + + echo '
'; + + if (isset($this->stops[0])) { + + echo ''; + + } else { + + echo '
Geen resultaten
'; + + } + + parent::footer(); + + } + + } + +?> diff --git a/includes/SearchQuery.php b/includes/SearchQuery.php new file mode 100644 index 0000000..bedcab6 --- /dev/null +++ b/includes/SearchQuery.php @@ -0,0 +1,38 @@ +originalQueryString = $queryString; + $this->queryString = rawurlencode(strtolower(str_replace(array('"', "'", '-', '.', '%'), ' ', $queryString))); + $this->searchForTypes = $searchForTypes; + + } + //https://www.delijn.be/rise-api-search/search/lijnen/knokke/1 + + public function execute () { + + $req = new ApiSearchRequest('search/haltes/' . $this->queryString . '/1'); + return $req->exec(); + + } + + } + +?> diff --git a/includes/SearchUI.php b/includes/SearchUI.php new file mode 100644 index 0000000..ae2e54f --- /dev/null +++ b/includes/SearchUI.php @@ -0,0 +1,31 @@ +Zoek halte'; + echo '
'; + echo '
'; + echo ''; + echo '
'; + + /* echo '

Zoek lijn

'; + echo '
'; + echo '
'; + echo ''; + echo '
';*/ + + } + + } + +?> diff --git a/includes/StopInfoboard.php b/includes/StopInfoboard.php new file mode 100644 index 0000000..f41e661 --- /dev/null +++ b/includes/StopInfoboard.php @@ -0,0 +1,237 @@ + 0 ? '+' : '-') . $str; + return $str . ($delay > 0 ? ' te laat' : ' te vroeg'); + } + + class StopInfoboard extends Infoboard { + + private $found = false; + + private $stop; + private $numberOfLines; + + private $currentTime; + + private $lines; + + private $disturbed = false; + private $allLinesDisturbed = false; + private $disturbances = false; + private $notServed = false; + + public function __construct ($stopRef, $numberOfLines=50) { + global $timezone; + + $this->currentTime = new DateTime('now', $timezone); + + $this->stop = new PTStop(intval($stopRef)); + $this->numberOfLines = $numberOfLines; + + $result = $this->stop->getImminentVehicles($numberOfLines); + + $this->detours = $result['halteOmleidingen']; + $this->disturbed = $result['dienstRegelingVerstoord']; + $this->allLinesDisturbed = $result['alleLijnenVerstoord']; + $this->disturbances = $result['storingen']; + $this->notServed = $result['nietBediend']; + + $this->lines = $result['lijnen']; + + } + + public function title() { + + $name = $this->stop->getFullName(); + if ($name) return $name; + + return 'Halte'; + + } + + public function display() { + global $timezone; + + parent::header(); + + if (!$this->stop->getExists()) { + + echo '
De halte met haltenummer ' . HTMLTools::makeSafe($this->stop->getRef()) . ' werd niet gevonden.
'; + + parent::footer(); + + return; + } + + + echo '

' . HTMLTools::makeSafe($this->stop->getFullName()) . '

'; + + echo '
'; + echo '
Haltenummer ' . HTMLTools::makeSafe($this->stop->getRef()) . '
'; + echo '
Info van ' . $this->currentTime->format('H:i') . ':' . $this->currentTime->format('s') . '
'; + echo '
'; + + if (!empty($this->disturbances)) { + echo '

Storingen en mededelingen

    '; + foreach ($this->disturbances as $disturbance) { + echo '
  • ' . HTMLTools::makeSafe($disturbance) . '
  • '; + } + echo '
'; + } + if (!empty($this->detours)) { + echo '

Omleidingen

    '; + foreach ($this->detours as $detour) { + $description = $detour['omleidingen'][0]; + echo '
  • ' . HTMLTools::makeSafe($description['title']) . '

    ' . HTMLTools::makeSafe($description['omleiding']) . '

    '; + + if (!empty($detour['verstoordeLijnenSet'])) { + echo '

    '; + foreach ($detour['verstoordeLijnenSet'] as $line) { + echo PTLine::htmlElement( + $line['kleurAchterGrond'], + $line['kleurAchterGrondRand'], + $line['kleurVoorGrond'], + $line['lijnNummerPubliek']); + echo ' '; + } + echo '

    '; + } + echo '
  • '; + } + echo '
'; + } + if ($this->notServed) { + echo '
Deze halte wordt momenteel niet bediend.
'; + } elseif ($this->allLinesDisturbed) { + echo '
De dienstregeling van alle lijnen aan deze halte is verstoord.
'; + } elseif ($this->disturbed) { + echo '
De dienstregeling van sommige lijnen aan deze halte is verstoord.
'; + } + + if (empty($this->lines)) { + echo '
Geen doorkomsten in de nabije toekomst
'; + } else { + + $anyNotRealtime = false; + + echo ''; + + $evenrow = true; + + usort($this->lines, compareDoorkomsten); + + foreach ($this->lines as $line) { + + $scheduledTime = intdiv($line['vertrekTheoretischeTijdstip'], 1000); + $realtimeTime = intdiv($line['vertrekRealtimeTijdstip'], 1000); + if ($realtimeTime == 0) $realtimeTime = null; + + $realtime = !is_null($realtimeTime); + if (!$realtime) $anyNotRealtime = true; + + $timeDT = new DateTime('now', $timezone); + if ($realtime) { + $timeDT->setTimestamp($realtimeTime); + } else { + $timeDT->setTimestamp($scheduledTime); + } + $delay = $realtime ? $realtimeTime - $scheduledTime : 0; + + $canceled = in_array('DELETED', $line['predictionStatussen']) || in_array('CANCELLED', $line['predictionStatussen']); + + + echo ''; + + // Line number + echo ' '; + + // Destination + echo ''; + + // Delay + echo ''; + + // Departure time + echo ''; + echo ''; + echo ''; + echo ''; + + $evenrow = !$evenrow; + } + + echo '
' . PTLine::htmlElement( + $line['kleurAchterGrond'], + $line['kleurAchterGrondRand'], + $line['kleurVoorGrond'], + $line['lijnNummerPubliek']) . ''; + if ($canceled) echo ''; + echo HTMLTools::makeSafeAndWrapBetter($line['bestemming']); + if ($canceled) echo ''; + echo ''; + if ($canceled) { + echo 'Rijdt niet'; + } elseif (abs($delay) >= 60) { + echo formatDelay($delay) . ':'; + } + echo ''; + + if (!$realtime) { + echo static::$theoreticalBefore; + } + + echo $timeDT->format("H"); + + echo ':'; + + echo $timeDT->format("i"); + + if ($realtime && intval($timeDT->format('s')) !== 0) { + echo ':' . $timeDT->format('s') . ''; + } + + if (!$realtime) { + echo static::$theoreticalAfter; + } + + echo '
'; + + if ($anyNotRealtime) { + echo '
' . static::$theoreticalBefore . 'Theoretische vertrektijd' . static::$theoreticalAfter . '
'; + } + } + + $coords = $this->stop->getLocation(); + echo 'Locatie van halte'; + + parent::footer(); + + } + + } + +?> diff --git a/includes/UI.php b/includes/UI.php new file mode 100644 index 0000000..66ebd7c --- /dev/null +++ b/includes/UI.php @@ -0,0 +1,57 @@ +'; + echo '

De Lijn Reisinformatie lite

'; + echo '
(niet-officieel)
'; + echo ''; + + } + + protected function footer() { + + echo ''; + + } + + public function listify($array) { + + $listString = ''; + + $length = count($array); + + switch ($length) { + case 0: + return false; + break; + + case 1: + return HTMLTools::makeSafeAndWrapBetter($array[0]); + break; + + case 2: + return HTMLTools::makeSafeAndWrapBetter($array[0]) . ' en ' . HTMLTools::makeSafeAndWrapBetter($array[1]); + break; + + default: + return HTMLTools::makeSafeAndWrapBetter($array[0]) . ', ' . HTMLTools::makeSafeAndWrapBetter($array[1]) . '...'; + break; + } + + } + + } + +?> diff --git a/omleiding.json b/omleiding.json new file mode 100644 index 0000000..bc0ad82 --- /dev/null +++ b/omleiding.json @@ -0,0 +1 @@ +{"alleLijnenVerstoord":null,"coordinaat":{"lt":51.0346508552327,"ln":3.717331850376546,"x":104307,"y":191808},"dienstRegelingVerstoord":null,"enkelBelbus":false,"geenDoorkomsten":true,"halteNummer":200984,"halteOmleidingen":[{"omleidingen":[{"datumOpgevraagd":null,"datumTot":null,"datumVan":null,"haltes":null,"id":269384,"lijnen":null,"omleiding":"Periode: Van maandag 25 mei 2020 tot einde werken\nNiet-bediende haltes: Gent: Parkplein\nVervanghaltes: Gent: Fortlaan\n","tijdstipTot":null,"tijdstipVan":null,"title":"Gent: De fasewissel werd uitgesteld! - Heraanleg halte 'Parkplein' FASE 2"}],"tijdstipTot":null,"tijdstipVan":null,"type":"TYPE_ENKELE_LIJNEN_VERSTOORD_VOLLEDIGE_DAG","url":"2/134/6/","verstoordeLijnenSet":[{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2134,"internLijnnummer":"2134","kleurAchterGrond":"#1199DD","kleurAchterGrondRand":"#1199DD","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":134,"lijnNummerPubliek":"34","lijnRichting":"Wetteren - Gent - Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/134/6/34_Wetteren_-_Gent_-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Wetteren - Gent - Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"De Pinte Station","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2135,"internLijnnummer":"2135","kleurAchterGrond":"#C5AA77","kleurAchterGrondRand":"#C5AA77","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":135,"lijnNummerPubliek":"35","lijnRichting":"Lokeren- Beervelde- Gent- Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/135/6/35_Lokeren-_Beervelde-_Gent-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Lokeren- Beervelde- Gent- Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Sint-Martens-Leerne Dorp","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2136,"internLijnnummer":"2136","kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":136,"lijnNummerPubliek":"36","lijnRichting":"Zele - Gent - Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/136/6/36_Zele_-_Gent_-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Zele - Gent - Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zelzate Koophandelsplein","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2155,"internLijnnummer":"2155","kleurAchterGrond":"#FF88AA","kleurAchterGrondRand":"#FF88AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":155,"lijnNummerPubliek":"55","lijnRichting":"Zelzate - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/155/6/55_Zelzate_-_Gent_Sint-Pieters","omschrijving":"Zelzate - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2157,"internLijnnummer":"2157","kleurAchterGrond":"#BBDD00","kleurAchterGrondRand":"#BBDD00","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1588543200000,"lijnNummer":157,"lijnNummerPubliek":"57","lijnRichting":"Watervliet - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/157/6/57_Watervliet_-_Gent_Sint-Pieters","omschrijving":"Watervliet - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2158,"internLijnnummer":"2158","kleurAchterGrond":"#229922","kleurAchterGrondRand":"#229922","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1587333600000,"lijnNummer":158,"lijnNummerPubliek":"58","lijnRichting":"Brugge - Eeklo - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/158/6/58_Brugge_-_Eeklo_-_Gent_Sint-Pieters","omschrijving":"Brugge - Eeklo - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2165,"internLijnnummer":"2165","kleurAchterGrond":"#0044BB","kleurAchterGrondRand":"#0044BB","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":165,"lijnNummerPubliek":"65","lijnRichting":"Ursel Kerk - Zomergem- Gent Sint-Pietersstation","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/165/6/65_Ursel_Kerk_-_Zomergem-_Gent_Sint-Pietersstation","omschrijving":"Ursel Kerk - Zomergem- Gent Sint-Pietersstation","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zwijnaarde Kasteel","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2170,"internLijnnummer":"2170","kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1590184800000,"lijnNummer":170,"lijnNummerPubliek":"70","lijnRichting":"Oostakker - Gent - Zwijnaarde","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/170/6/70_Oostakker_-_Gent_-_Zwijnaarde","omschrijving":"Oostakker - Gent - Zwijnaarde","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Nazareth Kortrijkseheerweg","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2171,"internLijnnummer":"2171","kleurAchterGrond":"#0099AA","kleurAchterGrondRand":"#0099AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1590184800000,"lijnNummer":171,"lijnNummerPubliek":"71","lijnRichting":"Oostakker - Gent - Nazareth Dorp","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/171/6/71_Oostakker_-_Gent_-_Nazareth_Dorp","omschrijving":"Oostakker - Gent - Nazareth Dorp","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Merelbeke Molenhoek","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2172,"internLijnnummer":"2172","kleurAchterGrond":"#77CCAA","kleurAchterGrondRand":"#77CCAA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":172,"lijnNummerPubliek":"72","lijnRichting":"Oostakker - Gent - Merelbeke Molenhoek","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/172/6/72_Oostakker_-_Gent_-_Merelbeke_Molenhoek","omschrijving":"Oostakker - Gent - Merelbeke Molenhoek","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2173,"internLijnnummer":"2173","kleurAchterGrond":"#229922","kleurAchterGrondRand":"#229922","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1588543200000,"lijnNummer":173,"lijnNummerPubliek":"73","lijnRichting":"Wachtebeke Overslag/Zelzate - Oostakker - Gent","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/173/6/73_Wachtebeke_Overslag_Zelzate_-_Oostakker_-_Gent","omschrijving":"Wachtebeke Overslag/Zelzate - Oostakker - Gent","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2174,"internLijnnummer":"2174","kleurAchterGrond":"#0099AA","kleurAchterGrondRand":"#0099AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1590357600000,"lijnNummer":174,"lijnNummerPubliek":"74","lijnRichting":"Lokeren - Zaffelare - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/174/6/74_Lokeren_-_Zaffelare_-_Gent_Sint-Pieters","omschrijving":"Lokeren - Zaffelare - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Eke Industriepark","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2176,"internLijnnummer":"2176","kleurAchterGrond":"#005555","kleurAchterGrondRand":"#005555","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":176,"lijnNummerPubliek":"76","lijnRichting":"Wachtebeke - Lochristi - Gent - De Pinte","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/176/6/76_Wachtebeke_-_Lochristi_-_Gent_-_De_Pinte","omschrijving":"Wachtebeke - Lochristi - Gent - De Pinte","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Deinze Kerkhof","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2177,"internLijnnummer":"2177","kleurAchterGrond":"#0044BB","kleurAchterGrondRand":"#0044BB","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":177,"lijnNummerPubliek":"77","lijnRichting":"Beervelde - Lochristi - Gent - Deinze Kerkhof","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/177/6/77_Beervelde_-_Lochristi_-_Gent_-_Deinze_Kerkhof","omschrijving":"Beervelde - Lochristi - Gent - Deinze Kerkhof","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zwijnaarde Bollebergen","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2178,"internLijnnummer":"2178","kleurAchterGrond":"#FFCC11","kleurAchterGrondRand":"#FFCC11","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":178,"lijnNummerPubliek":"78","lijnRichting":"Lokeren - Lochristi - Gent - De Pinte - Zevergem","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/178/6/78_Lokeren_-_Lochristi_-_Gent_-_De_Pinte_-_Zevergem","omschrijving":"Lokeren - Lochristi - Gent - De Pinte - Zevergem","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null}]},{"omleidingen":[{"datumOpgevraagd":null,"datumTot":null,"datumVan":null,"haltes":null,"id":268850,"lijnen":null,"omleiding":"Periode: Van maandag 11 mei 2020 tot einde werken\nNiet-bediende haltes: Gent: Parkplein\nVervanghaltes: Geen vervanghaltes\n","tijdstipTot":null,"tijdstipVan":null,"title":"Gent: De fasewissel werd uitgesteld! - Heraanleg halte 'Parkplein'"}],"tijdstipTot":null,"tijdstipVan":null,"type":"TYPE_ENKELE_LIJNEN_VERSTOORD_VOLLEDIGE_DAG","url":"2/134/6/","verstoordeLijnenSet":[{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2134,"internLijnnummer":"2134","kleurAchterGrond":"#1199DD","kleurAchterGrondRand":"#1199DD","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":134,"lijnNummerPubliek":"34","lijnRichting":"Wetteren - Gent - Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/134/6/34_Wetteren_-_Gent_-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Wetteren - Gent - Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"De Pinte Station","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2135,"internLijnnummer":"2135","kleurAchterGrond":"#C5AA77","kleurAchterGrondRand":"#C5AA77","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":135,"lijnNummerPubliek":"35","lijnRichting":"Lokeren- Beervelde- Gent- Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/135/6/35_Lokeren-_Beervelde-_Gent-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Lokeren- Beervelde- Gent- Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Sint-Martens-Leerne Dorp","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2136,"internLijnnummer":"2136","kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":136,"lijnNummerPubliek":"36","lijnRichting":"Zele - Gent - Latem - De Pinte/St-Martens-Leerne","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/136/6/36_Zele_-_Gent_-_Latem_-_De_Pinte_St-Martens-Leerne","omschrijving":"Zele - Gent - Latem - De Pinte/St-Martens-Leerne","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zelzate Koophandelsplein","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2155,"internLijnnummer":"2155","kleurAchterGrond":"#FF88AA","kleurAchterGrondRand":"#FF88AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":155,"lijnNummerPubliek":"55","lijnRichting":"Zelzate - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/155/6/55_Zelzate_-_Gent_Sint-Pieters","omschrijving":"Zelzate - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2157,"internLijnnummer":"2157","kleurAchterGrond":"#BBDD00","kleurAchterGrondRand":"#BBDD00","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1588543200000,"lijnNummer":157,"lijnNummerPubliek":"57","lijnRichting":"Watervliet - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/157/6/57_Watervliet_-_Gent_Sint-Pieters","omschrijving":"Watervliet - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2158,"internLijnnummer":"2158","kleurAchterGrond":"#229922","kleurAchterGrondRand":"#229922","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1587333600000,"lijnNummer":158,"lijnNummerPubliek":"58","lijnRichting":"Brugge - Eeklo - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/158/6/58_Brugge_-_Eeklo_-_Gent_Sint-Pieters","omschrijving":"Brugge - Eeklo - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2165,"internLijnnummer":"2165","kleurAchterGrond":"#0044BB","kleurAchterGrondRand":"#0044BB","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":165,"lijnNummerPubliek":"65","lijnRichting":"Ursel Kerk - Zomergem- Gent Sint-Pietersstation","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/165/6/65_Ursel_Kerk_-_Zomergem-_Gent_Sint-Pietersstation","omschrijving":"Ursel Kerk - Zomergem- Gent Sint-Pietersstation","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zwijnaarde Kasteel","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2170,"internLijnnummer":"2170","kleurAchterGrond":"#BB0022","kleurAchterGrondRand":"#BB0022","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1590184800000,"lijnNummer":170,"lijnNummerPubliek":"70","lijnRichting":"Oostakker - Gent - Zwijnaarde","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/170/6/70_Oostakker_-_Gent_-_Zwijnaarde","omschrijving":"Oostakker - Gent - Zwijnaarde","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Nazareth Kortrijkseheerweg","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2171,"internLijnnummer":"2171","kleurAchterGrond":"#0099AA","kleurAchterGrondRand":"#0099AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1590184800000,"lijnNummer":171,"lijnNummerPubliek":"71","lijnRichting":"Oostakker - Gent - Nazareth Dorp","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/171/6/71_Oostakker_-_Gent_-_Nazareth_Dorp","omschrijving":"Oostakker - Gent - Nazareth Dorp","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Merelbeke Molenhoek","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2172,"internLijnnummer":"2172","kleurAchterGrond":"#77CCAA","kleurAchterGrondRand":"#77CCAA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":172,"lijnNummerPubliek":"72","lijnRichting":"Oostakker - Gent - Merelbeke Molenhoek","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/172/6/72_Oostakker_-_Gent_-_Merelbeke_Molenhoek","omschrijving":"Oostakker - Gent - Merelbeke Molenhoek","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2173,"internLijnnummer":"2173","kleurAchterGrond":"#229922","kleurAchterGrondRand":"#229922","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1588543200000,"lijnNummer":173,"lijnNummerPubliek":"73","lijnRichting":"Wachtebeke Overslag/Zelzate - Oostakker - Gent","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/173/6/73_Wachtebeke_Overslag_Zelzate_-_Oostakker_-_Gent","omschrijving":"Wachtebeke Overslag/Zelzate - Oostakker - Gent","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Gent Sint-Pietersstation","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2174,"internLijnnummer":"2174","kleurAchterGrond":"#0099AA","kleurAchterGrondRand":"#0099AA","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1590357600000,"lijnNummer":174,"lijnNummerPubliek":"74","lijnRichting":"Lokeren - Zaffelare - Gent Sint-Pieters","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/174/6/74_Lokeren_-_Zaffelare_-_Gent_Sint-Pieters","omschrijving":"Lokeren - Zaffelare - Gent Sint-Pieters","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Eke Industriepark","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2176,"internLijnnummer":"2176","kleurAchterGrond":"#005555","kleurAchterGrondRand":"#005555","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":176,"lijnNummerPubliek":"76","lijnRichting":"Wachtebeke - Lochristi - Gent - De Pinte","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/176/6/76_Wachtebeke_-_Lochristi_-_Gent_-_De_Pinte","omschrijving":"Wachtebeke - Lochristi - Gent - De Pinte","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Deinze Kerkhof","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2177,"internLijnnummer":"2177","kleurAchterGrond":"#0044BB","kleurAchterGrondRand":"#0044BB","kleurVoorGrond":"#FFFFFF","kleurVoorGrondRand":"#000000","lijnGeldigVan":1591567200000,"lijnNummer":177,"lijnNummerPubliek":"77","lijnRichting":"Beervelde - Lochristi - Gent - Deinze Kerkhof","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/177/6/77_Beervelde_-_Lochristi_-_Gent_-_Deinze_Kerkhof","omschrijving":"Beervelde - Lochristi - Gent - Deinze Kerkhof","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null},{"bestemming":"Zwijnaarde Bollebergen","eindHalteBijSchrapping":null,"entiteitNummer":2,"gemeentes":null,"halteVolgorde":-1,"haltes":null,"id":2178,"internLijnnummer":"2178","kleurAchterGrond":"#FFCC11","kleurAchterGrondRand":"#FFCC11","kleurVoorGrond":"#000000","kleurVoorGrondRand":"#FFFFFF","lijnGeldigVan":1591567200000,"lijnNummer":178,"lijnNummerPubliek":"78","lijnRichting":"Lokeren - Lochristi - Gent - De Pinte - Zevergem","lijnType":"bus","lijnTypeLink":"BUSLIJN","lijnUrl":"2/178/6/78_Lokeren_-_Lochristi_-_Gent_-_De_Pinte_-_Zevergem","omschrijving":"Lokeren - Lochristi - Gent - De Pinte - Zevergem","omschrijvingHighlighted":null,"predictionDeleted":false,"predictionShortened":false,"predictionStatussen":[],"richtingCode":6,"richtingCodeAndereRichting":7,"ritNummer":0,"ritOrder":0,"vertrekCalendar":null,"vertrekRealtimeTijdstip":null,"vertrekTheoretischeTijdstip":null,"vertrekTijd":null,"viaBestemming":null,"voertuigNummer":null}]}],"huidigeDag":"woensdag","huidigeTijd":"14:06","lijnen":[],"nietBediend":false,"omschrijvingKort":"Parkplein","omschrijvingLang":"Gent Parkplein","serverTijd":1592395562521,"storingen":[]} \ No newline at end of file