Fix css issues
Fix css issues
Place time/period/location adjuster on many views
Sanitize more user input

<?php <?php
date_default_timezone_set('Australia/ACT'); date_default_timezone_set('Australia/ACT');
$APIurl = "http://localhost:8765"; $APIurl = "http://localhost:8765";
error_reporting(E_ALL ^ E_NOTICE); $cloudmadeAPIkey="daa03470bb8740298d4b10e3f03d63e6";
  $googleMapsAPIkey="ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q";
  $otpAPIurl = 'http://10.1.0.243:5080/opentripplanner-api-webapp/';
  if (isDebug()) error_reporting(E_ALL ^ E_NOTICE);
   
// 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");
   
// 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['service_period'])) $_SESSION['service_period'] = filter_var($_REQUEST['service_period'],FILTER_SANITIZE_STRING);
  if (isset($_REQUEST['time'])) $_SESSION['time'] = filter_var($_REQUEST['time'],FILTER_SANITIZE_STRING);
  if (isset($_REQUEST['geolocate'])) {
  $contents = geocode(var_filter($_REQUEST['geolocate'],FILTER_SANITIZE_URL),true);
  if (isset($contents[0]->centroid)) {
  $session['lat'] = $contents[0]->centroid->coordinates[0];
  $session['lon'] = $contents[0]->centroid->coordinates[1];
  }
  else {
  $session['lat'] = "";
  $session['lon'] = "";
  }
  }
  //print_r ($_SESSION);
function isDebug() function isDebug()
{ {
return $_SERVER['SERVER_NAME'] == "10.0.1.154" || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME']; return $_SERVER['SERVER_NAME'] == "10.0.1.154" || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME'];
} }
   
function debug($msg) { function debug($msg) {
if (isDebug()) echo "<!-- $msg -->"; if (isDebug()) echo "<!-- $msg -->";
} }
function isFastDevice() { function isFastDevice() {
return true; return true;
} }
   
function include_header($pageTitle, $opendiv = true, $geolocate = false) { function include_header($pageTitle, $opendiv = true, $geolocate = false) {
// this starts the session  
session_start();  
   
// if (isDebug()) // set php error level high  
echo ' echo '
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>busness time - '.$pageTitle.'</title> <title>busness time - '.$pageTitle.'</title>
'; ';
if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" /> if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" />
<script type="text/javascript" src="js/jquery-1.5.js"></script> <script type="text/javascript" src="js/jquery-1.5.js"></script>
<script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>'; <script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>';
else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.css" /> else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.js"></script> <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>'; <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>';
echo ' echo '
<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" /> <link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />
<script> <script>
//reset type=date inputs to text //reset type=date inputs to text
$( document ).bind( "mobileinit", function(){ $( document ).bind( "mobileinit", function(){
$.mobile.page.prototype.options.degradeInputs.date = true; $.mobile.page.prototype.options.degradeInputs.date = true;
}); });
</script> </script>
<script src="js/jQuery.ui.datepicker.js"></script> <script src="js/jQuery.ui.datepicker.js"></script>
<script src="js/jquery.ui.datepicker.mobile.js"></script> <script src="js/jquery.ui.datepicker.mobile.js"></script>
<style type="text/css"> <style type="text/css">
.ui-navbar { .ui-navbar {
padding-bottom: 18px;  
width: 100%; width: 100%;
} }
  .ui-btn-inner {
  white-space: normal !important;
  }
.ui-li-heading { .ui-li-heading {
white-space: normal !important; white-space: normal !important;
  }
  .ui-listview-filter {
  margin: 0 !important;
} }
</style> </style>
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-startup-image" href="startup.png" /> <link rel="apple-touch-startup-image" href="startup.png" />
<link rel="apple-touch-icon" href="apple-touch-icon.png" />'; <link rel="apple-touch-icon" href="apple-touch-icon.png" />';
if ($geolocate) { if ($geolocate) {
echo "<script> echo "<script>
   
function setCookie(c_name,value,expiredays)  
{  
var exdate=new Date();  
exdate.setDate(exdate.getDate()+expiredays);  
document.cookie=c_name+ \"=\" +escape(value)+  
((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString());  
}  
   
function getCookie(c_name)  
{  
if (document.cookie.length>0)  
{  
c_start=document.cookie.indexOf(c_name + \"=\");  
if (c_start!=-1)  
{  
c_start=c_start + c_name.length+1;  
c_end=document.cookie.indexOf(\";\",c_start);  
if (c_end==-1) c_end=document.cookie.length;  
return unescape(document.cookie.substring(c_start,c_end));  
}  
}  
return \"\";  
}  
   
function success(position) { function success(position) {
$('#geolocate').val(position.coords.latitude+','+position.coords.longitude); $('#geolocate').val(position.coords.latitude+','+position.coords.longitude);
setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1); // setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1);
} $('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;});
  $('#here').show();
  }
function error(msg) { function error(msg) {
console.log(msg); console.log(msg);
} }
   
if (navigator.geolocation) { if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, error); navigator.geolocation.getCurrentPosition(success, error);
} }
   
</script> "; </script> ";
} }
echo '</head> echo '</head>
<body> <body>
'; ';
if ($opendiv) echo '<div data-role="page"> if ($opendiv) {
  echo '<div data-role="page">
<div data-role="header"> <div data-role="header">
<h1>'.$pageTitle.'</h1> <h1>'.$pageTitle.'</h1>
</div><!-- /header --> </div><!-- /header -->
<div data-role="content"> '; <div data-role="content"> ';
} }
  }
   
function include_footer() function include_footer()
{ {
echo '</div>'; if ($geolocate && isset($_SESSION['lat'])) {
  echo "<script>
  $('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;});
  $('#here').show();
  </script>";
  }
  echo '</div>';
} }
   
$service_periods = Array ('sunday','saturday','weekday'); $service_periods = Array ('sunday','saturday','weekday');
   
function service_period() function service_period()
{ {
if (isset($_SESSION['service_period'])) return $_SESSION['service_period']; if (isset($_SESSION['service_period'])) return $_SESSION['service_period'];
   
switch (date('w')){ switch (date('w')){
   
case 0: case 0:
return 'sunday'; return 'sunday';
case 6: case 6:
return 'saturday'; return 'saturday';
default: default:
return 'weekday'; return 'weekday';
} }
} }
   
function remove_spaces($string) function remove_spaces($string)
{ {
return str_replace(' ','',$string); return str_replace(' ','',$string);
} }
   
function midnight_seconds() function midnight_seconds()
{ {
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
if (isset($_SESSION['time'])) { if (isset($_SESSION['time'])) {
$time = mkdate($_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 "";
} }
} }
function getPage($url) function getPage($url)
{ {
debug($url); debug($url);
$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,30); curl_setopt($ch,CURLOPT_TIMEOUT,30);
$page = curl_exec($ch); $page = curl_exec($ch);
if(curl_errno($ch)) echo "<font color=red> Database temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch)."</font>"; if(curl_errno($ch)) echo "<font color=red> Database temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch)."</font>";
curl_close($ch); curl_close($ch);
return $page; return $page;
} }
function array_flatten($a,$f=array()){ function array_flatten($a,$f=array()){
if(!$a||!is_array($a))return ''; if(!$a||!is_array($a))return '';
foreach($a as $k=>$v){ foreach($a as $k=>$v){
if(is_array($v))$f=array_flatten($v,$f); if(is_array($v))$f=array_flatten($v,$f);
else $f[$k]=$v; else $f[$k]=$v;
} }
return $f; return $f;
} }
   
function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb") function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb")
{ {
$width = 300; $width = 300;
$height = 300; $height = 300;
$metersperpixel[9]=305.492*$width; $metersperpixel[9]=305.492*$width;
$metersperpixel[10]=152.746*$width; $metersperpixel[10]=152.746*$width;
$metersperpixel[11]=76.373*$width; $metersperpixel[11]=76.373*$width;
$metersperpixel[12]=38.187*$width; $metersperpixel[12]=38.187*$width;
$metersperpixel[13]=19.093*$width; $metersperpixel[13]=19.093*$width;
$metersperpixel[14]=9.547*$width; $metersperpixel[14]=9.547*$width;
$metersperpixel[15]=4.773*$width; $metersperpixel[15]=4.773*$width;
$metersperpixel[16]=2.387*$width; $metersperpixel[16]=2.387*$width;
// $metersperpixel[17]=1.193*$width; // $metersperpixel[17]=1.193*$width;
$center = ""; $center = "";
$markers = ""; $markers = "";
$minlat = 999; $minlat = 999;
$minlon = 999; $minlon = 999;
$maxlat = 0; $maxlat = 0;
$maxlon = 0; $maxlon = 0;
   
if (sizeof($mapPoints) < 1) return "map error"; if (sizeof($mapPoints) < 1) return "map error";
if (sizeof($mapPoints) === 1) { if (sizeof($mapPoints) === 1) {
if ($zoom == 0) $zoom = 14; if ($zoom == 0) $zoom = 14;
$markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage"; $markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage";
$center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
} else { } else {
foreach ($mapPoints as $index => $mapPoint) { foreach ($mapPoints as $index => $mapPoint) {
$markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1); $markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1);
if ($index+1 != sizeof($mapPoints)) $markers .= "|"; if ($index+1 != sizeof($mapPoints)) $markers .= "|";
if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0]; if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0];
if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0]; if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0];
if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1]; if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1];
if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1]; if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1];
$totalLat += $mapPoint[0]; $totalLat += $mapPoint[0];
$totalLon += $mapPoint[1]; $totalLon += $mapPoint[1];
} }
if ($zoom == 0) { if ($zoom == 0) {
$mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon); $mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon);
foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance) foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance)
{ {
if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel; if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel;
} }
} }
$center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints); $center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints);
} }
$output = ""; $output = "";
$output .= '<div data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; $output .= '<div data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>';
$output .= '<center><img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'></center>'; $output .= '<center><img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'></center>';
$output .= '</div>'; $output .= '</div>';
return $output; return $output;
} }
   
function distance($lat1, $lng1, $lat2, $lng2) function distance($lat1, $lng1, $lat2, $lng2)
{ {
$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;
   
return $km * 1000; return $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($lat * 1e-5, $lng * 1e-5); $points[] = array($lat * 1e-5, $lng * 1e-5);
} }
   
return $points; return $points;
} }
   
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 geocode($query, $giveOptions) { function geocode($query, $giveOptions) {
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?query=".$query."&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; global $cloudmadeAPIkey;
  $url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=".$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) return $contents->features; if ($giveOptions) return $contents->features;
elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1]; elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1];
else return ""; else return "";
} }
   
function reverseGeocode($lat,$lng) { function reverseGeocode($lat,$lng) {
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".$lat.",".$lng."&distance=closest&object_type=road"; global $cloudmadeAPIkey;
  $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;
} }
   
function startsWith($haystack,$needle,$case=true) { function startsWith($haystack,$needle,$case=true) {
if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);} if($case){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){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);} if($case){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 bracketsMeanNewLine($input) { function bracketsMeanNewLine($input) {
return str_replace(")","</small>",str_replace("(","<br><small>",$input)); return str_replace(")","</small>",str_replace("(","<br><small>",$input));
} }
   
function viaPoints($tripid,$stopid, $timingPointsOnly = false) { function viaPoints($tripid,$stopid, $timingPointsOnly = false) {
global $APIurl; global $APIurl;
$url = $APIurl."/json/tripstoptimes?trip=".$tripid; $url = $APIurl."/json/tripstoptimes?trip=".$tripid;
   
$json = json_decode(getPage($url)); $json = json_decode(getPage($url));
debug(print_r($json,true)); debug(print_r($json,true));
$stops = $json[0]; $stops = $json[0];
$times = $json[1]; $times = $json[1];
$foundStop = false; $foundStop = false;
$viaPoints = Array(); $viaPoints = Array();
foreach ($stops as $key => $row) foreach ($stops as $key => $row)
{ {
if ($foundStop) { if ($foundStop) {
if (!$timingPointsOnly || !startsWith($row[5],"Wj") ) { if (!$timingPointsOnly || !startsWith($row[5],"Wj") ) {
$viaPoints[] = Array("id" => $row[0], "name" => $row[1], "time" => $times[$key]); $viaPoints[] = Array("id" => $row[0], "name" => $row[1], "time" => $times[$key]);
} }
} else { } else {
if ($row[0] == $stopid) $foundStop = true; if ($row[0] == $stopid) $foundStop = true;
} }
} }
return $viaPoints; return $viaPoints;
} }
   
function viaPointNames($tripid,$stopid) { function viaPointNames($tripid,$stopid) {
$points = viaPoints($tripid,$stopid,true); $points = viaPoints($tripid,$stopid,true);
$pointNames = Array(); $pointNames = Array();
foreach ($points as $point) { foreach ($points as $point) {
$pointNames[] = $point['name']; $pointNames[] = $point['name'];
} }
return implode(", ",$pointNames); return implode(", ",$pointNames);
} }
   
function timePlaceSettings() { function timePlaceSettings($geolocate = false) {
global $service_periods; global $service_periods;
echo '<div data-role="collapsible" data-collapsed="true"> $geoerror = false;
  if ($geolocate == true) {
  $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat'])
  || $_SESSION['lat'] == "" || $_SESSION['lon'] == "";
  }
  if ($geoerror) {
  echo '<div class="error">Sorry, but your location could not currently be detected.
  Please allow location permission, wait for your location to be detected,
  or enter an address/co-ordinates in the box below.</div>';
  }
  echo '<div data-role="collapsible" data-collapsed="'.!$geoerror.'">
<h3>Change Time/Place...</h3> <h3>Change Time/Place...</h3>
  <form action="" method="post">
<div class="ui-body"> <div class="ui-body">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="geolocate"> Current Location: </label> <label for="geolocate"> Current Location: </label>
<input type="text" id="geolocate" name="geolocate" value="Enter co-ordinates or address here"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a> <input type="text" id="geolocate" name="geolocate" value="Enter co-ordinates or address here"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="time"> Time: </label> <label for="time"> Time: </label>
<input type="time" value="'. date("H:m").'"/> <a href="#" style="display:none" name="currentTime" id="currentTime"/>Current Time?</a> <input type="time" name="time" id="time" value="'. ($_SESSION['time'] ? $_SESSION['time'] : date("H:m")).'"/> <a href="#" name="currentTime" id="currentTime"/>Current Time?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="service_period"> Service Period: </label> <label for="service_period"> Service Period: </label>
<select name="service_period">'; <select name="service_period">';
   
foreach ($service_periods as $service_period) { foreach ($service_periods as $service_period) {
echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>'; echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>';
} }
echo '</select> echo '</select>
<a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a> <a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a>
</div> </div>
<input type="submit" value="Update"/> <input type="submit" value="Update"/>
  </form>
</div></div>'; </div></div>';
echo " <script>  
$('#here').click(function(event) { $('#geolocate').val(getCookie('geolocate')); return false;});  
$('#here').show();  
</script>";  
} }
?> ?>
<?php <?php
include('common.inc.php'); include('common.inc.php');
// remove all the variable in the session  
session_unset();  
   
//destroy the session  
session_destroy();  
if (isset($_REQUEST['service_period'])) $_SESSION['service_period'] = $_REQUEST['service_period'];  
if (isset($_REQUEST['time'])) $_SESSION['time'] = $_REQUEST['time'];  
// todo take in cellids and crossreference with http://realtimeblog.free.fr/latest/cellular/processed/sqlite/505_sqlite_zones.zip to estimate location  
include_header("bus.lambdacomplex.org",false, true) include_header("bus.lambdacomplex.org",false, true)
?> ?>
<div data-role="page"> <div data-role="page">
<div data-role="content"> <div data-role="content">
<div id="jqm-homeheader"> <div id="jqm-homeheader">
<center><h3 id="jqm-logo"><img src="apple-touch-icon.png" alt="logo" width="64" height="64" /><br> <center><h3>busness time</h3><br><small>Canberra Bus Timetables and Trip Planner</small></center>
busness time</h3></center>  
</div> </div>
<a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a> <a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a>
<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
<li data-role="list-divider">Timetables - Stops</li> <li data-role="list-divider">Timetables - Stops</li>
<li><a href="stopList.php">Major (Timing Point) Stops</a></li> <li><a href="stopList.php">Major (Timing Point) Stops</a></li>
<li><a href="stopList.php">All Stops</a></li> <li><a href="stopList.php">All Stops</a></li>
<li><a href="stopList.php?suburbs=yes">Stops By Suburb</a></li> <li><a href="stopList.php?suburbs=yes">Stops By Suburb</a></li>
<li><a href="stopList.php?nearby=yes">Nearby Stops</a></li> <li><a class="nearby" href="stopList.php?nearby=yes">Nearby Stops</a></li>
</ul> </ul>
<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
<li data-role="list-divider">Timetables - Routes</li> <li data-role="list-divider">Timetables - Routes</li>
<li><a href="routeList.php">Routes By Final Destination</a></li> <li><a href="routeList.php">Routes By Final Destination</a></li>
<li><a href="routeList.php?bynumber=yes">Routes By Number</a></li> <li><a href="routeList.php?bynumber=yes">Routes By Number</a></li>
<li><a href="routeList.php?nearby=yes">Nearby Routes</a></li> <li><a class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li>
</ul> </ul>
<?php echo timePlaceSettings();?> <?php echo timePlaceSettings();?>
</div> </div>
</body> </body>
</html> </html>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
include_header("Routes"); include_header("Routes");
echo' echo'
<div data-role="navbar"> <div data-role="navbar">
<ul> <ul>
<li><a href="routeList.php">By Final Destination...</a></li> <li><a href="routeList.php">By Final Destination...</a></li>
<li><a href="routeList.php?bynumber=yes">By Number... </a></li> <li><a href="routeList.php?bynumber=yes">By Number... </a></li>
<!--<li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li>--> <li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li>
  <li><a href="routeList.php?nearby=yes">Nearby... </a></li>
</ul> </ul>
</div> </div>
'; ';
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
$url = $APIurl."/json/routes"; $url = $APIurl."/json/routes";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
debug(print_r($contents,true)); debug(print_r($contents,true));
   
function printRoutes($routes){ function printRoutes($routes){
foreach($routes as $row) { foreach($routes as $row) {
echo '<li>'.$row[1].' <a href="trip.php?routeid='.$row[0].'">'.$row[2]." (".ucwords($row[3]).")</a></li>\n"; echo '<li>'.$row[1].' <a href="trip.php?routeid='.$row[0].'">'.$row[2]." (".ucwords($row[3]).")</a></li>\n";
} }
} }
   
if ($_REQUEST['bynumber']) { if ($_REQUEST['bynumber']) {
$routeSeries = Array(); $routeSeries = Array();
$seriesRange = Array(); $seriesRange = Array();
foreach ($contents as $key => $row) { foreach ($contents as $key => $row) {
foreach (explode(" ",$row[1]) as $routeNumber ) { foreach (explode(" ",$row[1]) as $routeNumber ) {
$seriesNum = substr($routeNumber, 0, -1)."0"; $seriesNum = substr($routeNumber, 0, -1)."0";
if ($seriesNum == "0") $seriesNum = $routeNumber; if ($seriesNum == "0") $seriesNum = $routeNumber;
$finalDigit = substr($routeNumber, sizeof($routeNumber)-1, 1); $finalDigit = substr($routeNumber, sizeof($routeNumber)-1, 1);
if (isset($seriesRange[$seriesNum])) { if (isset($seriesRange[$seriesNum])) {
if ($finalDigit < $seriesRange[$seriesNum]['max']) if ($finalDigit < $seriesRange[$seriesNum]['max'])
$seriesRange[$seriesNum]['max'] = $routeNumber; $seriesRange[$seriesNum]['max'] = $routeNumber;
if ($finalDigit > $seriesRange[$seriesNum]['min']) if ($finalDigit > $seriesRange[$seriesNum]['min'])
$seriesRange[$seriesNum]['min'] = $routeNumber; $seriesRange[$seriesNum]['min'] = $routeNumber;
} else { } else {
$seriesRange[$seriesNum]['max'] = $routeNumber; $seriesRange[$seriesNum]['max'] = $routeNumber;
$seriesRange[$seriesNum]['min'] = $routeNumber; $seriesRange[$seriesNum]['min'] = $routeNumber;
} }
$routeSeries[$seriesNum][$seriesNum."-".$row[1]."-".$row[0]] = $row; $routeSeries[$seriesNum][$seriesNum."-".$row[1]."-".$row[0]] = $row;
} }
} }
ksort($routeSeries); ksort($routeSeries);
ksort($seriesRange); ksort($seriesRange);
echo '<div class="noscriptnav"> Go to route numbers: '; echo '<div class="noscriptnav"> Go to route numbers: ';
foreach ($seriesRange as $series => $range) foreach ($seriesRange as $series => $range)
{ {
if ($range['min'] == $range['max']) echo "<a href=\"#$series\">$series</a>&nbsp;"; if ($range['min'] == $range['max']) echo "<a href=\"#$series\">$series</a>&nbsp;";
else echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a>&nbsp;"; else echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a>&nbsp;";
} }
echo "</div> echo "</div>
<script> <script>
$('.noscriptnav').hide(); $('.noscriptnav').hide();
</script>"; </script>";
foreach ($routeSeries as $series => $routes) foreach ($routeSeries as $series => $routes)
{ {
echo '<a name="'.$series.'"></a>'; echo '<a name="'.$series.'"></a>';
if ($series <= 9) echo '<li>'.$series."<ul>\n"; if ($series <= 9) echo '<li>'.$series."<ul>\n";
else echo "<li>{$seriesRange[$series]['min']}-{$seriesRange[$series]['max']}<ul>\n"; else echo "<li>{$seriesRange[$series]['min']}-{$seriesRange[$series]['max']}<ul>\n";
printRoutes($routes); printRoutes($routes);
echo "</ul></li>\n"; echo "</ul></li>\n";
} }
} else { } else {
foreach ($contents as $key => $row) { foreach ($contents as $key => $row) {
$routeDestinations[$row[2]][] = $row; $routeDestinations[$row[2]][] = $row;
} }
echo '<div class="noscriptnav"> Go to Destination: '; echo '<div class="noscriptnav"> Go to Destination: ';
foreach(ksort($routeDestinations) as $destination => $routes) foreach(ksort($routeDestinations) as $destination => $routes)
{ {
echo "<a href=\"#$destination\">$destination</a>&nbsp;"; echo "<a href=\"#$destination\">$destination</a>&nbsp;";
} }
echo "</div> echo "</div>
<script> <script>
$('.noscriptnav').hide(); $('.noscriptnav').hide();
</script>"; </script>";
foreach ($routeDestinations as $destination => $routes) foreach ($routeDestinations as $destination => $routes)
{ {
echo '<a name="'.$destination.'"></a>'; echo '<a name="'.$destination.'"></a>';
echo '<li>'.$destination."... <ul>\n"; echo '<li>'.$destination."... <ul>\n";
printRoutes($routes); printRoutes($routes);
echo "</ul></li>\n"; echo "</ul></li>\n";
} }
} }
echo "</ul>\n"; echo "</ul>\n";
   
   
include_footer(); include_footer();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
$url = $APIurl."/json/stop?stop_id=".$_REQUEST['stopid']; $url = $APIurl."/json/stop?stop_id=".$_REQUEST['stopid'];
$stop = json_decode(getPage($url)); $stop = json_decode(getPage($url));
   
include_header("Trips passing ".$stop[1]); include_header($stop[1]);
  timePlaceSettings();
echo '<div data-role="content" class="ui-content" role="main"><p>'.staticmap(Array(0 => Array($stop[2],$stop[3]))).'</p>'; echo '<div data-role="content" class="ui-content" role="main"><p>'.staticmap(Array(0 => Array($stop[2],$stop[3]))).'</p>';
// change date/time/service_period  
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
$url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period(); $url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period();
$trips = json_decode(getPage($url)); $trips = json_decode(getPage($url));
debug(print_r($trips,true)); debug(print_r($trips,true));
foreach ($trips as $row) foreach ($trips as $row)
{ {
echo '<li>'; echo '<li>';
echo '<h3><a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.$row[1][1]; echo '<h3><a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.$row[1][1];
echo '<br><small>Via: '.viaPointNames($row[1][0],$_REQUEST['stopid']).'</small> </a></h3>'; echo '<br><small>Via: '.viaPointNames($row[1][0],$_REQUEST['stopid']).'</small> </a></h3>';
echo '<p class="ui-li-aside"><strong>'.midnight_seconds_to_time($row[0]).'</strong></p>'; echo '<p class="ui-li-aside"><strong>'.midnight_seconds_to_time($row[0]).'</strong></p>';
echo '</li>'; echo '</li>';
} }
if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>"; if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>";
echo '</ul></div>'; echo '</ul></div>';
include_footer(); include_footer();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
include_header("Stops");  
echo' function navbar() {
<div data-role="navbar"> echo'
  <div data-role="navbar">
<ul> <ul>
<li><a href="stopList.php">Timing Points</a></li> <li><a href="stopList.php">Timing Points</a></li>
<li><a href="stopList.php?suburbs=yes">By Suburb</a></li> <li><a href="stopList.php?suburbs=yes">By Suburb</a></li>
<li><a href="stopList.php?nearby=yes">Nearby Stops</a></li> <li><a href="stopList.php?nearby=yes">Nearby Stops</a></li>
<li><a href="stopList.php?allstops=yes">All Stops</a></li> <li><a href="stopList.php?allstops=yes">All Stops</a></li>
</ul> </ul>
</div> </div>
'; ';
  timePlaceSettings();
  }
// By suburb // By suburb
if (isset($_REQUEST['suburbs'])) { if (isset($_REQUEST['suburbs'])) {
  include_header("Stops by Suburb");
  navbar();
echo ' <ul data-role="listview" data-filter="true" data-inset="true" >'; echo ' <ul data-role="listview" data-filter="true" data-inset="true" >';
foreach ($suburbs as $suburb) { foreach ($suburbs as $suburb) {
echo '<li><a href="stopList.php?suburb='.urlencode($suburb).'">'.$suburb.'</a></li>'; echo '<li><a href="stopList.php?suburb='.urlencode($suburb).'">'.$suburb.'</a></li>';
} }
echo '</ul>'; echo '</ul>';
} else { } else {
// Timing Points / All stops // Timing Points / All stops
   
  if ($_REQUEST['allstops']) {
  $url = $APIurl."/json/stops";
  include_header("All Stops");
  navbar();
  } else if ($_REQUEST['nearby']) {
  $url = $APIurl."/json/neareststops?lat={$_SESSION['lat']}&lon={$_SESSION['lon']}&limit=15";
  include_header("Nearby Stops");
  navbar();
  timePlaceSettings();
  } else if ($_REQUEST['suburb']) {
  $url = $APIurl."/json/stopzonesearch?q=".filter_var($_REQUEST['suburb'], FILTER_SANITIZE_STRING);
  include_header("Stops in ".ucwords(filter_var($_REQUEST['suburb'], FILTER_SANITIZE_STRING)));
  navbar();
  } else {
  $url = $APIurl."/json/timingpoints";
  include_header("Timing Points / Major Stops");
  navbar();
  }
echo '<div class="noscriptnav"> Go to letter: '; echo '<div class="noscriptnav"> Go to letter: ';
foreach(range('A','Z') as $letter) foreach(range('A','Z') as $letter)
{ {
echo "<a href=\"#$letter\">$letter</a>&nbsp;"; echo "<a href=\"#$letter\">$letter</a>&nbsp;";
} }
echo "</div> echo "</div>
<script> <script>
$('.noscriptnav').hide(); $('.noscriptnav').hide();
</script>"; </script>";
echo ' <ul data-role="listview" data-filter="true" data-inset="true" >'; echo ' <ul data-role="listview" data-filter="true" data-inset="true" >';
$url = $APIurl."/json/timingpoints";  
if ($_REQUEST['allstops']) $url = $APIurl."/json/stops";  
if ($_REQUEST['nearby']) $url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=15";  
if ($_REQUEST['suburb']) $url = $APIurl."/json/stopzonesearch?q={$_REQUEST['suburb']}";  
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
debug(print_r($contents,true)); debug(print_r($contents,true));
foreach ($contents as $key => $row) { foreach ($contents as $key => $row) {
$stopName[$key] = $row[1]; $stopName[$key] = $row[1];
} }
   
// Sort the stops by name // Sort the stops by name
array_multisort($stopName, SORT_ASC, $contents); array_multisort($stopName, SORT_ASC, $contents);
   
$firstletter = ""; $firstletter = "";
foreach ($contents as $row) foreach ($contents as $row)
{ {
if (substr($row[1],0,1) != $firstletter){ if (substr($row[1],0,1) != $firstletter){
echo "<a name=$firstletter></a>"; echo "<a name=$firstletter></a>";
$firstletter = substr($row[1],0,1); $firstletter = substr($row[1],0,1);
} }
echo '<li><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]).'</a></li>'; echo '<li><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]).'</a></li>';
} }
echo '</ul>'; echo '</ul>';
} }
include_footer(); include_footer();
?> ?>
   
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
$tripid = $_REQUEST['tripid']; $tripid = filter_var($_REQUEST['tripid'],FILTER_SANITIZE_NUMBER_INT);
$stopid = $_REQUEST['stopid']; $stopid = filter_var($_REQUEST['stopid'],FILTER_SANITIZE_NUMBER_INT);
if ($_REQUEST['routeid']) { if ($_REQUEST['routeid']) {
$url = $APIurl."/json/routetrips?route_id=".$_REQUEST['routeid']; $url = $APIurl."/json/routetrips?route_id=".filter_var($_REQUEST['routeid'],FILTER_SANITIZE_NUMBER_INT);
$trips = json_decode(getPage($url)); $trips = json_decode(getPage($url));
debug(print_r($trips,true)); debug(print_r($trips,true));
foreach ($trips as $trip) foreach ($trips as $trip)
{ {
if ($trip[0] < midnight_seconds()) { if ($trip[0] < midnight_seconds()) {
$tripid = $trip[1]; $tripid = $trip[1];
break; break;
} }
} }
if (!($tripid > 0)) $tripid = $trips[0][1]; if (!($tripid > 0)) $tripid = $trips[0][1];
} }
$url = $APIurl."/json/triprows?trip=".$tripid; $url = $APIurl."/json/triprows?trip=".$tripid;
$trips = array_flatten(json_decode(getPage($url))); $trips = array_flatten(json_decode(getPage($url)));
debug(print_r($trips,true)); debug(print_r($trips,true));
include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name); include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name);
  timePlaceSettings();
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
   
   
$url = $APIurl."/json/tripstoptimes?trip=".$tripid; $url = $APIurl."/json/tripstoptimes?trip=".$tripid;
   
$json = json_decode(getPage($url)); $json = json_decode(getPage($url));
debug(print_r($json,true)); debug(print_r($json,true));
$stops = $json[0]; $stops = $json[0];
$times = $json[1]; $times = $json[1];
foreach ($stops as $key => $row) foreach ($stops as $key => $row)
{ {
echo '<li>'; echo '<li>';
echo '<h3><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]); echo '<h3><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]);
if ($row[0] == $stopid) echo "<br><small> Current Location</small>"; if ($row[0] == $stopid) echo "<br><small> Current Location</small>";
echo '</a></h3>'; echo '</a></h3>';
echo '<p class="ui-li-aside">'.midnight_seconds_to_time($times[$key]).'</p>'; echo '<p class="ui-li-aside">'.midnight_seconds_to_time($times[$key]).'</p>';
echo '</li>'; echo '</li>';
} }
echo '</ul>'; echo '</ul>';
include_footer(); include_footer();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
include_header("Trip Planner", true, true); include_header("Trip Planner", true, true);
  $from = (isset($_REQUEST['from']) ? filter_var($_REQUEST['from'],FILTER_SANITIZE_STRING) : "Brigalow");
  $to = (isset($_REQUEST['to']) ? filter_var($_REQUEST['to'],FILTER_SANITIZE_STRING) : "Barry");
  $date = (isset($_REQUEST['date']) ? filter_var($_REQUEST['date'],FILTER_SANITIZE_STRING) : date("m/d/Y"));
  $time = (isset($_REQUEST['time']) ? filter_var($_REQUEST['time'],FILTER_SANITIZE_STRING) : date("H:m"));
  # todo: convert date from form to h:ia?
   
function tripPlanForm($errorMessage = "") function tripPlanForm($errorMessage = "")
{ {
$from = (isset($_REQUEST['from']) ? $_REQUEST['from'] : "Brigalow"); global $date,$time,$from,$to;
$to = (isset($_REQUEST['to']) ? $_REQUEST['to'] : "Barry"); echo "<font color=red>$errorMessage</font>";
$date = (isset($_REQUEST['date']) ? $_REQUEST['date'] : date("m/d/Y"));  
$time = (isset($_REQUEST['time']) ? $_REQUEST['time'] : date("H:m"));  
# todo: convert date from form to h:ia?  
echo "<font color=red>$errorMessage</font>";  
echo '<form action="tripPlanner.php" method="post"> echo '<form action="tripPlanner.php" method="post">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="from">I would like to go from</label> <label for="from">I would like to go from</label>
<input type="text" name="from" id="from" value="' . $from . '" /> <input type="text" name="from" id="from" value="' . $from . '" />
<a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a> <a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="to"> to </label> <label for="to"> to </label>
<input type="text" name="to" id="to" value="' . $to . '" /> <input type="text" name="to" id="to" value="' . $to . '" />
<a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a> <a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="date"> on </label> <label for="date"> on </label>
<input type="date" name="date" id="date" value="' . $date . '" /> <input type="date" name="date" id="date" value="' . $date . '" />
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="time"> at </label> <label for="time"> at </label>
<input type="time" name="time" id="time" value="' . $time . '" /> <input type="time" name="time" id="time" value="' . $time . '" />
</div> </div>
<input type="submit" value="Go!"></form>'; <input type="submit" value="Go!"></form>';
echo "<script> echo "<script>
$('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;}); $('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;});
$('#toHere').show(); $('#toHere').show();
$('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;}); $('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;});
$('#fromHere').show(); $('#fromHere').show();
   
</script>"; </script>";
} }
function processItinerary($itineraryNumber, $itinerary) function processItinerary($itineraryNumber, $itinerary)
{ {
echo '<div data-role="collapsible" ' . ($itineraryNumber > 0 ? 'data-collapsed="true"' : "") . '> <h3> Option #' . ($itineraryNumber + 1) . ": " . floor($itinerary->duration / 60000) . " minutes ({$itinerary->startTime} to {$itinerary->endTime})</h3><p>"; echo '<div data-role="collapsible" ' . ($itineraryNumber > 0 ? 'data-collapsed="true"' : "") . '> <h3> Option #' . ($itineraryNumber + 1) . ": " . floor($itinerary->duration / 60000) . " minutes ({$itinerary->startTime} to {$itinerary->endTime})</h3><p>";
echo "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n"; echo "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n";
echo "Transit time: " . floor($itinerary->transitTime / 60000) . " minutes<br>\n"; echo "Transit time: " . floor($itinerary->transitTime / 60000) . " minutes<br>\n";
echo "Waiting time: " . floor($itinerary->waitingTime / 60000) . " minutes<br>\n"; echo "Waiting time: " . floor($itinerary->waitingTime / 60000) . " minutes<br>\n";
   
if (is_array($itinerary->legs->leg)) { if (is_array($itinerary->legs->leg)) {
$legMarkers = array(); $legMarkers = array();
foreach ($itinerary->legs->leg as $legNumber => $leg) { foreach ($itinerary->legs->leg as $legNumber => $leg) {
$legMarkers[] = array($leg->from->lat, $leg->from->lon); $legMarkers[] = array($leg->from->lat, $leg->from->lon);
} }
echo '' . staticmap($legMarkers) . "<br>\n"; echo '' . staticmap($legMarkers) . "<br>\n";
echo '<ul>'; echo '<ul>';
foreach ($itinerary->legs->leg as $legNumber => $leg) { foreach ($itinerary->legs->leg as $legNumber => $leg) {
echo '<li>'; echo '<li>';
processLeg($legNumber, $leg); processLeg($legNumber, $leg);
echo "</li>"; echo "</li>";
} }
echo "</ul>"; echo "</ul>";
} else { } else {
echo '' . staticmap(array(array($itinerary->legs->leg->from->lat, $itinerary->legs->leg->from->lon))) . "<br>\n"; echo '' . staticmap(array(array($itinerary->legs->leg->from->lat, $itinerary->legs->leg->from->lon))) . "<br>\n";
processLeg(0, $itinerary->legs->leg); processLeg(0, $itinerary->legs->leg);
} }
echo "</p></div>"; echo "</p></div>";
} }
function processLeg($legNumber, $leg) { function processLeg($legNumber, $leg) {
$legArray = object2array($leg); $legArray = object2array($leg);
echo '<h3>Leg #' . ($legNumber + 1) . " ( {$legArray['@mode']} from: {$leg->from->name} to {$leg->to->name}, " . floor($leg->duration / 60000) . " minutes) </h3>\n"; echo '<h3>Leg #' . ($legNumber + 1) . " ( {$legArray['@mode']} from: {$leg->from->name} to {$leg->to->name}, " . floor($leg->duration / 60000) . " minutes) </h3>\n";
if ($legArray["@mode"] === "BUS") { if ($legArray["@mode"] === "BUS") {
echo "Take bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']) . "<br>"; echo "Take bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']) . "<br>";
} else { } else {
$walkStepMarkers = array(); $walkStepMarkers = array();
foreach ($leg->steps->walkSteps as $stepNumber => $step) { foreach ($leg->steps->walkSteps as $stepNumber => $step) {
$walkStepMarkers[] = array($step->lat, $step->lon); $walkStepMarkers[] = array($step->lat, $step->lon);
} }
echo "" . staticmap($walkStepMarkers, "icong") . "<br>\n"; echo "" . staticmap($walkStepMarkers, "icong") . "<br>\n";
foreach ($leg->steps->walkSteps as $stepNumber => $step) { foreach ($leg->steps->walkSteps as $stepNumber => $step) {
echo "Walking step " . ($stepNumber + 1) . " $step->absoluteDirection / $step->relativeDirection on $step->streetName for " . floor($step->distance) . " meters<br>\n"; echo "Walking step " . ($stepNumber + 1) . " $step->absoluteDirection / $step->relativeDirection on $step->streetName for " . floor($step->distance) . " meters<br>\n";
} }
} }
} }
if ($_REQUEST['time']) { if ($_REQUEST['time']) {
$toPlace = (startsWith($_REQUEST['to'], "-") ? $_REQUEST['to'] : geocode(urlencode($_REQUEST['to']), false)); $toPlace = (startsWith($to, "-") ? $to : geocode($to, false));
$fromPlace = (startsWith($_REQUEST['from'], "-") ? $_REQUEST['from'] : geocode(urlencode($_REQUEST['from']), false)); $fromPlace = (startsWith($from, "-") ? $from : geocode($from, false));
if ($toPlace == "" || $fromPlace == "") { if ($toPlace == "" || $fromPlace == "") {
$errorMessage = ""; $errorMessage = "";
if ($toPlace === "") if ($toPlace === "")
$errorMessage .= urlencode($_REQUEST['to']) . " not found.<br>\n"; $errorMessage .= urlencode($to) . " not found.<br>\n";
if ($fromPlace === "") if ($fromPlace === "")
$errorMessage .= urlencode($_REQUEST['from']) . " not found.<br>\n"; $errorMessage .= urlencode($from) . " not found.<br>\n";
tripPlanForm($errorMessage); tripPlanForm($errorMessage);
} else { } else {
$url = "http://10.1.0.243:5080/opentripplanner-api-webapp/ws/plan?_dc=1290254798856&arriveBy=false&date=" . urlencode($_REQUEST['date']) . "&time=" . urlencode($_REQUEST['time']) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=$toPlace&fromPlace=$fromPlace&intermediatePlaces="; $url = $otpAPIurl."ws/plan?date=" . urlencode($_REQUEST['date']) . "&time=" . urlencode($_REQUEST['time']) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=$toPlace&fromPlace=$fromPlace&intermediatePlaces=";
$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_HTTPHEADER, array("Accept: application/json")); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
curl_setopt($ch,CURLOPT_TIMEOUT,5); curl_setopt($ch,CURLOPT_TIMEOUT,5);
$page = curl_exec($ch); $page = curl_exec($ch);
   
if(curl_errno($ch)) { tripPlanForm("Trip planner temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch));} if(curl_errno($ch)) { tripPlanForm("Trip planner temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch));}
else { else {
$tripplan = json_decode($page); $tripplan = json_decode($page);
debug(print_r($triplan,true)); debug(print_r($triplan,true));
echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>"; echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>";
echo "<h1> At: {$tripplan->plan->date} </h1>"; echo "<h1> At: {$tripplan->plan->date} </h1>";
if (is_array($tripplan->plan->itineraries->itinerary)) { if (is_array($tripplan->plan->itineraries->itinerary)) {
echo '<div data-role="collapsible-set">'; echo '<div data-role="collapsible-set">';
foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) { foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
processItinerary($itineraryNumber, $itinerary); processItinerary($itineraryNumber, $itinerary);
} }
echo "</div>"; echo "</div>";
} else { } else {
processItinerary(0, $tripplan->plan->itineraries->itinerary); processItinerary(0, $tripplan->plan->itineraries->itinerary);
} }
} }
curl_close($ch); curl_close($ch);
} }
} else { } else {
tripPlanForm(); tripPlanForm();
} }
include_footer(); include_footer();
?> ?>
   
options: options:
start_date: 20101115 start_date: 20101115
end_date: 20111231 end_date: 20111231
remove_date: 20111231 remove_date: 20111231
agency_name: ACT Internal Omnibus Network (ACTION) agency_name: ACT Internal Omnibus Network (ACTION)
agency_url: http://www.action.act.gov.au/ agency_url: http://www.action.act.gov.au/
agency_timezone: Australia/Sydney agency_timezone: Australia/Sydney
  agency_phone: 131710
  agency_lang: en