Add trip planner, fix weekend routes appearing on weekdays in network 10
[bus.git] / busui / common.inc.php
blob:a/busui/common.inc.php -> blob:b/busui/common.inc.php
<?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);
   
function isDebug() function isDebug()
{ {
return true; return true;
} }
   
function isFastDevice() { function isFastDevice() {
return true; return true;
} }
   
function include_header($pageTitle, $opendiv = true, $geolocate = false) { function include_header($pageTitle, $opendiv = true, $geolocate = false) {
// 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>bus.lambdacomplex.org - '.$pageTitle.'</title> <title>bus.lambdacomplex.org - '.$pageTitle.'</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.css" /> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.css" />
<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script><script type="text/javascript" <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script><script type="text/javascript"
src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script> src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script>
<script type="text/javascript" src="docs/docs.js"></script> <script type="text/javascript" src="docs/docs.js"></script>
<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" />
</head> </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>
<a href="index.php" data-icon="back" class="ui-btn-right">Home</a> <a href="index.php" data-icon="back" class="ui-btn-right">Home</a>
</div><!-- /header --> </div><!-- /header -->
<div data-role="content"> '; <div data-role="content"> ';
} }
   
function include_footer() function include_footer()
{ {
echo '</div>'; echo '</div>';
} }
   
function service_period() function 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 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
$secs = (date("G") * 3600) + (date("i") * 60) + date("s"); $secs = (date("G") * 3600) + (date("i") * 60) + date("s");
return $secs; return $secs;
} }
   
function midnight_seconds_to_time($seconds) function midnight_seconds_to_time($seconds)
{ {
$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);
} }
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 );
$page = curl_exec($ch); $page = curl_exec($ch);
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) function staticmap($mapPoints)
{ {
$width = 300; $width = 300;
$height = 300; $height = 300;
  $zoom = 0;
  $center = "";
  $markers = "";
   
if (sizeof($mapPoints) < 1) return ""; if (sizeof($mapPoints) < 1) return "";
if (sizeof($mapPoints) === 1) $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; if (sizeof($mapPoints) === 1) {
if (sizeof($mapPoints) > 1) $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; //TODO average points $zoom = 14;
$markers = "";  
foreach ($mapPoints as $index => $mapPoint) {  
if (sizeof($mapPoints) === 1) {  
$markers .= $mapPoint[0].",".$mapPoint[1].",ol-marker"; $markers .= $mapPoint[0].",".$mapPoint[1].",ol-marker";
} else { $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
  } else {
  foreach ($mapPoints as $index => $mapPoint) {
$markers .= $mapPoint[0].",".$mapPoint[1].",lightblue".($index+1); $markers .= $mapPoint[0].",".$mapPoint[1].",lightblue".($index+1);
  if ($index+1 != sizeof($mapPoints)) $markers .= "|";
  $totalLat += $mapPoint[0];
  $totalLon += $mapPoint[1];
} }
} $zoom = 11;
return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom=14&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width=$width height=$height>'; $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.'>';
  }
   
  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;
  else return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1];
  }
   
  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;
} }
?> ?>