--- a/busui/common.inc.php
+++ b/busui/common.inc.php
@@ -3,33 +3,115 @@
$APIurl = "http://localhost:8765";
error_reporting(E_ALL ^ E_NOTICE);
+// 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");
+
+ // you have to open the session to be able to modify or remove it
+session_start();
+
+
function isDebug()
{
- return true;
-}
-
+ 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) {
+ if (isDebug()) echo "";
+}
function isFastDevice() {
return true;
}
-function include_header($pageTitle) {
+function include_header($pageTitle, $opendiv = true, $geolocate = false) {
+ // this starts the session
+ session_start();
+
// if (isDebug()) // set php error level high
echo '
- bus.lambdacomplex.org - '.$pageTitle.'
-
-
-
-
+ busness time - '.$pageTitle.'
+ ';
+ if (isDebug()) echo '
+
+ ';
+ else echo '
+
+ ';
+echo '
+
+
+
+
+
+
+
+
+ ';
+ if ($geolocate) {
+echo " ";
+ }
+echo '
-
-
+ ';
+if ($opendiv) echo '
-
'.$pageTitle.'
+ '.$pageTitle.'
';
}
@@ -39,8 +121,12 @@
echo '
';
}
+$service_periods = Array ('sunday','saturday','weekday');
+
function service_period()
{
+if (isset($_SESSION['service_period'])) return $_SESSION['service_period'];
+
switch (date('w')){
case 0:
@@ -52,24 +138,39 @@
}
}
+function remove_spaces($string)
+{
+ return str_replace(' ','',$string);
+}
+
function midnight_seconds()
{
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
- $secs = (date("G") * 3600) + (date("i") * 60) + date("s");
- return $secs;
+if (isset($_SESSION['time'])) {
+ $time = mkdate($_SESSION['time']);
+ return (date("G",$time) * 3600) + (date("i",$time) * 60) + date("s",$time);
+ }
+ return (date("G") * 3600) + (date("i") * 60) + date("s");
}
function midnight_seconds_to_time($seconds)
{
+if ($seconds > 0) {
$midnight = mktime (0, 0, 0, date("n"), date("j"), date("Y"));
return date("h:ia",$midnight+$seconds);
+} else {
+return "";
+}
}
function getPage($url)
{
+ debug($url);
$ch = curl_init($url);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
+ curl_setopt($ch,CURLOPT_TIMEOUT,30);
$page = curl_exec($ch);
+ if(curl_errno($ch)) echo "
Database temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch)."";
curl_close($ch);
return $page;
}
@@ -81,5 +182,216 @@
}
return $f;
}
+
+function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb")
+{
+$width = 300;
+$height = 300;
+$metersperpixel[9]=305.492*$width;
+$metersperpixel[10]=152.746*$width;
+$metersperpixel[11]=76.373*$width;
+$metersperpixel[12]=38.187*$width;
+$metersperpixel[13]=19.093*$width;
+$metersperpixel[14]=9.547*$width;
+$metersperpixel[15]=4.773*$width;
+$metersperpixel[16]=2.387*$width;
+// $metersperpixel[17]=1.193*$width;
+$center = "";
+$markers = "";
+$minlat = 999;
+$minlon = 999;
+$maxlat = 0;
+$maxlon = 0;
+
+ if (sizeof($mapPoints) < 1) return "map error";
+ if (sizeof($mapPoints) === 1) {
+ if ($zoom == 0) $zoom = 14;
+ $markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage";
+ $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
+ } else {
+ foreach ($mapPoints as $index => $mapPoint) {
+ $markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1);
+ if ($index+1 != sizeof($mapPoints)) $markers .= "|";
+ if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0];
+ if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0];
+ if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1];
+ if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1];
+ $totalLat += $mapPoint[0];
+ $totalLon += $mapPoint[1];
+ }
+ if ($zoom == 0) {
+ $mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon);
+ foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance)
+ {
+ if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel;
+ }
+ }
+ $center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints);
+ }
+
+ return '
';
+}
+
+function distance($lat1, $lng1, $lat2, $lng2)
+{
+ $pi80 = M_PI / 180;
+ $lat1 *= $pi80;
+ $lng1 *= $pi80;
+ $lat2 *= $pi80;
+ $lng2 *= $pi80;
+
+ $r = 6372.797; // mean radius of Earth in km
+ $dlat = $lat2 - $lat1;
+ $dlng = $lng2 - $lng1;
+ $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));
+ $km = $r * $c;
+
+ return $km * 1000;
+}
+
+function decodePolylineToArray($encoded)
+{
+// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5
+ $length = strlen($encoded);
+ $index = 0;
+ $points = array();
+ $lat = 0;
+ $lng = 0;
+
+ while ($index < $length)
+ {
+ // Temporary variable to hold each ASCII byte.
+ $b = 0;
+
+ // The encoded polyline consists of a latitude value followed by a
+ // longitude value. They should always come in pairs. Read the
+ // latitude value first.
+ $shift = 0;
+ $result = 0;
+ do
+ {
+ // The `ord(substr($encoded, $index++))` statement returns the ASCII
+ // code for the character at $index. Subtract 63 to get the original
+ // value. (63 was added to ensure proper ASCII characters are displayed
+ // in the encoded polyline string, which is `human` readable)
+ $b = ord(substr($encoded, $index++)) - 63;
+
+ // 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
+ // by 5 bits each time.
+ // 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
+ // order during encoding, reading them in this way ensures proper
+ // summation.
+ $result |= ($b & 0x1f) << $shift;
+ $shift += 5;
+ }
+ // Continue while the read byte is >= 0x20 since the last `chunk`
+ // was not OR'd with 0x20 during the conversion process. (Signals the end)
+ while ($b >= 0x20);
+
+ // Check if negative, and convert. (All negative values have the last bit
+ // set)
+ $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1));
+
+ // Compute actual latitude since value is offset from previous value.
+ $lat += $dlat;
+
+ // The next values will correspond to the longitude for this point.
+ $shift = 0;
+ $result = 0;
+ do
+ {
+ $b = ord(substr($encoded, $index++)) - 63;
+ $result |= ($b & 0x1f) << $shift;
+ $shift += 5;
+ }
+ while ($b >= 0x20);
+
+ $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1));
+ $lng += $dlng;
+
+ // The actual latitude and longitude values were multiplied by
+ // 1e5 before encoding so that they could be converted to a 32-bit
+ // integer representation. (With a decimal accuracy of 5 places)
+ // Convert back to original values.
+ $points[] = array($lat * 1e-5, $lng * 1e-5);
+ }
+
+ return $points;
+}
+
+function object2array($object) {
+ if (is_object($object)) {
+ foreach ($object as $key => $value) {
+ $array[$key] = $value;
+ }
+ }
+ else {
+ $array = $object;
+ }
+ return $array;
+}
+
+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";
+ $contents = json_decode(getPage($url));
+ if ($giveOptions) return $contents->features;
+ elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1];
+ else return "";
+}
+
+function reverseGeocode($lat,$lng) {
+ $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".$lat.",".$lng."&distance=closest&object_type=road";
+ $contents = json_decode(getPage($url));
+ return $contents->features[0]->properties->name;
+}
+
+function startsWith($haystack,$needle,$case=true) {
+ if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
+ return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
+}
+
+function endsWith($haystack,$needle,$case=true) {
+ if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
+ return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
+}
+function bracketsMeanNewLine($input) {
+ return str_replace(")","",str_replace("(","
",$input));
+}
+
+function viaPoints($tripid,$stopid, $timingPointsOnly = false) {
+ global $APIurl;
+ $url = $APIurl."/json/tripstoptimes?trip=".$tripid;
+
+$json = json_decode(getPage($url));
+debug(print_r($json,true));
+$stops = $json[0];
+$times = $json[1];
+$foundStop = false;
+$viaPoints = Array();
+foreach ($stops as $key => $row)
+{
+ if ($foundStop) {
+ if (!$timingPointsOnly || !startsWith($row[5],"Wj") ) {
+ $viaPoints[] = Array("id" => $row[0], "name" => $row[1], "time" => $times[$key]);
+ }
+ } else {
+ if ($row[0] == $stopid) $foundStop = true;
+ }
+}
+ return $viaPoints;
+}
+
+function viaPointNames($tripid,$stopid) {
+ $points = viaPoints($tripid,$stopid,true);
+ $pointNames = Array();
+ foreach ($points as $point) {
+ $pointNames[] = $point['name'];
+ }
+ return implode(", ",$pointNames);
+}
?>
+