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
--- a/busui/tripPlanner.php
+++ b/busui/tripPlanner.php
@@ -1,48 +1,133 @@
 <?php
-include('common.inc.php');
-if ($_REQUEST['time']) {
-    $toPlace = geocode($_REQUEST['to'],false);
-    $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=";
-        $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")); 
-$page = curl_exec($ch);
-curl_close($ch);
-    $tripplan = json_decode($page);
-    echo "<h1> From: {$tripplan->plan->from->name} </h1>";
-     echo "<h1> To: {$tripplan->plan->to->name} </h1>";
-      echo "<h1> At: {$tripplan->plan->date} </h1>";
-    foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary ){
-        echo "<hr> <h2> Option #".($itineraryNumber+1)."<h2>";
-        echo "Duration: ".floor($itinerary->duration/60000)." minutes ({$itinerary->startTime} to {$itinerary->endTime})<br>\n";
-        echo "Walking time: ".floor($itinerary->walkTime/60000)." minutes ({$itinerary->walkDistance} meters)<br>\n";
-        echo "Transit time: ".floor($itinerary->transitTime/60000)." minutes<br>\n";
-        echo "Waiting time: ".floor($itinerary->waitingTime/60000)." minutes<br>\n";
-        $legMarkers = Array();
-        foreach ($itinerary->legs->leg as $legNumber => $leg ){
-            $legMarkers[] = Array($leg->from->lat,$leg->from->lon);
-        }
-        echo staticmap($legMarkers)."<br>\n";
-         foreach ($itinerary->legs->leg as $legNumber => $leg ){
-            echo "Leg #".($legNumber+1)." (from: {$leg->from->name} to {$leg->to->name}, ".floor($leg->duration/60000)." minutes) <br>\n";
-            $legArray = object2array($leg);
-            if ($legArray["@mode"] === "BUS") {
-                echo "Take bus {$legArray['@route']} ".str_replace("To","towards",$legArray['@headsign'])."<br>";
-            }
-            else {
-                foreach ($leg->steps->walkSteps as $stepNumber => $step ){
-                     echo "Walking step $stepNumber $step->absoluteDirection / $step->relativeDirection on $step->streetName for $step->distance meters / ".floor($step->duration/60000)." minutes<br>\n";
-                }
-            }
-         }
-    }
-} else {
-    echo '<form> I would like to go from <input type="text" name="from" value="Brigalow"></input> to 
-      <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>
-      <input type="submit"></form>';
+  include('common.inc.php');
+  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 = "")
+  {
+    global $date,$time,$from,$to;
+            echo "<font color=red>$errorMessage</font>";
+      echo '<form action="tripPlanner.php" method="post">
+    <div data-role="fieldcontain">
+        <label for="from">I would like to go from</label>
+        <input type="text" name="from" id="from" value="' . $from . '"  />
+        <a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a>
+    </div>
+        <div data-role="fieldcontain">
+        <label for="to"> to </label>
+        <input type="text" name="to" id="to" value="' . $to . '"  />
+        <a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a>
+    </div>
+    <div data-role="fieldcontain">
+        <label for="date"> on </label>
+        <input type="date" name="date" id="date" value="' . $date . '"  />
+    </div>
+        <div data-role="fieldcontain">
+        <label for="time"> at </label>
+        <input type="time" name="time" id="time" value="' . $time . '"  />
+    </div>
+        <input type="submit" value="Go!"></form>';
+        echo "<script>
+$('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;});
+$('#toHere').show();
+$('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;});
+$('#fromHere').show();
+
+        </script>";
+  }
+  
+  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 "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n";
+      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($to, "-") ? $to : geocode($to, false));
+      $fromPlace = (startsWith($from, "-") ? $from : geocode($from, false));
+      if ($toPlace == "" || $fromPlace == "") {
+          $errorMessage = "";
+          if ($toPlace === "")
+              $errorMessage .= urlencode($to) . " not found.<br>\n";
+          if ($fromPlace === "")
+              $errorMessage .= urlencode($from) . " not found.<br>\n";
+          tripPlanForm($errorMessage);
+      } else {
+          $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);
+          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();
 ?>
+