Refactor stop page
Refactor stop page

--- a/include/common-session.inc.php
+++ b/include/common-session.inc.php
@@ -9,7 +9,7 @@
 	$_SESSION['time'] = filter_var($_REQUEST['time'], FILTER_SANITIZE_STRING);
 	sessionUpdated();
 }
-if (isset($_REQUEST['geolocate'])) {
+if (isset($_REQUEST['geolocate']) && $_REQUEST['geolocate'] != "Enter co-ordinates or address here") {
 	$geocoded = false;
 	if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) {
 		$_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -16,24 +16,5 @@
 		return 'weekday';
 	}
 }
-function midnight_seconds()
-{
-	// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
-	if (isset($_SESSION['time'])) {
-		$time = strtotime($_SESSION['time']);
-		return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time);
-	}
-	return (date("G") * 3600) + (date("i") * 60) + date("s");
-}
-function midnight_seconds_to_time($seconds)
-{
-	if ($seconds > 0) {
-		$midnight = mktime(0, 0, 0, date("n") , date("j") , date("Y"));
-		return date("h:ia", $midnight + $seconds);
-	}
-	else {
-		return "";
-	}
-}
 
 ?>

--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -139,5 +139,42 @@
 	if ($sort_ascending) $array = array_reverse($temp_array);
 	else $array = $temp_array;
 }
+function sktimesort(&$array, $subkey = "id", $sort_ascending = false)
+{
+	if (count($array)) $temp_array[key($array) ] = array_shift($array);
+	foreach ($array as $key => $val) {
+		$offset = 0;
+		$found = false;
+		foreach ($temp_array as $tmp_key => $tmp_val) {
+			if (!$found and strtotime($val[$subkey]) > strtotime($tmp_val[$subkey])) {
+				$temp_array = array_merge((array)array_slice($temp_array, 0, $offset) , array(
+					$key => $val
+				) , array_slice($temp_array, $offset));
+				$found = true;
+			}
+			$offset++;
+		}
+		if (!$found) $temp_array = array_merge($temp_array, array(
+			$key => $val
+		));
+	}
+	if ($sort_ascending) $array = array_reverse($temp_array);
+	else $array = $temp_array;
+}
+function r_implode( $glue, $pieces ) 
+{ 
+  foreach( $pieces as $r_pieces ) 
+  { 
+    if( is_array( $r_pieces ) ) 
+    { 
+      $retVal[] = r_implode( $glue, $r_pieces ); 
+    } 
+    else 
+    { 
+      $retVal[] = $r_pieces; 
+    } 
+  } 
+  return implode( $glue, $retVal ); 
+} 
 ?>
 

--- a/include/db/stop-dao.inc.php
+++ b/include/db/stop-dao.inc.php
@@ -14,7 +14,7 @@
 		databaseError(pg_result_error($result));
 		return Array();
 	}
-	return pg_fetch_all($result);    
+	return pg_fetch_assoc($result);    
 }
 function getStops($timingPointsOnly = false, $firstLetter = "")
 {
@@ -31,7 +31,7 @@
                 $query .= " Where ".$conditions[0]." ";
             }
         }
-        $query .= "order by stop_name;";
+        $query .= " order by stop_name;";
         debug($query,"database");
 	$result = pg_query($conn, $query);
 	if (!$result) {
@@ -67,8 +67,9 @@
 	}
 	return pg_fetch_all($result);
 }
-function stopRoutes($stopID, $service_period)
+function getStopRoutes($stopID, $service_period)
 {
+        if ($service_period == "") $service_period = service_period();
 	/*
 	 def handle_json_GET_stoproutes(self, params):
 	   """Given a stop_id return all routes to visit the stop."""
@@ -85,57 +86,46 @@
 	   return result
 	*/
 }
-function stopTrips($stopID)
+function getStopTrips($stopID, $service_period = "")
 {
-	/*
-	 def handle_json_GET_stopalltrips(self, params):
-	   """Given a stop_id return all trips to visit the stop (without times)."""
-	   schedule = self.server.schedule
-	   stop = schedule.GetStop(params.get('stop', None))
-	   service_period = params.get('service_period', None)
-	   trips = stop.GetTrips(schedule)
-	   result = []
-	   for trip in trips:
-	     if service_period == None or trip.service_id == service_period:
-	       result.append((trip.trip_id, trip.service_id))
-	   return result
-	*/
+    if ($service_period == "") $service_period = service_period();
+    global $conn;
+        $query = "SELECT stop_times.trip_id,arrival_time,stop_id,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 WHERE stop_id = '$stopID' AND service_id='$service_period'";
+        debug($query,"database");
+	$result = pg_query($conn, $query);
+	if (!$result) {
+		databaseError(pg_result_error($result));
+		return Array();
+	}
+	return pg_fetch_all($result);
+
 }
-function stopTripsWithTimes($stopID, $time, $service_period)
+function getStopTripsWithTimes($stopID, $time = "", $service_period = "", $time_range = "")
 {
-	/*
-	 def handle_json_GET_stoptrips(self, params):
-	   """Given a stop_id and time in seconds since midnight return the next
-	   trips to visit the stop."""
-	   schedule = self.server.schedule
-	   stop = schedule.GetStop(params.get('stop', None))
-	   requested_time = int(params.get('time', 0))
-	   limit = int(params.get('limit', 15))
-	   service_period = params.get('service_period', None)
-	   time_range = int(params.get('time_range', 24*60*60))
-	   
-	   filtered_time_trips = []
-	   for trip, index in stop._GetTripIndex(schedule):
-	     tripstarttime = trip.GetStartTime()
-	     if tripstarttime > requested_time and tripstarttime < (requested_time + time_range):
-	       time, stoptime, tp = trip.GetTimeInterpolatedStops()[index]
-	       if time > requested_time and time < (requested_time + time_range):
-	         bisect.insort(filtered_time_trips, (time, (trip, index), tp))
-	   result = []
-	   for time, (trip, index), tp in filtered_time_trips:
-	     if len(result) > limit:
-	       break
-	     route = schedule.GetRoute(trip.route_id)
-	     trip_name = ''
-	     if route.route_short_name:
-	       trip_name += route.route_short_name
-	     if route.route_long_name:
-	       if len(trip_name):
-	         trip_name += " - "
-	       trip_name += route.route_long_name
-	     if service_period == None or trip.service_id == service_period:
-	       result.append((time, (trip.trip_id, trip_name, trip.service_id), tp))
-	   return result
-	*/
+       if ($service_period == "") $service_period = service_period();
+       if ($time_range == "") $time_range = (24*60*60);
+       if ($time == "") $time = ($_SESSION['time'] ? $_SESSION['time'] : date("h:i:00"));
+       $trips = getStopTrips($stopID,$service_period);
+       $timedTrips = Array();
+	  foreach ($trips as $trip) {
+            if ($trip['arrival_time'] != "") {
+                if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)){
+                $timedTrips[] = $trip;
+                }
+            } else {
+	     $tripstarttime = getTripStartTime($trip['trip_id']);
+	     if ($tripstarttime > $time and $tripstarttime < ($time + $time_range)) {
+	       $timedtrip = getTimeInterpolatedTripStop($trip['trip_id'], $trip['stop_sequence']);
+	       if (strtotime($timedtrip['arrival_time']) > strtotime($time) and $timedtrip['arrival_time'] < (strtotime($time) + strtotime($time_range))){
+	         $timedTrips[] = $timedTrip;
+	       }
+             }
+            }
+            if (sizeof($timedTrips) > limit) break;
+          }
+	   sktimesort($timedTrips,"arrival_time", true);
+           return $timedTrips;
 }
 ?>

--- a/include/db/trip-dao.inc.php
+++ b/include/db/trip-dao.inc.php
@@ -1,20 +1,15 @@
 <?php
 function getTrip($tripID) {
-    /* def handle_json_GET_triprows(self, params):
-    """Return a list of rows from the feed file that are related to this
-    trip."""
-    schedule = self.server.schedule
-    try:
-      trip = schedule.GetTrip(params.get('trip', None))
-    except KeyError:
-      # if a non-existent trip is searched for, the return nothing
-      return
-    route = schedule.GetRoute(trip.route_id)
-    trip_row = dict(trip.iteritems())
-    route_row = dict(route.iteritems())
-    return [['trips.txt', trip_row], ['routes.txt', route_row]]
-    */
-}
+    global $conn;
+        $query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1";
+        debug($query,"database");
+	$result = pg_query($conn, $query);
+	if (!$result) {
+		databaseError(pg_result_error($result));
+		return Array();
+	}
+	return pg_fetch_assoc($result);    
+   }
 function getTripShape() {
     /* def handle_json_GET_tripstoptimes(self, params):
     schedule = self.server.schedule
@@ -49,7 +44,7 @@
         points.append((stop.stop_lat, stop.stop_lon))
     return points*/
 }
-function tripStopTimes($tripID, $after_time, $limit) {
+function getTimeInterpolatedTrip($tripID) {
     /*     rv = []
 
     stoptimes = self.GetStopTimes()
@@ -88,45 +83,33 @@
 
     return rv*/
 }
+function getTimeInterpolatedTripAtStop($trip_id, $stop_sequence) {
+   foreach(getTimeInterpolatedTrip($tripID) as $tripStop) {
+    if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop;
+   }
+   return Array();
+}
 
-function tripStartTime($tripID) {
+function getTripStartTime($tripID) {
     $query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1';
     
 }
 
-function viaPoints($tripid, $stopid, $timingPointsOnly = false)
-{
-	global $APIurl;
-	$url = $APIurl . "/json/tripstoptimes?trip=" . $tripid;
-	$json = json_decode(getPage($url));
-	debug(print_r($json, true));
-	$stops = $json[0];
-	$times = $json[1];
-	$foundStop = false;
-	$viaPoints = Array();
-	foreach ($stops as $key => $row) {
-		if ($foundStop) {
-			if (!$timingPointsOnly || !startsWith($row[5], "Wj")) {
-				$viaPoints[] = Array(
-					"id" => $row[0],
-					"name" => $row[1],
-					"time" => $times[$key]
-				);
-			}
-		}
-		else {
-			if ($row[0] == $stopid) $foundStop = true;
-		}
-	}
-	return $viaPoints;
-}
 function viaPointNames($tripid, $stopid)
 {
-	$points = viaPoints($tripid, $stopid, true);
-	$pointNames = Array();
-	foreach ($points as $point) {
-		$pointNames[] = $point['name'];
+    global $conn;
+        $query = "SELECT stop_name
+FROM stop_times join stops on stops.stop_id = stop_times.stop_id
+WHERE stop_times.trip_id = '$tripid'
+AND stop_sequence > '$stop_sequence'
+AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence";
+        debug($query,"database");
+	$result = pg_query($conn, $query);
+	if (!$result) {
+		databaseError(pg_result_error($result));
+		return Array();
 	}
-	return implode(", ", $pointNames);
+	$pointNames = pg_fetch_all($result);
+	return r_implode(", ", $pointNames);
 }
 ?>

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -2,9 +2,8 @@
 include ('include/common.inc.php');
 $stopid = filter_var($_REQUEST['stopid'], FILTER_SANITIZE_NUMBER_INT);
 $stopcode = filter_var($_REQUEST['stopcode'], FILTER_SANITIZE_STRING);
-$url = $APIurl . "/json/stop?stop_id=" . $stopid;
-$stop = json_decode(getPage($url));
-if ($stopcode != "" && $stop[5] != $stopcode) {
+if ($stopid) $stop = getStop($stopid);
+/*if ($stopcode != "" && $stop[5] != $stopcode) {
 	$url = $APIurl . "/json/stopcodesearch?q=" . $stopcode;
 	$stopsearch = json_decode(getPage($url));
 	$stopid = $stopsearch[0][0];
@@ -14,7 +13,7 @@
 if (!startsWith($stop[5], "Wj") && strpos($stop[1], "Platform") === false) {
 	// expand out to all platforms
 	
-}
+}*/
 $stops = Array();
 $stopPositions = Array();
 $stopNames = Array();
@@ -25,93 +24,92 @@
 if (isset($_REQUEST['stopids'])) {
 	$stopids = explode(",", filter_var($_REQUEST['stopids'], FILTER_SANITIZE_STRING));
 	foreach ($stopids as $sub_stopid) {
-		$url = $APIurl . "/json/stop?stop_id=" . $sub_stopid;
-		$stop = json_decode(getPage($url));
-		$stops[] = $stop;
+		$stops[] = getStop($sub_stopid);
 	}
 	$stop = $stops[0];
-	$stopid = $stops[0][0];
+	$stopid = $stops[0]["stop_id"];
 	$stopLinks.= "Individual stop pages: ";
 	foreach ($stops as $key => $sub_stop) {
-	//	$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> ';
-        }
+		//	$stopNames[$key] = $sub_stop[1] . ' Stop #' . ($key + 1);
+		if (strpos($stop["stop_name"], "Station")) {
+			$stopNames[$key] = 'Platform ' . ($key + 1);
+			$stopLinks.= '<a href="stop.php?stopid=' . $sub_stop["stop_id"] . '&stopcode=' . $sub_stop["stop_code"] . '">' . $sub_stop["stop_name"] . '</a> ';
+		}
+		else {
+			$stopNames[$key] = '#' . ($key + 1);
+			$stopLinks.= '<a href="stop.php?stopid=' . $sub_stop["stop_id"] . '&stopcode=' . $sub_stop["stop_code"] . '">' . $sub_stop["stop_name"] . ' Stop #' . ($key + 1) . '</a> ';
+		}
 		$stopPositions[$key] = Array(
-			$sub_stop[2],
-			$sub_stop[3]
+			$sub_stop["stop_lat"],
+			$sub_stop["stop_lon"]
 		);
-                
-                $url = $APIurl . "/json/stopalltrips?stop=" . $sub_stop[0];		$trips = json_decode(getPage($url));
-                $tripSequence = "";
+		$trips = getStopTrips($sub_stop["stop_id"]);
+		$tripSequence = "";
 		foreach ($trips as $trip) {
-                        $tripSequence .= "$trip[0],";
-			$tripStopNumbers[$trip[0]][] = $key;
+			$tripSequence.= "{$trip['trip_id']},";
+			$tripStopNumbers[$trip['trip_id']][] = $key;
 		}
-                
-                if (!in_array($tripSequence,$fetchedTripSequences)) {
-                    // only fetch new trip sequences
-                    $fetchedTripSequences[] = $tripSequence;
-                    $url = $APIurl . "/json/stoptrips?stop=" . $sub_stop[0] . "&time=" . midnight_seconds() . "&service_period=" . service_period();
-                    $trips = json_decode(getPage($url));
-                    foreach ($trips as $trip) {
-                            if (!isset($allStopsTrips[$trip[1][0]])) $allStopsTrips[$trip[1][0]] = $trip;
-                    }
-                } else {
-                    echo "skipped sequence $tripSequence";
-                }
+		if (!in_array($tripSequence, $fetchedTripSequences)) {
+			// only fetch new trip sequences
+			$fetchedTripSequences[] = $tripSequence;
+			$trips = getStopTripsWithTimes($sub_stop["stop_id"]);
+			foreach ($trips as $trip) {
+				if (!isset($allStopsTrips[$trip["trip_id"]])) $allStopsTrips[$trip["trip_id"]] = $trip;
+			}
+		}
+		else {
+			echo "skipped sequence $tripSequence";
+		}
 	}
 }
-include_header($stop[1], "stop");
+include_header($stop['stop_name'], "stop");
 timePlaceSettings();
 echo '<div data-role="content" class="ui-content" role="main">        <a name="maincontent" id="maincontent"></a>';
 echo $stopLinks;
 if (sizeof($stops) > 0) {
-    trackEvent("View Stops","View Combined Stops", $stop[1], $stop[0]);
-
+	trackEvent("View Stops", "View Combined Stops", $stop["stop_name"], $stop["stop_id"]);
 	echo '<p>' . staticmap($stopPositions) . '</p>';
 }
 else {
-        trackEvent("View Stops","View Single Stop", $stop[1], $stop[0]);
+	trackEvent("View Stops", "View Single Stop", $stop["stop_name"], $stop["stop_id"]);
 	echo '<p>' . staticmap(Array(
 		0 => Array(
-			$stop[2],
-			$stop[3]
+			$stop["stop_lat"],
+			$stop["stop_lon"]
 		)
 	)) . '</p>';
 }
 echo '  <ul data-role="listview"  data-inset="true">';
 if (sizeof($allStopsTrips) > 0) {
-    sksort($allStopsTrips,0, $true);
+    sktimesort($allStopsTrips,"arrival_time", true);
 	$trips = $allStopsTrips;
 }
 else {
-	$url = $APIurl . "/json/stoptrips?stop=" . $stopid . "&time=" . midnight_seconds() . "&service_period=" . service_period();
-	$trips = json_decode(getPage($url));
+	$trips = getStopTripsWithTimes($stopid);
 }
-foreach ($trips as $row) {
-	echo '<li>';
-	echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $row[1][0] . '"><h3>' . $row[1][1]."</h3><p>";
-        $viaPoints = viaPointNames($row[1][0], $stopid);
-        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) {
-                echo $stopNames[$key] .' ';
-            }
-            echo '</small>';
-        }
-	echo '</p>';
-	echo '<p class="ui-li-aside"><strong>' . midnight_seconds_to_time($row[0]) . '</strong></p>';
-	echo '</a></li>';
-        flush(); @ob_flush();
+if (sizeof($trips) == 0) {
+	echo "<li> <center>No trips in the near future.</center> </li>";
 }
-if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>";
+else {
+	foreach ($trips as $trip) {
+		echo '<li>';
+		echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $trip['trip_id'] . '"><h3>' . $trip['route_short_name'] . " " . $trip['route_long_name'] . "</h3><p>";
+		$viaPoints = viaPointNames($trip['trip_id'], $trip['stop_sequence']);
+		if ($viaPoints != "") echo '<br><span class="viaPoints">Via: ' . $viaPoints . '</span>';
+		if (sizeof($tripStopNumbers) > 0) {
+			echo '<br><small>Boarding At: ';
+			foreach ($tripStopNumbers[$trip['trip_id']] as $key) {
+				echo $stopNames[$key] . ' ';
+			}
+			echo '</small>';
+		}
+		echo '</p>';
+		echo '<p class="ui-li-aside"><strong>' . $trip['arrival_time'] . '</strong></p>';
+		echo '</a></li>';
+		flush();
+		@ob_flush();
+	}
+}
 echo '</ul></div>';
 include_footer();
 ?>

--- a/stopList.php
+++ b/stopList.php
@@ -100,7 +100,7 @@
 					// just a normal stop
 					echo '<li>';
 					if (!startsWith($stop['stop_code'], "Wj")) echo '<img src="css/images/time.png" alt="Timing Point" class="ui-li-icon">';
-					echo '<a href="stop.php?stopid=' . $row[0] . (startsWith($stop['stop_code'], "Wj") ? '&stopcode=' . $stop['stop_code'] : "") . '">';
+					echo '<a href="stop.php?stopid=' . $stop['stop_id'] . (startsWith($stop['stop_code'], "Wj") ? '&stopcode=' . $stop['stop_code'] : "") . '">';
 					if (isset($_SESSION['lat']) && isset($_SESSION['lon'])) {
 						echo '<span class="ui-li-count">' . distance($stop['stop_lat'],$stop['stop_lon'], $_SESSION['lat'], $_SESSION['lon'], true) . 'm away</span>';
 					}