Don't show letters in lists that don't have entries
Don't show letters in lists that don't have entries

file:a/about.php -> file:b/about.php
--- a/about.php
+++ b/about.php
@@ -35,7 +35,8 @@
     Some icons by Joseph Wain / glyphish.com<br />
     Native clients also available for iPhone(<a href="http://itunes.apple.com/au/app/cbrtimetable/id444287349?mt=8">cbrTimetable by Sandor Kolotenko</a>
     , <a href="http://itunes.apple.com/au/app/act-buses/id376634797?mt=8">ACT Buses by David Sullivan</a>) 
-    , Android (<a href="https://market.android.com/details?id=com.action">MyBus 2.0 by Imagine Team</a>) 
+    , Android (<a href="https://market.android.com/details?id=com.action">MyBus 2.0 by Imagine Team</a>, <A href="https://market.android.com/details?id=GetMe2CanberraFree.source">GetMe2 Canberra by
+Colin Thompson </a>) 
     and Windows Phone 7 (<a href="http://www.windowsphone.com/en-AU/apps/d840375e-429c-4aa4-a358-80eec6ea9e66">TransHub Canberra by Soul Solutions</a>) Other web clients include <a href="http://canberra.itranzit.com/option.html">iTranzit</a>.
     <br />
     GTFS-realtime API:

--- a/include/common-request.inc.php
+++ b/include/common-request.inc.php
@@ -57,11 +57,14 @@
 if (isset($_REQUEST['stopids'])) {
     $stopids = explode(",", filter_var($_REQUEST['stopids'], FILTER_SANITIZE_STRING));
 }
-if (isset($_REQUEST['routeids'])) {
-    $routeids = explode(",", filter_var($_REQUEST['routeids'], FILTER_SANITIZE_STRING));
-}
 if (isset($_REQUEST['tripid'])) {
     $tripid = filter_var($_REQUEST['tripid'], FILTER_SANITIZE_STRING);
+}
+if (isset($_REQUEST['routeid'])) {
+    $routeid = filter_var($_REQUEST['routeid'], FILTER_SANITIZE_STRING);
+}
+if (isset($_REQUEST['directionid'])) {
+    $directionid = filter_var($_REQUEST['directionid'], FILTER_SANITIZE_STRING);
 }
 if (isset($_REQUEST['stopid'])) {
     $stopid = filter_var($_REQUEST['stopid'], FILTER_SANITIZE_NUMBER_INT);

--- a/include/common-session.inc.php
+++ b/include/common-session.inc.php
@@ -61,8 +61,10 @@
 }
 
 //debug(print_r($_SESSION, true) , "session");
-function current_time() {
-    return ($_REQUEST['time'] ? $_REQUEST['time'] : date("H:i:s"));
+function current_time($time = "") {
+    if ($_REQUEST['time']) return $_REQUEST['time'];
+    else if ($time != "") date("H:i:s",$time);
+    else return date("H:i:s");
 }
 
 ?>

--- a/include/common-template.inc.php
+++ b/include/common-template.inc.php
@@ -175,7 +175,7 @@
         <div data-role="content"> ';
         if ($GTFSREnabled) {
         $overrides = getServiceOverride();
-        if ($overrides['service_id']) {
+        if (isset($overrides['service_id'])) {
             if ($overrides['service_id'] == "noservice") {
                 echo '<div id="servicewarning">Buses are <strong>not running today</strong> due to industrial action/public holiday. See <a 
 href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>';

--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -20,20 +20,21 @@
     'saturday',
     'weekday'
 );
-function service_period_day ($spid) {
-    $idParts = explode("-",$spid);
-        return strtolower($idParts[2]);
-}
+
 function service_period($date = "") {
 
-    if (isset($_REQUEST['service_period']))
+    if (isset($_REQUEST['service_period'])) {
         return $_REQUEST['service_period'];
+    }
+
     $override = getServiceOverride($date);
-    if ($override['service_id']) {
-        return service_period_day ($override['service_id']);
-    }
-
-    switch (date('w', ($date != "" ? $date : time()))) {
+    if (isset($override['service_id'])) {
+        return strtolower($override['service_id']);
+    }
+    $date = ($date != "" ? $date : time());
+    $dow = date('w', $date);
+
+    switch ($dow) {
         case 0:
             return 'sunday';
         case 6:
@@ -42,19 +43,28 @@
             return 'weekday';
     }
 }
-function service_ids($service_period) {
+
+function service_ids($service_period, $date = "") {
     switch ($service_period) {
         case 'sunday':
-            return Array("2010-TUGGSUN-Sunday-20","2010-BELCSUN-Sunday-19");
+            return Array("Sunday", "Sunday");
         case 'saturday':
-            return Array("2010-BELCSAT-Saturday-19","2010-TUGGSAT-Saturday-19");
+            return Array("Saturday", "Saturday");
         default:
-            //return 'weekday';
-            return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14"); 
-    }
-}
+            $date = ($date != "" ? $date : time());
+// school holidays
+            $ymd = date('Ymd', $date);
+            $dow = date('w', $date);
+            if (intval($ymd) < "20120203" && $dow != 0 && $dow != 6) {
+                return Array("Weekday-SchoolVacation", "Weekday-SchoolVacation");
+            } else {
+                return Array("Weekday", "Weekday");
+            }
+    }
+}
+
 function valid_service_ids() {
-    return array_merge(service_ids(""),service_ids('saturday'),service_ids('sunday'));
+    return array_merge(service_ids(""), service_ids('saturday'), service_ids('sunday'));
 }
 
 function midnight_seconds($time = "") {

--- a/include/db/route-dao.inc.php
+++ b/include/db/route-dao.inc.php
@@ -61,8 +61,8 @@
     }
     return $query->fetchAll();
 }
-function getRouteDescription($routeID) {
-    $trip = getRouteNextTrip($routeID);
+function getRouteDescription($routeID, $directionID) {
+    $trip = getRouteNextTrip($routeID, $directionID);
     $start = getTripStartingPoint($trip['trip_id']); 
     $end = getTripDestination($trip['trip_id']);
     return "From ".$start['stop_name']." to ".$end['stop_name'];
@@ -86,30 +86,6 @@
     $query = "Select * from routes order by route_short_name;";
     debug($query, "database");
     $query = $conn->prepare($query);
-    $query->execute();
-    if (!$query) {
-        databaseError($conn->errorInfo());
-        return Array();
-    }
-    return $query->fetchAll();
-}
-
-function getRoutesByNumber($routeNumber = "", $directionID = "",$service_period = "") {
-    global $conn;
-    if ($routeNumber != "") {
-        $query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes  join trips on trips.route_id =
-routes.route_id join stop_times on stop_times.trip_id = trips.trip_id
-where route_short_name = :routeNumber OR route_short_name LIKE :routeNumber2 order by route_short_name;";
-    } else {
-        $query = "SELECT DISTINCT route_short_name from routes order by route_short_name";
-    }
-    debug($query, "database");
-    $query = $conn->prepare($query);
-    if ($routeNumber != "") {
-        $query->bindParam(":routeNumber", $routeNumber);
-        $routeNumber2 = "% " . $routeNumber;
-        $query->bindParam(":routeNumber2", $routeNumber2);
-    }
     $query->execute();
     if (!$query) {
         databaseError($conn->errorInfo());
@@ -141,16 +117,21 @@
     return $query->fetchAll();
 }
 
-function getRouteNextTrip($routeID) {
+function getRouteNextTrip($routeID, $directionID) {
     global $conn;
    
-    $query = "select routes.route_id,direction_id,trips.trip_id,departure_time from routes join trips on trips.route_id = routes.route_id
-join stop_times on stop_times.trip_id = trips.trip_id where  arrival_time > :currentTime and routes.route_id = :routeID order by
+    $query = "select routes.route_id,direction_id,trips.trip_id,trip_headsign,departure_time from routes join trips on trips.route_id = routes.route_id
+join stop_times on stop_times.trip_id = trips.trip_id where  arrival_time between :currentTime and :futureTime 
+and routes.route_id = :routeID and trips.direction_id = :directionID order by
 arrival_time limit 1";
     debug($query, "database");
     $query = $conn->prepare($query);
     $query->bindParam(":currentTime", current_time());
+    $futureTime = current_time(strtotime(current_time() ." +2h"));
+    if (date("h",strtotime(current_time()) > 22)) $futureTime = "23:59:59";
+        $query->bindParam(":futureTime", $futureTime);
     $query->bindParam(":routeID", $routeID);
+    $query->bindParam(":directionID", $directionID);
     $query->execute();
     databaseError($conn->errorInfo());
     if (!$query) {
@@ -158,15 +139,21 @@
         return Array();
     }
     $r = $query->fetch(PDO :: FETCH_ASSOC);
-
-    // past last trip of the day special case
-    if (sizeof($r) < 16) {
-        $query = "select * from routes join trips on trips.route_id = routes.route_id
-join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID order by
+    return $r;
+}
+
+function getRouteFirstTrip($routeID,$directionID) {
+       global $conn;
+       
+       $query = "select * from routes join trips on trips.route_id = routes.route_id
+join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID 
+and trips.direction_id = :directionID order by
 arrival_time DESC limit 1";
         debug($query, "database");
         $query = $conn->prepare($query);
         $query->bindParam(":routeID", $routeID);
+        
+    $query->bindParam(":directionID", $directionID);
         $query->execute();
         if (!$query) {
             databaseError($conn->errorInfo());
@@ -174,12 +161,11 @@
         }
 
         $r = $query->fetch(PDO :: FETCH_ASSOC);
-    }
-    return $r;
-}
-
-function getRouteAtStop($routeID, $stop_id) {
-    $nextTrip = getRouteNextTrip($routeID);
+        return $r;
+}
+
+function getRouteAtStop($routeID, $directionID, $stop_id) {
+    $nextTrip = getRouteNextTrip($routeID, $directionID);
     if ($nextTrip['trip_id']) {
         foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) {
             if ($tripStop['stop_id'] == $stop_id)
@@ -189,7 +175,7 @@
     return Array();
 }
 
-function getRoutesTrips($routeIDs, $directionID = "", $service_period = "") {
+function getRouteTrips($routeID, $directionID = "", $service_period = "") {
     global $conn;
     if ($service_period == "")
         $service_period = service_period();
@@ -201,12 +187,11 @@
         $directionSQL = " and direction_id = :directionID ";
     $query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id
 join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB)
-AND (routes.route_id = :routeIDA OR routes.route_id = :routeIDB) " . $directionSQL . " and stop_sequence = '1' order by
+AND (routes.route_id = :routeID) " . $directionSQL . " and stop_sequence = '1' order by
 arrival_time ";
     debug($query, "database");
     $query = $conn->prepare($query);
-    $query->bindParam(":routeIDA", $routeIDs[0]);
-    $query->bindParam(":routeIDB", $routeIDs[1]);
+    $query->bindParam(":routeID", $routeID);
     $query->bindParam(":service_periodA", $sidA);
     $query->bindParam(":service_periodB", $sidB);
     if ($directionSQL != "")
@@ -290,7 +275,7 @@
     if ($limit != "")
         $limitSQL = " LIMIT :limit ";
     global $conn;
-    $query = "SELECT service_id,trips.route_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id,
+    $query = "SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id,
         min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance
 FROM stop_times
 join trips on trips.trip_id = stop_times.trip_id
@@ -298,7 +283,7 @@
 join stops on stops.stop_id = stop_times.stop_id
 WHERE (service_id=:service_periodA OR service_id=:service_periodB)
 AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE)
-        group by service_id,trips.route_id,route_short_name,route_long_name
+        group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name
         order by distance $limitSQL";
     debug($query, "database");
     $query = $conn->prepare($query);

--- a/include/db/stop-dao.inc.php
+++ b/include/db/stop-dao.inc.php
@@ -46,7 +46,7 @@
         }
     }
     $query .= " order by stop_name;";
-    debug($query,"database");
+    debug($query, "database");
     $query = $conn->prepare($query);
     if ($firstLetter != "")
         $query->bindParam(":firstLetter", $firstLetter);
@@ -167,16 +167,16 @@
     if ($service_period == "") {
         $service_period = service_period();
     }
-        $service_ids = service_ids($service_period);
+    $service_ids = service_ids($service_period);
     $sidA = $service_ids[0];
     $sidB = $service_ids[1];
     $limitSQL = "";
     if ($limit != "")
         $limitSQL .= " LIMIT :limit ";
-        
+
     global $conn;
     if ($afterTime != "") {
-        $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,end_times.arrival_time as end_time
+        $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,trips.trip_headsign,route_short_name,route_long_name,end_times.arrival_time as end_time
 FROM stop_times
 join trips on trips.trip_id =
 stop_times.trip_id
@@ -184,7 +184,7 @@
 	WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times 
 WHERE stop_times.stop_id = :stopID
 AND stop_times.trip_id = end_times.trip_id
-AND (service_id=:service_periodA OR service_id=:service_periodB) ".($route_short_name != "" ? " AND route_short_name = :route_short_name ":"")." 
+AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " 
 AND end_times.arrival_time > :afterTime
 ORDER BY end_time $limitSQL";
     } else {
@@ -194,7 +194,7 @@
 stop_times.trip_id
 join routes on trips.route_id = routes.route_id
 WHERE stop_times.stop_id = :stopID
-AND (service_id=:service_periodA OR service_id=:service_periodB) ".($route_short_name != "" ? " AND route_short_name = :route_short_name ":"")." 
+AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " 
 ORDER BY arrival_time $limitSQL";
     }
     debug($query, "database");

file:a/index.php -> file:b/index.php
--- a/index.php
+++ b/index.php
@@ -20,7 +20,7 @@
 <div data-role="page">
     <div data-role="content">
         <div id="jqm-homeheader">
-            <h1>busness time</h1><br><small>Canberra Bus Timetables and Trip Planner</small>
+            <h1>busness time</h1><br><small>Canberra Bus Timetables and Trip Planner</small> 
         </div> 
         <a name="maincontent" id="maincontent"></a>
         <a href="tripPlanner.php" data-role="button" data-icon="navigation">Launch Trip Planner...</a>
@@ -37,9 +37,9 @@
             <li><a href="routeList.php?bysuburbs=yes">Routes By Suburb</a></li>
             <li><a class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li>
         </ul>
+        <a href="labs/index.php" data-role="button" data-icon="beaker">Busness R&amp;D</a>
+        <a href="myway/index.php" data-role="button">MyWay Balance and Timeliness Survey Results</a>
         <?php
-        echo ' <a href="labs/index.php" data-role="button" data-icon="beaker">Busness R&amp;D</a>';
-        echo ' <a href="myway/index.php" data-role="button">MyWay Balance and Timeliness Survey Results</a>';
         include_footer(true)
         ?>
 

--- a/myway/myway_api.json.php
+++ b/myway/myway_api.json.php
@@ -84,6 +84,9 @@
     curl_setopt($ch, CURLOPT_REFERER, "https://www.transport.act.gov.au/ARTS/getbalance.asp");
     curl_setopt($ch, CURLOPT_HEADER, 0);
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+    // ssl ignore
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
     //execute post
     $pageHTML = curl_exec($ch);
     if (curl_errno($ch))

--- a/myway/myway_timeliness.php
+++ b/myway/myway_timeliness.php
@@ -41,8 +41,18 @@
 $labels = Array();
 $lastRoute = "";
 foreach ($query->fetchAll() as $delta) {
+      /*$routeIDParts = explode(" ",$delta['route_name']);
+    $routeNumber = $routeIDParts[0];
+    $routeDirection = $routeIDParts[1];
+    if (preg_match('/31./',$routeName)) {
+        $routeName = "312-319"." ".$routeDirection;
+    } else {
+        $routeName = $delta['route_name'];
+    }*/
+    
     $routeName = $delta['route_name'];
-    if (preg_match('/z/',$routeName)) {
+    
+    if (preg_match('/31./',$routeName)) {
         $routeName = "312-319";
     } else {
         $routeName = preg_replace('/\D/', '', $routeName);

--- a/myway/myway_timeliness_calculate.php
+++ b/myway/myway_timeliness_calculate.php
@@ -58,10 +58,18 @@
     $search_time = date("H:i:s", strtotime($obsv['time']) - (60 * 60)); // 30 minutes margin
     $date = date("c", strtotime($obsv['time']));
     $timing_period = service_period(strtotime($date));
+    
+    // little hack for public holidays nolonger active; weekdays and 900+ route numbers don't make sense
+    if ($timing_period == "weekday" && preg_match('/9../',$obsv["route_short_name"]))  {
+        echo "Potential public holiday detected, trying Sunday timetable.<br>";
+        
+        $timing_period = "sunday";
+    }
+    
     if (isset($obsv["stop_id"]) && $obsv["stop_id"] != "" && $obsv["stop_id"] != "*") {
     $potentialStops = Array(getStop($obsv["stop_id"]));
     } else {
-        echo "Potential stops are a bus station<br>";
+        echo "No stop_id recorded for this stop_name, potential stops are a bus station<br>";
         $potentialStops = getStops("",  trim(str_replace(Array("Arrival","Arrivals","Arrive Platform 3 Set down only.","Arrive","Set Down Only"), "", $obsv["myway_stop"])));
     }
     //:get myway_stops records
@@ -110,7 +118,7 @@
                                 "timeDiff" => $timeDiff,
                                 "stop_id" => $potentialStop['stop_id'],
                                 "stop_sequence" => $trip['stop_sequence'],
-                                "route_name" => "{$trip['route_short_name']} {$trip['route_long_name']} {$trip['direction']}",
+                                "route_name" => "{$trip['route_short_name']} {$trip['trip_headsign']}",
                                 "route_id" => $trip['route_id']
                             );
                             echo "Found trip {$trip['trip_id']} at stop {$potentialStop['stop_id']} (#{$potentialStop['stop_name']}, sequence #{$trip['stop_sequence']})<br>";

--- a/routeList.php
+++ b/routeList.php
@@ -32,38 +32,35 @@
 }
 
 function displayRoutes($routes) {
-    global $nearby;
     echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
-    $filteredRoutes = Array();
     foreach ($routes as $route) {
         foreach (getRouteHeadsigns($route['route_id']) as $headsign) {
-            $start = $headsign['stop_name'];
-            $serviceday = service_period_day($headsign['service_id']);
-            $key = $route['route_short_name'] . "." . $headsign['direction_id'];
-            if (isset($filteredRoutes[$key])) {
-                $filteredRoutes[$key]['route_ids'][] = $route['route_id'];
-                $filteredRoutes[$key]['route_ids'] = array_unique($filteredRoutes[$key]['route_ids']);
-            } else {
-                $filteredRoutes[$key]['route_short_name'] = $route['route_short_name'];
-                $filteredRoutes[$key]['route_long_name'] = "starting at " . $start;
-                $filteredRoutes[$key]['service_id'] = $serviceday;
-                $filteredRoutes[$key]['trip_headsign'] = $headsign['trip_headsign'].(strstr($headsign['trip_headsign'], "bound") ===false ?"bound":"");
-                $filteredRoutes[$key]['direction_id'] = $headsign['direction_id'];
-                if (isset($nearby)) {
-                    $filteredRoutes[$key]['distance'] = $route['distance'];
-                }
-            }
+
+            //print_r($route);
+            echo '<li> <a href="trip.php?routeid=' . $route['route_id'] . '&directionid=' . $headsign['direction_id'] . '"><h3>' . $route['route_short_name'] . "</h3>
+                   
+                <p>" . $headsign['trip_headsign'] . (strstr($headsign['trip_headsign'], "bound") === false ? "bound" : "") . ", starting at " . $headsign['stop_name'] . " (" . ucwords($headsign['service_id']) . ")</p>";
+
+            echo"       </a></li>\n";
         }
     }
-    foreach ($filteredRoutes as $key => $route) {
-        echo '<li> <a href="trip.php?routeids=' . implode(",", $route['route_ids']) . '&directionid=' . $route['direction_id'] . '"><h3>' . $route['route_short_name'] . "</h3>
+}
+
+function displayNearbyRoutes($routes) {
+    echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
+    foreach ($routes as $route) {
+        $time = getRouteAtStop($route['route_id'], $route['direction_id'], $route['stop_id']);
+ $start = getTripStartingPoint($time['trip_id']); 
+    $end = getTripDestination($time['trip_id']);
+        //print_r($route);
+        echo '<li> <a href="trip.php?routeid=' . $route['route_id'] . '&directionid=' . $route['direction_id'] . '"><h3>' . $route['route_short_name'] . "</h3>
                    
-                <p>" . $route['trip_headsign'].", ".  $route['route_long_name'] . " (" . ucwords($route['service_id']) . ")</p>";
-        if (isset($nearby)) {
-            $time = getRouteAtStop($route['route_id'], $route['stop_id']);
-            echo '<span class="ui-li-count">' . ($time['arrival_time'] ? $time['arrival_time'] : "No more trips today") . "<br>" . floor($route['distance']) . 'm away</span>';
-        }
-        echo"       </a></li>\n";
+                <p>" . $time['trip_headsign'] . (strstr($time['trip_headsign'], "bound") === false ? "bound" : "") . " from ".$start['stop_name']." to ".$end['stop_name'] . " (" . ucwords($time['service_id']) . ")</p>";
+        $stop = getStop($route['stop_id']);
+echo "<p>Board at ".$stop['stop_name']."</p>";
+        echo '<span class="ui-li-count">' . ($time['arrival_time'] ? $time['arrival_time'] : "No more trips today") . "<br>" . floor($route['distance']) . 'm away</span>';
+        
+    echo"       </a></li>\n";
     }
 }
 
@@ -106,7 +103,7 @@
 
 
     if (sizeof($routes) > 0) {
-        displayRoutes($routes);
+        displayNearbyRoutes($routes);
     } else {
         echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
         echo "<li style='text-align: center;'> No routes nearby.</li>";
@@ -116,7 +113,7 @@
     navbar();
     echo ' <ul data-role="listview"  data-inset="true">';
     if (isset($bynumber)) {
-        $routes = getRoutesByNumber();
+        $routes = getRoutes();
         $routeSeries = Array();
         $seriesRange = Array();
         foreach ($routes as $key => $routeNumber) {

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -73,8 +73,12 @@
         //}
     }
 }
-include_header($stop['stop_name'], "stop");
-
+if (sizeof($stops) > 0) {
+$stopDescParts = explode("<br>",$stop['stop_desc']);
+include_header(trim(str_replace("Street: ","",$stopDescParts[0])), "stop");
+} else {
+    include_header($stop['stop_name']);
+}
 /* $serviceAlerts = json_decode(getPage(curPageURL() . "/servicealerts_api.php?filter_class=stop&filter_id=".$stopid) , true);
 
   foreach($serviceAlerts['entities'] as $serviceAlert) {
@@ -106,22 +110,29 @@
 } else {
     $trips = getStopTripsWithTimes($stopid);
 }
+
 echo "<div class='ui-header' style='overflow: visible; height: 2.5em'>";
+// if we have too many trips, cut down to size.
+if (sizeof($trips) > 10) {
+    $trips = array_splice($trips, 0,10);
+}
+    
 // later/earlier button setup
 if (sizeof($trips) == 0) {
     $time = isset($_REQUEST['time']) ? strtotime($_REQUEST['time']) : time();
     $earlierTime = $time - (90 * 60);
     $laterTime = $time + (90 * 60);
 } else {
-    $earlierTime = strtotime($trips[0]['arrival_time']) - (90 * 60);
-    $laterTime = strtotime($trips[sizeof($trips) - 1]['arrival_time']) - 60;
+    $tripsKeys = array_keys($trips);
+    $earlierTime = strtotime($trips[$tripsKeys[0]]['arrival_time']) - (90 * 60);
+    $laterTime = strtotime($trips[$tripsKeys[sizeof($trips) - 1]]['arrival_time']) - 60;
 }
 if (sizeof($stopids) > 0) {
     $stopidurl = "stopids=" . implode(",", $stopids);
 } else {
     $stopidurl = "stopid=$stopid";
 }
-if (sizeof($trips) > 10) {
+if (sizeof($trips) >= 10) {
     echo '<a href="stop.php?' . $stopidurl . '&service_period=' . service_period() . '&time=' . date("H:i", $laterTime) . '" data-icon="arrow-r" class="ui-btn-right">Later Trips</a>';
 }
 echo '<a href="stop.php?' . $stopidurl . '&service_period=' . service_period() . '&time=' . date("H:i", $earlierTime) . '" data-icon="arrow-l" class="ui-btn-left">Earlier Trips</a>';
@@ -133,7 +144,7 @@
         echo '<li>';
 
         $destination = getTripDestination($trip['trip_id']);
-        echo '<a href="trip.php?stopid=' . $stopid . '&amp;tripid=' . $trip['trip_id'] . '"><h3>' . $trip['route_short_name'] . " towards " . $destination['stop_name'] . "</h3><p>";
+        echo '<a href="trip.php?stopid=' . $stopid . '&amp;tripid=' . $trip['trip_id'] . '"><h3>'. $trip['route_short_name'] . " towards " . $destination['stop_name'] . "</h3><p>";
         $viaPoints = viaPointNames($trip['trip_id'], $trip['stop_sequence']);
         if ($viaPoints != "")
             echo '<br><span class="viaPoints">Via: ' . $viaPoints . '</span>';

--- a/stopList.php
+++ b/stopList.php
@@ -36,8 +36,8 @@
     navbar();
     echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
     if (!isset($firstLetter)) {
-        foreach (range('A', 'Z') as $letter) {
-            echo "<li><a href=\"stopList.php?firstLetter=$letter&amp;bysuburbs=yes\">$letter...</a></li>\n";
+        foreach (range('A', 'Y') as $letter) { // no suburbs start with J, Q, U, V, X or Z
+            if ($letter != "J" && $letter != "Q" && $letter != "U" && $letter != "V" && $letter != "X") echo "<li><a href=\"stopList.php?firstLetter=$letter&amp;bysuburbs=yes\">$letter...</a></li>\n";
         }
     } else {
         foreach ($suburbs as $suburb) {
@@ -86,9 +86,9 @@
         navbar();
     } 
     echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
-    if (!isset($firstLetter) && !isset($suburb) && !isset($nearby)) {
-        foreach (range('A', 'Z') as $letter) {
-            echo "<li><a href=\"stopList.php?firstLetter=$letter&amp;$listType\">$letter...</a></li>\n";
+    if (!isset($firstLetter) && !isset($suburb) && !isset($nearby)) { // all stops by letter
+        foreach (range('A', 'Y') as $letter) { // no streets start with X or Z
+            if ($letter != "X") echo "<li><a href=\"stopList.php?firstLetter=$letter&amp;$listType\">$letter...</a></li>\n";
         }
     } else {
         //var_dump($stops);

file:a/trip.php -> file:b/trip.php
--- a/trip.php
+++ b/trip.php
@@ -17,25 +17,19 @@
  */
 include ('include/common.inc.php');
 $routetrips = Array();
-if (isset($routeids) && !isset($tripid)) {
-    foreach ($routeids as $routeid) {
-        $possibleTrip = getRouteNextTrip($routeid);
-        if (!isset($trip) || strtotime($possibleTrip['departure_time']) < strtotime($trip['departure_time'])) {
-            $trip = getRouteNextTrip($routeid);
-        }
+if (isset($routeid) && !isset($tripid)) {
+    $trip = getRouteNextTrip($routeid,$directionid);
+    
+    if (!($trip)) {
+        $trip = getRouteFirstTrip($routeid,$directionid);
     }
     $tripid = $trip['trip_id'];
 } else {
     $trip = getTrip($tripid);
-    $similarRoutes = getRoutesByNumber($trip['route_short_name'], $trip['direction_id'], service_period_day($trip["service_id"]));
-    $routeids = Array();
-    foreach ($similarRoutes as $similarRoute) {
-        $routeids[] = $similarRoute['route_id'];
-    }
-    $routeids = array_unique($routeids);
+    $routeid = $trip['route_id'];
 }
 $directionid = $trip['direction_id'];
-$service_period = service_period_day($trip["service_id"]);
+$service_period = strtolower($trip["service_id"]);
 $destination = getTripDestination($trip['trip_id']);
 include_header("Stops on " . $trip['route_short_name'] . ' ' . $destination['stop_name'], "trip");
 trackEvent("Route/Trip View", "View Route", $trip['route_short_name'] . ' ' . $destination['stop_name'], $routeid);
@@ -43,49 +37,30 @@
 echo '<a href="' . $trip['route_url'] . '">View Original Timetable/Map</a>';
 echo '<h2>Via:</h2> <small>' . viaPointNames($tripid) . '</small>';
 echo '<h2>Other Trips:</h2> ';
-echo "getRoutesTrips(".print_r($routeids,true).", {$trip['direction_id']}, $service_period)  $tripid";
-$routeTrips = getRoutesTrips($routeids, $trip['direction_id'], $service_period);
+$routeTrips = getRouteTrips($routeid, $trip['direction_id'], $service_period);
 foreach ($routeTrips as $key => $othertrip) {
-   // if ($othertrip['trip_id'] != $tripid) {
-        echo '<a href="trip.php?tripid=' . $othertrip['trip_id']