Shorter names for combined stops and fix sorting bug
Shorter names for combined stops and fix sorting bug

--- a/aws/awsStartup.sh
+++ b/aws/awsStartup.sh
@@ -5,6 +5,7 @@
 #http://www.how2forge.org/installing-lighttpd-with-php5-and-mysql-support-on-fedora-12
 
 cp /root/aws.php /tmp/
+mkdir /var/www/lib/staticmaplite/cache 
 chcon -h system_u:object_r:httpd_sys_content_t /var/www
 chcon -R -h root:object_r:httpd_sys_content_t /var/www/*
 chcon -R -t httpd_sys_content_rw_t /var/www/lib/staticmaplite/cache

--- a/feedback.php
+++ b/feedback.php
@@ -59,6 +59,8 @@
   echo "\nUser host/IP: ".$_SERVER["HTTP_X_FORWARDED_FOR"]." ".$_SERVER["REMOTE_ADDR"]; 
   echo "\nServer host/IP: ".php_uname("n");
   echo "\nCurrent date/time: ". date("c");
+  echo "\nCurrent code revision: ".exec("git rev-parse --short HEAD");
+  echo "\nCurrent timetables version: ".@filemtime('cbrfeed.zip');
   echo "\nDump of session: ".print_r($_SESSION,true);
 ?>
 </textarea>

--- a/include/common-geo.inc.php
+++ b/include/common-geo.inc.php
@@ -47,7 +47,7 @@
 	}
 	$output = "";
 	if ($collapsible) $output.= '<div data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>';
-	$output.= '<center><img src="' . curPageURL() . 'lib/staticmaplite/staticmap.php?center=' . $center . '&zoom=' . $zoom . '&size=' . $width . 'x' . $height . '&maptype=mapnik&markers=' . 
+	$output.= '<center><img src="' . curPageURL() . 'lib/staticmaplite/staticmap.php?center=' . $center . '&zoom=' . $zoom . '&size=' . $width . 'x' . $height . '&markers=' . 
 $markers . '" width=' . $width . ' height=' . $height . '></center>';
 	if ($collapsible) $output.= '</div>';
 	return $output;

--- /dev/null
+++ b/include/common-session.inc.php
@@ -1,1 +1,57 @@
+<?php
+// you have to open the session to be able to modify or remove it
+session_start();
+if (isset($_REQUEST['service_period'])) {
+	$_SESSION['service_period'] = filter_var($_REQUEST['service_period'], FILTER_SANITIZE_STRING);
+	sessionUpdated();
+}
+if (isset($_REQUEST['time'])) {
+	$_SESSION['time'] = filter_var($_REQUEST['time'], FILTER_SANITIZE_STRING);
+	sessionUpdated();
+}
+if (isset($_REQUEST['geolocate'])) {
+	$geocoded = false;
+	if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) {
+		$_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
+		$_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
+	}
+	else {
+		$geolocate = filter_var($_REQUEST['geolocate'], FILTER_SANITIZE_URL);
+		echo $_REQUEST['geolocate'];
+		if (startsWith($geolocate, "-")) {
+			$locateparts = explode(",", $geolocate);
+			$_SESSION['lat'] = $locateparts[0];
+			$_SESSION['lon'] = $locateparts[1];
+		}
+		else {
+			$contents = geocode($geolocate, true);
+			print_r($contents);
+			if (isset($contents[0]->centroid)) {
+				$geocoded = true;
+				$_SESSION['lat'] = $contents[0]->centroid->coordinates[0];
+				$_SESSION['lon'] = $contents[0]->centroid->coordinates[1];
+			}
+			else {
+				$_SESSION['lat'] = "";
+				$_SESSION['lon'] = "";
+			}
+		}
+	}
+	if ($_SESSION['lat'] != "" && isAnalyticsOn()) {
+		trackEvent("Geolocation","Updated Location", "Geocoded - ".($geocoded ? "Yes" : "No"));
+	}
+	sessionUpdated();
+}
+function sessionUpdated() {
+	$_SESSION['lastUpdated'] = time();
+}
+// timeoutSession
+$TIMEOUT_LIMIT = 60*5; // 5 minutes
+if (isset($_SESSION['lastUpdated']) && $_SESSION['lastUpdated']+$TIMEOUT_LIMIT < time()) {
+	debug ("Session timeout ".($_SESSION['lastUpdated']+$TIMEOUT_LIMIT).">".time(),"session");
+	session_destroy();
+	session_start();
+}
+debug(print_r($_SESSION, true) , "session");
 
+?>

--- a/include/common-template.inc.php
+++ b/include/common-template.inc.php
@@ -87,7 +87,7 @@
         text-size: 0.2em;
     }
     .min-width-480px .viaPoints {
-        display: block;
+        display: inline;
     }
     #extrainfo {
     visibility: hidden;
@@ -121,18 +121,19 @@
 		echo "<script>
 
 function success(position) {
+$('#error').val('Location now detected. Please wait for data to load.');
 $('#geolocate').val(position.coords.latitude+','+position.coords.longitude);
 $.ajax({ url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude });
 location.reload(true);
 }
 function error(msg) {
- console.log(msg);
+$('#error').val('Error: '+msg);
 }
 
 function geolocate() {
 if (navigator.geolocation) {
 var options = {
-      enableHighAccuracy: false,
+      enableHighAccuracy: true,
       timeout: 60000,
       maximumAge: 10000
 }
@@ -168,7 +169,8 @@
     document.title = "' . $pageTitle . '";
 });
 </script>
-	<div data-role="header"> 
+	<div data-role="header" data-position="inline">
+	<a href="'.$_SERVER["HTTP_REFERER"].'" data-icon="arrow-l" data-rel="back">Back</a> 
 		<h1>' . $pageTitle . '</h1>
 	</div><!-- /header -->
         <a name="maincontent" id="maincontent"></a>
@@ -200,7 +202,7 @@
 		$geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "";
 	}
 	if ($geoerror) {
-		echo '<div class="error">Sorry, but your location could not currently be detected.
+		echo '<div id="error">Sorry, but your location could not currently be detected.
         Please allow location permission, wait for your location to be detected,
         or enter an address/co-ordinates in the box below.</div>';
 	}
@@ -215,7 +217,7 @@
     		<div data-role="fieldcontain">
 		        <label for="time"> Time: </label>
 		    	<input type="time" name="time" id="time" value="' . (isset($_SESSION['time']) ? $_SESSION['time'] : date("H:i")) . '"/>
-			<a href="#" name="currentTime" id="currentTime" onClick="var d = new Date();'. "$('#time').val(d.getHours() +':'+ d.getMinutes());".'">Current Time?</a>
+			<a href="#" name="currentTime" id="currentTime" onClick="var d = new Date();'. "$('#time').val(d.getHours() +':'+ (d.getMinutes().toString().length = 1 ? '0'+ d.getMinutes():  d.getMinutes()));".'">Current Time?</a>
 	        </div>
 		<div data-role="fieldcontain">
 		    <label for="service_period"> Service Period:  </label>

--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -5,9 +5,10 @@
 	"session",
 	"json",
 	"phperror",
-	"awsgtfs",
+	//"awsgtfs",
 	"awsotp",
-	"squallotp",
+	//"squallotp",
+	//"vanilleotp",
 	"other"
 );
 if (isDebug("awsgtfs")) {
@@ -22,52 +23,18 @@
 if (isDebug("squallotp")) {
 		$otpAPIurl = 'http://10.0.1.108:5080/opentripplanner-api-webapp/';
 }
+if (isDebug("vanilleotp")) {
+		$otpAPIurl = 'http://10.0.1.135:8080/opentripplanner-api-webapp/';
+}
 if (isDebug("phperror")) error_reporting(E_ALL ^ E_NOTICE);
+
 include_once ("common-geo.inc.php");
 include_once ("common-net.inc.php");
+include_once ("common-transit.inc.php");
+
+include_once ("common-session.inc.php");
 include_once ("common-template.inc.php");
-include_once ("common-transit.inc.php");
-// you have to open the session to be able to modify or remove it
-session_start();
-if (isset($_REQUEST['service_period'])) {
-	$_SESSION['service_period'] = filter_var($_REQUEST['service_period'], FILTER_SANITIZE_STRING);
-}
-if (isset($_REQUEST['time'])) {
-	$_SESSION['time'] = filter_var($_REQUEST['time'], FILTER_SANITIZE_STRING);
-}
-if (isset($_REQUEST['geolocate'])) {
-	$geocoded = false;
-	if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) {
-		$_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
-		$_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
-	}
-	else {
-		$geolocate = filter_var($_REQUEST['geolocate'], FILTER_SANITIZE_URL);
-		echo $_REQUEST['geolocate'];
-		if (startsWith($geolocate, "-")) {
-			$locateparts = explode(",", $geolocate);
-			$_SESSION['lat'] = $locateparts[0];
-			$_SESSION['lon'] = $locateparts[1];
-		}
-		else {
-			$contents = geocode($geolocate, true);
-			print_r($contents);
-			if (isset($contents[0]->centroid)) {
-				$geocoded = true;
-				$_SESSION['lat'] = $contents[0]->centroid->coordinates[0];
-				$_SESSION['lon'] = $contents[0]->centroid->coordinates[1];
-			}
-			else {
-				$_SESSION['lat'] = "";
-				$_SESSION['lon'] = "";
-			}
-		}
-	}
-	if ($_SESSION['lat'] != "" && isAnalyticsOn()) {
-		trackEvent("Geolocation","Updated Location", "Geocoded - ".($geocoded ? "Yes" : "No"));
-	}
-}
-debug(print_r($_SESSION, true) , "session");
+
 function isDebugServer()
 {
 	return $_SERVER['SERVER_NAME'] == "10.0.1.154" || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME'];

--- a/labs/tripPlannerTester.kml.php
+++ b/labs/tripPlannerTester.kml.php
@@ -63,8 +63,8 @@
 // make sure to sleep(10);
 $boundingBoxes = Array(
 	"belconnen" => Array(
-		"startlat" => - 35.1828,
-		"startlon" => 149.0295,
+		"startlat" => - 35.1928,
+		"startlon" => 149.006,
 		"finishlat" => - 35.2630,
 		"finishlon" => 149.1045,
 	) ,
@@ -74,24 +74,24 @@
 		"finishlat" => - 35.2955,
 		"finishlon" => 149.1559,
 	) ,
-	//"west duffy" => Array(
-	//	"startlat" => - 35.3252,
-	//	"startlon" => 149.0240,
-	//	"finishlat" => - 35.3997,
-	//	"finishlon" => 149.0676,
-	//) ,
-	//"central south" => Array(
-	//	"startlat" => - 35.3042,
-	//	"startlon" => 149.0762,
-	//	"finishlat" => - 35.3370,
-	//	"finishlon" => 149.1806,
-	//) ,
-	//"south" => Array(
-	//	"startlat" => - 35.3403,
-	//	"startlon" => 149.0714,
-	//	"finishlat" => - 35.4607,
-	//	"finishlon" => 149.1243,
-	//)
+	"west duffy" => Array(
+		"startlat" => - 35.3252,
+		"startlon" => 149.0240,
+		"finishlat" => - 35.3997,
+		"finishlon" => 149.0676,
+	) ,
+	"central south" => Array(
+		"startlat" => - 35.3042,
+		"startlon" => 149.0762,
+		"finishlat" => - 35.3370,
+		"finishlon" => 149.1806,
+	) ,
+	"south" => Array(
+		"startlat" => - 35.3403,
+		"startlon" => 149.0714,
+		"finishlat" => - 35.4607,
+		"finishlon" => 149.1243,
+	)
 );
 $latdeltasize = 0.01;
 $londeltasize = 0.01;
@@ -121,8 +121,7 @@
 				if ($csv) echo "Trip planner temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch);
 			}
 			else {
-				$tripplan = json_decode($page);
-				if (isset($tripplan->error)) var_dump($tripplan->error);
+				$tripplan = json_decode($page); 
 				$plans = Array();
 				if (is_array($tripplan->plan->itineraries->itinerary)) {
 					foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
@@ -144,6 +143,10 @@
 					else {
 						$plan .= processLeg(0, $plans[min(array_keys($plans)) ]->legs->leg);
 					}
+						if (isset($tripplan->error) && $tripplan->error->id == 404) {
+							$time = 999;
+							$plan = "Trip not possible without excessive walking from nearest bus stop";
+						}
 					$testRegions[] = Array(
 						"lat" => $i,
 						"lon" => $j,
@@ -151,7 +154,7 @@
 						"latdeltasize" => $latdeltasize,
 						"londeltasize" => $londeltasize,
 						"regionname" => $key,
-						"plan" => $plan . "<br><a href='". htmlspecialchars($url)."'>original plan</a>"
+						"plan" => $plan . "<br/><a href='". htmlspecialchars($url)."'>original plan</a>"
 					);
 					$regionTimes[] = $time;
 				}
@@ -163,25 +166,25 @@
 	}
 }
 if ($kml) {
-	$colorSteps = 18;
+	$colorSteps = 9;
 	//$minTime = min($regionTimes);
 	//$maxTime = max($regionTimes);
 	//$rangeTime = $maxTime - $minTime;
 	//$deltaTime = $rangeTime / $colorSteps;
-	$Gradients = Gradient("66FF00", "FF0000", $colorSteps);
+	$Gradients = Gradient(strrev("66FF00"), strrev("FF0000"), $colorSteps); // KML is BGR not RGB so strrev
 	foreach ($testRegions as $testRegion) {
 		//$band = (floor(($testRegion[time] - $minTime) / $deltaTime));
-		$band = (floor(($testRegion[time] / 10) *2));
+		$band = (floor($testRegion[time] / 10));
 		if ($band > $colorSteps) $band = $colorSteps;
 		echo "<Placemark>
   <name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name>
   <description> {$testRegion['plan']} </description>
     <Style>
         <PolyStyle>
-            <color>c7" . strrev($Gradients[$band]) . "</color>" . // 7f = 50% alpha, c7=78%, also KML is BGR not RGB
+            <color>c7" . $Gradients[$band] . "</color>" . // 7f = 50% alpha, c7=78%
 		"</PolyStyle>
         <LineStyle>
-            <color>c7" . strrev($Gradients[$band]) . "</color>" . "</LineStyle>
+            <color>c7" . $Gradients[$band] . "</color>" . "</LineStyle>
     </Style>
    <Polygon>
 <altitudeMode>relativeToGround</altitudeMode>

--- a/lib/staticmaplite/staticmap.php
+++ b/lib/staticmaplite/staticmap.php
@@ -32,11 +32,9 @@
 
 	protected $tileSize = 256;
 	protected $tileSrcUrl = array(	'mapnik' => 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png',
-									'osmarenderer' => 'http://c.tah.openstreetmap.org/Tiles/tile/{Z}/{X}/{Y}.png',
-									'cycle' => 'http://c.andy.sandbox.cloudmade.com/tiles/cycle/{Z}/{X}/{Y}.png'
-	);
-	
-	protected $tileDefaultSrc = 'mapnik';
+				      'cloudmade' => 'http://b.tile.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/1/256/{Z}/{X}/{Y}.png',);
+	
+	protected $tileDefaultSrc = 'cloudmade';
 	protected $markerBaseDir = 'images/markers';
 	protected $osmLogo = 'images/osm_logo.png';
 
@@ -258,8 +256,10 @@
 		} else {
 			// no cache, make map, send headers and deliver png
 			$this->makeMap();
-			$this->sendHeader();	
-			return imagepng($this->image);		
+		//	$this->sendHeader();
+			// do some extra compression
+			imagetruecolortopalette($this->image, false, 256);
+			return imagepng($this->image, 9, PNG_ALL_FILTERS);		
 			
 		}
 	}

--- a/routeList.php
+++ b/routeList.php
@@ -36,16 +36,16 @@
 		$suburb = filter_var($_REQUEST['suburb'], FILTER_SANITIZE_STRING);
 		$url = $APIurl . "/json/stopzonesearch?q=" . $suburb;
 		include_header("Routes by Suburb", "routeList");
-		trackEvent("Route Lists","Routes By Suburb", $suburb);
+		trackEvent("Route Lists", "Routes By Suburb", $suburb);
 	}
 	if ($_REQUEST['nearby']) {
 		$url = $APIurl . "/json/neareststops?lat={$_SESSION['lat']}&lon={$_SESSION['lon']}&limit=15";
 		include_header("Routes Nearby", "routeList", true, true);
-               timePlaceSettings(true);
-                if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") {
-                        include_footer();
-                        die();
-                }
+		timePlaceSettings(true);
+		if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") {
+			include_footer();
+			die();
+		}
 	}
 	$stops = json_decode(getPage($url));
 	$routes = Array();
@@ -63,7 +63,7 @@
 		echo '<li>' . $row[1] . ' <a href="trip.php?routeid=' . $row[0] . '">' . $row[2] . " (" . ucwords($row[4]) . ")</a></li>\n";
 	}
 }
-else if ($_REQUEST['bynumber']) {
+else if ($_REQUEST['bynumber'] || $_REQUEST['numberSeries']) {
 	include_header("Routes by Number", "routeList");
 	navbar();
 	echo ' <ul data-role="listview"  data-inset="true">';
@@ -87,25 +87,20 @@
 			$routeSeries[$seriesNum][$seriesNum . "-" . $row[1] . "-" . $row[0]] = $row;
 		}
 	}
-	ksort($routeSeries);
-	ksort($seriesRange);
-	echo '<div class="noscriptnav"> Go to route numbers: ';
-	foreach ($seriesRange as $series => $range) {
-		if ($range['min'] == $range['max']) echo "<a href=\"#$series\">$series</a>&nbsp;";
-		else echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a>&nbsp;";
+	if ($_REQUEST['bynumber']) {
+		ksort($routeSeries);
+		ksort($seriesRange);
+		foreach ($routeSeries as $series => $routes) {
+			echo '<li><a href="' . curPageURL() . 'routeList.php?numberSeries=' . $series . '">';
+			if ($series <= 9) echo $series;
+			else echo "{$seriesRange[$series]['min']}-{$seriesRange[$series]['max']}";
+			echo "</a></li>\n";
+		}
 	}
-	echo "</div>
-			<script>
-		$('.noscriptnav').hide();
-			</script>";
-	foreach ($routeSeries as $series => $routes) {
-		echo '<a name="' . $series . '"></a>';
-		if ($series <= 9) echo '<li>' . $series . "<ul>\n";
-		else echo "<li>{$seriesRange[$series]['min']}-{$seriesRange[$series]['max']}<ul>\n";
-		foreach ($routes as $row) {
+	else if ($_REQUEST['numberSeries']) {
+		foreach ($routeSeries[$_REQUEST['numberSeries']] as $row) {
 			echo '<li>' . $row[1] . ' <a href="trip.php?routeid=' . $row[0] . '">' . $row[2] . " (" . ucwords($row[3]) . ")</a></li>\n";
 		}
-		echo "</ul></li>\n";
 	}
 }
 else {
@@ -115,24 +110,18 @@
 	$url = $APIurl . "/json/routes";
 	$contents = json_decode(getPage($url));
 	// by destination!
-	foreach ($contents as $key => $row) {
+	foreach ($contents as $row) {
 		$routeDestinations[$row[2]][] = $row;
 	}
-	echo '<div class="noscriptnav"> Go to Destination: ';
-	foreach (ksort($routeDestinations) as $destination => $routes) {
-		echo "<a href=\"#$destination\">$destination</a>&nbsp;";
-	}
-	echo "</div>
-			<script>
-		$('.noscriptnav').hide();
-			</script>";
-	foreach ($routeDestinations as $destination => $routes) {
-		echo '<a name="' . $destination . '"></a>';
-		echo '<li>' . $destination . "... <ul>\n";
-		foreach ($routes as $row) {
+	if ($_REQUEST['routeDestination']) {
+		foreach ($routeDestinations[urldecode($_REQUEST['routeDestination'])] as $row) {
 			echo '<li>' . $row[1] . ' <a href="trip.php?routeid=' . $row[0] . '">' . $row[2] . " (" . ucwords($row[3]) . ")</a></li>\n";
 		}
-		echo "</ul></li>\n";
+	}
+	else {
+		foreach ($routeDestinations as $destination => $routes) {
+			echo '<li><a href="' . curPageURL() . 'routeList.php?routeDestination=' . urlencode($destination) . '">' . $destination . "... </a></li>\n";
+		}
 	}
 }
 echo "</ul>\n";

--- a/schedule_viewer.py
+++ b/schedule_viewer.py
@@ -316,8 +316,19 @@
         except:
           print "Error for GetStartTime of trip #" + t.trip_id + sys.exc_info()[0]
         else:
-            result.append ( (starttime, t.trip_id) )
-    return sorted(result, key=lambda trip: trip[0])
+          cursor = t._schedule._connection.cursor()
+          cursor.execute(
+              'SELECT arrival_secs,departure_secs FROM stop_times WHERE '
+              'trip_id=? ORDER BY stop_sequence DESC LIMIT 1', (t.trip_id,))
+          (arrival_secs, departure_secs) = cursor.fetchone()
+          if arrival_secs != None:
+            endtime = arrival_secs
+          elif departure_secs != None:
+            endtime = departure_secs
+          else:
+            endtime =0
+          result.append ( (starttime, t.trip_id, endtime) )
+    return sorted(result, key=lambda trip: trip[2])
   
   def handle_json_GET_triprows(self, params):
     """Return a list of rows from the feed file that are related to this

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -32,8 +32,15 @@
 	$stopid = $stops[0][0];
 	$stopLinks.= "Individual stop pages: ";
 	foreach ($stops as $key => $sub_stop) {
-		$stopNames[$key] = $sub_stop[1] . ' Stop #' . ($key + 1);
-		$stopLinks.= '<a href="stop.php?stopid=' . $sub_stop[0] . '&stopcode=' . $sub_stop[5] . '">' . $stopNames[$key] . '</a> ';
+	//	$stopNames[$key] = $sub_stop[1] . ' Stop #' . ($key + 1);
+        if (strpos($stop[1],
+                   "Station")) {
+		$stopNames[$key] = 'Platform ' . ($key + 1);
+		$stopLinks.= '<a href="stop.php?stopid=' . $sub_stop[0] . '&stopcode=' . $sub_stop[5] . '">' . $sub_stop[1] . '</a> ';  
+        }         else {
+		$stopNames[$key] = '#' . ($key + 1);
+		$stopLinks.= '<a href="stop.php?stopid=' . $sub_stop[0] . '&stopcode=' . $sub_stop[5] . '">' . $sub_stop[1] . ' Stop #' . ($key + 1) . '</a> ';
+        }
 		$stopPositions[$key] = Array(
 			$sub_stop[2],
 			$sub_stop[3]
@@ -66,6 +73,7 @@
 }
 echo '  <ul data-role="listview"  data-inset="true">';
 if (sizeof($allStopsTrips) > 0) {
+    sksort($allStopsTrips,0, $true);
 	$trips = $allStopsTrips;
 }
 else {
@@ -76,7 +84,7 @@
 	echo '<li>';
 	echo '<h3><a href="trip.php?stopid=' . $stopid . '&tripid=' . $row[1][0] . '">' . $row[1][1];
         $viaPoints = viaPointNames($row[1][0], $stopid);
-        if ($viaPoints != "") echo '<div class="viaPoints">Via: ' . $viaPoints . '</div>';
+        if ($viaPoints != "") echo '<br><span class="viaPoints">Via: ' . $viaPoints . '</span>';
 	if (sizeof($tripStopNumbers) > 0) {
             echo '<br><small>Boarding At: ';
             foreach ($tripStopNumbers[$row[1][0]] as $key) {

file:a/trip.php -> file:b/trip.php
--- a/trip.php
+++ b/trip.php
@@ -9,7 +9,7 @@
 	$url = $APIurl . "/json/routetrips?route_id=" . $routeid;
 	$routetrips = json_decode(getPage($url));
 	foreach ($routetrips as $trip) {
-		if ($trip[0] > midnight_seconds()) {
+		if ($trip[2] > midnight_seconds()) {
 			$tripid = $trip[1];
 			break;
 		}