Convert myway timeliness visualisations to new GTFS feed
Convert myway timeliness visualisations to new GTFS feed

--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -37,6 +37,17 @@
             return 'saturday';
         default:
             return 'weekday';
+    }
+}
+function service_ids($service_period) {
+    switch ($service_period) {
+        case 'sunday':
+            return Array("2010-TUGGSUN-Sunday-20","2010-BELCSUN-Sunday-19");
+        case 'saturday':
+            return Array("2010-BELCSAT-Saturday-19","2010-TUGGSAT-Saturday-19");
+        default:
+            //return 'weekday';
+            return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14"); 
     }
 }
 

--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -55,8 +55,9 @@
     $basePath = "../";
 
 function isDebugServer() {
+    
     return php_sapi_name() == "cli" || isset($_SERVER['SERVER_NAME']) && ( $_SERVER['SERVER_NAME'] == "azusa" || $_SERVER['SERVER_NAME'] == "vanille"
-            || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1");
+            || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" ||  $_SERVER['SERVER_NAME'] == "192.168.1.8");
 }
 
 include_once ("common-geo.inc.php");
@@ -71,7 +72,7 @@
 
 function isAnalyticsOn() {
     $user_agent = $_SERVER['HTTP_USER_AGENT'];
-    return!isDebugServer() && !preg_match('/cloudkick/i', $user_agent) && !preg_match('/googlebot/i', $user_agent) &&
+    return !isDebugServer() && !preg_match('/cloudkick/i', $user_agent) && !preg_match('/googlebot/i', $user_agent) &&
             !preg_match('/baidu/i', $user_agent);
 }
 
@@ -133,10 +134,6 @@
         return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
     }
     return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
-}
-
-function bracketsMeanNewLine($input) {
-    return str_replace(")", "</small>", str_replace("(", "<br><small>", $input));
 }
 
 function sksort(&$array, $subkey = "id", $sort_ascending = false) {
@@ -202,5 +199,6 @@
     return implode($glue, $retVal);
 }
 
+
 ?>
 

--- a/include/db/route-dao.inc.php
+++ b/include/db/route-dao.inc.php
@@ -29,7 +29,19 @@
     }
     return $query->fetch(PDO :: FETCH_ASSOC);
 }
-
+function getRoutesByShortName($routeShortName) {
+    global $conn;
+    $query = "Select * from routes where route_short_name = :routeShortName";
+    debug($query, "database");
+    $query = $conn->prepare($query);
+    $query->bindParam(":routeShortName", $routeShortName);
+    $query->execute();
+    if (!$query) {
+        databaseError($conn->errorInfo());
+        return Array();
+    }
+    return $query->fetchAll();
+}
 function getRouteByFullName($routeFullName) {
     global $conn;
     $query = "Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1";
@@ -140,10 +152,10 @@
     return $r;
 }
 
-function getTimeInterpolatedRouteAtStop($routeID, $stop_id) {
+function getRouteAtStop($routeID, $stop_id) {
     $nextTrip = getRouteNextTrip($routeID);
     if ($nextTrip['trip_id']) {
-        foreach (getTimeInterpolatedTrip($nextTrip['trip_id']) as $tripStop) {
+        foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) {
             if ($tripStop['stop_id'] == $stop_id)
                 return $tripStop;
         }
@@ -220,6 +232,9 @@
 function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) {
     if ($service_period == "")
         $service_period = service_period();
+        $service_ids = service_ids($service_period);
+    $sidA = $service_ids[0];
+    $sidB = $service_ids[1];
     if ($limit != "")
         $limitSQL = " LIMIT :limit ";
     global $conn;
@@ -229,13 +244,14 @@
 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 service_id=:service_period
+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
         order by distance $limitSQL";
     debug($query, "database");
     $query = $conn->prepare($query);
-    $query->bindParam(":service_period", $service_period);
+    $query->bindParam(":service_periodA", $sidA);
+    $query->bindParam(":service_periodB", $sidB);
     $query->bindParam(":distance", $distance);
     if ($limit != "")
         $query->bindParam(":limit", $limit);

--- a/include/db/stop-dao.inc.php
+++ b/include/db/stop-dao.inc.php
@@ -30,11 +30,9 @@
     return $query->fetch(PDO :: FETCH_ASSOC);
 }
 
-function getStops($timingPointsOnly = false, $firstLetter = "", $startsWith = "") {
+function getStops($firstLetter = "", $startsWith = "") {
     global $conn;
     $conditions = Array();
-    if ($timingPointsOnly)
-        $conditions[] = "substr(stop_code,1,2) != 'Wj'";
     if ($firstLetter != "")
         $conditions[] = "substr(stop_name,1,1) = :firstLetter";
     if ($startsWith != "")
@@ -48,6 +46,7 @@
         }
     }
     $query .= " order by stop_name;";
+    debug($query,"database");
     $query = $conn->prepare($query);
     if ($firstLetter != "")
         $query->bindParam(":firstLetter", $firstLetter);
@@ -140,15 +139,21 @@
 }
 
 function getStopRoutes($stopID, $service_period) {
-    if ($service_period == "")
+    if ($service_period == "") {
         $service_period = service_period();
+    }
+    $service_ids = service_ids($service_period);
+    $sidA = $service_ids[0];
+    $sidB = $service_ids[1];
     global $conn;
     $query = "SELECT distinct service_id,trips.route_id,route_short_name,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 stop_id = :stopID AND service_id=:service_period";
-    debug($query, "database");
-    $query = $conn->prepare($query);
-    $query->bindParam(":service_period", $service_period);
+stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID 
+AND (service_id=:service_periodA OR service_id=:service_periodB)";
+    debug($query, "database");
+    $query = $conn->prepare($query);
+    $query->bindParam(":service_periodA", $sidA);
+    $query->bindParam(":service_periodB", $sidB);
     $query->bindParam(":stopID", $stopID);
     $query->execute();
     if (!$query) {
@@ -159,8 +164,13 @@
 }
 
 function getStopTrips($stopID, $service_period = "", $afterTime = "", $limit = "") {
-    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 = " LIMIT :limit ";
     global $conn;
@@ -173,7 +183,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_period
+AND (service_id=:service_periodA OR service_id=:service_periodB)
 AND end_times.arrival_time > :afterTime
 ORDER BY end_time $limitSQL";
     } else {
@@ -183,12 +193,13 @@
 stop_times.trip_id
 join routes on trips.route_id = routes.route_id
 WHERE stop_times.stop_id = :stopID
-AND service_id=:service_period
+AND (service_id=:service_periodA OR service_id=:service_periodB)
 ORDER BY arrival_time $limitSQL";
     }
     debug($query, "database");
     $query = $conn->prepare($query);
-    $query->bindParam(":service_period", $service_period);
+    $query->bindParam(":service_periodA", $sidA);
+    $query->bindParam(":service_periodB", $sidB);
     $query->bindParam(":stopID", $stopID);
     if ($limit != "")
         $query->bindParam(":limit", $limit);
@@ -220,7 +231,7 @@
                     $timedTrips[] = $trip;
                 }
             } else {
-                $timedTrip = getTimeInterpolatedTripAtStop($trip['trip_id'], $trip['stop_sequence']);
+                $timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']);
                 if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) {
                     $timedTrips[] = $timedTrip;
                 }

--- a/include/db/trip-dao.inc.php
+++ b/include/db/trip-dao.inc.php
@@ -34,6 +34,7 @@
 }
 
 function getTripShape($tripID) {
+    // todo, use shapes table if shape_id specified
     global $conn;
     $query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.position))) as the_route
 FROM (SELECT position,
@@ -53,7 +54,7 @@
     return $query->fetchColumn(0);
 }
 
-function getTimeInterpolatedTrip($tripID, $range = "") {
+function getTripStopTimes($tripID) {
     global $conn;
     $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code,
 	stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
@@ -71,104 +72,137 @@
         return Array();
     }
     $stopTimes = $query->fetchAll();
-    $cur_timepoint = Array();
-    $next_timepoint = Array();
-    $distance_between_timepoints = 0.0;
-    $distance_traveled_between_timepoints = 0.0;
-    $rv = Array();
-    foreach ($stopTimes as $i => $stopTime) {
-        if ($stopTime['arrival_time'] != "") {
-            // is timepoint
-            $cur_timepoint = $stopTime;
-            $distance_between_timepoints = 0.0;
-            $distance_traveled_between_timepoints = 0.0;
-            if ($i + 1 < sizeof($stopTimes)) {
-                $k = $i + 1;
-                $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
-                while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) {
-                    $k += 1;
-                    // echo "k".$k;
-                    $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
-                }
-                $next_timepoint = $stopTimes[$k];
-            }
-            $rv[] = $stopTime;
-        } else {
-            // is untimed point
-            // echo "i".$i;
-            $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]);
-            // echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>";
-            $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints;
-            if ($next_timepoint["arrival_time"] != "") {
-                $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]);
-                // echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>";
-                $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]);
-                $stopTime["arrival_time"] = date("H:i:s", $time_estimate);
-            } else {
-                $stopTime["arrival_time"] = $cur_timepoint["arrival_time"];
-            }
-            $rv[] = $stopTime;
-        }
-    }
-    // var_dump($rv);
-    return $rv;
-}
-
-function getTripPreviousTimePoint($tripID, $stop_sequence) {
-    global $conn;
-    $query = " SELECT trip_id,stop_id,
-	stop_sequence
-FROM stop_times
-WHERE trip_id = :tripID and stop_sequence < :stop_sequence
-and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1";
-    debug($query, "database");
-    $query = $conn->prepare($query);
-    $query->bindParam(":tripID", $tripID);
-    $query->bindParam(":stop_sequence", $stop_sequence);
-    $query->execute();
-    if (!$query) {
-        databaseError($conn->errorInfo());
-        return Array();
-    }
-    return $query->fetch(PDO :: FETCH_ASSOC);
-}
-
-function getTripNextTimePoint($tripID, $stop_sequence) {
-    global $conn;
-    $query = " SELECT trip_id,stop_id,
-	stop_sequence
-FROM stop_times
-WHERE trip_id = :tripID and stop_sequence > :stop_sequence
-and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1";
-    debug($query, "database");
-    $query = $conn->prepare($query);
-    $query->bindParam(":tripID", $tripID);
-    $query->bindParam(":stop_sequence", $stop_sequence);
-    $query->execute();
-    if (!$query) {
-        databaseError($conn->errorInfo());
-        return Array();
-    }
-    return $query->fetch(PDO :: FETCH_ASSOC);
-}
-
-function getTimeInterpolatedTripAtStop($tripID, $stop_sequence) {
-    global $conn;
-    // limit interpolation to between nearest actual points.
-    $prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence);
-    $nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence);
-    // echo " prev {$lowestDelta['stop_sequence']} next {$nextTimePoint['stop_sequence']} ";
-    $range = "";
-    if ($prevTimePoint != "")
-        $range .= " AND stop_sequence >= '{$prevTimePoint['stop_sequence']}'";
-    if ($nextTimePoint != "")
-        $range .= " AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'";
-    foreach (getTimeInterpolatedTrip($tripID, $range) as $tripStop) {
+    return $stopTimes;
+}
+
+function getTripAtStop($tripID, $stop_sequence) {
+    global $conn;
+    foreach (getTripStopTimes($tripID) as $tripStop) {
         if ($tripStop['stop_sequence'] == $stop_sequence)
             return $tripStop;
     }
     return Array();
 }
+
+/* DEPRECIATED 
+  function getTimeInterpolatedTrip($tripID, $range = "") {
+  global $conn;
+  $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code,
+  stop_sequence,service_id,trips.route_id,route_short_name,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
+  join stops on stops.stop_id = stop_times.stop_id
+  WHERE trips.trip_id = :tripID $range ORDER BY stop_sequence";
+  debug($query, "database");
+  $query = $conn->prepare($query);
+  $query->bindParam(":tripID", $tripID);
+  $query->execute();
+  if (!$query) {
+  databaseError($conn->errorInfo());
+  return Array();
+  }
+  $stopTimes = $query->fetchAll();
+  $cur_timepoint = Array();
+  $next_timepoint = Array();
+  $distance_between_timepoints = 0.0;
+  $distance_traveled_between_timepoints = 0.0;
+  $rv = Array();
+  foreach ($stopTimes as $i => $stopTime) {
+  if ($stopTime['arrival_time'] != "") {
+  // is timepoint
+  $cur_timepoint = $stopTime;
+  $distance_between_timepoints = 0.0;
+  $distance_traveled_between_timepoints = 0.0;
+  if ($i + 1 < sizeof($stopTimes)) {
+  $k = $i + 1;
+  $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
+  while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) {
+  $k += 1;
+  // echo "k".$k;
+  $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
+  }
+  $next_timepoint = $stopTimes[$k];
+  }
+  $rv[] = $stopTime;
+  } else {
+  // is untimed point
+  // echo "i".$i;
+  $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]);
+  // echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>";
+  $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints;
+  if ($next_timepoint["arrival_time"] != "") {
+  $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]);
+  // echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>";
+  $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]);
+  $stopTime["arrival_time"] = date("H:i:s", $time_estimate);
+  } else {
+  $stopTime["arrival_time"] = $cur_timepoint["arrival_time"];
+  }
+  $rv[] = $stopTime;
+  }
+  }
+  // var_dump($rv);
+  return $rv;
+  }
+
+  function getTripPreviousTimePoint($tripID, $stop_sequence) {
+  global $conn;
+  $query = " SELECT trip_id,stop_id,
+  stop_sequence
+  FROM stop_times
+  WHERE trip_id = :tripID and stop_sequence < :stop_sequence
+  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1";
+  debug($query, "database");
+  $query = $conn->prepare($query);
+  $query->bindParam(":tripID", $tripID);
+  $query->bindParam(":stop_sequence", $stop_sequence);
+  $query->execute();
+  if (!$query) {
+  databaseError($conn->errorInfo());
+  return Array();
+  }
+  return $query->fetch(PDO :: FETCH_ASSOC);
+  }
+
+  function getTripNextTimePoint($tripID, $stop_sequence) {
+  global $conn;
+  $query = " SELECT trip_id,stop_id,
+  stop_sequence
+  FROM stop_times
+  WHERE trip_id = :tripID and stop_sequence > :stop_sequence
+  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1";
+  debug($query, "database");
+  $query = $conn->prepare($query);
+  $query->bindParam(":tripID", $tripID);
+  $query->bindParam(":stop_sequence", $stop_sequence);
+  $query->execute();
+  if (!$query) {
+  databaseError($conn->errorInfo());
+  return Array();
+  }
+  return $query->fetch(PDO :: FETCH_ASSOC);
+  }
+
+
+
+  function getTimeInterpolatedTripAtStop($tripID, $stop_sequence) {
+  global $conn;
+  // limit interpolation to between nearest actual points.
+  $prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence);
+  $nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence);
+  // echo " prev {$lowestDelta['stop_sequence']} next {$nextTimePoint['stop_sequence']} ";
+  $range = "";
+  if ($prevTimePoint != "")
+  $range .= " AND stop_sequence >= '{$prevTimePoint['stop_sequence']}'";
+  if ($nextTimePoint != "")
+  $range .= " AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'";
+  foreach (getTimeInterpolatedTrip($tripID, $range) as $tripStop) {
+  if ($tripStop['stop_sequence'] == $stop_sequence)
+  return $tripStop;
+  }
+  return Array();
+  } */
 
 function getTripStartTime($tripID) {
     global $conn;
@@ -222,12 +256,12 @@
     return $query->fetchAll();
 }
 
-function viaPoints($tripID, $stop_sequence = "", $timing_points_only = true) {
+function viaPoints($tripID, $stop_sequence = "") {
     global $conn;
     $query = "SELECT stops.stop_id, stop_name, arrival_time
 FROM stop_times join stops on stops.stop_id = stop_times.stop_id
 WHERE stop_times.trip_id = :tripID
-" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . ($timing_points_only ? "AND substr(stop_code,1,2) != 'Wj' " : "") . " ORDER BY stop_sequence";
+" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . " ORDER BY stop_sequence";
     debug($query, "database");
     $query = $conn->prepare($query);
     if ($stop_sequence != "")

file:a/index.php -> file:b/index.php
--- a/index.php
+++ b/index.php
@@ -26,8 +26,7 @@
         <a href="tripPlanner.php" data-role="button" data-icon="navigation">Launch Trip Planner...</a>
         <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
             <li data-role="list-divider">Timetables - Stops</li>
-            <li><a href="stopList.php">Major (Timing Point) Stops</a></li>
-            <li><a href="stopList.php?allstops=yes">All Stops</a></li>
+            <li><a href="stopList.php">Stops By Name</a></li>
             <li><a href="stopList.php?bysuburbs=yes">Stops By Suburb</a></li>
             <li><a class="nearby" href="stopList.php?nearby=yes">Nearby Stops</a></li>
         </ul>

--- a/myway/index.php
+++ b/myway/index.php
@@ -16,7 +16,7 @@
  */
 include ('../include/common.inc.php');
 
-include_header("Busness R&amp;D", "index");
+include_header("MyWay Balance and Timeliness Survey Results", "index");
 if ($_SESSION['authed'] == true) {
     echo '<ul data-role="listview" data-theme="e" data-groupingtheme="e">
 		<li data-role="list-divider" > Admin Features </li>
@@ -35,6 +35,9 @@
 <ul data-role="listview" data-theme="e" data-groupingtheme="e">
 
     <li data-role="list-divider" > MyWay Timeliness Graphs </li>
+    
+    <li><a href="myway_timeliness_overview.php"><h3>Timeliness Overview</h3>
+            <p>Displays statistics on timeliness split by day/time/month/stop etc.</p></a></li>
     <li><a href="myway_timeliness.php"><h3>Timeliness over Day</h3>
             <p>Displays the deviation from the timetable over the day</p></a></li>
     <li><a href="myway_timeliness_freqdist.php"><h3>Frequency Distribution of Time Deviation</h3>

--- a/myway/myway_timeliness.php
+++ b/myway/myway_timeliness.php
@@ -30,7 +30,7 @@
         var midnight = d.getTime();
 
 <?php
-$query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas)  order by route_full_name;";
+$query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas) order by route_name;";
 $query = $conn->prepare($query);
 $query->execute();
 if (!$query) {
@@ -41,11 +41,12 @@
 $labels = Array();
 $lastRoute = "";
 foreach ($query->fetchAll() as $delta) {
-    $routeName = $delta['route_full_name'];
-    if (strstr($routeName, " 3"))
+    $routeName = $delta['route_name'];
+    if (preg_match('/z/',$routeName)) {
         $routeName = "312-319";
-    else
+    } else {
         $routeName = preg_replace('/\D/', '', $routeName);
+    }
     if ($routeName != $lastRoute) {
         $i++;
         echo "    var d$i = [];";
@@ -78,7 +79,7 @@
             yaxis: {
                 tickFormatter: yformatter
             },
-            grid: { hoverable: true, clickable: true, labelMargin: 32   },
+            grid: { hoverable: true, clickable: true, labelMargin: 32   }
         });
         var o;
         o = plot.pointOffset({ x: midnight+ (9*60*60*1000), y: -1.2});

--- a/myway/myway_timeliness_calculate.php
+++ b/myway/myway_timeliness_calculate.php
@@ -29,8 +29,7 @@
 
 //collect all observation not in delta
 $query = "select * from myway_observations INNER JOIN myway_stops
-ON myway_observations.myway_stop=myway_stops.myway_stop INNER JOIN myway_routes
-ON myway_observations.myway_route=myway_routes.myway_route
+ON myway_observations.myway_stop=myway_stops.myway_stop 
  WHERE observation_id NOT IN
 (
 SELECT  observation_id
@@ -51,12 +50,8 @@
     //var_dump($obsv);
     echo "<h3>Observation {$obsv['observation_id']}:</h1>
 <small>{$obsv['myway_stop']} @ {$obsv['time']} on {$obsv['myway_route']}</small><br>";
-    if ($obsv["stop_code"] == "") {
+    if ($obsv["stop_id"] == "") {
         echo "error, stop '{$obsv['myway_stop']}' unknown";
-        continue;
-    }
-    if ($obsv["route_full_name"] == "") {
-        echo "error, route '{$obsv['myway_route']}' unknown";
         continue;
     }
     // convert timestamp into time of day and date
@@ -66,80 +61,95 @@
     $search_time = date("H:i:s", strtotime($obsv['time']) - (30 * 60)); // 30 minutes margin
     $date = date("c", strtotime($obsv['time']));
     $timing_period = service_period(strtotime($date));
-    $potentialStops = getStopsByStopCode($obsv["stop_code"], $obsv["stop_street"]);
+    $potentialStops = Array(getStop($obsv["stop_id"]));
     //:get myway_stops records
     //:search by starts with stopcode and starts with street if street is not null
     //no result, skip and display error
     if (sizeof($potentialStops) < 1) {
-        echo "error, potential stops for stopcode {$obsv["stop_code"]} street {$obsv["stop_street"]} unknown";
+        echo "error, potential stops for stopid {$obsv["stop_id"]} unknown";
         continue;
     }
     //print out stops
     echo "Matched stops: ";
-    foreach ($potentialStops as $potentialStop)
-        echo $potentialStop['stop_code'] . " ";
+    foreach ($potentialStops as $potentialStop) {
+        echo $potentialStop['stop_id'] . " " . $potentialStop['stop_name'] . " ";
+    }
     echo "<br>";
     //:get myway_route record
     //no result, skip and display error
     //print out route
-    $potentialRoute = getRouteByFullName($obsv["route_full_name"]);
-    if ($potentialRoute["route_short_name"] == "") {
-        echo "error, route '{$obsv["route_full_name"]}' unknown";
+    $potentialRoutes = getRoutesByShortName(preg_replace("/[A-Z]/", "", $obsv["myway_route"]));
+    if (sizeof($potentialRoutes) < 1) {
+        echo "error, route '{$obsv["myway_route"]}' unknown";
         continue;
     }
-    echo "Matched route: {$potentialRoute['route_short_name']}{$potentialRoute['route_long_name']} {$timing_period}<br>";
     $timeDeltas = Array();
-    foreach ($potentialStops as $potentialStop) {
-        $stopRoutes = getStopRoutes($potentialStop['stop_id'], $timing_period);
-        $foundRoute = Array();
-        foreach ($stopRoutes as $stopRoute) {
-            //Check if this route stops at each stop
-            if ($stopRoute['route_short_name'] . $stopRoute['route_long_name'] == $obsv["route_full_name"]) {
-                echo "Matching route {$stopRoute['route_id']} found at {$potentialStop['stop_code']}<br>";
-                $foundRoute = $stopRoute;
-                //if does get tripstoptimes for this route
-                $trips = getStopTrips($potentialStop['stop_id'], $timing_period, $search_time);
-                foreach ($trips as $trip) {
-                    //echo $trip['route_id']." ".$stopRoute['route_id'].";";
-                    if ($trip['route_id'] == $stopRoute['route_id']) {
-                        $timedTrip = getTimeInterpolatedTripAtStop($trip['trip_id'], $trip['stop_sequence']);
-                        $actual_time = strtotime($time);
-                        $trip_time = strtotime($timedTrip['arrival_time']);
-                        $timeDiff = $actual_time - $trip_time;
-                        //work out time delta, put into array with index of delta
-                        $timeDeltas[] = Array(
-                            "timeDiff" => $timeDiff,
-                            "stop_code" => $potentialStop['stop_code'],
-                            "stop_sequence" => $timedTrip['stop_sequence']
-                        );
-                        echo "Found trip {$trip['trip_id']} at stop {$potentialStop['stop_code']} (#{$potentialStop['stop_id']}, sequence #{$trip['stop_sequence']})<br>";
-                        echo "Arriving at {$timedTrip['arrival_time']}, difference of " . round($timeDiff / 60, 2) . " minutes<br>";
+    foreach ($potentialRoutes as $potentialRoute) {
+        echo "Matched route: {$potentialRoute['route_id']} {$potentialRoute['route_short_name']}{$potentialRoute['route_long_name']} {$timing_period}<br>";
+        foreach ($potentialStops as $potentialStop) {
+            $stopRoutes = getStopRoutes($potentialStop['stop_id'], $timing_period);
+            $foundRoute = Array();
+            foreach ($stopRoutes as $stopRoute) {
+                //Check if this route stops at each stop
+                if ($stopRoute['route_id'] == $potentialRoute['route_id']) {
+                    echo "Matching route {$stopRoute['route_id']} found at stop #{$potentialStop['stop_id']}<br>";
+                    $foundRoute = $stopRoute;
+                    //if does get tripstoptimes for this route
+                    $trips = getStopTrips($potentialStop['stop_id'], $timing_period, $search_time);
+                    foreach ($trips as $trip) {
+                        //echo $trip['route_id']." ".$stopRoute['route_id'].";";
+                        if ($trip['route_id'] == $stopRoute['route_id']) {
+                            $timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']);
+                            $actual_time = strtotime($time);
+                            $trip_time = strtotime($timedTrip['arrival_time']);
+                            $timeDiff = $actual_time - $trip_time;
+                            //work out time delta, put into array with index of delta
+                            $timeDeltas[] = Array(
+                                "timeDiff" => $timeDiff,
+                                "stop_id" => $potentialStop['stop_id'],
+                                "stop_sequence" => $trip['stop_sequence'],
+                                "route_name" => "{$potentialRoute['route_short_name']} {$potentialRoute['route_long_name']}",
+                                "route_id" => $trip['route_id']
+                            );
+                            echo "Found trip {$trip['trip_id']} at stop {$potentialStop['stop_id']} (#{$potentialStop['stop_name']}, sequence #{$trip['stop_sequence']})<br>";
+                            echo "Arriving at {$timedTrip['arrival_time']}, difference of " . round($timeDiff / 60, 2) . " minutes<br>";
+                        }
                     }
+                    break; // because have found route
                 }
-                break; // because have found route
+            }
+            if (sizeof($foundRoute) < 1) {
+                //print out that stops/does not stop
+                echo "No matching routes found at {$potentialStop['stop_id']}<br>";
+                //var_dump($stopRoutes);
+                flush();
             }
         }
-        if (sizeof($foundRoute) < 1) {
-            //print out that stops/does not stop
-            echo "No matching routes found at {$potentialStop['stop_code']}<br>";
-            var_dump($stopRoutes);
-            flush();
-        }
     }
+    
     //   lowest delta is recorded delta
     usort($timeDeltas, "abssort");
     $lowestDelta = $timeDeltas[0]["timeDiff"];
     if (sizeof($timeDeltas) != 0) {
+        if (abs($lowestDelta) > 9999) {
+             echo "Difference of " . round($lowestDelta / 60, 2) . " minutes is too high. Will not record this observation<br>";
+        } else {
         echo "Lowest difference of " . round($lowestDelta / 60, 2) . " minutes will be recorded for this observation<br>";
+        
         $observation_id = $obsv['observation_id'];
-        $route_full_name = $obsv['route_full_name'];
-        $stop_code = $timeDeltas[0]["stop_code"];
+        
+        $route_name = $timeDeltas[0]["route_name"];
+        $route_id = $timeDeltas[0]["route_id"];
+        $stop_id = $timeDeltas[0]["stop_id"];
+        $myway_stop = $obsv["myway_stop"];
         $stop_sequence = $timeDeltas[0]["stop_sequence"];
-        $stmt = $conn->prepare("insert into myway_timingdeltas (observation_id, route_full_name, stop_code, timing_delta, time, date, timing_period, stop_sequence)
-				      values (:observation_id, :route_full_name, :stop_code, :timing_delta, :time, :date, :timing_period, :stop_sequence)");
+        $stmt = $conn->prepare("insert into myway_timingdeltas (observation_id, route_id, stop_id, timing_delta, time, date, timing_period, stop_sequence,myway_stop,route_name)
+				      values (:observ