Add trip planner, fix weekend routes appearing on weekdays in network 10
[bus.git] / busui / tripPlanner.php
blob:a/busui/tripPlanner.php -> blob:b/busui/tripPlanner.php
<?php <?php
include('common.inc.php'); include('common.inc.php');
if ($_REQUEST['time']) { include_header("Trip Planner", true, true);
$toPlace = geocode($_REQUEST['to'],false); function tripPlanForm($errorMessage = "")
$fromPlace = geocode($_REQUEST['from'],false); {
$url = "http://localhost:8080/opentripplanner-api-webapp/ws/plan?_dc=1290254798856&arriveBy=false&date=11%2F17%2F2010&time=1%3A06%20pm&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=$toPlace&fromPlace=$fromPlace&intermediatePlaces="; $from = (isset($_REQUEST['from']) ? $_REQUEST['from'] : "Brigalow");
$ch = curl_init($url); $to = (isset($_REQUEST['to']) ? $_REQUEST['to'] : "Barry");
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); $date = (isset($_REQUEST['date']) ? $_REQUEST['date'] : date("m/d/Y"));
curl_setopt( $ch, CURLOPT_HEADER, 0 ); $time = (isset($_REQUEST['time']) ? $_REQUEST['time'] : date("h:ia"));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json")); echo "<font color=red>$errorMessage</font>";
$page = curl_exec($ch); echo '<form action="tripPlanner.php" method="post">
curl_close($ch); <div data-role="fieldcontain">
$tripplan = json_decode($page); <label for="from">I would like to go from</label>
echo "<h1> From: {$tripplan->plan->from->name} </h1>"; <input type="text" name="from" id="from" value="' . $from . '" />
echo "<h1> To: {$tripplan->plan->to->name} </h1>"; <a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a>
echo "<h1> At: {$tripplan->plan->date} </h1>"; </div>
foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary ){ <div data-role="fieldcontain">
echo "<hr> <h2> Option #".($itineraryNumber+1)."<h2>"; <label for="to"> to </label>
echo "Duration: ".floor($itinerary->duration/60000)." minutes ({$itinerary->startTime} to {$itinerary->endTime})<br>\n"; <input type="text" name="to" id="to" value="' . $to . '" />
echo "Walking time: ".floor($itinerary->walkTime/60000)." minutes ({$itinerary->walkDistance} meters)<br>\n"; <a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a>
echo "Transit time: ".floor($itinerary->transitTime/60000)." minutes<br>\n"; </div>
echo "Waiting time: ".floor($itinerary->waitingTime/60000)." minutes<br>\n"; <div data-role="fieldcontain">
$legMarkers = Array(); <label for="date"> on </label>
foreach ($itinerary->legs->leg as $legNumber => $leg ){ <input type="date" name="date" id="date" value="' . $date . '" />
$legMarkers[] = Array($leg->from->lat,$leg->from->lon); </div>
} <div data-role="fieldcontain">
echo staticmap($legMarkers)."<br>\n"; <label for="time"> at </label>
foreach ($itinerary->legs->leg as $legNumber => $leg ){ <input type="time" name="time" id="time" value="' . $time . '" />
echo "Leg #".($legNumber+1)." (from: {$leg->from->name} to {$leg->to->name}, ".floor($leg->duration/60000)." minutes) <br>\n"; </div>
$legArray = object2array($leg); <input type="submit" value="Go!"></form>';
if ($legArray["@mode"] === "BUS") { echo "<script>
echo "Take bus {$legArray['@route']} ".str_replace("To","towards",$legArray['@headsign'])."<br>"; $('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;});
} $('#toHere').show();
else { $('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;});
foreach ($leg->steps->walkSteps as $stepNumber => $step ){ $('#fromHere').show();
echo "Walking step $stepNumber $step->absoluteDirection / $step->relativeDirection on $step->streetName for $step->distance meters / ".floor($step->duration/60000)." minutes<br>\n";  
} </script>";
} }
}  
} function processItinerary($itineraryNumber, $itinerary)
} else { {
echo '<form> I would like to go from <input type="text" name="from" value="Brigalow"></input> to 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>";
<input type="text" name="to" value="Barry"></input> on <input type="text" name="date" value="1:00pm"> at <input type="text" name="time" value="1:00pm"></input> echo "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n";
<input type="submit"></form>'; echo "Transit time: " . floor($itinerary->transitTime / 60000) . " minutes<br>\n";
  echo "Waiting time: " . floor($itinerary->waitingTime / 60000) . " minutes<br>\n";
   
}  
include_footer(); if (is_array($itinerary->legs->leg)) {
  $legMarkers = array();
  foreach ($itinerary->legs->leg as $legNumber => $leg) {
  $legMarkers[] = array($leg->from->lat, $leg->from->lon);
  }
  echo '' . staticmap($legMarkers) . "<br>\n";
  echo '<ul>';
  foreach ($itinerary->legs->leg as $legNumber => $leg) {
  echo '<li>';
  processLeg($legNumber, $leg);
  echo "</li>";
  }
  echo "</ul>";
  } else {
  echo '' . staticmap(array(array($itinerary->legs->leg->from->lat, $itinerary->legs->leg->from->lon))) . "<br>\n";
  processLeg(0, $itinerary->legs->leg);
  }
   
  echo "</p></div>";
  }
   
  function processLeg($legNumber, $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";
  if ($legArray["@mode"] === "BUS") {
  echo "Take bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']) . "<br>";
  } else {
  $walkStepMarkers = array();
  foreach ($leg->steps->walkSteps as $stepNumber => $step) {
  $walkStepMarkers[] = array($step->lat, $step->lon);
  }
  echo "" . staticmap($walkStepMarkers, "icong") . "<br>\n";
  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";
  }
  }
  }
   
  if ($_REQUEST['time']) {
  $toPlace = (startsWith($_REQUEST['to'], "-") ? $_REQUEST['to'] : geocode(urlencode($_REQUEST['to']), false));
  $fromPlace = (startsWith($_REQUEST['from'], "-") ? $_REQUEST['from'] : geocode(urlencode($_REQUEST['from']), false));
  if ($toPlace == "" || $fromPlace == "") {
  $errorMessage = "";
  if ($toPlace === "")
  $errorMessage .= urlencode($_REQUEST['to']) . " not found.<br>\n";
  if ($fromPlace === "")
  $errorMessage .= urlencode($_REQUEST['from']) . " not found.<br>\n";
  tripPlanForm($errorMessage);
  } 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=";
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
  curl_setopt($ch,CURLOPT_TIMEOUT,5);
  $page = curl_exec($ch);
   
  if(curl_errno($ch)) { tripPlanForm("Trip planner temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch));}
  else {
  $tripplan = json_decode($page);
  debug(print_r($triplan,true));
  echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>";
  echo "<h1> At: {$tripplan->plan->date} </h1>";
   
  if (is_array($tripplan->plan->itineraries->itinerary)) {
  echo '<div data-role="collapsible-set">';
  foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
  processItinerary($itineraryNumber, $itinerary);
  }
  echo "</div>";
  } else {
  processItinerary(0, $tripplan->plan->itineraries->itinerary);
  }
  }
  curl_close($ch);
  }
  } else {
  tripPlanForm();
  }
  include_footer();
?> ?>