<?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> "; | if ($range['min'] == $range['max']) echo "<a href=\"#$series\">$series</a> "; |
else echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a> "; | else echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a> "; |
} | } |
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> "; | echo "<a href=\"#$destination\">$destination</a> "; |
} | } |
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> "; | echo "<a href=\"#$letter\">$letter</a> "; |
} | } |
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 | |