Code standards, fix base path at least for php includes and use single quotes more often
Code standards, fix base path at least for php includes and use single quotes more often

<?php <?php
require $basePath.'lib/openid.php';  
  require ROOT . '/../lib/openid.php';
$openid = new LightOpenID($_SERVER['HTTP_HOST']); $openid = new LightOpenID($_SERVER['HTTP_HOST']);
   
function login() function login() {
{ global $openid;
global $openid; if (!$openid->mode) {
if(!$openid->mode) { $openid->required = array('contact/email');
$openid->required = array('contact/email'); $openid->identity = 'https://www.google.com/accounts/o8/id';
$openid->identity = 'https://www.google.com/accounts/o8/id'; header('Location: ' . $openid->authUrl());
header('Location: ' . $openid->authUrl()); }
} }
}  
  function auth() {
  if ($_SESSION['authed'] == true)
  return true;
  global $openid;
   
  if ($openid->mode) {
  $attr = $openid->getAttributes();
  if ($attr['contact/email'] != 'maxious@gmail.com') {
  die('Access Denied');
  } else {
  $_SESSION['authed'] = true;
  }
  } else {
  login();
  }
  }
   
   
function auth()  
   
{  
if ($_SESSION['authed'] == true) return true;  
global $openid;  
   
if($openid->mode) {  
$attr = $openid->getAttributes();  
if ($attr["contact/email"] != "maxious@gmail.com") {  
die("Access Denied");  
} else {  
$_SESSION['authed'] = true;  
}  
} else {  
login();  
}  
}  
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
if (strstr(php_uname('n'),"actbus")) { if (strstr(php_uname('n'),'actbus')) {
$conn = new PDO("pgsql:dbname=transitdata;user=transitdata;password=transitdata;host=bus-main.lambdacomplex.org"); $conn = new PDO('pgsql:dbname=transitdata;user=transitdata;password=transitdata;host=bus-main.lambdacomplex.org');
} else if (isDebugServer()) { } else if (isDebugServer()) {
$conn = new PDO("pgsql:dbname=transitdata;user=postgres;password=snmc;host=localhost"); $conn = new PDO('pgsql:dbname=transitdata;user=postgres;password=snmc;host=localhost');
} else { } else {
$conn = new PDO("pgsql:dbname=transitdata;user=transitdata;password=transitdata;host=localhost"); $conn = new PDO('pgsql:dbname=transitdata;user=transitdata;password=transitdata;host=localhost');
} }
if (!$conn) { if (!$conn) {
die("A database error occurred.\n"); die('A database error occurred.'.PHP_EOL);
} }
   
function databaseError($errMsg) { function databaseError($errMsg) {
if ($errMsg[1] != "") { if ($errMsg[1] != '') {
die(print_r($errMsg,true)); die(print_r($errMsg,true));
} }
} }
   
include ('db/route-dao.inc.php'); include ('db/route-dao.inc.php');
include ('db/trip-dao.inc.php'); include ('db/trip-dao.inc.php');
include ('db/stop-dao.inc.php'); include ('db/stop-dao.inc.php');
include ('db/servicealert-dao.inc.php'); include ('db/servicealert-dao.inc.php');
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',') // SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',')
$suburbs = explode(",", "Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O'Connor,O'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla"); $suburbs = explode(',', 'Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O\'Connor,O\'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla');
   
function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) {
   
$markers = ""; $markers = '';
$height = 300; $height = 300;
$width = $height; $width = $height;
$index = 0; $index = 0;
if (sizeof($mapPoints) < 1) if (sizeof($mapPoints) < 1)
return "map error"; return 'map error';
if (sizeof($mapPoints) === 1) { if (sizeof($mapPoints) === 1) {
$markers = "markers={$mapPoints[0][0]},{$mapPoints[0][1]}"; $markers = 'markers={$mapPoints[0][0]},{$mapPoints[0][1]}';
} else { } else {
if (!$numbered) { if (!$numbered) {
$markers = "markers="; $markers = 'markers=';
} }
if ($path) { if ($path) {
$markers.= "markers={$mapPoints[0][0]},{$mapPoints[0][1]}&amp;path="; $markers.= 'markers={$mapPoints[0][0]},{$mapPoints[0][1]}&amp;path=';
} }
foreach ($mapPoints as $index => $mapPoint) { foreach ($mapPoints as $index => $mapPoint) {
if ($twotone && $index == 0) { if ($twotone && $index == 0) {
$markers = "markerd=color:red|".$mapPoint[0] . "," . $mapPoint[1]."&amp;markers="; $markers = 'markerd=color:red|' . $mapPoint[0] . ',' . $mapPoint[1] . '&amp;markers=';
} else { } else {
if ($numbered) { if ($numbered) {
$label = ($index > 9 ? 9 : $index); $label = ($index > 9 ? 9 : $index);
$markers.= "markers=label:$label|" . $mapPoint[0] . "," . $mapPoint[1]; $markers.= 'markers=label:' . $label . '|' . $mapPoint[0] . ',' . $mapPoint[1];
if ($index + 1 != sizeof($mapPoints)) { if ($index + 1 != sizeof($mapPoints)) {
$markers.= "&amp;"; $markers.= '&amp;';
} }
} else { } else {
$markers.= $mapPoint[0] . "," . $mapPoint[1]; $markers.= $mapPoint[0] . ',' . $mapPoint[1];
if ($index + 1 != sizeof($mapPoints)) { if ($index + 1 != sizeof($mapPoints)) {
$markers.= "|"; $markers.= '|';
} }
} }
$index++; $index++;
} }
} }
} }
$output = ""; $output = '';
if ($collapsible) if ($collapsible)
$output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; $output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>';
if (isIOSDevice()) $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=2&amp;sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">'; if (isIOSDevice())
else $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=1&amp;format=jpg&amp;sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">'; $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=2&amp;sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">';
  else
  $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=1&amp;format=jpg&amp;sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">';
   
if ($collapsible) if ($collapsible)
$output.= '</div>'; $output.= '</div>';
return $output; return $output;
} }
   
function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) {
$pi80 = M_PI / 180; $pi80 = M_PI / 180;
$lat1*= $pi80; $lat1*= $pi80;
$lng1*= $pi80; $lng1*= $pi80;
$lat2*= $pi80; $lat2*= $pi80;
$lng2*= $pi80; $lng2*= $pi80;
$r = 6372.797; // mean radius of Earth in km $r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1; $dlat = $lat2 - $lat1;
$dlng = $lng2 - $lng1; $dlng = $lng2 - $lng1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c; $km = $r * $c;
if ($roundLargeValues) { if ($roundLargeValues) {
if ($km < 1) if ($km < 1)
return floor($km * 1000); return floor($km * 1000);
else else
return round($km, 2) . "k"; return round($km, 2) . 'k';
} }
else else
return floor($km * 1000); return floor($km * 1000);
} }
   
function decodePolylineToArray($encoded) { function decodePolylineToArray($encoded) {
// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 // source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5
$length = strlen($encoded); $length = strlen($encoded);
$index = 0; $index = 0;
$points = array(); $points = array();
$lat = 0; $lat = 0;
$lng = 0; $lng = 0;
while ($index < $length) { while ($index < $length) {
// Temporary variable to hold each ASCII byte. // Temporary variable to hold each ASCII byte.
$b = 0; $b = 0;
// The encoded polyline consists of a latitude value followed by a // The encoded polyline consists of a latitude value followed by a
// longitude value. They should always come in pairs. Read the // longitude value. They should always come in pairs. Read the
// latitude value first. // latitude value first.
$shift = 0; $shift = 0;
$result = 0; $result = 0;
do { do {
// The `ord(substr($encoded, $index++))` statement returns the ASCII // The `ord(substr($encoded, $index++))` statement returns the ASCII
// code for the character at $index. Subtract 63 to get the original // code for the character at $index. Subtract 63 to get the original
// value. (63 was added to ensure proper ASCII characters are displayed // value. (63 was added to ensure proper ASCII characters are displayed
// in the encoded polyline string, which is `human` readable) // in the encoded polyline string, which is `human` readable)
$b = ord(substr($encoded, $index++)) - 63; $b = ord(substr($encoded, $index++)) - 63;
// AND the bits of the byte with 0x1f to get the original 5-bit `chunk. // AND the bits of the byte with 0x1f to get the original 5-bit `chunk.
// Then left shift the bits by the required amount, which increases // Then left shift the bits by the required amount, which increases
// by 5 bits each time. // by 5 bits each time.
// OR the value into $results, which sums up the individual 5-bit chunks // OR the value into $results, which sums up the individual 5-bit chunks
// into the original value. Since the 5-bit chunks were reversed in // into the original value. Since the 5-bit chunks were reversed in
// order during encoding, reading them in this way ensures proper // order during encoding, reading them in this way ensures proper
// summation. // summation.
$result|= ($b & 0x1f) << $shift; $result|= ($b & 0x1f) << $shift;
$shift+= 5; $shift+= 5;
} }
// Continue while the read byte is >= 0x20 since the last `chunk` // Continue while the read byte is >= 0x20 since the last `chunk`
// was not OR'd with 0x20 during the conversion process. (Signals the end) // was not OR'd with 0x20 during the conversion process. (Signals the end)
while ($b >= 0x20); while ($b >= 0x20);
// Check if negative, and convert. (All negative values have the last bit // Check if negative, and convert. (All negative values have the last bit
// set) // set)
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1));
// Compute actual latitude since value is offset from previous value. // Compute actual latitude since value is offset from previous value.
$lat+= $dlat; $lat+= $dlat;
// The next values will correspond to the longitude for this point. // The next values will correspond to the longitude for this point.
$shift = 0; $shift = 0;
$result = 0; $result = 0;
do { do {
$b = ord(substr($encoded, $index++)) - 63; $b = ord(substr($encoded, $index++)) - 63;
$result|= ($b & 0x1f) << $shift; $result|= ($b & 0x1f) << $shift;
$shift+= 5; $shift+= 5;
} while ($b >= 0x20); } while ($b >= 0x20);
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$lng+= $dlng; $lng+= $dlng;
// The actual latitude and longitude values were multiplied by // The actual latitude and longitude values were multiplied by
// 1e5 before encoding so that they could be converted to a 32-bit // 1e5 before encoding so that they could be converted to a 32-bit
// integer representation. (With a decimal accuracy of 5 places) // integer representation. (With a decimal accuracy of 5 places)
// Convert back to original values. // Convert back to original values.
$points[] = array( $points[] = array(
$lat * 1e-5, $lat * 1e-5,
$lng * 1e-5 $lng * 1e-5
); );
} }
return $points; return $points;
} }
   
function geocode($query, $giveOptions) { function geocode($query, $giveOptions) {
global $cloudmadeAPIkey; global $cloudmadeAPIkey;
$url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=" . urlencode($query) . "&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; $url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=' . urlencode($query) . '&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true';
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
if ($giveOptions) if ($giveOptions)
return $contents->features; return $contents->features;
elseif (isset($contents->features[0]->centroid)) elseif (isset($contents->features[0]->centroid))
return $contents->features[0]->centroid->coordinates[0] . "," . $contents->features[0]->centroid->coordinates[1]; return $contents->features[0]->centroid->coordinates[0] . ',' . $contents->features[0]->centroid->coordinates[1];
else else
return ""; return '';
} }
   
function reverseGeocode($lat, $lng) { function reverseGeocode($lat, $lng) {
global $cloudmadeAPIkey; global $cloudmadeAPIkey;
$url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=" . $lat . "," . $lng . "&distance=closest&object_type=road"; $url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=' . $lat . ',' . $lng . '&distance=closest&object_type=road';
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
return $contents->features[0]->properties->name; return $contents->features[0]->properties->name;
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
function getPage($url) { function getPage($url) {
debug($url, "json"); debug($url, 'json');
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 45); curl_setopt($ch, CURLOPT_TIMEOUT, 45);
$page = curl_exec($ch); $page = curl_exec($ch);
if (curl_errno($ch)) { if (curl_errno($ch)) {
echo "<font color=red> Database temporarily unavailable: "; echo '<font color=red> Database temporarily unavailable: ';
echo curl_errno($ch) . " " . curl_error($ch); echo curl_errno($ch) . ' ' . curl_error($ch);
if (isDebug()) { if (isDebug()) {
echo $url; echo $url;
} }
echo "</font><br>"; echo '</font><br>';
} }
curl_close($ch); curl_close($ch);
debug(print_r($page, true), "json"); debug(print_r($page, true), 'json');
return $page; return $page;
} }
   
function curPageURL() { function curPageURL() {
$isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); $isHTTPS = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on');
$port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); $port = (isset($_SERVER['SERVER_PORT']) && ((!$isHTTPS && $_SERVER['SERVER_PORT'] != '80') || ($isHTTPS && $_SERVER['SERVER_PORT'] != '443')));
$port = ($port) ? ':' . $_SERVER["SERVER_PORT"] : ''; $port = ($port) ? ':' . $_SERVER['SERVER_PORT'] : '';
$url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER["SERVER_NAME"] . $port . htmlentities(dirname($_SERVER['PHP_SELF']), ENT_QUOTES); $url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER['SERVER_NAME'] . $port . htmlentities(dirname($_SERVER['PHP_SELF']), ENT_QUOTES);
return $url; return $url;
} }
   
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// you have to open the session to be able to modify or remove it // you have to open the session to be able to modify or remove it
session_start(); session_start();
if (isset($_REQUEST['geolocate']) && $_REQUEST['geolocate'] != "Enter co-ordinates or address here") { if (isset($_REQUEST['geolocate']) && $_REQUEST['geolocate'] != 'Enter co-ordinates or address here') {
$geocoded = false; $geocoded = false;
if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) { if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) {
$_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); $_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); $_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
} else { } else {
if (startsWith($geolocate, "-")) { if (startsWith($geolocate, '-')) {
$locateparts = explode(",", $geolocate); $locateparts = explode(',', $geolocate);
$_SESSION['lat'] = $locateparts[0]; $_SESSION['lat'] = $locateparts[0];
$_SESSION['lon'] = $locateparts[1]; $_SESSION['lon'] = $locateparts[1];
} else if (strpos($geolocate, "(") !== false) { } else if (strpos($geolocate, '(') !== false) {
$geoParts = explode("(", $geolocate); $geoParts = explode('(', $geolocate);
$locateparts = explode(",", str_replace(")", "", $geoParts[1])); $locateparts = explode(',', str_replace(')', '', $geoParts[1]));
$_SESSION['lat'] = $locateparts[0]; $_SESSION['lat'] = $locateparts[0];
$_SESSION['lon'] = $locateparts[1]; $_SESSION['lon'] = $locateparts[1];
} else { } else {
$contents = geocode($geolocate, true); $contents = geocode($geolocate, true);
print_r($contents); print_r($contents);
if (isset($contents[0]->centroid)) { if (isset($contents[0]->centroid)) {
$geocoded = true; $geocoded = true;
$_SESSION['lat'] = $contents[0]->centroid->coordinates[0]; $_SESSION['lat'] = $contents[0]->centroid->coordinates[0];
$_SESSION['lon'] = $contents[0]->centroid->coordinates[1]; $_SESSION['lon'] = $contents[0]->centroid->coordinates[1];
} else { } else {
$_SESSION['lat'] = ""; $_SESSION['lat'] = '';
$_SESSION['lon'] = ""; $_SESSION['lon'] = '';
} }
} }
} }
sessionUpdated(); sessionUpdated();
} }
   
function sessionUpdated() { function sessionUpdated() {
$_SESSION['lastUpdated'] = time(); $_SESSION['lastUpdated'] = time();
} }
   
// timeoutSession // timeoutSession
$TIMEOUT_LIMIT = 60 * 5; // 5 minutes $TIMEOUT_LIMIT = 60 * 5; // 5 minutes
if (isset($_SESSION['lastUpdated']) && $_SESSION['lastUpdated'] + $TIMEOUT_LIMIT < time()) { if (isset($_SESSION['lastUpdated']) && $_SESSION['lastUpdated'] + $TIMEOUT_LIMIT < time()) {
debug("Session timeout " . ($_SESSION['lastUpdated'] + $TIMEOUT_LIMIT) . ">" . time(), "session"); debug('Session timeout ' . ($_SESSION['lastUpdated'] + $TIMEOUT_LIMIT) . '>' . time(), 'session');
session_destroy(); session_destroy();
session_start(); session_start();
} }
   
//debug(print_r($_SESSION, true) , "session"); //debug(print_r($_SESSION, true) , 'session');
function current_time($time = "") { function current_time($time = '') {
if (isset($_REQUEST['time'])) return $_REQUEST['time']; if (isset($_REQUEST['time']))
else if ($time != "") date("H:i:s",$time); return $_REQUEST['time'];
else return date("H:i:s"); else if ($time != '')
  date('H:i:s', $time);
  else
  return date('H:i:s');
} }
   
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
$service_periods = Array( $service_periods = Array(
'sunday', 'sunday',
'saturday', 'saturday',
'weekday' 'weekday'
); );
   
function service_period($date = "") { function service_period($date = '') {
   
if (isset($_REQUEST['service_period'])) { if (isset($_REQUEST['service_period'])) {
return $_REQUEST['service_period']; return $_REQUEST['service_period'];
} }
   
$override = getServiceOverride($date); $override = getServiceOverride($date);
if (isset($override['service_id'])) { if (isset($override['service_id'])) {
return strtolower($override['service_id']); return strtolower($override['service_id']);
} }
$date = ($date != "" ? $date : time()); $date = ($date != '' ? $date : time());
$dow = date('w', $date); $dow = date('w', $date);
   
switch ($dow) { switch ($dow) {
case 0: case 0:
return 'sunday'; return 'sunday';
case 6: case 6:
return 'saturday'; return 'saturday';
default: default:
return 'weekday'; return 'weekday';
} }
} }
   
function service_ids($service_period, $date = "") { function service_ids($service_period, $date = '') {
switch ($service_period) { switch ($service_period) {
case 'sunday': case 'sunday':
return Array("Sunday", "Sunday"); return Array('Sunday', 'Sunday');
case 'saturday': case 'saturday':
return Array("Saturday", "Saturday"); return Array('Saturday', 'Saturday');
default: default:
$date = ($date != "" ? $date : time()); $date = ($date != '' ? $date : time());
// school holidays // school holidays
$ymd = date('Ymd', $date); $ymd = date('Ymd', $date);
$dow = date('w', $date); $dow = date('w', $date);
if (intval($ymd) < "20120203" && $dow != 0 && $dow != 6) { if (intval($ymd) < '20120203' && $dow != 0 && $dow != 6) {
return Array("Weekday-SchoolVacation", "Weekday-SchoolVacation"); return Array('Weekday-SchoolVacation', 'Weekday-SchoolVacation');
} else { } else {
return Array("Weekday", "Weekday"); return Array('Weekday', 'Weekday');
} }
} }
} }
   
function valid_service_ids() { function valid_service_ids() {
return array_merge(service_ids(""), service_ids('saturday'), service_ids('sunday')); return array_merge(service_ids(''), service_ids('saturday'), service_ids('sunday'));
} }
   
function midnight_seconds($time = "") { function midnight_seconds($time = '') {
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
if ($time != "") { if ($time != '') {
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time);
} }
if (isset($_SESSION['time'])) { if (isset($_SESSION['time'])) {
$time = strtotime($_SESSION['time']); $time = strtotime($_SESSION['time']);
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time);
} }
return (date("G") * 3600) + (date("i") * 60) + date("s"); return (date('G') * 3600) + (date('i') * 60) + date('s');
} }
   
function midnight_seconds_to_time($seconds) { function midnight_seconds_to_time($seconds) {
if ($seconds > 0) { if ($seconds > 0) {
$midnight = mktime(0, 0, 0, date("n"), date("j"), date("Y")); $midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
return date("h:ia", $midnight + $seconds); return date('h:ia', $midnight + $seconds);
} else { } else {
return ""; return '';
} }
} }
   
if ($GTFSREnabled) { if ($GTFSREnabled) {
$serviceAlertCause = Array( $serviceAlertCause = Array(
"UNKNOWN_CAUSE" => "Unknown cause", 'UNKNOWN_CAUSE' => 'Unknown cause',
"OTHER_CAUSE" => "Other cause", 'OTHER_CAUSE' => 'Other cause',
"TECHNICAL_PROBLEM" => "Technical problem", 'TECHNICAL_PROBLEM' => 'Technical problem',
"STRIKE" => "Strike", 'STRIKE' => 'Strike',
"DEMONSTRATION" => "Demonstration", 'DEMONSTRATION' => 'Demonstration',
"ACCIDENT" => "Accident", 'ACCIDENT' => 'Accident',
"HOLIDAY" => "Holiday", 'HOLIDAY' => 'Holiday',
"WEATHER" => "Weather", 'WEATHER' => 'Weather',
"MAINTENANCE" => "Maintenance", 'MAINTENANCE' => 'Maintenance',
"CONSTRUCTION" => "Construction", 'CONSTRUCTION' => 'Construction',
"POLICE_ACTIVITY" => "Police activity", 'POLICE_ACTIVITY' => 'Police activity',
"MEDICAL_EMERGENCY" => "Medical emergency" 'MEDICAL_EMERGENCY' => 'Medical emergency'
); );
$serviceAlertEffect = Array( $serviceAlertEffect = Array(
"NO_SERVICE" => "No service", 'NO_SERVICE' => 'No service',
"REDUCED_SERVICE" => "Reduced service", 'REDUCED_SERVICE' => 'Reduced service',
"SIGNIFICANT_DELAYS" => "Significant delays", 'SIGNIFICANT_DELAYS' => 'Significant delays',
"DETOUR" => "Detour", 'DETOUR' => 'Detour',
"ADDITIONAL_SERVICE" => "Additional service", 'ADDITIONAL_SERVICE' => 'Additional service',
"MODIFIED_SERVICE" => "Modified service", 'MODIFIED_SERVICE' => 'Modified service',
"OTHER_EFFECT" => "Other effect", 'OTHER_EFFECT' => 'Other effect',
"UNKNOWN_EFFECT" => "Unknown effect", 'UNKNOWN_EFFECT' => 'Unknown effect',
"STOP_MOVED" => "Stop moved"); 'STOP_MOVED' => 'Stop moved');
   
set_include_path(get_include_path() . PATH_SEPARATOR . ($basePath . "lib/Protobuf-PHP/library/DrSlump/")); set_include_path(get_include_path() . PATH_SEPARATOR . (ROOT. '/../lib/Protobuf-PHP/library/DrSlump/'));
   
include_once("Protobuf.php"); include_once('Protobuf.php');
include_once("Protobuf/Message.php"); include_once('Protobuf/Message.php');
include_once("Protobuf/Registry.php"); include_once('Protobuf/Registry.php');
include_once("Protobuf/Descriptor.php"); include_once('Protobuf/Descriptor.php');
include_once("Protobuf/Field.php"); include_once('Protobuf/Field.php');
   
include_once($basePath . "lib/Protobuf-PHP/gtfs-realtime.php"); include_once(ROOT. '/../lib/Protobuf-PHP/gtfs-realtime.php');
include_once("Protobuf/CodecInterface.php"); include_once('Protobuf/CodecInterface.php');
include_once("Protobuf/Codec/PhpArray.php"); include_once('Protobuf/Codec/PhpArray.php');
include_once("Protobuf/Codec/Binary.php"); include_once('Protobuf/Codec/Binary.php');
include_once("Protobuf/Codec/Binary/Writer.php"); include_once('Protobuf/Codec/Binary/Writer.php');
include_once("Protobuf/Codec/Json.php"); include_once('Protobuf/Codec/Json.php');
   
function getServiceAlerts($filter_class = "", $filter_id = "") { function getServiceAlerts($filter_class = '', $filter_id = '') {
/* /*
   
also need last modified epoch of client gtfs also need last modified epoch of client gtfs
   
- add,remove,patch,inform (null) - add,remove,patch,inform (null)
- stop - stop
- trip - trip
- network - network
- classes (WHERE=) - classes (WHERE=)
- route (short_name or route_id) - route (short_name or route_id)
- street - street
- stop - stop
- trip - trip
Currently support: Currently support:
network inform network inform
trip patch: stop remove trip patch: stop remove
street inform: route inform, trip inform, stop inform street inform: route inform, trip inform, stop inform
route patch: trip remove route patch: trip remove
*/ */
$current_alerts = getCurrentAlerts(); $current_alerts = getCurrentAlerts();
$informed_count = 0; $informed_count = 0;
if (sizeof($current_alerts) > 0) { if (sizeof($current_alerts) > 0) {
   
$fm = new transit_realtime\FeedMessage(); $fm = new transit_realtime\FeedMessage();
$fh = new transit_realtime\FeedHeader(); $fh = new transit_realtime\FeedHeader();
$fh->setGtfsRealtimeVersion(1); $fh->setGtfsRealtimeVersion(1);
$fh->setTimestamp(time()); $fh->setTimestamp(time());
$fm->setHeader($fh); $fm->setHeader($fh);
foreach ($current_alerts as $current_alert) { foreach ($current_alerts as $current_alert) {
$affectsFilteredEntities = false; $affectsFilteredEntities = false;
$fe = new transit_realtime\FeedEntity(); $fe = new transit_realtime\FeedEntity();
$fe->setId($current_alert['id']); $fe->setId($current_alert['id']);
$fe->setIsDeleted(false); $fe->setIsDeleted(false);
$alert = new transit_realtime\Alert(); $alert = new transit_realtime\Alert();
$tr = new transit_realtime\TimeRange(); $tr = new transit_realtime\TimeRange();
$tr->setStart($current_alert['start']); $tr->setStart($current_alert['start']);
$tr->setEnd($current_alert['end']); $tr->setEnd($current_alert['end']);
$alert->addActivePeriod($tr); $alert->addActivePeriod($tr);
$informedEntities = getInformedAlerts($current_alert['id'], $filter_class, $filter_id); $informedEntities = getInformedAlerts($current_alert['id'], $filter_class, $filter_id);
if (sizeof($informedEntities) > 0) { if (sizeof($informedEntities) > 0) {
   
$affectsFilteredEntities = true; $affectsFilteredEntities = true;
foreach ($informedEntities as $informedEntity) { foreach ($informedEntities as $informedEntity) {
$informed_count++; $informed_count++;
$informed = Array(); $informed = Array();
$es = new transit_realtime\EntitySelector(); $es = new transit_realtime\EntitySelector();
if ($informedEntity['informed_class'] == "agency") { if ($informedEntity['informed_class'] == 'agency') {
$es->setAgencyId($informedEntity['informed_id']); $es->setAgencyId($informedEntity['informed_id']);
} }
if ($informedEntity['informed_class'] == "stop") { if ($informedEntity['informed_class'] == 'stop') {
$es->setStopId($informedEntity['informed_id']); $es->setStopId($informedEntity['informed_id']);
} }
if ($informedEntity['informed_class'] == "route") { if ($informedEntity['informed_class'] == 'route') {
$es->setRouteId($informedEntity['informed_id']); $es->setRouteId($informedEntity['informed_id']);
} }
if ($informedEntity['informed_class'] == "trip") { if ($informedEntity['informed_class'] == 'trip') {
$td = new transit_realtime\TripDescriptor(); $td = new transit_realtime\TripDescriptor();
$td->setTripId($informedEntity['informed_id']); $td->setTripId($informedEntity['informed_id']);
$es->setTrip($td); $es->setTrip($td);
} }
$alert->addInformedEntity($es); $alert->addInformedEntity($es);
} }
} }
if ($current_alert['cause'] != "") { if ($current_alert['cause'] != '') {
$alert->setCause(constant("transit_realtime\Alert\Cause::" . $current_alert['cause'])); $alert->setCause(constant('transit_realtime\Alert\Cause::' . $current_alert['cause']));
} }
if ($current_alert['effect'] != "") { if ($current_alert['effect'] != '') {
$alert->setEffect(constant("transit_realtime\Alert\Effect::" . $current_alert['effect'])); $alert->setEffect(constant('transit_realtime\Alert\Effect::' . $current_alert['effect']));
} }
if ($current_alert['url'] != "") { if ($current_alert['url'] != '') {
$tsUrl = new transit_realtime\TranslatedString(); $tsUrl = new transit_realtime\TranslatedString();
$tUrl = new transit_realtime\TranslatedString\Translation(); $tUrl = new transit_realtime\TranslatedString\Translation();
$tUrl->setText($current_alert['url']); $tUrl->setText($current_alert['url']);
$tUrl->setLanguage("en"); $tUrl->setLanguage('en');
$tsUrl->addTranslation($tUrl); $tsUrl->addTranslation($tUrl);
$alert->setUrl($tsUrl); $alert->setUrl($tsUrl);
} }
if ($current_alert['header'] != "") { if ($current_alert['header'] != '') {
$tsHeaderText = new transit_realtime\TranslatedString(); $tsHeaderText = new transit_realtime\TranslatedString();
$tHeaderText = new transit_realtime\TranslatedString\Translation(); $tHeaderText = new transit_realtime\TranslatedString\Translation();
$tHeaderText->setText($current_alert['header']); $tHeaderText->setText($current_alert['header']);
$tHeaderText->setLanguage("en"); $tHeaderText->setLanguage('en');
$tsHeaderText->addTranslation($tHeaderText); $tsHeaderText->addTranslation($tHeaderText);
$alert->setHeaderText($tsHeaderText); $alert->setHeaderText($tsHeaderText);
} }
if ($current_alert['description'] != "") { if ($current_alert['description'] != '') {
$tsDescriptionText = new transit_realtime\TranslatedString(); $tsDescriptionText = new transit_realtime\TranslatedString();
$tDescriptionText = new transit_realtime\TranslatedString\Translation(); $tDescriptionText = new transit_realtime\TranslatedString\Translation();
$tDescriptionText->setText(trim($current_alert['description'])); $tDescriptionText->setText(trim($current_alert['description']));
$tDescriptionText->setLanguage("en"); $tDescriptionText->setLanguage('en');
$tsDescriptionText->addTranslation($tDescriptionText); $tsDescriptionText->addTranslation($tDescriptionText);
$alert->setDescriptionText($tsDescriptionText); $alert->setDescriptionText($tsDescriptionText);
} }
$fe->setAlert($alert); $fe->setAlert($alert);
if ($affectsFilteredEntities) { if ($affectsFilteredEntities) {
$fm->addEntity($fe); $fm->addEntity($fe);
} }
} }
if ($informed_count > 0) { if ($informed_count > 0) {
return $fm; return $fm;
} else { } else {
return null; return null;
} }
} else } else
return null; return null;
} }
   
function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { function getServiceAlertsAsArray($filter_class = '', $filter_id = '') {
   
$alerts = getServiceAlerts($filter_class, $filter_id); $alerts = getServiceAlerts($filter_class, $filter_id);
if ($alerts != null) { if ($alerts != null) {
$codec = new DrSlump\Protobuf\Codec\PhpArray(); $codec = new DrSlump\Protobuf\Codec\PhpArray();
   
return $codec->encode($alerts); return $codec->encode($alerts);
} else { } else {
return null; return null;
} }
} }
   
function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { function getServiceAlertsAsBinary($filter_class = '', $filter_id = '') {
$codec = new DrSlump\Protobuf\Codec\Binary(); $codec = new DrSlump\Protobuf\Codec\Binary();
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); return $codec->encode(getServiceAlerts($filter_class, $filter_id));
} }
   
function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { function getServiceAlertsAsJSON($filter_class = '', $filter_id = '') {
$codec = new DrSlump\Protobuf\Codec\Json(); $codec = new DrSlump\Protobuf\Codec\Json();
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); return $codec->encode(getServiceAlerts($filter_class, $filter_id));
} }
   
function getServiceAlertsByClass() { function getServiceAlertsByClass() {
$return = Array(); $return = Array();
$alerts = getServiceAlertsAsArray("", ""); $alerts = getServiceAlertsAsArray('', '');
foreach ($alerts['entities'] as $entity) { foreach ($alerts['entities'] as $entity) {
foreach ($entity['informed'] as $informed) { foreach ($entity['informed'] as $informed) {
foreach ($informed as $key => $value) { foreach ($informed as $key => $value) {
if (strpos("_id", $key) > 0) { if (strpos('_id', $key) > 0) {
$parts = explode($key); $parts = explode($key);
$class = $parts[0]; $class = $parts[0];
$id = $value; $id = $value;
} }
} }
$return[$class][$id][] = $entity; $return[$class][$id][] = $entity;
} }
} }
} }
   
function getTripUpdates($filter_class = "", $filter_id = "") { function getTripUpdates($filter_class = '', $filter_id = '') {
$fm = new transit_realtime\FeedMessage(); $fm = new transit_realtime\FeedMessage();
$fh = new transit_realtime\FeedHeader(); $fh = new transit_realtime\FeedHeader();
$fh->setGtfsRealtimeVersion(1); $fh->setGtfsRealtimeVersion(1);
$fh->setTimestamp(time()); $fh->setTimestamp(time());
$fm->setHeader($fh); $fm->setHeader($fh);
foreach (getCurrentAlerts() as $alert) { foreach (getCurrentAlerts() as $alert) {
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']);
$stops = Array(); $stops = Array();
$routestrips = Array(); $routestrips = Array();
if (sizeof($informedEntities) > 0) { if (sizeof($informedEntities) > 0) {
if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { if ($informedEntity['informed_class'] == 'stop' && $informed['x-action'] == 'remove') {
$stops[] = $informedEntity['informed_id']; $stops[] = $informedEntity['informed_id'];
} }
if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch") { if (($informedEntity['informed_class'] == 'route' || $informedEntity['informed_class'] == 'trip') && $informed['x-action'] == 'patch') {
$routestrips[] = Array("id" => $informedEntity['informed_id'], $routestrips[] = Array('id' => $informedEntity['informed_id'],
"type" => $informedEntity['informed_class']); 'type' => $informedEntity['informed_class']);
} }
} }
foreach ($routestrips as $routetrip) { foreach ($routestrips as $routetrip) {
$fe = new transit_realtime\FeedEntity(); $fe = new transit_realtime\FeedEntity();
$fe->setId($alert['id'] . $routetrip['id']); $fe->setId($alert['id'] . $routetrip['id']);
$fe->setIsDeleted(false); $fe->setIsDeleted(false);
$tu = new transit_realtime\TripUpdate(); $tu = new transit_realtime\TripUpdate();
$td = new transit_realtime\TripDescriptor(); $td = new transit_realtime\TripDescriptor();
if ($routetrip['type'] == "route") { if ($routetrip['type'] == 'route') {
$td->setRouteId($routetrip['id']); $td->setRouteId($routetrip['id']);
} else if ($routetrip['type'] == "trip") { } else if ($routetrip['type'] == 'trip') {
$td->setTripId($routetrip['id']); $td->setTripId($routetrip['id']);
} }
$tu->setTrip($td); $tu->setTrip($td);
foreach ($stops as $stop) { foreach ($stops as $stop) {
$stu = new transit_realtime\TripUpdate\StopTimeUpdate(); $stu = new transit_realtime\TripUpdate\StopTimeUpdate();
$stu->setStopId($stop); $stu->setStopId($stop);
$stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); $stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED);
$tu->addStopTimeUpdate($stu); $tu->addStopTimeUpdate($stu);
} }
$fe->setTripUpdate($tu); $fe->setTripUpdate($tu);
$fm->addEntity($fe); $fm->addEntity($fe);
} }
} }
return $fm; return $fm;
} }
   
function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { function getTripUpdatesAsArray($filter_class = '', $filter_id = '') {
$codec = new DrSlump\Protobuf\Codec\PhpArray(); $codec = new DrSlump\Protobuf\Codec\PhpArray();
return $codec->encode(getTripUpdates($filter_class, $filter_id)); return $codec->encode(getTripUpdates($filter_class, $filter_id));
} }
   
function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { function getTripUpdatesAsBinary($filter_class = '', $filter_id = '') {
$codec = new DrSlump\Protobuf\Codec\Binary(); $codec = new DrSlump\Protobuf\Codec\Binary();
return $codec->encode(getTripUpdates($filter_class, $filter_id)); return $codec->encode(getTripUpdates($filter_class, $filter_id));
} }
   
function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { function getTripUpdatesAsJSON($filter_class = '', $filter_id = '') {
$codec = new DrSlump\Protobuf\Codec\Json(); $codec = new DrSlump\Protobuf\Codec\Json();
return $codec->encode(getTripUpdates($filter_class, $filter_id)); return $codec->encode(getTripUpdates($filter_class, $filter_id));
} }
   
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
date_default_timezone_set('Australia/ACT'); date_default_timezone_set('Australia/ACT');
$debugOkay = Array( $debugOkay = Array(
"session", 'session',
"json", 'json',
"phperror", 'phperror',
"awsotp", 'awsotp',
//"squallotp", //'squallotp',
//"vanilleotp", //'vanilleotp',
"database", 'database',
"other" 'other'
); );
$GTFSREnabled = true; $GTFSREnabled = true;
$cloudmadeAPIkey = "daa03470bb8740298d4b10e3f03d63e6"; $cloudmadeAPIkey = 'daa03470bb8740298d4b10e3f03d63e6';
$googleMapsAPIkey = "ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q"; $googleMapsAPIkey = 'ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q';
$otpAPIurl = 'http://localhost:8080/opentripplanner-api-webapp/'; $otpAPIurl = 'http://localhost:8080/opentripplanner-api-webapp/';
if (isDebug("awsotp") || php_uname('n') == "maxious.xen.prgmr.com" || strstr(php_uname('n'),"actbus")) { if (isDebug('awsotp') || php_uname('n') == 'maxious.xen.prgmr.com' || strstr(php_uname('n'),'actbus')) {
$otpAPIurl = 'http://bus-main.lambdacomplex.org:8080/opentripplanner-api-webapp/'; $otpAPIurl = 'http://bus-main.lambdacomplex.org:8080/opentripplanner-api-webapp/';
} }
if (isDebug("dotcloudotp") || php_uname('n') == "actbus-www") { if (isDebug('dotcloudotp') || php_uname('n') == 'actbus-www') {
$otpAPIurl = 'http://otp.actbus.dotcloud.com/opentripplanner-api-webapp/'; $otpAPIurl = 'http://otp.actbus.dotcloud.com/opentripplanner-api-webapp/';
} }
if (isDebug("squallotp")) { if (isDebug('squallotp')) {
$otpAPIurl = 'http://10.0.1.108:5080/opentripplanner-api-webapp/'; $otpAPIurl = 'http://10.0.1.108:5080/opentripplanner-api-webapp/';
} }
if (isDebug("vanilleotp")) { if (isDebug('vanilleotp')) {
$otpAPIurl = 'http://10.0.1.135:8080/opentripplanner-api-webapp/'; $otpAPIurl = 'http://10.0.1.135:8080/opentripplanner-api-webapp/';
} }
if (isDebug("phperror")) if (isDebug('phperror'))
error_reporting(E_ALL ^ E_NOTICE); error_reporting(E_ALL ^ E_NOTICE);
$basePath = "";  
  define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
if (strstr($_SERVER['PHP_SELF'], "labs/") if (strstr($_SERVER['PHP_SELF'], "labs/")
|| strstr($_SERVER['PHP_SELF'], "myway/") || strstr($_SERVER['PHP_SELF'], "myway/")
|| strstr($_SERVER['PHP_SELF'], "lib/") || strstr($_SERVER['PHP_SELF'], "lib/")
|| strstr($_SERVER['PHP_SELF'], "geo/") || strstr($_SERVER['PHP_SELF'], "geo/")
|| strstr($_SERVER['PHP_SELF'], "include/") || strstr($_SERVER['PHP_SELF'], "include/")
|| strstr($_SERVER['PHP_SELF'], "rtpis/")) { || strstr($_SERVER['PHP_SELF'], "rtpis/")) {
$basePath = "../"; $basePath = "../";
} }
   
function isDebugServer() { function isDebugServer() {
return php_sapi_name() == "cli" || strstr(php_uname('n'),"actbus") || isset($_SERVER['SERVER_NAME']) && ( $_SERVER['SERVER_NAME'] == "azusa" || $_SERVER['SERVER_NAME'] == "vanille" return php_sapi_name() == 'cli' || strstr(php_uname('n'),'actbus') || isset($_SERVER['SERVER_NAME']) && ( $_SERVER['SERVER_NAME'] == 'azusa' || $_SERVER['SERVER_NAME'] == 'vanille'
|| $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "192.168.1.8" || $_SERVER['SERVER_NAME'] == "192.168.178.24"); || $_SERVER['SERVER_NAME'] == 'localhost' || $_SERVER['SERVER_NAME'] == '127.0.0.1' || $_SERVER['SERVER_NAME'] == '192.168.1.8' || $_SERVER['SERVER_NAME'] == '192.168.178.24');
} }
   
if (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == "maxious.xen.prgmr.com") { if (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == 'maxious.xen.prgmr.com') {
// Set the exception handler // Set the exception handler
require $basePath."/lib/amon-php/amon.php"; require ROOT.'../lib/amon-php/amon.php';
Amon::setup_exception_handler(); Amon::setup_exception_handler();
} }
   
include_once ("common-geo.inc.php"); include_once ('common-geo.inc.php');
include_once ("common-net.inc.php"); include_once ('common-net.inc.php');
include_once ("common-transit.inc.php"); include_once ('common-transit.inc.php');
if (!strstr($_SERVER['PHP_SELF'], "feedback")) { if (!strstr($_SERVER['PHP_SELF'], 'feedback')) {
include_once ("common-db.inc.php"); include_once ('common-db.inc.php');
} }
   
include_once ("common-request.inc.php"); include_once ('common-request.inc.php');
include_once ("common-session.inc.php"); include_once ('common-session.inc.php');
include_once ("common-auth.inc.php"); include_once ('common-auth.inc.php');
include_once ("common-template.inc.php"); include_once ('common-template.inc.php');
   
function isAnalyticsOn() { function isAnalyticsOn() {
$user_agent = $_SERVER['HTTP_USER_AGENT']; $user_agent = $_SERVER['HTTP_USER_AGENT'];
return !isDebugServer() && !preg_match('/cloudkick/i', $user_agent) && !preg_match('/googlebot/i', $user_agent) && return !isDebugServer() && !preg_match('/cloudkick/i', $user_agent) && !preg_match('/googlebot/i', $user_agent) &&
!preg_match('/baidu/i', $user_agent); !preg_match('/baidu/i', $user_agent);
} }
   
function isDebug($debugReason = "other") { function isDebug($debugReason = 'other') {
global $debugOkay; global $debugOkay;
return in_array($debugReason, $debugOkay, false) && isDebugServer(); return in_array($debugReason, $debugOkay, false) && isDebugServer();
} }
   
function debug($msg, $debugReason = "other") { function debug($msg, $debugReason = 'other') {
if (isDebug($debugReason)) if (isDebug($debugReason))
echo "\n<!-- " . date(DATE_RFC822) . "\n $msg -->\n"; echo PHP_EOL.'<!-- ' . date(DATE_RFC822) . PHP_EOL.' $msg -->'.PHP_EOL;
} }
function isIOSDevice() { function isIOSDevice() {
return strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad'); return strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad');
} }
function isJQueryMobileDevice() { function isJQueryMobileDevice() {
// http://forum.jquery.com/topic/what-is-the-best-way-to-detect-all-useragents-which-can-handle-jquery-mobile#14737000002087897 // http://forum.jquery.com/topic/what-is-the-best-way-to-detect-all-useragents-which-can-handle-jquery-mobile#14737000002087897
$user_agent = $_SERVER['HTTP_USER_AGENT']; $user_agent = $_SERVER['HTTP_USER_AGENT'];
return preg_match('/iphone/i', $user_agent) || preg_match('/android/i', $user_agent) || preg_match('/webos/i', $user_agent) || preg_match('/ios/i', $user_agent) || preg_match('/bada/i', $user_agent) || preg_match('/maemo/i', $user_agent) || preg_match('/meego/i', $user_agent) || preg_match('/fennec/i', $user_agent) || (preg_match('/symbian/i', $user_agent) && preg_match('/s60/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/symbian/i', $user_agent) && preg_match('/platform/i', $user_agent) && $browser['majorver'] >= 3) || (preg_match('/blackberry/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/opera mobile/i', $user_agent) && $browser['majorver'] >= 10) || (preg_match('/opera mini/i', $user_agent) && $browser['majorver'] >= 5); return preg_match('/iphone/i', $user_agent) || preg_match('/android/i', $user_agent) || preg_match('/webos/i', $user_agent) || preg_match('/ios/i', $user_agent) || preg_match('/bada/i', $user_agent) || preg_match('/maemo/i', $user_agent) || preg_match('/meego/i', $user_agent) || preg_match('/fennec/i', $user_agent) || (preg_match('/symbian/i', $user_agent) && preg_match('/s60/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/symbian/i', $user_agent) && preg_match('/platform/i', $user_agent) && $browser['majorver'] >= 3) || (preg_match('/blackberry/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/opera mobile/i', $user_agent) && $browser['majorver'] >= 10) || (preg_match('/opera mini/i', $user_agent) && $browser['majorver'] >= 5);
} }
   
   
function array_flatten($a, $f = array()) { function array_flatten($a, $f = array()) {
if (!$a || !is_array($a)) if (!$a || !is_array($a))
return ''; return '';
foreach ($a as $k => $v) { foreach ($a as $k => $v) {
if (is_array($v)) if (is_array($v))
$f = array_flatten($v, $f); $f = array_flatten($v, $f);
else else
$f[$k] = $v; $f[$k] = $v;
} }
return $f; return $f;
} }
   
function remove_spaces($string) { function remove_spaces($string) {
return str_replace(' ', '', $string); return str_replace(' ', '', $string);
} }
   
function object2array($object) { function object2array($object) {
if (is_object($object)) { if (is_object($object)) {
foreach ($object as $key => $value) { foreach ($object as $key => $value) {
$array[$key] = $value; $array[$key] = $value;
} }
} else { } else {
$array = $object; $array = $object;
} }
return $array; return $array;
} }
   
function startsWith($haystack, $needle, $case = true) { function startsWith($haystack, $needle, $case = true) {
if ($case) { if ($case) {
return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0); return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
} }
return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0); return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
} }
   
function endsWith($haystack, $needle, $case = true) { function endsWith($haystack, $needle, $case = true) {
if ($case) { if ($case) {
return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0); return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
} }
return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0); return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
} }
   
function sksort(&$array, $subkey = "id", $sort_ascending = false) { function sksort(&$array, $subkey = 'id', $sort_ascending = false) {
if (count($array)) if (count($array))
$temp_array[key($array)] = array_shift($array); $temp_array[key($array)] = array_shift($array);
foreach ($array as $key => $val) { foreach ($array as $key => $val) {
$offset = 0; $offset = 0;
$found = false; $found = false;
foreach ($temp_array as $tmp_key => $tmp_val) { foreach ($temp_array as $tmp_key => $tmp_val) {
if (!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey])) { if (!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey])) {
$temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array( $temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array(
$key => $val $key => $val
), array_slice($temp_array, $offset)); ), array_slice($temp_array, $offset));
$found = true; $found = true;
} }
$offset++; $offset++;
} }
if (!$found) if (!$found)
$temp_array = array_merge($temp_array, array( $temp_array = array_merge($temp_array, array(
$key => $val $key => $val
)); ));
} }
if ($sort_ascending) if ($sort_ascending)
$array = array_reverse($temp_array); $array = array_reverse($temp_array);
else else
$array = $temp_array; $array = $temp_array;
} }
   
function sktimesort(&$array, $subkey = "id", $sort_ascending = false) { function sktimesort(&$array, $subkey = 'id', $sort_ascending = false) {
if (count($array)) if (count($array))
$temp_array[key($array)] = array_shift($array); $temp_array[key($array)] = array_shift($array);
foreach ($array as $key => $val) { foreach ($array as $key => $val) {
$offset = 0; $offset = 0;
$found = false; $found = false;
foreach ($temp_array as $tmp_key => $tmp_val) { foreach ($temp_array as $tmp_key => $tmp_val) {
if (!$found and strtotime($val[$subkey]) > strtotime($tmp_val[$subkey])) { if (!$found and strtotime($val[$subkey]) > strtotime($tmp_val[$subkey])) {
$temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array( $temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array(
$key => $val $key => $val
), array_slice($temp_array, $offset)); ), array_slice($temp_array, $offset));
$found = true; $found = true;
} }
$offset++; $offset++;
} }
if (!$found) if (!$found)
$temp_array = array_merge($temp_array, array( $temp_array = array_merge($temp_array, array(
$key => $val $key => $val
)); ));
} }
if ($sort_ascending && isset($temp_array)) if ($sort_ascending && isset($temp_array))
$array = array_reverse($temp_array); $array = array_reverse($temp_array);
else else
$array = $temp_array; $array = $temp_array;
} }
   
function r_implode($glue, $pieces) { function r_implode($glue, $pieces) {
foreach ($pieces as $r_pieces) { foreach ($pieces as $r_pieces) {
if (is_array($r_pieces)) { if (is_array($r_pieces)) {
$retVal[] = r_implode($glue, $r_pieces); $retVal[] = r_implode($glue, $r_pieces);
} else { } else {
$retVal[] = $r_pieces; $retVal[] = $r_pieces;
} }
} }
return implode($glue, $retVal); return implode($glue, $retVal);
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
function getRoute($routeID) { function getRoute($routeID) {
global $conn; global $conn;
$query = "Select * from routes where route_id = :routeID LIMIT 1"; $query = 'Select * from routes where route_id = :routeID LIMIT 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeID", $routeID); $query->bindParam(':routeID', $routeID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getRoutesByShortName($routeShortName) { function getRoutesByShortName($routeShortName) {
global $conn; global $conn;
$query = "Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName"; $query = 'Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeShortName", $routeShortName); $query->bindParam(':routeShortName', $routeShortName);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRouteHeadsigns($routeID) { function getRouteHeadsigns($routeID) {
global $conn; global $conn;
$query = "select stops.stop_name, trip_headsign, direction_id,max(service_id) as service_id, count(*) $query = 'select stops.stop_name, trip_headsign, direction_id,max(service_id) as service_id, count(*)
from routes join trips on trips.route_id = routes.route_id from routes join trips on trips.route_id = routes.route_id
join stop_times on stop_times.trip_id = trips.trip_id join stops on join stop_times on stop_times.trip_id = trips.trip_id join stops on
stop_times.stop_id = stops.stop_id where trips.route_id = :routeID stop_times.stop_id = stops.stop_id where trips.route_id = :routeID
and stop_times.stop_sequence = 1 group by stops.stop_name, trip_headsign, direction_id having count(*) > 2"; and stop_times.stop_sequence = 1 group by stops.stop_name, trip_headsign, direction_id having count(*) > 2';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeID", $routeID); $query->bindParam(':routeID', $routeID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$results = $query->fetchAll(); $results = $query->fetchAll();
if (is_array($results)) { if (is_array($results)) {
return $results; return $results;
} else { } else {
return Array($results); return Array($results);
} }
} }
   
function getRouteDescription($routeID, $directionID) { function getRouteDescription($routeID, $directionID) {
$trip = getRouteNextTrip($routeID, $directionID); $trip = getRouteNextTrip($routeID, $directionID);
$start = getTripStartingPoint($trip['trip_id']); $start = getTripStartingPoint($trip['trip_id']);
$end = getTripDestination($trip['trip_id']); $end = getTripDestination($trip['trip_id']);
return "From ".$start['stop_name']." to ".$end['stop_name']; return 'From ' . $start['stop_name'] . ' to ' . $end['stop_name'];
} }
   
function getRouteByFullName($routeFullName) { function getRouteByFullName($routeFullName) {
global $conn; global $conn;
$query = "Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1"; $query = 'Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeFullName", $routeFullName); $query->bindParam(':routeFullName', $routeFullName);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getRoutes() { function getRoutes() {
global $conn; global $conn;
$query = "Select * from routes order by route_short_name;"; $query = 'Select * from routes order by route_short_name;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRoutesByNumberSeries($routeNumberSeries = "") { function getRoutesByNumberSeries($routeNumberSeries = '') {
global $conn; global $conn;
if (strlen($routeNumberSeries) == 1) { if (strlen($routeNumberSeries) == 1) {
return getRoute($routeNumberSeries); return getRoute($routeNumberSeries);
} }
$seriesMin = substr($routeNumberSeries, 0, -1) . "0"; $seriesMin = substr($routeNumberSeries, 0, -1) . '0';
$seriesMax = substr($routeNumberSeries, 0, -1) . "9"; $seriesMax = substr($routeNumberSeries, 0, -1) . '9';
$query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = $query = 'Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id =
routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, 'FM999') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;"; routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, \'FM999\') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":seriesMin", $seriesMin); $query->bindParam(':seriesMin', $seriesMin);
$query->bindParam(":seriesMax", $seriesMax); $query->bindParam(':seriesMax', $seriesMax);
$routeNumberSeries = "% " . substr($routeNumberSeries, 0, -1) . "%"; $routeNumberSeries = '% ' . substr($routeNumberSeries, 0, -1) . '%';
$query->bindParam(":routeNumberSeries", $routeNumberSeries); $query->bindParam(':routeNumberSeries', $routeNumberSeries);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRouteNextTrip($routeID, $directionID) { function getRouteNextTrip($routeID, $directionID) {
global $conn; global $conn;
   
$query = "select routes.route_id,routes.route_url,direction_id,trips.trip_id,trip_headsign,departure_time,service_id from routes join trips on trips.route_id = routes.route_id $query = 'select routes.route_id,routes.route_url,direction_id,trips.trip_id,trip_headsign,departure_time,service_id from routes join trips on trips.route_id = routes.route_id
join stop_times on stop_times.trip_id = trips.trip_id where arrival_time between :currentTime and :futureTime join stop_times on stop_times.trip_id = trips.trip_id where arrival_time between :currentTime and :futureTime
and routes.route_id = :routeID and trips.direction_id = :directionID order by and routes.route_id = :routeID and trips.direction_id = :directionID order by
arrival_time limit 1"; arrival_time limit 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":currentTime", current_time()); $query->bindParam(':currentTime', current_time());
$futureTime = current_time(strtotime(current_time() ." +2h")); $futureTime = current_time(strtotime(current_time() . ' +2h'));
if (date("h",strtotime(current_time()) > 22)) $futureTime = "23:59:59"; if (date('h', strtotime(current_time()) > 22))
$query->bindParam(":futureTime", $futureTime); $futureTime = '23:59:59';
$query->bindParam(":routeID", $routeID); $query->bindParam(':futureTime', $futureTime);
$query->bindParam(":directionID", $directionID); $query->bindParam(':routeID', $routeID);
  $query->bindParam(':directionID', $directionID);
$query->execute(); $query->execute();
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r; return $r;
} }
   
function getRouteFirstTrip($routeID,$directionID) { function getRouteFirstTrip($routeID, $directionID) {
global $conn; global $conn;
   
$query = "select * from routes join trips on trips.route_id = routes.route_id $query = 'select * from routes join trips on trips.route_id = routes.route_id
join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID
and trips.direction_id = :directionID order by and trips.direction_id = :directionID order by
arrival_time DESC limit 1"; arrival_time DESC limit 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeID", $routeID); $query->bindParam(':routeID', $routeID);
   
$query->bindParam(":directionID", $directionID); $query->bindParam(':directionID', $directionID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
   
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r; return $r;
} }
   
function getRouteAtStop($routeID, $directionID, $stop_id) { function getRouteAtStop($routeID, $directionID, $stop_id) {
$nextTrip = getRouteNextTrip($routeID, $directionID); $nextTrip = getRouteNextTrip($routeID, $directionID);
if ($nextTrip['trip_id']) { if ($nextTrip['trip_id']) {
foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) { foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) {
if ($tripStop['stop_id'] == $stop_id) if ($tripStop['stop_id'] == $stop_id)
return $tripStop; return $tripStop;
} }
} }
return Array(); return Array();
} }
   
function getRouteTrips($routeID, $directionID = "", $service_period = "") { function getRouteTrips($routeID, $directionID = '', $service_period = '') {
global $conn; global $conn;
if ($service_period == "") if ($service_period == '')
$service_period = service_period(); $service_period = service_period();
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
$directionSQL = ""; $directionSQL = '';
if ($directionID != "") if ($directionID != '')
$directionSQL = " and direction_id = :directionID "; $directionSQL = ' and direction_id = :directionID ';
$query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id $query = 'select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id
join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB) join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB)
AND (routes.route_id = :routeID) " . $directionSQL . " and stop_sequence = '1' order by AND (routes.route_id = :routeID) ' . $directionSQL . ' and stop_sequence = \'1\' order by
arrival_time "; arrival_time ';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":routeID", $routeID); $query->bindParam(':routeID', $routeID);
$query->bindParam(":service_periodA", $sidA); $query->bindParam(':service_periodA', $sidA);
$query->bindParam(":service_periodB", $sidB); $query->bindParam(':service_periodB', $sidB);
if ($directionSQL != "") if ($directionSQL != '')
$query->bindParam(":directionID", $directionID); $query->bindParam(':directionID', $directionID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRoutesByDestination($destination = "", $service_period = "") { function getRoutesByDestination($destination = '', $service_period = '') {
global $conn; global $conn;
if ($service_period == "") if ($service_period == '')
$service_period = service_period(); $service_period = service_period();
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
if ($destination != "") { if ($destination != '') {
/* $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id /* $query = 'SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id
FROM stop_times join trips on trips.trip_id = FROM stop_times join trips on trips.trip_id =
stop_times.trip_id join routes on trips.route_id = routes.route_id stop_times.trip_id join routes on trips.route_id = routes.route_id
WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB) WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB)
order by route_short_name";*/ order by route_short_name'; */
$query = "select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id $query = 'select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;"; from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;';
} else { } else {
$query = "select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id $query = 'select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;"; from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;';
} }
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
   
//$query->bindParam(":service_periodA", $sidA); //$query->bindParam(':service_periodA', $sidA);
//$query->bindParam(":service_periodB", $sidB); //$query->bindParam(':service_periodB', $sidB);
if ($destination != "") if ($destination != '')
$query->bindParam(":destination", $destination); $query->bindParam(':destination', $destination);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRoutesBySuburb($suburb, $service_period = "") { function getRoutesBySuburb($suburb, $service_period = '') {
if ($service_period == "") if ($service_period == '')
$service_period = service_period(); $service_period = service_period();
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
   
global $conn; global $conn;
$query = "SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name $query = 'SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times join trips on trips.trip_id = stop_times.trip_id FROM stop_times join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE stop_desc LIKE :suburb AND (service_id=:service_periodA OR service_id=:service_periodB) WHERE stop_desc LIKE :suburb AND (service_id=:service_periodA OR service_id=:service_periodB)
ORDER BY route_short_name"; ORDER BY route_short_name';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":service_periodA", $sidA); $query->bindParam(':service_periodA', $sidA);
$query->bindParam(":service_periodB", $sidB); $query->bindParam(':service_periodB', $sidB);
$suburb = "%Suburb: %" . $suburb . "%"; $suburb = '%Suburb: %' . $suburb . '%';
$query->bindParam(":suburb", $suburb); $query->bindParam(':suburb', $suburb);
$query->execute(); $query->execute();
   
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
   
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) { function getRoutesNearby($lat, $lng, $limit = '', $distance = 500) {
// if ($service_period == "") // if ($service_period == '')
$service_period = service_period(); $service_period = service_period();
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
$limitSQL = ""; $limitSQL = '';
if ($limit != "") if ($limit != '')
$limitSQL = " LIMIT :limit "; $limitSQL = ' LIMIT :limit ';
global $conn; global $conn;
$query = "SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, $query = 'SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id,
min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance min(ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), FALSE)) as distance
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE (service_id=:service_periodA OR service_id=:service_periodB) WHERE (service_id=:service_periodA OR service_id=:service_periodB)
AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE) AND ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), :distance, FALSE)
group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name
order by distance $limitSQL"; order by distance $limitSQL';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":service_periodA", $sidA); $query->bindParam(':service_periodA', $sidA);
$query->bindParam(":service_periodB", $sidB); $query->bindParam(':service_periodB', $sidB);
$query->bindParam(":distance", $distance); $query->bindParam(':distance', $distance);
if ($limit != "") if ($limit != '')
$query->bindParam(":limit", $limit); $query->bindParam(':limit', $limit);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
function getServiceOverride($date = "") { function getServiceOverride($date = '') {
global $conn; global $conn;
$query = "Select * from calendar_dates where date = :date and exception_type = '1' LIMIT 1"; $query = 'Select * from calendar_dates where date = :date and exception_type = \'1\' LIMIT 1';
// debug($query,"database"); // debug($query,'database');
$query = $conn->prepare($query); // Create a prepared statement $query = $conn->prepare($query); // Create a prepared statement
$date = date("Ymd", ($date != "" ? $date : time())); $date = date('Ymd', ($date != '' ? $date : time()));
$query->bindParam(":date", $date); $query->bindParam(':date', $date);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getServiceAlert($alertID) { function getServiceAlert($alertID) {
global $conn; global $conn;
$query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where id = :servicealert_id"; $query = 'SELECT id,extract(\'epoch\' from start) as start, extract(\'epoch\' from "end") as \\\'end\\\',cause,effect,header,description,url from servicealerts_alerts where id = :servicealert_id';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":servicealert_id", $alertID); $query->bindParam(':servicealert_id', $alertID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function updateServiceAlert($alertID, $alert) { function updateServiceAlert($alertID, $alert) {
global $conn; global $conn;
$query = 'update servicealerts_alerts set start=:start, "end"=:end, header=:header, description=:description, url=:url, cause=:cause, effect=:effect where id = :servicealert_id'; $query = 'update servicealerts_alerts set start=:start, "end"=:end, header=:header, description=:description, url=:url, cause=:cause, effect=:effect where id = :servicealert_id';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindValue(":servicealert_id", $alertID); $query->bindValue(':servicealert_id', $alertID);
$query->bindValue(":start", $alert['startdate']); $query->bindValue(':start', $alert['startdate']);
$query->bindValue(":end", $alert['enddate']); $query->bindValue(':end', $alert['enddate']);
$query->bindValue(":header", $alert['header']); $query->bindValue(':header', $alert['header']);
$query->bindValue(":description", $alert['description']); $query->bindValue(':description', $alert['description']);
$query->bindValue(":url", $alert['url']); $query->bindValue(':url', $alert['url']);
$query->bindValue(":cause", $alert['cause']); $query->bindValue(':cause', $alert['cause']);
$query->bindValue(":effect", $alert['effect']); $query->bindValue(':effect', $alert['effect']);
$query->execute(); $query->execute();
   
print_r($conn->errorInfo()); print_r($conn->errorInfo());
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function addServiceAlert($alert) { function addServiceAlert($alert) {
global $conn; global $conn;
$query = 'INSERT INTO servicealerts_alerts (start, "end", header, description, url,cause,effect) VALUES (:start, :end, :header, :description, :url,:cause,:effect) '; $query = 'INSERT INTO servicealerts_alerts (start, "end", header, description, url,cause,effect) VALUES (:start, :end, :header, :description, :url,:cause,:effect) ';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
//print_r($alert); //print_r($alert);
$query->bindValue(":start", $alert['startdate']); $query->bindValue(':start', $alert['startdate']);
$query->bindValue(":end", $alert['enddate']); $query->bindValue(':end', $alert['enddate']);
$query->bindValue(":header", $alert['header']); $query->bindValue(':header', $alert['header']);
$query->bindValue(":description", $alert['description']); $query->bindValue(':description', $alert['description']);
$query->bindValue(":url", $alert['url']); $query->bindValue(':url', $alert['url']);
$query->bindValue(":cause", $alert['cause']); $query->bindValue(':cause', $alert['cause']);
$query->bindValue(":effect", $alert['effect']); $query->bindValue(':effect', $alert['effect']);
$query->execute(); $query->execute();
   
print_r($conn->errorInfo()); print_r($conn->errorInfo());
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getCurrentAlerts() { function getCurrentAlerts() {
global $conn; global $conn;
$query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where NOW() > start and NOW() < \"end\""; $query = 'SELECT id,extract(\'epoch\' from start) as start, extract(\'epoch\' from "end") as "end",cause,effect,header,description,url from servicealerts_alerts where NOW() > start and NOW() < "end"';
// debug($query, "database"); // debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getFutureAlerts() { function getFutureAlerts() {
global $conn; global $conn;
$query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where NOW() < \"end\""; $query = 'SELECT id,extract(\'epoch\' from start) as start, extract(\'epoch\' from "end") as "end",cause,effect,header,description,url from servicealerts_alerts where NOW() < "end"';
// debug($query, "database"); // debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getAllAlerts() { function getAllAlerts() {
global $conn; global $conn;
$query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts"; $query = 'SELECT id,extract(\'epoch\' from start) as start, extract(\'epoch\' from "end") as "end",cause,effect,header,description,url from servicealerts_alerts';
// debug($query, "database"); // debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getInformedAlerts($id, $filter_class, $filter_id) { function getInformedAlerts($id, $filter_class, $filter_id) {
   
global $conn; global $conn;
//echo "$id, $filter_class, $filter_id\n"; //echo '$id, $filter_class, $filter_id\n';
$query = "SELECT * from servicealerts_informed where servicealert_id = :servicealert_id"; $query = 'SELECT * from servicealerts_informed where servicealert_id = :servicealert_id';
   
if ($filter_class != "") { if ($filter_class != '') {
$query .= " AND informed_class = :informed_class "; $query .= ' AND informed_class = :informed_class ';
} }
if ($filter_id != "") { if ($filter_id != '') {
$query .= " AND informed_id = :informed_id "; $query .= ' AND informed_id = :informed_id ';
} }
// debug($query, "database"); // debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
if ($filter_class != "") { if ($filter_class != '') {
$query->bindParam(":informed_class", $filter_class); $query->bindParam(':informed_class', $filter_class);
} }
if ($filter_id != "") { if ($filter_id != '') {
$query->bindParam(":informed_id", $filter_id); $query->bindParam(':informed_id', $filter_id);
} }
$query->bindParam(":servicealert_id", $id); $query->bindParam(':servicealert_id', $id);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function deleteInformedAlert($serviceAlertID, $class, $id) { function deleteInformedAlert($serviceAlertID, $class, $id) {
global $conn; global $conn;
$query = 'DELETE from servicealerts_informed where servicealert_id = :servicealert_id and informed_class = :informed_class AND informed_id = :informed_id'; $query = 'DELETE from servicealerts_informed where servicealert_id = :servicealert_id and informed_class = :informed_class AND informed_id = :informed_id';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":servicealert_id", $serviceAlertID); $query->bindParam(':servicealert_id', $serviceAlertID);
$query->bindParam(":informed_class", $class); $query->bindParam(':informed_class', $class);
$query->bindParam(":informed_id", $id); $query->bindParam(':informed_id', $id);
$query->execute(); $query->execute();
print_r($conn->errorInfo()); print_r($conn->errorInfo());
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return null; return null;
} }
   
function addInformedAlert($serviceAlertID, $class, $id, $action) { function addInformedAlert($serviceAlertID, $class, $id, $action) {
global $conn; global $conn;
$query = 'INSERT INTO servicealerts_informed (servicealert_id , informed_class , informed_id, informed_action) $query = 'INSERT INTO servicealerts_informed (servicealert_id , informed_class , informed_id, informed_action)
VALUES(:servicealert_id ,:informed_class, :informed_id, :informed_action)'; VALUES(:servicealert_id ,:informed_class, :informed_id, :informed_action)';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":servicealert_id", $serviceAlertID); $query->bindParam(':servicealert_id', $serviceAlertID);
$query->bindParam(":informed_class", $class); $query->bindParam(':informed_class', $class);
$query->bindParam(":informed_id", $id); $query->bindParam(':informed_id', $id);
$query->bindParam(":informed_action", $action); $query->bindParam(':informed_action', $action);
$query->execute(); $query->execute();
   
print_r($conn->errorInfo()); print_r($conn->errorInfo());
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return null; return null;
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
function getStop($stopID) { function getStop($stopID) {
global $conn; global $conn;
$query = "Select * from stops where stop_id = :stopID LIMIT 1"; $query = 'Select * from stops where stop_id = :stopID LIMIT 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":stopID", $stopID); $query->bindParam(':stopID', $stopID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getStops($firstLetter = "", $startsWith = "") { function getStops($firstLetter = '', $startsWith = '') {
global $conn; global $conn;
$conditions = Array(); $conditions = Array();
if ($firstLetter != "") if ($firstLetter != '')
$conditions[] = "substr(stop_name,1,1) = :firstLetter"; $conditions[] = 'substr(stop_name,1,1) = :firstLetter';
if ($startsWith != "") if ($startsWith != '')
$conditions[] = "stop_name like :startsWith"; $conditions[] = 'stop_name like :startsWith';
$query = "Select * from stops"; $query = 'Select * from stops';
if (sizeof($conditions) > 0) { if (sizeof($conditions) > 0) {
if (sizeof($conditions) > 1) { if (sizeof($conditions) > 1) {
$query .= " Where " . implode(" AND ", $conditions) . " "; $query .= ' Where ' . implode(' AND ', $conditions) . ' ';
} else { } else {
$query .= " Where " . $conditions[0] . " "; $query .= ' Where ' . $conditions[0] . ' ';
} }
} }
$query .= " order by stop_name;"; $query .= ' order by stop_name;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
if ($firstLetter != "") if ($firstLetter != '')
$query->bindParam(":firstLetter", $firstLetter); $query->bindParam(':firstLetter', $firstLetter);
   
if ($startsWith != "") { if ($startsWith != '') {
$startsWith = $startsWith . "%"; $startsWith = $startsWith . '%';
$query->bindParam(":startsWith", $startsWith); $query->bindParam(':startsWith', $startsWith);
} }
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getNearbyStops($lat, $lng, $limit = "", $distance = 1000) { function getNearbyStops($lat, $lng, $limit = '', $distance = 1000) {
if ($lat == null || $lng == null) if ($lat == null || $lng == null)
return Array(); return Array();
if ($limit != "") if ($limit != '')
$limitSQL = " LIMIT :limit "; $limitSQL = ' LIMIT :limit ';
global $conn; global $conn;
$query = "Select *, ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE) as distance $query = 'Select *, ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), FALSE) as distance
from stops WHERE ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE) from stops WHERE ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), :distance, FALSE)
order by distance $limitSQL;"; order by distance $limitSQL;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":distance", $distance); $query->bindParam(':distance', $distance);
$query->bindParam(":limit", $limit); $query->bindParam(':limit', $limit);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopsByName($name) { function getStopsByName($name) {
global $conn; global $conn;
$query = "Select * from stops where stop_name LIKE :name;"; $query = 'Select * from stops where stop_name LIKE :name;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$name = $name . "%"; $name = $name . '%';
$query->bindParam(":name", $name); $query->bindParam(':name', $name);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopsBySuburb($suburb) { function getStopsBySuburb($suburb) {
global $conn; global $conn;
$query = "Select * from stops where stop_desc LIKE :suburb order by stop_name;"; $query = 'Select * from stops where stop_desc LIKE :suburb order by stop_name;';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$suburb = "%<br>Suburb: %" . $suburb . "%"; $suburb = '%<br>Suburb: %' . $suburb . '%';
$query->bindParam(":suburb", $suburb); $query->bindParam(':suburb', $suburb);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopsByStopCode($stop_code, $startsWith = "") { function getStopsByStopCode($stop_code, $startsWith = '') {
global $conn; global $conn;
$query = "Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)"; $query = 'Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)';
if ($startsWith != "") if ($startsWith != '')
$query .= " AND stop_name like :startsWith"; $query .= ' AND stop_name like :startsWith';
   
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
   
$query->bindParam(":stop_code", $stop_code); $query->bindParam(':stop_code', $stop_code);
$stop_code2 = $stop_code . "%"; $stop_code2 = $stop_code . '%';
$query->bindParam(":stop_code2", $stop_code2); $query->bindParam(':stop_code2', $stop_code2);
if ($startsWith != "") { if ($startsWith != '') {
$startsWith = $startsWith . "%"; $startsWith = $startsWith . '%';
$query->bindParam(":startsWith", $startsWith); $query->bindParam(':startsWith', $startsWith);
} }
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopRoutes($stopID, $service_period) { function getStopRoutes($stopID, $service_period) {
if ($service_period == "") { if ($service_period == '') {
$service_period = service_period(); $service_period = service_period();
} }
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
global $conn; global $conn;
$query = "SELECT distinct service_id,trips.route_id,route_short_name,route_long_name $query = 'SELECT distinct service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times join trips on trips.trip_id = FROM stop_times join trips on trips.trip_id =
stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID
AND (service_id=:service_periodA OR service_id=:service_periodB)"; AND (service_id=:service_periodA OR service_id=:service_periodB)';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":service_periodA", $sidA); $query->bindParam(':service_periodA', $sidA);
$query->bindParam(":service_periodB", $sidB); $query->bindParam(':service_periodB', $sidB);
$query->bindParam(":stopID", $stopID); $query->bindParam(':stopID', $stopID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopTrips($stopID, $service_period = "", $afterTime = "", $limit = "", $route_short_name = "") { function getStopTrips($stopID, $service_period = '', $afterTime = '', $limit = '', $route_short_name = '') {
if ($service_period == "") { if ($service_period == '') {
$service_period = service_period(); $service_period = service_period();
} }
$service_ids = service_ids($service_period); $service_ids = service_ids($service_period);
$sidA = $service_ids[0]; $sidA = $service_ids[0];
$sidB = $service_ids[1]; $sidB = $service_ids[1];
$limitSQL = ""; $limitSQL = '';
if ($limit != "") if ($limit != '')
$limitSQL .= " LIMIT :limit "; $limitSQL .= ' LIMIT :limit ';
   
global $conn; global $conn;
if ($afterTime != "") { if ($afterTime != '') {
$query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,trips.trip_headsign,route_short_name,route_long_name,end_times.arrival_time as end_time $query = ' SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,trips.trip_headsign,route_short_name,route_long_name,end_times.arrival_time as end_time
FROM stop_times FROM stop_times
join trips on trips.trip_id = join trips on trips.trip_id =
stop_times.trip_id stop_times.trip_id
join routes on trips.route_id = routes.route_id , (SELECT trip_id,max(arrival_time) as arrival_time from stop_times join routes on trips.route_id = routes.route_id , (SELECT trip_id,max(arrival_time) as arrival_time from stop_times
WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times
WHERE stop_times.stop_id = :stopID WHERE stop_times.stop_id = :stopID
AND stop_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id
AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . '
AND end_times.arrival_time > :afterTime AND end_times.arrival_time > :afterTime
ORDER BY end_time $limitSQL"; ORDER BY end_time $limitSQL';
} else { } else {
$query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name $query = 'SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times FROM stop_times
join trips on trips.trip_id = join trips on trips.trip_id =
stop_times.trip_id stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
WHERE stop_times.stop_id = :stopID WHERE stop_times.stop_id = :stopID
AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . '
ORDER BY arrival_time $limitSQL"; ORDER BY arrival_time $limitSQL';
} }
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":service_periodA", $sidA); $query->bindParam(':service_periodA', $sidA);
$query->bindParam(":service_periodB", $sidB); $query->bindParam(':service_periodB', $sidB);
$query->bindParam(":stopID", $stopID); $query->bindParam(':stopID', $stopID);
if ($limit != "") if ($limit != '')
$query->bindParam(":limit", $limit); $query->bindParam(':limit', $limit);
if ($afterTime != "") if ($afterTime != '')
$query->bindParam(":afterTime", $afterTime); $query->bindParam(':afterTime', $afterTime);
if ($route_short_name != "") if ($route_short_name != '')
$query->bindParam(":route_short_name", $route_short_name); $query->bindParam(':route_short_name', $route_short_name);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getStopTripsWithTimes($stopID, $time = "", $service_period = "", $time_range = "", $limit = "") { function getStopTripsWithTimes($stopID, $time = '', $service_period = '', $time_range = '', $limit = '') {
if ($service_period == "") if ($service_period == '')
$service_period = service_period(); $service_period = service_period();
if ($time_range == "") if ($time_range == '')
$time_range = (24 * 60 * 60); $time_range = (24 * 60 * 60);
if ($time == "") if ($time == '')
$time = current_time(); $time = current_time();
if ($limit == "") if ($limit == '')
$limit = 10; $limit = 10;
$trips = getStopTrips($stopID, $service_period, $time); $trips = getStopTrips($stopID, $service_period, $time);
$timedTrips = Array(); $timedTrips = Array();
if ($trips && sizeof($trips) > 0) { if ($trips && sizeof($trips) > 0) {
foreach ($trips as $trip) { foreach ($trips as $trip) {
if ($trip['arrival_time'] != "") { if ($trip['arrival_time'] != '') {
if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) { if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) {
$timedTrips[] = $trip; $timedTrips[] = $trip;
} }
} else { } else {
$timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']); $timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']);
if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) { if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) {
$timedTrips[] = $timedTrip; $timedTrips[] = $timedTrip;
} }
} }
if (sizeof($timedTrips) > $limit) if (sizeof($timedTrips) > $limit)
break; break;
} }
sktimesort($timedTrips, "arrival_time", true); sktimesort($timedTrips, 'arrival_time', true);
} }
return $timedTrips; return $timedTrips;
} }
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
   
function getTrip($tripID) { function getTrip($tripID) {
global $conn; global $conn;
$query = "Select * from trips $query = 'Select * from trips
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
where trip_id = :tripID where trip_id = :tripID
LIMIT 1"; LIMIT 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
   
return Array(); return Array();
} }
return $query->fetch(PDO :: FETCH_ASSOC); return $query->fetch(PDO :: FETCH_ASSOC);
} }
   
function getTripStops($tripID) { function getTripStops($tripID) {
global $conn; global $conn;
$query = "SELECT stops.stop_id, stop_name, ST_AsKML(position) as positionkml, $query = 'SELECT stops.stop_id, stop_name, ST_AsKML(position) as positionkml,
stop_sequence, trips.trip_id stop_sequence, trips.trip_id
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE trips.trip_id = :tripID ORDER BY stop_sequence"; WHERE trips.trip_id = :tripID ORDER BY stop_sequence';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function getTripHasStop($tripID, $stopID) { function getTripHasStop($tripID, $stopID) {
global $conn; global $conn;
$query = "SELECT stop_id $query = 'SELECT stop_id
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
WHERE trips.trip_id = :tripID and stop_times.stop_id = :stopID"; WHERE trips.trip_id = :tripID and stop_times.stop_id = :stopID';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->bindParam(":stopID", $stopID); $query->bindParam(':stopID', $stopID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return ($query->fetchColumn() > 0); return ($query->fetchColumn() > 0);
} }
   
function getTripShape($tripID) { function getTripShape($tripID) {
// todo, use shapes table if shape_id specified // todo, use shapes table if shape_id specified
global $conn; global $conn;
$query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.shape_pt))) as the_route $query = 'SELECT ST_AsKML(ST_MakeLine(geometry(a.shape_pt))) as the_route
FROM (SELECT shapes.shape_id,shape_pt from shapes FROM (SELECT shapes.shape_id,shape_pt from shapes
inner join trips on shapes.shape_id = trips.shape_id inner join trips on shapes.shape_id = trips.shape_id
WHERE trips.trip_id = :tripID ORDER BY shape_pt_sequence) as a group by a.shape_id"; WHERE trips.trip_id = :tripID ORDER BY shape_pt_sequence) as a group by a.shape_id';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchColumn(0); return $query->fetchColumn(0);
} }
   
function getTripStopTimes($tripID) { function getTripStopTimes($tripID) {
global $conn; global $conn;
$query = "SELECT stop_times.trip_id,trip_headsign,arrival_time,stop_times.stop_id $query = 'SELECT stop_times.trip_id,trip_headsign,arrival_time,stop_times.stop_id
,stop_lat,stop_lon,stop_name,stop_desc,stop_code, ,stop_lat,stop_lon,stop_name,stop_desc,stop_code,
stop_sequence,service_id,trips.route_id,route_short_name,route_long_name stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE trips.trip_id = :tripID ORDER BY stop_sequence"; WHERE trips.trip_id = :tripID ORDER BY stop_sequence';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$stopTimes = $query->fetchAll(); $stopTimes = $query->fetchAll();
return $stopTimes; return $stopTimes;
} }
   
function getTripAtStop($tripID, $stop_sequence) { function getTripAtStop($tripID, $stop_sequence) {
global $conn; global $conn;
foreach (getTripStopTimes($tripID) as $tripStop) { foreach (getTripStopTimes($tripID) as $tripStop) {
if ($tripStop['stop_sequence'] == $stop_sequence) if ($tripStop['stop_sequence'] == $stop_sequence)
return $tripStop; return $tripStop;
} }
return Array(); return Array();
} }
   
function getTripStartTime($tripID) { function getTripStartTime($tripID) {
global $conn; global $conn;
$query = "Select * from stop_times $query = 'Select * from stop_times
where trip_id = :tripID where trip_id = :tripID
AND arrival_time IS NOT NULL AND arrival_time IS NOT NULL
AND stop_sequence = '1'"; AND stop_sequence = \'1\'';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r['arrival_time']; return $r['arrival_time'];
} }
   
function getTripEndTime($tripID) { function getTripEndTime($tripID) {
global $conn; global $conn;
$query = "SELECT trip_id,max(arrival_time) as arrival_time from stop_times $query = 'SELECT trip_id,max(arrival_time) as arrival_time from stop_times
WHERE stop_times.arrival_time IS NOT NULL and trip_id = :tripID group by trip_id"; WHERE stop_times.arrival_time IS NOT NULL and trip_id = :tripID group by trip_id';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r['arrival_time']; return $r['arrival_time'];
} }
   
function getTripStartingPoint($tripID) { function getTripStartingPoint($tripID) {
global $conn; global $conn;
$query = "SELECT stops.stop_id, stops.stop_name, stops.stop_desc $query = 'SELECT stops.stop_id, stops.stop_name, stops.stop_desc
from stop_times inner join stops on stop_times.stop_id = stops.stop_id from stop_times inner join stops on stop_times.stop_id = stops.stop_id
WHERE trip_id = :tripID and stop_sequence = '1' limit 1"; WHERE trip_id = :tripID and stop_sequence = \'1\' limit 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r; return $r;
} }
   
function getTripDestination($tripID) { function getTripDestination($tripID) {
global $conn; global $conn;
$query = "SELECT stops.stop_id, stops.stop_name, stops.stop_desc $query = 'SELECT stops.stop_id, stops.stop_name, stops.stop_desc
from stop_times inner join stops on stop_times.stop_id = stops.stop_id from stop_times inner join stops on stop_times.stop_id = stops.stop_id
WHERE trip_id = :tripID order by stop_sequence desc limit 1"; WHERE trip_id = :tripID order by stop_sequence desc limit 1';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
$r = $query->fetch(PDO :: FETCH_ASSOC); $r = $query->fetch(PDO :: FETCH_ASSOC);
return $r; return $r;
} }
   
function getActiveTrips($time) { function getActiveTrips($time) {
global $conn; global $conn;
if ($time == "") if ($time == '')
$time = current_time(); $time = current_time();
$query = "Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL $query = 'Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL
AND stop_sequence = '1') as start_times, (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times AND stop_sequence = \'1\') as start_times, (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times
WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND :time > start_times.arrival_time AND :time < end_times.arrival_time"; WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND :time > start_times.arrival_time AND :time < end_times.arrival_time';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
$query->bindParam(":time", $time); $query->bindParam(':time', $time);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
   
function viaPoints($tripID, $stop_sequence = "") { function viaPoints($tripID, $stop_sequence = '') {
global $conn; global $conn;
$query = "SELECT stops.stop_id, stop_name, arrival_time $query = 'SELECT stops.stop_id, stop_name, arrival_time
FROM stop_times join stops on stops.stop_id = stop_times.stop_id FROM stop_times join stops on stops.stop_id = stop_times.stop_id
WHERE stop_times.trip_id = :tripID WHERE stop_times.trip_id = :tripID
" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . " ORDER BY stop_sequence"; ' . ($stop_sequence != '' ? ' AND stop_sequence > :stop_sequence ' : '') . ' ORDER BY stop_sequence';
debug($query, "database"); debug($query, 'database');
$query = $conn->prepare($query); $query = $conn->prepare($query);
if ($stop_sequence != "") if ($stop_sequence != '')
$query->bindParam(":stop_sequence", $stop_sequence); $query->bindParam(':stop_sequence', $stop_sequence);
$query->bindParam(":tripID", $tripID); $query->bindParam(':tripID', $tripID);
$query->execute(); $query->execute();
if (!$query) { if (!$query) {
databaseError($conn->errorInfo()); databaseError($conn->errorInfo());
return Array(); return Array();
} }
return $query->fetchAll(); return $query->fetchAll();
} }
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
include ('include/common.inc.php'); include ('include/common.inc.php');
$last_updated = date('Y-m-d', @filemtime('cbrfeed.zip')); $last_updated = date('Y-m-d', @filemtime('cbrfeed.zip'));
header("Content-Type: text/xml"); header("Content-Type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>"; echo "<?xml version='1.0' encoding='UTF-8'?>";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:geo="http://www.google.com/geo/schemas/sitemap/1.0">' . "\n"; echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:geo="http://www.google.com/geo/schemas/sitemap/1.0">' .PHP_EOL;
echo " <url><loc>" . curPageURL() . "index.php</loc><priority>1.0</priority></url>\n"; echo " <url><loc>" . curPageURL() . "index.php</loc><priority>1.0</priority></url>".PHP_EOL;
foreach (scandir("./") as $file) { foreach (scandir("./") as $file) {
if (strpos($file, ".php") !== false && $file != "index.php" && $file != "sitemap.xml.php") if (strpos($file, ".php") !== false && $file != "index.php" && $file != "sitemap.xml.php")
echo " <url><loc>" . curPageURL() . "$file</loc><priority>0.3</priority></url>\n"; echo " <url><loc>" . curPageURL() . "$file</loc><priority>0.3</priority></url>".PHP_EOL;
} }
foreach (scandir("./labs") as $file) { foreach (scandir("./labs") as $file) {
if (strpos($file, ".php") !== false) if (strpos($file, ".php") !== false)
echo " <url><loc>" . curPageURL() . "/labs/$file</loc><priority>0.3</priority></url>\n"; echo " <url><loc>" . curPageURL() . "/labs/$file</loc><priority>0.3</priority></url>".PHP_EOL;
} }
foreach (scandir("./myway") as $file) { foreach (scandir("./myway") as $file) {
if (strpos($file, ".php") !== false) if (strpos($file, ".php") !== false)
echo " <url><loc>" . curPageURL() . "/myway/$file</loc><priority>0.3</priority></url>\n"; echo " <url><loc>" . curPageURL() . "/myway/$file</loc><priority>0.3</priority></url>".PHP_EOL;
} }
foreach (getStops() as $stop) { foreach (getStops() as $stop) {
echo " <url><loc>" . curPageURL() . "stop.php?stopid=" . htmlspecialchars($stop["stop_id"]) . "</loc>"; echo " <url><loc>" . curPageURL() . "stop.php?stopid=" . htmlspecialchars($stop["stop_id"]) . "</loc>";
echo "<lastmod>" . $last_updated . "</lastmod>"; echo "<lastmod>" . $last_updated . "</lastmod>";
echo "<changefreq>monthly</changefreq>"; echo "<changefreq>monthly</changefreq>";
echo "<priority>0.9</priority>"; echo "<priority>0.9</priority>";
echo "</url>\n"; echo "</url>".PHP_EOL;
} }
foreach (getRoutes() as $route) { foreach (getRoutes() as $route) {
echo " <url><loc>" . curPageURL() . "trip.php?routeid=" . htmlspecialchars($route["route_id"]) . "</loc>"; echo " <url><loc>" . curPageURL() . "trip.php?routeid=" . htmlspecialchars($route["route_id"]) . "</loc>";
echo "<lastmod>" . $last_updated . "</lastmod>"; echo "<lastmod>" . $last_updated . "</lastmod>";
echo "<changefreq>monthly</changefreq>"; echo "<changefreq>monthly</changefreq>";
echo "<priority>0.9</priority>"; echo "<priority>0.9</priority>";
echo "</url>\n"; echo "</url>".PHP_EOL;
} }
   
// geosite map // geosite map
foreach (getRoutes() as $route) { foreach (getRoutes() as $route) {
echo " <url><loc>" . curPageURL() . "geo/route.kml.php?routeid=" . htmlspecialchars($route["route_id"]) . "</loc>"; echo " <url><loc>" . curPageURL() . "geo/route.kml.php?routeid=" . htmlspecialchars($route["route_id"]) . "</loc>";
echo "<lastmod>" . $last_updated . "</lastmod>"; echo "<lastmod>" . $last_updated . "</lastmod>";
echo "<geo:geo> echo "<geo:geo>
<geo:format>kml</geo:format> <geo:format>kml</geo:format>
</geo:geo>"; </geo:geo>";
echo "</url>\n"; echo "</url>".PHP_EOL;
} }
   
echo '</urlset>'; echo '</urlset>';
?> ?>
   
<?php <?php
   
/* /*
* Copyright 2010,2011 Alexander Sadleir * Copyright 2010,2011 Alexander Sadleir
   
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
   
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
if (php_sapi_name() == "cli") { if (php_sapi_name() == "cli") {
include ('include/common.inc.php'); include ('include/common.inc.php');
$pdconn = new PDO("pgsql:dbname=transitdata;user=postgres;password=snmc;host=localhost"); $pdconn = new PDO("pgsql:dbname=transitdata;user=postgres;password=snmc;host=localhost");
   
/* /*
delete from agency; delete from agency;
delete from calendar; delete from calendar;
delete from calendar_dates; delete from calendar_dates;
delete from routes; delete from routes;
delete from shapes; delete from shapes;
delete from stop_times; delete from stop_times;
delete from stops; delete from stops;
delete from trips; delete from trips;
*/ */
   
// Unzip cbrfeed.zip, import all csv files to database // Unzip cbrfeed.zip, import all csv files to database
$unzip = false; $unzip = false;
$zip = zip_open(dirname(__FILE__) . "/cbrfeed.zip"); $zip = zip_open(dirname(__FILE__) . "/cbrfeed.zip");
$tmpdir = "c:/tmp/cbrfeed/"; $tmpdir = "c:/tmp/cbrfeed/";
mkdir($tmpdir); mkdir($tmpdir);
if ($unzip) { if ($unzip) {
if (is_resource($zip)) { if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) { while ($zip_entry = zip_read($zip)) {
$fp = fopen($tmpdir . zip_entry_name($zip_entry), "w"); $fp = fopen($tmpdir . zip_entry_name($zip_entry), "w");
if (zip_entry_open($zip, $zip_entry, "r")) { if (zip_entry_open($zip, $zip_entry, "r")) {
echo "Extracting " . zip_entry_name($zip_entry) . "\n"; echo "Extracting " . zip_entry_name($zip_entry) . PHP_EOL;
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp, "$buf"); fwrite($fp, "$buf");
zip_entry_close($zip_entry); zip_entry_close($zip_entry);
fclose($fp); fclose($fp);
} }
} }
zip_close($zip); zip_close($zip);
} }
} }
   
foreach (scandir($tmpdir) as $file) { foreach (scandir($tmpdir) as $file) {
$headers = Array(); $headers = Array();
if (!strpos($file, ".txt") === false) { if (!strpos($file, ".txt") === false) {
$fieldseparator = ","; $fieldseparator = ",";
$lineseparator = "\n"; $lineseparator = PHP_EOL;
$tablename = str_replace(".txt", "", $file); $tablename = str_replace(".txt", "", $file);
echo "Opening $file \n"; echo "Opening $file \n";
$line = 0; $line = 0;
$handle = fopen($tmpdir . $file, "r"); $handle = fopen($tmpdir . $file, "r");
   
$distance = 0; $distance = 0;
$lastshape = 0; $lastshape = 0;
$lastlat = 0; $lastlat = 0;
$lastlon = 0; $lastlon = 0;
$stmt = null; $stmt = null;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if ($line == 0) { if ($line == 0) {
$headers = array_values($data); $headers = array_values($data);
if ($tablename == "stops") { if ($tablename == "stops") {
$headers[] = "position"; $headers[] = "position";
} }
if ($tablename == "shapes") { if ($tablename == "shapes") {
$headers[] = "shape_pt"; $headers[] = "shape_pt";
} }
$query = "insert into $tablename ("; $query = "insert into $tablename (";
$valueCount = 0; $valueCount = 0;
foreach ($headers as $value) { foreach ($headers as $value) {
$query.=($valueCount > 0 ? "," : "") . pg_escape_string($value); $query.=($valueCount > 0 ? "," : "") . pg_escape_string($value);
$valueCount++; $valueCount++;
} }
$query.= ") values( "; $query.= ") values( ";
$valueCount = 0; $valueCount = 0;
foreach ($data as $value) { foreach ($data as $value) {
$query.=($valueCount > 0 ? "," : "") . '?'; $query.=($valueCount > 0 ? "," : "") . '?';
$valueCount++; $valueCount++;
} }
if ($tablename == "stops") { if ($tablename == "stops") {
$query.= ", ST_GeographyFromText(?));"; $query.= ", ST_GeographyFromText(?));";
} else if ($tablename == "shapes") { } else if ($tablename == "shapes") {
$query.= ", ST_GeographyFromText(?));"; $query.= ", ST_GeographyFromText(?));";
} else { } else {
$query.= ");"; $query.= ");";
} }
   
echo $query; echo $query;
$stmt = $pdconn->prepare($query); $stmt = $pdconn->prepare($query);
} else { } else {
$values = array_values($data); $values = array_values($data);
if ($tablename == "stops") { if ($tablename == "stops") {
// Coordinate values are out of range [-180 -90, 180 90] // Coordinate values are out of range [-180 -90, 180 90]
$values[] = 'SRID=4326;POINT('.$values[5].' '.$values[4].')'; $values[] = 'SRID=4326;POINT('.$values[5].' '.$values[4].')';
} }
if ($tablename == "shapes") { if ($tablename == "shapes") {
if ($data[0] != $lastshape) { if ($data[0] != $lastshape) {
$distance = 0; $distance = 0;
$lastshape = $data[0]; $lastshape = $data[0];
} else { } else {
$distance += distance($lastlat, $lastlon, $data[1], $data[2]); $distance += distance($lastlat, $lastlon, $data[1], $data[2]);
} }
$lastlat = $data[1]; $lastlat = $data[1];
$lastlon = $data[2]; $lastlon = $data[2];
   
$values[4] = $distance; $values[4] = $distance;
$values[] = 'SRID=4326;POINT('.$values[2].' '.$values[1].')'; $values[] = 'SRID=4326;POINT('.$values[2].' '.$values[1].')';
} }
if (substr($values[1],0,2) == '24') $values[1] = "23:59:59"; if (substr($values[1],0,2) == '24') $values[1] = "23:59:59";
if (substr($values[2],0,2) == '24') $values[2] = "23:59:59"; if (substr($values[2],0,2) == '24') $values[2] = "23:59:59";
$stmt->execute($values); $stmt->execute($values);
$err = $pdconn->errorInfo(); $err = $pdconn->errorInfo();
if ($err[2] != "" && strpos($err[2], "duplicate key") === false) { if ($err[2] != "" && strpos($err[2], "duplicate key") === false) {
print_r($values); print_r($values);
print_r($err); print_r($err);
die("terminated import due to db error above"); die("terminated import due to db error above");
} }
} }
$line++; $line++;
if ($line % 10000 == 0) if ($line % 10000 == 0)
echo "$line records... " . date('c') . "\n"; echo "$line records... " . date('c') . PHP_EOL;
} }
fclose($handle); fclose($handle);
$stmt->closeCursor(); $stmt->closeCursor();
echo "Found a total of $line records in $file.\n"; echo "Found a total of $line records in $file.\n";
} }
} }
} }
?> ?>