Ensure all variables are initialised in nearby routes codepath
Ensure all variables are initialised in nearby routes codepath

file:a/about.php -> file:b/about.php
--- a/about.php
+++ b/about.php
@@ -34,7 +34,7 @@
     <br />
     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>) 
+    , <a href="http://itunes.apple.com/au/app/act-buses/id376634797?mt=8">ACT Buses by David Sullivan</a>, <a href="http://itunes.apple.com/app/bus-trips-act/id489146525?mt=8">Bus Trips ACT by Molson Chengalath</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>.

--- a/aws/busuidb.sh
+++ b/aws/busuidb.sh
@@ -7,7 +7,8 @@
 psql -d transitdata -f /var/www/transitdata.cbrfeed.sql
 #createuser transitdata -SDRP
 #password transitdata
-#psql -d transitdata -c "GRANT SELECT ON TABLE agency,calendar,calendar_dates,routes,stop_times,stops,trips TO transitdata;"
+#psql -d transitdata -c "GRANT SELECT ON TABLE agency,calendar,calendar_dates,routes,stop_times,stops,trips\
+#,servicealerts_alerts,servicealerts_informed TO transitdata;"
 #psql -d transitdata -c "GRANT SELECT,INSERT ON	TABLE myway_observations,myway_routes,myway_stops,myway_timingdeltas TO transitdata;"
 #psql -d transitdata -c	"GRANT SELECT,INSERT,UPDATE ON TABLE myway_routes,myway_stops TO transitdata;"
 ##psql -d transitdata -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO transitdata;"
@@ -15,3 +16,4 @@
 ##SELECT '', 'public', 'shapes', 'shape_pt', ST_CoordDim(shape_pt), ST_SRID(shape_pt), GeometryType(shape_pt)
 ##FROM shapes LIMIT 1;
 php /var/www/updatedb.php
+

--- a/geo/route.kml.php
+++ b/geo/route.kml.php
@@ -1,4 +1,5 @@
 <?php
+
 header('Content-Type: application/vnd.google-earth.kml+xml');
 include ('../include/common.inc.php');
 echo '<?xml version="1.0" encoding="UTF-8"?>
@@ -14,15 +15,15 @@
       </PolyStyle>
 	</Style>';
 $route = getRoute($routeid);
- echo "\n<Placemark>\n";
- $link = curPageURL()."/../trip.php?routeid=".htmlspecialchars ($route["route_id"]);
- echo "<name>".$route['route_short_name']."</name>";
-  echo '<atom:link href="'.$link.'"/>';
- echo '<description><![CDATA[ <a href="'.$link.'">'.$route['route_short_name']." ".$route['route_long_name']."</a>]]> </description>";
+echo "\n<Placemark>\n";
+
+$link = curPageURL() . "/../trip.php?routeid=" . htmlspecialchars($route["route_id"]);
+echo "<name>" . $route['route_short_name'] . "</name>";
+echo '<atom:link href="' . $link . '"/>';
+echo '<description><![CDATA[ <a href="' . $link . '">' . $route['route_short_name'] . " " . $route['route_long_name'] . "</a>]]> </description>";
 echo "<styleUrl>#yellowLineGreenPoly</styleUrl>";
-
-	$trip = getRouteNextTrip($routeid);
-	echo getTripShape($trip['trip_id']);
+$trip = getRouteNextTrip($routeid);
+echo getTripShape($trip['trip_id']);
 
 echo "</Placemark>\n</Document></kml>\n";
 ?>

--- a/geo/stops.kml.php
+++ b/geo/stops.kml.php
@@ -1,11 +1,11 @@
 <?php

+header('Content-type: application/vnd.google-earth.kml+xml');

 include ('../include/common.inc.php');

-header('Content-type: application/vnd.google-earth.kml+xml');

 //http://wiki.openstreetmap.org/wiki/OpenLayers_Dynamic_KML

 // Creates the KML/XML Document.

 $dom = new DOMDocument('1.0', 'UTF-8');

 // Creates the root KML element and appends it to the root document.

-$node = $dom->createElementNS('http://earth.google.com/kml/2.1', 'kml');

+$node = $dom->createElementNS('http://www.opengis.net/kml/2.2', 'kml');

 $parNode = $dom->appendChild($node);

 // Creates a KML Document element and append it to the KML element.

 $dnode = $dom->createElement('Document');

@@ -13,7 +13,7 @@
 if ($suburb != "") $result_stops = getStopsBySuburb($suburb);

 else $result_stops = getStops();

 foreach ($result_stops as $stop) {

-	$description = 'http://bus.lambdacomplex.org/' . 'stop.php?stopid=' . $stop['stop_id'] . " <br>";

+	$description = baseURL() . 'stop.php?stopid=' . $stop['stop_id'] . " <br>";

 	// Creates a Placemark and append it to the Document.

 	$node = $dom->createElement('Placemark');

 	$placeNode = $docNode->appendChild($node);


file:b/geo/trip.kml.php (new)
--- /dev/null
+++ b/geo/trip.kml.php
@@ -1,1 +1,31 @@
+<?php
 
+header('Content-Type: application/vnd.google-earth.kml+xml');
+include ('../include/common.inc.php');
+echo '<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"><Document>';
+echo '
+    <Style id="yellowLineGreenPoly">
+      <LineStyle>
+        <color>7f00ff00</color>
+        <width>4</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7f00ffff</color>
+      </PolyStyle>
+	</Style>';
+$trip = getTrip($tripid);
+echo "\n<Placemark>\n";
+$link = curPageURL() . "/../trip.php?tripid=" . htmlspecialchars($$tripid);
+echo "<name>" . $tripid . "</name>";
+echo '<atom:link href="' . $link . '"/>';
+echo '<description><![CDATA[ <a href="' . $link . '">' . $tripid . "</a>]]> </description>";
+echo "<styleUrl>#yellowLineGreenPoly</styleUrl>";
+
+
+echo getTripShape($tripid);
+
+echo "</Placemark>\n</Document></kml>\n";
+?>
+
+

--- a/include/common-net.inc.php
+++ b/include/common-net.inc.php
@@ -35,7 +35,11 @@
     debug(print_r($page, true), "json");
     return $page;
 }
+function baseURL() {
+     $protocol = $_SERVER['HTTPS'] ? "https" : "http";
+  return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
 
+}
 function curPageURL() {
     $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on");
     $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443")));

--- a/include/common-session.inc.php
+++ b/include/common-session.inc.php
@@ -62,7 +62,7 @@
 
 //debug(print_r($_SESSION, true) , "session");
 function current_time($time = "") {
-    if ($_REQUEST['time']) return $_REQUEST['time'];
+    if (isset($_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
@@ -54,7 +54,7 @@
 <link rel="dns-prefetch" href="//code.jquery.com">
 <link rel="dns-prefetch" href="//ajax.googleapis.com">
 	<link rel="stylesheet"  href="' . $basePath . 'css/jquery-ui-1.8.12.custom.css" />';
-    $jqmVersion = "1.0";
+    $jqmVersion = "1.0.1";
     if (isDebugServer()) {
         $jqmcss = $basePath . "css/jquery.mobile-$jqmVersion.css";
         $jqjs = $basePath . "js/jquery-1.6.4.min.js";

--- a/include/db/route-dao.inc.php
+++ b/include/db/route-dao.inc.php
@@ -212,23 +212,22 @@
     $sidA = $service_ids[0];
     $sidB = $service_ids[1];
     if ($destination != "") {
-        $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id
+       /* $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id
 FROM stop_times join trips on trips.trip_id =
 stop_times.trip_id join routes on trips.route_id = routes.route_id
 WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB)
- order by route_short_name";
+ order by route_short_name";*/
+        $query = "select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id  from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
+        from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;";
     } else {
-        $query = "SELECT DISTINCT route_long_name
-FROM stop_times join trips on trips.trip_id =
-stop_times.trip_id join routes on trips.route_id = routes.route_id
-WHERE (service_id=:service_periodA OR service_id=:service_periodB)
- order by route_long_name";
-    }
-    debug($query, "database");
-    $query = $conn->prepare($query);
-
-    $query->bindParam(":service_periodA", $sidA);
-    $query->bindParam(":service_periodB", $sidB);
+        $query = "select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id  from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
+        from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;";
+    }
+    debug($query, "database");
+    $query = $conn->prepare($query);
+
+    //$query->bindParam(":service_periodA", $sidA);
+    //$query->bindParam(":service_periodB", $sidB);
     if ($destination != "")
         $query->bindParam(":destination", $destination);
     $query->execute();
@@ -267,12 +266,13 @@
 }
 
 function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) {
-    if ($service_period == "")
+   // if ($service_period == "")
         $service_period = service_period();
     $service_ids = service_ids($service_period);
     $sidA = $service_ids[0];
     $sidB = $service_ids[1];
-    if ($limit != "")
+ $limitSQL = "";
+    if ($limit != "") 	
         $limitSQL = " LIMIT :limit ";
     global $conn;
     $query = "SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id,
@@ -301,3 +301,4 @@
 }
 
 ?>
+

--- a/include/db/trip-dao.inc.php
+++ b/include/db/trip-dao.inc.php
@@ -78,7 +78,7 @@
 join trips on trips.trip_id = stop_times.trip_id
 join routes on trips.route_id = routes.route_id
 join stops on stops.stop_id = stop_times.stop_id
-WHERE trips.trip_id = :tripID $range ORDER BY stop_sequence";
+WHERE trips.trip_id = :tripID ORDER BY stop_sequence";
     debug($query, "database");
     $query = $conn->prepare($query);
     $query->bindParam(":tripID", $tripID);

--- a/myway/myway_timeliness_calculate.php
+++ b/myway/myway_timeliness_calculate.php
@@ -95,7 +95,7 @@
     }
     $timeDeltas = Array();
     foreach ($potentialRoutes as $potentialRoute) {
-        echo "Matched route: {$potentialRoute['route_id']} {$potentialRoute['route_short_name']}{$potentialRoute['route_long_name']} {$timing_period}<br>";
+        echo "Matched route: {$potentialRoute['route_id']} {$potentialRoute['route_short_name']} {$timing_period}<br>";
         foreach ($potentialStops as $potentialStop) {
             $stopRoutes = getStopRoutes($potentialStop['stop_id'], $timing_period);
             $foundRoute = Array();

--- a/routeList.php
+++ b/routeList.php
@@ -37,7 +37,7 @@
         foreach (getRouteHeadsigns($route['route_id']) as $headsign) {
 
             //print_r($route);
-            echo '<li> <a href="trip.php?routeid=' . $route['route_id'] . '&directionid=' . $headsign['direction_id'] . '"><h3>' . $route['route_short_name'] . "</h3>
+            echo '<li> <a href="trip.php?routeid=' . $route['route_id'] . '&directionid=' . $headsign['direction_id'] . '"><h3>' . $route['route_id'] . "</h3>
                    
                 <p>" . $headsign['trip_headsign'] . (strstr($headsign['trip_headsign'], "bound") === false ? "bound" : "") . ", starting at " . $headsign['stop_name'] . " (" . ucwords($headsign['service_id']) . ")</p>";
 
@@ -92,7 +92,7 @@
 } else if (isset($nearby)) {
     $routes = Array();
     include_header("Routes Nearby", "routeList", true, true);
-    trackEvent("Route Lists", "Routes Nearby", $_SESSION['lat'] . "," . $_SESSION['lon']);
+    if (isset($_SESSION['lat'])) trackEvent("Route Lists", "Routes Nearby", $_SESSION['lat'] . "," . $_SESSION['lon']);
     navbar();
     placeSettings();
     if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") {
@@ -157,7 +157,7 @@
         displayRoutes(getRoutesByDestination($routeDestination));
     } else {
         foreach (getRoutesByDestination() as $destination) {
-            echo '<li><a href="' . curPageURL() . '/routeList.php?routeDestination=' . urlencode($destination['route_long_name']) . '">' . $destination['route_long_name'] . "... </a></li>\n";
+            echo '<li><a href="' . curPageURL() . '/routeList.php?routeDestination=' . urlencode($destination['stop_name']) . '">' . $destination['stop_name'] . "... </a></li>\n";
         }
     }
 }

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -127,7 +127,7 @@
     $earlierTime = strtotime($trips[$tripsKeys[0]]['arrival_time']) - (90 * 60);
     $laterTime = strtotime($trips[$tripsKeys[sizeof($trips) - 1]]['arrival_time']) - 60;
 }
-if (sizeof($stopids) > 0) {
+if (isset($stopids) && sizeof($stopids) > 0) {
     $stopidurl = "stopids=" . implode(",", $stopids);
 } else {
     $stopidurl = "stopid=$stopid";

--- a/stopList.php
+++ b/stopList.php
@@ -94,9 +94,8 @@
         //var_dump($stops);
         $stopsGrouped = Array();
         foreach ($stops as $key => $stop) {
-            if (stopCompare($stops[$key]["stop_name"]) 
-                    != stopCompare($stops[$key + 1]["stop_name"])
-                    || $key + 1 >= sizeof($stops)) {
+            if ($key + 1 >= sizeof($stops) || 
+                    stopCompare($stops[$key]["stop_name"]) != stopCompare($stops[$key + 1]["stop_name"])) {
                 if (sizeof($stopsGrouped) > 0) {
                     // print and empty grouped stops
                     // subsequent duplicates

file:a/trip.php -> file:b/trip.php
--- a/trip.php
+++ b/trip.php
@@ -34,7 +34,9 @@
 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);
 echo '<span class="content-secondary">';
-echo '<a href="' . $trip['route_url'] . '">View Original Timetable/Map</a>';
+echo '<a href="' . $trip['route_url'] . '">View Original Timetable/Map</a> ';
+echo '<a href="geo/trip.kml.php?tripid='.$tripid.'">View Trip in Google Earth</a> ';
+echo '<a href="geo/route.kml.php?routeid='.$tripid.'">View Route in Google Earth</a>';
 echo '<h2>Via:</h2> <small>' . viaPointNames($tripid) . '</small>';
 echo '<h2>Other Trips:</h2> ';
 $routeTrips = getRouteTrips($routeid, $trip['direction_id'], $service_period);