<?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); |
error_reporting(E_ALL ^ E_NOTICE); |
// 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(); |
|
|
|
|
function isDebug() |
function isDebug() |
{ |
{ |
return $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME']; |
return $_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 |
// this starts the session |
session_start(); |
session_start(); |
|
|
// if (isDebug()) // set php error level high |
// 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="jquery-mobile-1.0a3.css" /> |
if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" /> |
<script type="text/javascript" src="jquery-mobile-1.0a3.js"></script>'; |
<script type="text/javascript" src="js/jquery-1.5.js"></script> |
else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.css" /> |
<script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>'; |
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js"></script>'; |
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/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>'; |
echo ' |
echo ' |
|
<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" /> |
|
<script> |
|
//reset type=date inputs to text |
|
$( document ).bind( "mobileinit", function(){ |
|
$.mobile.page.prototype.options.degradeInputs.date = true; |
|
}); |
|
</script> |
|
<script src="js/jQuery.ui.datepicker.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; |
padding-bottom: 18px; |
width: 100%; |
width: 100%; |
} |
} |
</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) |
function setCookie(c_name,value,expiredays) |
{ |
{ |
var exdate=new Date(); |
var exdate=new Date(); |
exdate.setDate(exdate.getDate()+expiredays); |
exdate.setDate(exdate.getDate()+expiredays); |
document.cookie=c_name+ \"=\" +escape(value)+ |
document.cookie=c_name+ \"=\" +escape(value)+ |
((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString()); |
((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString()); |
} |
} |
|
|
function getCookie(c_name) |
function getCookie(c_name) |
{ |
{ |
if (document.cookie.length>0) |
if (document.cookie.length>0) |
{ |
{ |
c_start=document.cookie.indexOf(c_name + \"=\"); |
c_start=document.cookie.indexOf(c_name + \"=\"); |
if (c_start!=-1) |
if (c_start!=-1) |
{ |
{ |
c_start=c_start + c_name.length+1; |
c_start=c_start + c_name.length+1; |
c_end=document.cookie.indexOf(\";\",c_start); |
c_end=document.cookie.indexOf(\";\",c_start); |
if (c_end==-1) c_end=document.cookie.length; |
if (c_end==-1) c_end=document.cookie.length; |
return unescape(document.cookie.substring(c_start,c_end)); |
return unescape(document.cookie.substring(c_start,c_end)); |
} |
} |
} |
} |
return \"\"; |
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); |
} |
} |
|
|
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>'; |
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 = mkdate($_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) { |
$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 { |
|
return ""; |
|
} |
} |
} |
function getPage($url) |
function getPage($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); |
$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>"; |
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); |
} |
} |
|
|
return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'>'; |
return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'>'; |
} |
} |
|
|
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"; |
$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"; |
$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"; |
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/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)), |