More work on mobile UI, changed to network 10 start date
More work on mobile UI, changed to network 10 start date

file:a/.gitignore -> file:b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
-maxious-canberra-transit-feed/source-html
 origin-src
 

file:a/betweenpoint.load.php (deleted)
--- a/betweenpoint.load.php
+++ /dev/null
@@ -1,76 +1,1 @@
-<?php

-/*

- * GeoPo Encode in PHP

- * @author : Shintaro Inagaki

- * @param $location (Array)

- * @return $geopo (String)

- */

-function geopoEncode($lat, $lng) {

-	// 64characters (number + big and small letter + hyphen + underscore)

-	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

-

-	$geopo = "";

-	$scale = 7;

-	

-	// Change a degree measure to a decimal number

-	$lat = ($lat + 90) / 180 * pow(8, 10);

-	$lng = ($lng + 180) / 360 * pow(8, 10);

-	// Compute a GeoPo code from head and concatenate

-	for($i = 0; $i < $scale; $i++) {

-		$geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1);

-	}

-	return $geopo;

-}		

-

-/*

- * GeoPo Decode in PHP

- * @author : Shintaro Inagaki

- * @param $geopo (String)

- * @return $location (Array)

- */

-function geopoDecode($geopo) {

-	// 64characters (number + big and small letter + hyphen + underscore)

-	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

-	// Array for geolocation

-	$location = array ();

-

-	for ($i = 0; $i < strlen($geopo); $i++) {

-		// What number of character that equal to a GeoPo code (0-63)

-		$order = strpos($chars, substr($geopo, $i, 1));

-		// Lat/Lng plus geolocation value of scale 

-		$location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i);

-		$location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i);

-	}

-

-	// Change a decimal number to a degree measure, and plus revised value that shift center of area

-	$location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90;

-	$location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180;

-	$location['scale'] = strlen($geopo);

-

-	return $location;

-}	

-

-$conn = pg_connect("dbname=bus user=postgres password=snmc");

-if (!$conn) {

-  echo "An error occured.\n";

-  exit;

-}

-$xml = simplexml_load_file("04-locatebetweenpoints.osm");

-

-/* Access the <rating> nodes of the first movie.

- * Output the rating scale, too. */

-foreach ($xml->node as $node) {

-	$geoPo = geopoEncode((float)$node['lat'],(float)$node['lon']);

-	$node['lat'] = (int) ((float)$node['lat']*10000000);

-	$node['lon'] = (int) ((float)$node['lon']*10000000);

-	echo($node['lat'].",".$node['lon']."=$geoPo<br>");

-   $sql = "INSERT INTO stops (geohash, lat, lng) VALUES('$geoPo','{$node['lat']}','{$node['lon']}')";

-     $result = pg_query($conn, $sql);

-     if (!$result) {

-         echo("Error in SQL query: " . pg_last_error() ."<br>\n");

-     }

-flush();

-    

-}

-?>

 

--- a/betweenpoint.php
+++ b/betweenpoint.php
@@ -10,7 +10,7 @@
     // create the ol map object
     var map = new OpenLayers.Map('map');
     
-  var osmtiles = new OpenLayers.Layer.OSM("local", "http://127.0.0.1/Maps/OSM/${z}/${x}/${y}.png")
+  var osmtiles = new OpenLayers.Layer.OSM("local", "http://127.0.0.1/tiles/${z}/${x}/${y}.png")
 // use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles
     markers = new OpenLayers.Layer.Markers("Between Stop Markers");
  
@@ -64,6 +64,7 @@
   fromto = selValue.split(":",2)[1];
   $("#from").val(fromto.split("->",2)[0]);
   $("#to").val(fromto.split("->",2)[1]);
+ document.getElementById("between_points").innerHTML = "";
     return true;
 }
 
@@ -126,9 +127,11 @@
           if (($fname != '.') && ($fname != '..')) {
               $timetable = Spyc::YAMLLoad("maxious-canberra-transit-feed/output/" . $fname);
 		// Strip off individual platforms because it usually doesn't matter for routes
-		$timetable["time_points"] = preg_replace("/-.* Platform.*/","",$timetable["time_points"]);
+		$timetable["time_points"] = preg_replace("/\(Platform.*/","",$timetable["time_points"]);
               for ($i = 0; $i < sizeof($timetable["time_points"]) - 1; $i++) {
-                  @$paths[trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1])] .= $timetable["short_name"] . ";";
+		$key = trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1]);
+		if (strstr($paths[$key],";" . $timetable["short_name"] . ";") === false)
+                  @$paths[$key] .= $timetable["short_name"] . ";";
               }
           }
       }
@@ -138,9 +141,12 @@
   $completedPaths = array();
   $result_betweenstops = pg_query($conn, "Select * FROM between_stops");
   while ($path = pg_fetch_assoc($result_betweenstops)) {
-      $completedPaths[trim($path['fromlocation']) . "->" . trim($path['tolocation'])] .= trim($path['routes']);
+    $key = trim($path['fromlocation']) . "->" . trim($path['tolocation']);
+    $completedPaths[$key].= trim($path['routes']);
+    
   }
-  
+
+ 
   foreach ($paths as $path => $routes) {
       if (!in_array($path, array_keys($completedPaths))) {
           echo "<option value=\"$routes:$path\">" . sizeof(explode(";", $routes)) . " $path</option>\n";
@@ -149,12 +155,14 @@
 	 $incompleteRoutes = "";
 	foreach (explode(";", $routes) as $route) {
 
-	  if (!in_array($route,$completedRoutes)) {
+	  if (!in_array($route,$completedRoutes) && strstr($incompleteRoutes,';'.$route.';') === false) {
 	  $incompleteRoutes .= $route.';';
 	  }
 	  
 	}
-	if ($incompleteRoutes != "") echo "<option value=\"$incompleteRoutes:$path\">" . sizeof(explode(";", $incompleteRoutes)) . " $path</option>\n";
+	if ($incompleteRoutes != "") {
+	  echo "<option value=\"$incompleteRoutes:$path\">" . sizeof(explode(";", $incompleteRoutes)) . " $path</option>\n";
+	}
       }
       
   }

--- a/betweenpoint.submit.php
+++ b/betweenpoint.submit.php
@@ -16,8 +16,11 @@
          echo("Error in SQL query: " . pg_last_error() ."<br>\n");

      }

      if ($reverse === "on") {

-	$points = implode(";",array_reverse(explode(";",$points)));

-$sql = "INSERT INTO between_stops ( toLocation, fromLocation, points, routes) VALUES('$from','$to','$points','$routes')";

+	$ep = explode(";",$points);

+	$epr = array_reverse($ep); 

+	$p = implode(";",$epr).";";

+	$pointsString = substr($p,1);

+$sql = "INSERT INTO between_stops ( toLocation, fromLocation, points, routes) VALUES('$from','$to','$pointsString','$routes')";

 $result = pg_query($conn, $sql);

      if (!$result) {

          echo("Error in SQL query: " . pg_last_error() ."<br>\n");


--- a/busui/common.inc.php
+++ b/busui/common.inc.php
@@ -12,24 +12,29 @@
     return true;
 }
 
-function include_header($pageTitle) {
+function include_header($pageTitle, $opendiv = true, $geolocate = false) {
     // if (isDebug()) // set php error level high
     echo '
 <!DOCTYPE html> 
 <html> 
 	<head> 
 	<title>bus.lambdacomplex.org - '.$pageTitle.'</title> 
-	<link rel="stylesheet"  href="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.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" 
-src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.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> 
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+ <link rel="apple-touch-startup-image" href="startup.png" />
+ <link rel="apple-touch-icon" href="apple-touch-icon.png" />
 </head> 
 <body> 
- 
-<div data-role="page"> 
+ ';
+if ($opendiv) echo '<div data-role="page"> 
  
 	<div data-role="header"> 
-		<h1>'.$pageTitle.'</h1> 
+		<h1>'.$pageTitle.'</h1>
+                <a href="index.php" data-icon="back" class="ui-btn-right">Home</a>
 	</div><!-- /header -->
         <div data-role="content"> ';
 }
@@ -81,5 +86,24 @@
   }
   return $f;
 }
+
+function staticmap($mapPoints)
+{
+$width = 300;
+$height = 300;
+    if (sizeof($mapPoints) < 1) return "";
+    if (sizeof($mapPoints) === 1) $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
+    if (sizeof($mapPoints) > 1) $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; //TODO average points
+    $markers = "";
+    foreach ($mapPoints as $index => $mapPoint) {
+        if (sizeof($mapPoints) === 1) {
+            $markers .= $mapPoint[0].",".$mapPoint[1].",ol-marker";
+        } else {
+            $markers .= $mapPoint[0].",".$mapPoint[1].",lightblue".($index+1);
+        }
+    }
+    return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom=14&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width=$width height=$height>';
+}
 ?>
   
+

--- a/busui/index.php
+++ b/busui/index.php
@@ -1,60 +1,26 @@
 <?php 
-include('common.inc.php'); 
+include('common.inc.php');
+include_header("bus.lambdacomplex.org",false)
 ?>
-<!doctype html>
-<html>
-    <head>
-        <meta charset="UTF-8" />
-        <title>bus.lambdacomplex.org</title>
-	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.css" />
-	<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
-	<script src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.js"></script>
-        <!-- <script src="jqtouch/extensions/jqt.location.js" type="application/x-javascript" charset="utf-8"></script>  -->
- 
-<!--        <script type="text/javascript" charset="utf-8">
-            $(function(){
-                function setDisplay(text) {
-                    $('.latlng').empty().append(text)
-                }
-                
-                // We pass "updateLocation" a callback function,
-                // to run once we have the coordinates.
-                // We also set it to a variable, so we can know
-                // right away if it's working or not
-                var lookup = jQT.updateLocation(function(coords){
-                    if (coords) {
-                        setDisplay('Latitude: ' + coords.latitude + '<br />Longitude: ' + coords.longitude);
-			 $('.nearby').empty().append('<a href="list.php?lat=' + coords.latitude + '&lng=' + coords.longitude + '">Nearby List</a>');
-                    } else {
-                        setDisplay('Device not capable of geo-location.');
-                    }
-                });
- 
-                if (lookup) {
-                    setDisplay('Looking up location&hellip;');
-                }
-            });
-        </script> -->
-    </head>
-    <body>
-<div data-role="page" data-theme="b" id="jqm-home"> 
-	<div id="jqm-homeheader"> 
-		<p>bus.lambdacomplex.org</p> 
+<div data-role="page" data-theme="b" id="jqm-home" class="ui-page ui-body-b ui-page-active">
+	<div id="jqm-homeheader">
+	    	<center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="jQuery Mobile Framework" width="64" height="64" />
+		bus.lambdacomplex.org</h1></center>
 	</div> 
 	<div data-role="content"> 
             <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
                 <li data-role="list-divider">Stops</li>
                 <li><a href="stopList.php">All stops List</a></li>
-		<li class="nearby"><a href="">Nearby List</a></li>
-                <li><a href="stopList.php">Favourites List</a></li>
+		<li class="nearby"><a href="stopList.php?nearby=yes">Nearby List</a></li>
+                <li><a href="stopList.php?favourites=yes">Favourites List</a></li>
             </ul>
 	    <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
                 <li data-role="list-divider">Routes</li>
                 <li><a href="routeList.php">All Routes List</a></li>
-		<li class="nearby"><a href="">Nearby List</a></li>
-                <li><a href="routeList.php">Favourites List</a></li>
+		<li class="nearby"><a href="routeList.php?nearby=yes">Nearby List</a></li>
+                <li><a href="routeList.php?favourites=yes">Favourites List</a></li>
             </ul>
-            <div class="info">
+            <div class="ui-body ui-body-c info">
 		<p class="latlng"></p>
 		Time: <?php echo date("H:m"); ?> <br>
 		Service Period: <?php echo ucwords(service_period()); ?> 

file:a/busui/list.php (deleted)
--- a/busui/list.php
+++ /dev/null
@@ -1,22 +1,1 @@
-<div id="get">
-    <div class="toolbar">
-        <h1>GET Example</h1>
-        <a class="back" href="#">AJAX</a>
-    </div>
-    <div class="info">
-        This page was loaded via AJAX.
-    </div>
-    <ul class="rounded">
-        <li><a href="#livetest">Test live events</a></li>
-    </ul>
-</div>
-<div id="livetest">
-    <div class="toolbar">
-        <h1>Events test</h1>
-        <a class="back" href="#">AJAX</a>
-        <a class="button goback" href="#home">Home</a>
-    </div>
-    <div class="info">
-        This is a test of live events.
-    </div>
-</div>
+

--- a/busui/readme.txt
+++ b/busui/readme.txt
@@ -21,3 +21,10 @@
 OOP stops/routes
 Stop sorting/search-filter
 
+static maps
+https://code.google.com/apis/maps/documentation/staticmaps/
+http://www.multimap.com/openapidocs/1.2/web_service/staticmaps.htm
+http://dev.openstreetmap.de/staticmap/ (os @ http://sourceforge.net/projects/staticmaplite/)
+(php and open source @ http://trac.openstreetmap.org/browser/sites/other/StaticMap?rev=16348)
+http://pafciu17.dev.openstreetmap.org/
+

file:a/busui/route.php (deleted)
--- a/busui/route.php
+++ /dev/null

--- a/busui/routeList.php
+++ b/busui/routeList.php
@@ -7,28 +7,49 @@
 $url = $APIurl."/json/routes";
 
 $contents = json_decode(getPage($url));
-foreach ($contents as $key => $row) {
-    $routeDestinations[$row[2]][]  = $row;
-}
-foreach ($routeDestinations as $destination => $routes)
-{
-	echo '<li>'.$destination."... <ul>\n";
-		foreach($routes as $row) {
-      			echo  '<li>'.$row[1].' <a href="route.php?routeid='.$row[0].'">'.$row[2]."</a></li>\n";
+if ($_REQUEST['bynumber']) {
+	$routeSeries = Array();
+	foreach ($contents as $key => $row) {
+		foreach (explode(" ",$row[1]) as $routeNumber ) {
+			$seriesNum = substr($routeNumber, 0, -1)."0";
+			if ($seriesNum == "0") $seriesNum = $routeNumber;
+			$routeSeries[$seriesNum][$seriesNum."-".$row[1]."-".$row[0]]  = $row;
+
+			
 		}
-	echo "</ul></li>\n";
+	}
+	ksort($routeSeries);
+	foreach ($routeSeries as $series => $routes)
+	{
+		echo '<li>'.$series."... <ul>\n";
+			foreach($routes as $row) {
+				echo  '<li>'.$row[1].' <a href="route.php?routeid='.$row[0].'">'.$row[2]."</a></li>\n";
+			}
+		echo "</ul></li>\n";
+	}
+} else {
+	foreach ($contents as $key => $row) {
+	    $routeDestinations[$row[2]][]  = $row;
+	}
+	foreach ($routeDestinations as $destination => $routes)
+	{
+		echo '<li>'.$destination."... <ul>\n";
+			foreach($routes as $row) {
+				echo  '<li>'.$row[1].' <a href="trip.php?routeid='.$row[0].'">'.$row[2]."</a></li>\n";
+			}
+		echo "</ul></li>\n";
+	}
 }
 echo "</ul>\n";
-/*
+echo'
  <div data-role="footer" data-id="foo1" data-position="fixed"> 
 		<div data-role="navbar"> 
 			<ul> 
-				<li><a href="footer-persist-a.html" class="ui-btn-active">Friends</a></li> 
-				<li><a href="footer-persist-b.html">Albums</a></li> 
-				<li><a href="footer-persist-c.html">Emails</a></li> 
+				<li><a href="routeList.php" class="ui-btn-active">By Final Destination...</a></li> 
+				<li><a href="routeList.php?bynumber=yes">By Number... </a></li>
+				<li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li> 
 			</ul> 
-		</div><!-- /navbar -->
-*/
+	';
 include_footer();
 ?>
 

--- a/busui/schedule_viewer.py
+++ b/busui/schedule_viewer.py
@@ -264,7 +264,19 @@
     schedule = self.server.schedule
     route = schedule.GetRoute(params.get('route', None))
     return [transitfeed.Route._FIELD_NAMES, route.GetFieldValuesTuple()]
-
+    
+  def handle_json_GET_routetrips(self, params):
+    """ Get a trip for a route_id (preferablly the next one) """
+    schedule = self.server.schedule
+    query = params.get('route_id', None).lower()
+    result = []
+    for t in schedule.GetTripList():
+      if t.route_id == query:
+        result.append ( (t.GetStartTime(), t.trip_id) )
+        """ UGH fails for 300s """
+    """return result"""
+    return sorted(result, key=lambda trip: trip[0])
+  
   def handle_json_GET_triprows(self, params):
     """Return a list of rows from the feed file that are related to this
     trip."""
@@ -337,6 +349,14 @@
   def handle_json_GET_stops(self, params):
     schedule = self.server.schedule
     return [StopToTuple(s) for s in schedule.GetStopList()]
+    
+  def handle_json_GET_timingpoints(self, params):
+    schedule = self.server.schedule
+    matches = []
+    for s in schedule.GetStopList():
+      if s.stop_code.find("Wj") == -1:
+        matches.append(StopToTuple(s))
+    return matches
 
   def handle_json_GET_stopsearch(self, params):
     schedule = self.server.schedule
@@ -361,6 +381,7 @@
     schedule = self.server.schedule
     stop = schedule.GetStop(params.get('stop', None))
     time = int(params.get('time', 0))
+    service_period = params.get('service_period', None)
     time_trips = stop.GetStopTimeTrips(schedule)
     time_trips.sort()  # OPT: use bisect.insort to make this O(N*ln(N)) -> O(N)
     # Keep the first 15 after param 'time'.
@@ -389,8 +410,8 @@
         trip_name += route.route_long_name
       if headsign:
         trip_name += " (Direction: %s)" % headsign
-
-      result.append((time, (trip.trip_id, trip_name, trip.service_id), tp))
+      if service_period == None or trip.service_id == service_period:
+        result.append((time, (trip.trip_id, trip_name, trip.service_id), tp))
     return result
 
   def handle_GET_ttablegraph(self,params):

--- a/busui/stop.php
+++ b/busui/stop.php
@@ -4,14 +4,19 @@
 $stop = json_decode(getPage($url));
 
 include_header("Trips passing ".$stop[1]);
+echo '<div data-role="content" class="ui-content" role="main"><p>'.staticmap(Array(0 => Array($stop[2],$stop[3]))).'</p>';
 echo '  <ul data-role="listview" >';
-$url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds();
-$page = getPage($url);
-foreach (json_decode($page) as $row)
+$url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period();
+$trips = json_decode(getPage($url));
+foreach ($trips as $row)
 {
-if ($row[1][2] === service_period()) echo  '<li>'.midnight_seconds_to_time($row[0]).' <a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.$row[1][1].'</a></li>';        
+echo  '<li>';
+echo '<h3><a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.$row[1][1].'</a></h3>';      
+echo '<p class="ui-li-aside"><strong>'.midnight_seconds_to_time($row[0]).'</strong></p>';
+echo '</li>';  
 }
-echo '</ul>';
+if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>";
+echo '</ul></div>';
 include_footer();
 ?>
 

--- a/busui/stopList.php
+++ b/busui/stopList.php
@@ -2,7 +2,8 @@
 include('common.inc.php');
 include_header("Stops");
 echo '  <ul data-role="listview" data-filter="true">';
-$url = $APIurl."/json/stops";
+$url = $APIurl."/json/timingpoints";
+if ($_REQUEST['allstops']) $url = $APIurl."/json/stops";
 if ($_REQUEST['lat'] && $_REQUEST['lon']) $url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=15";
 $contents = json_decode(getPage($url));
 foreach ($contents as $key => $row) {
@@ -19,16 +20,14 @@
       echo  '<li><a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></li>';
         }
 echo '</ul>';
-/*
+echo'
  <div data-role="footer" data-id="foo1" data-position="fixed"> 
 		<div data-role="navbar"> 
 			<ul> 
-				<li><a href="footer-persist-a.html" class="ui-btn-active">Friends</a></li> 
-				<li><a href="footer-persist-b.html">Albums</a></li> 
-				<li><a href="footer-persist-c.html">Emails</a></li> 
+				<li><a href="stopList.php" class="ui-btn-active">Timing Points</a></li> 
+				<li><a href="stopList.php?allstops=yes">All Stops</a></li> 
 			</ul> 
-		</div><!-- /navbar -->
-*/
+	';
 include_footer();
 ?>
 

--- a/busui/trip.php
+++ b/busui/trip.php
@@ -1,23 +1,36 @@
 <?php
 include('common.inc.php');
-$url = $APIurl."/json/triprows?trip=".$_REQUEST['tripid'];
+$tripid = $_REQUEST['tripid'];
+if ($_REQUEST['routeid']) {
+    $url = $APIurl."/json/routetrips?route_id=".$_REQUEST['routeid'];
+    $trips = json_decode(getPage($url));
+foreach ($trips as $trip)
+         {
+            if ($trip[0] < midnight_seconds()) {
+                $tripid = $trip[1];
+                break;
+            }
+         }
+         if (!($tripid > 0)) $tripid = $trips[0][1];
+}
+$url = $APIurl."/json/triprows?trip=".$tripid;
 $trips = array_flatten(json_decode(getPage($url)));
-print_r($trips);
 
 include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name);
 echo '  <ul data-role="listview" >';
 
 
-
-
-$url = $APIurl."/json/tripstoptimes?trip=".$_REQUEST['tripid'];
+$url = $APIurl."/json/tripstoptimes?trip=".$tripid;
 
 $json = json_decode(getPage($url));
 $stops = $json[0];
 $times = $json[1];
 foreach ($stops as $key => $row)
 {
-echo  '<li>'.midnight_seconds_to_time($times[$key]).' <a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></li>';        
+    echo  '<li>';
+echo '<h3><a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></h3>';      
+echo '<p class="ui-li-aside">'.midnight_seconds_to_time($times[$key]).'</p>';
+echo '</li>';       
 }
 echo '</ul>';
 include_footer();

--- a/maxious-canberra-transit-feed/01-extracttimes.rb
+++ b/maxious-canberra-transit-feed/01-extracttimes.rb
@@ -14,7 +14,14 @@
 	timetable = {"between_stops" => [], "short_name" => short_name}
 	time_points = table.xpath('tr[1]//th').map do |tp|
 		if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>"
-			timing_point = tp.content.squeeze(" ").gsub("\r\n Platform"," - Platform").gsub("  - "," - ").gsub("\n","").gsub("\r","").gsub("\\"," / ").strip
+			timing_point = tp.content.squeeze(" ").gsub("Bus Station"," Bus Station ").gsub(" Platform"," (Platform").gsub("  - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(","," ").gsub("\302\240","").squeeze(" ").strip
+			if (tp.content.match('Platform'))
+			  timing_point.concat(")")
+			end;
+			if tp.to_s.match(/[0-9][0-9][0-9]/) or tp.to_s.include? "Wheelchair"
+			  timing_point = nil
+			end
+			timing_point
 		end
 	end
 	time_points.delete(nil)
@@ -24,12 +31,17 @@
 	table.css('tr').each do |row|
 		times = row.css('td').map do |cell|
 			time = cell.content.squeeze(" ").strip
-			time = time.gsub(/ *A\S?M/,"a").gsub(/ ?P\S?M/,"p").gsub("12:08 AM","1208x").gsub(":","").gsub("1.","1").gsub("2.","2")
-			time = time.gsub("3.","3").gsub("4.","4")
+			time = time.gsub(/ *A\S?M/,"a").gsub(/ ?P\S?M/,"p").gsub(/ *a\S?m/,"a").gsub(/ ?p\S?m/,"p")
+			time = time.gsub("12:08 AM","1208x").gsub(":","").gsub("1.","1").gsub("2.","2").gsub("3.","3").gsub("4.","4")
 			time = time.gsub("5.","5").gsub("6.","6").gsub("7.","7").gsub("8.","8").gsub("9.","9").gsub("10.","10")
-			time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-")
+			time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-").gsub("\302\240","")
+			if time == "" or time.include? "chool" or time.include? "On Race Days" or time.include? "Bus"
+				time = nil # This hacky way is faster than using position()>1 xpath on <TD>s!
+			end 
+			time
 		end
-		if not times.empty?
+		times.delete(nil)
+		if not times.empty? 
 			if not (route = times.shift)
 				raise("TODO: account for shifting route numbers eg. intertown/redex 62/162")
 			end
@@ -42,7 +54,7 @@
 	timetable[period] = periodtimes.to_a
 	# pp timetable
 	filename = timetable["short_name"] + "-" + timetable["long_name"]+ "." + period + ".yml"
-	filename = filename.downcase.gsub(" ","-").gsub("/","-")
+	filename = filename.downcase.gsub(" ","-").gsub("/","-").gsub("(","").gsub(")","")
 	puts "Saving " + filename
 	File.open("#{File.dirname(__FILE__)}/output/"+filename, "w") do |f|
 		f.write timetable.to_yaml
@@ -50,15 +62,14 @@
 	timetable
 end
 
-#TODO fix route 934
-Dir.glob("source-html/Route*.htm*") { |file|
+Dir.glob("source-html/*oute*.htm*") { |file|
 	puts "Opened " + file
 	doc = Nokogiri::HTML(open(file))
 	# Search for nodes by css
 	timetables = []
 	short_name = "";
 	doc.xpath('//title').each do |title|
-		short_name = title.content.gsub("Route_","").gsub("Route ","").gsub(", ","/").squeeze(" ").strip
+		short_name = title.content.gsub("Route_","").gsub("Route ","").gsub("route ","").gsub(", ","/").gsub("ACTION Buses Timetable for ","").squeeze(" ").strip
 	end
 	if short_name == ""
 		raise "Route number(s) not found in <title> tag"
@@ -67,7 +78,15 @@
 	doc.xpath('//table[preceding::text()="Weekdays"]').each do |table|
 		timetables << makeTimetable(table, "stop_times", short_name)
 	end
-
+	doc.xpath('//table[preceding::text()="This timetable is effective from Monday 15th November 2010."]').each do |table|
+		timetables << makeTimetable(table, "stop_times", short_name)
+	end
+	#all tables are weekdays on some really malformatted timetables
+	if short_name == "170"
+		doc.xpath('//table').each do |table|
+			timetables << makeTimetable(table, "stop_times", short_name)
+		end
+	end
 	#weekends
 	doc.xpath('//table[preceding::text()="Saturdays" and following::a]').each do |table|
 		timetables << makeTimetable(table, "stop_times_saturday", short_name)

--- a/maxious-canberra-transit-feed/02-tidytimepoints.rb
+++