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);
}
?>
--- 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>';
}