Fix myway_timeliness_route
Fix myway_timeliness_route

file:b/.gitmodules (new)
--- /dev/null
+++ b/.gitmodules
@@ -1,1 +1,4 @@
+[submodule "lib/amon-php"]
+	path = lib/amon-php
+	url = https://github.com/martinrusev/amon-php.git
 

file:a/about.php -> file:b/about.php
--- a/about.php
+++ b/about.php
@@ -20,8 +20,8 @@
 <p>
     Busness Time - An ACT bus timetable webapp<br />
     Based on the maxious-canberra-transit-feed (<a 
-        href="http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip">download</a>, 
-    last updated <?php echo date("F d Y.", @filemtime('cbrfeed.zip')); ?>)<br />
+        href="http://busresources.lambdacomplex.org/cbrfeed.zip">download</a>, 
+    last updated <?php echo date("F d Y.", @filemtime('../busresources/cbrfeed.zip')); ?>)<br />
     Source code for the <a 
         href="https://github.com/maxious/ACTBus-data">transit 
         feed</a> and <a href="https://github.com/maxious/ACTBus-ui">this 

--- a/aws/busuidb.sh
+++ b/aws/busuidb.sh
@@ -7,10 +7,10 @@
 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\
-#,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 TABLE agency,calendar,calendar_dates,routes,stop_times,stops,trips TO transitdata;"
+#psql -d transitdata -c "GRANT SELECT,INSERT ON TABLE myway_observations,myway_timingdeltas,myway_routes,myway_stops TO transitdata;"
+#psql -d transitdata -c	"GRANT SELECT,INSERT,UPDATE ON TABLE servicealerts_alerts,servicealerts_informed TO transitdata;"
+#psql -d transitdata -c	"GRANT USAGE,SELECT ON SEQUENCE servicealerts_alerts_id_seq TO transitdata;"
 ##psql -d transitdata -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO transitdata;"
 ## INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
 ##SELECT '', 'public', 'shapes', 'shape_pt', ST_CoordDim(shape_pt), ST_SRID(shape_pt), GeometryType(shape_pt)

--- a/css/local.css.php
+++ b/css/local.css.php
@@ -55,7 +55,7 @@
     visibility: hidden;
     display: none;
     }
-    #servicewarning {
+    .servicewarning {
     padding: 1em;
     margin-bottom: 0.5em;
     text-size: 0.2em;

--- a/feedback.php
+++ b/feedback.php
@@ -67,7 +67,7 @@
   echo "\nServer host/IP: ".php_uname("n");
   echo "\nCurrent date/time: ". date("c");
   echo "\nCurrent code revision: ".exec("git rev-parse --short HEAD");
-  echo "\nCurrent timetables version: ".date("c",@filemtime('cbrfeed.zip'));
+  echo "\nCurrent timetables version: ".date("c",@filemtime('../busresources/cbrfeed.zip'));
   echo "\nDump of session: ".print_r($_SESSION,true);
 ?>
 </textarea>

--- a/include/common-geo.inc.php
+++ b/include/common-geo.inc.php
@@ -58,8 +58,8 @@
     $output = "";
     if ($collapsible)
         $output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>';
-   if (isIOSDevice()) $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=2&amp;sensor=true" width=' . $width . ' height=' . $height . '>';
- else $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=1&amp;format=jpg&amp;sensor=true" width=' . $width . ' height=' . $height . '>';
+   if (isIOSDevice()) $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=2&amp;sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">';
+ else $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&amp;' . $markers . '&amp;scale=1&amp;format=jpg&amp;sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">';
    
     if ($collapsible)
         $output.= '</div>';

--- a/include/common-request.inc.php
+++ b/include/common-request.inc.php
@@ -51,6 +51,9 @@
 if (isset($_REQUEST['routeDestination'])) {
     $routeDestination = urldecode(filter_var($_REQUEST['routeDestination'], FILTER_SANITIZE_ENCODED));
 }
+if (isset($_REQUEST['routename'])) {
+    $routename = urldecode(filter_var($_REQUEST['routename'], FILTER_SANITIZE_ENCODED));
+}
 if (isset($_REQUEST['stopcode'])) {
     $stopcode = filter_var($_REQUEST['stopcode'], FILTER_SANITIZE_STRING);
 }

--- a/include/common-template.inc.php
+++ b/include/common-template.inc.php
@@ -176,35 +176,35 @@
             $overrides = getServiceOverride();
             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 
+                    echo '<div class="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>';
                 } else {
-                    echo '<div id="servicewarning">Buses are running on an altered timetable today 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>';
+                    echo '<div class="servicewarning">Buses are running on an altered timetable today 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>';
                 }
             }
             $serviceAlerts = Array();
             $globalAlerts = getServiceAlertsAsArray("agency", "0");
-            if ($globalAlerts != nullarray) {
+            if ($globalAlerts != null) {
                 // echo "getting alerts due to network wide";
                 $serviceAlerts = array_merge($serviceAlerts, $globalAlerts);
             }
             if (isset($stopid)) {
                 $stopAlerts = getServiceAlertsAsArray("stop", $stopid);
-                if ($stopAlerts != nullarray) {
+                if ($stopAlerts != null) {
                     // echo "getting alerts due to stop $stopid";
                     $serviceAlerts = array_merge($serviceAlerts, $stopAlerts);
                 }
             }
             if (isset($routeid)) {
                 $routeAlerts = getServiceAlertsAsArray("route", $routeid);
-                if ($routeAlerts != nullarray) {
+                if ($routeAlerts != null) {
                     //    echo "getting alerts due to route $routeid";
                     $serviceAlerts = array_merge($serviceAlerts, $routeAlerts);
                 }
             }
             if (isset($serviceAlerts['entity']) && sizeof($serviceAlerts['entity']) > 0) {
                 foreach ($serviceAlerts['entity'] as $entity) {
-                    echo "<div id='servicewarning'><b>{$entity['alert']['header_text']['translation'][0]['text']}</b>&nbsp;<small>"
+                    echo "<div class='servicewarning'><b>{$entity['alert']['header_text']['translation'][0]['text']}</b>&nbsp;<small>"
                     . date("F jS Y, g:i a", $entity['alert']['active_period'][0]['start']) . " to "
                     . date("F jS Y, g:i a", $entity['alert']['active_period'][0]['end']) . "</small>
                             <br>Warning: {$entity['alert']['description_text']['translation'][0]['text']} 
@@ -229,7 +229,7 @@
 s.parentNode.insertBefore(ga, s);
   })();</script>";
         $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl();
-        echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>';
+        echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" alt=""/></noscript>';
     }
     echo "\n</div></div></body></html>";
 }

--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -172,7 +172,8 @@
                 if (sizeof($informedEntities) > 0) {
 
                     $affectsFilteredEntities = true;
-                    $informed_count++;
+                    foreach ($informedEntities as $informedEntity) {
+	$informed_count++;
                     $informed = Array();
                     $es = new transit_realtime\EntitySelector();
                     if ($informedEntity['informed_class'] == "agency") {
@@ -190,6 +191,7 @@
                         $es->setTrip($td);
                     }
                     $alert->addInformedEntity($es);
+}
                 }
                 if ($current_alert['cause'] != "") {
                     $alert->setCause(constant("transit_realtime\Alert\Cause::" . $current_alert['cause']));
@@ -216,7 +218,7 @@
                 if ($current_alert['description'] != "") {
                     $tsDescriptionText = new transit_realtime\TranslatedString();
                     $tDescriptionText = new transit_realtime\TranslatedString\Translation();
-                    $tDescriptionText->setText($current_alert['description']);
+                    $tDescriptionText->setText(trim($current_alert['description']));
                     $tDescriptionText->setLanguage("en");
                     $tsDescriptionText->addTranslation($tDescriptionText);
                     $alert->setDescriptionText($tsDescriptionText);
@@ -243,7 +245,7 @@
 
             return $codec->encode($alerts);
         } else {
-            return nullarray;
+            return null;
         }
     }
 

--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -51,13 +51,20 @@
         || strstr($_SERVER['PHP_SELF'], "lib/")
         || strstr($_SERVER['PHP_SELF'], "geo/")
         || strstr($_SERVER['PHP_SELF'], "include/")
-        || strstr($_SERVER['PHP_SELF'], "servicealerts/"))
+        || strstr($_SERVER['PHP_SELF'], "rtpis/")) {
     $basePath = "../";
+}
 
 function isDebugServer() {
     
     return php_sapi_name() == "cli" || strstr(php_uname('n'),"actbus") || 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'] == "192.168.1.8" || $_SERVER['SERVER_NAME'] == "192.168.178.24");
+}
+
+if (isset($_SERVER['SERVER_NAME'])  && $_SERVER['SERVER_NAME'] == "maxious.xen.prgmr.com") {
+// Set the exception handler
+require $basePath."/lib/amon-php/amon.php";
+Amon::setup_exception_handler();
 }
 
 include_once ("common-geo.inc.php");

--- a/include/db/route-dao.inc.php
+++ b/include/db/route-dao.inc.php
@@ -59,7 +59,12 @@
         databaseError($conn->errorInfo());
         return Array();
     }
-    return $query->fetchAll();
+    $results = $query->fetchAll();
+    if (is_array($results)) {
+        return $results;
+    } else {
+        return Array($results);
+    }
 }
 function getRouteDescription($routeID, $directionID) {
     $trip = getRouteNextTrip($routeID, $directionID);
@@ -120,7 +125,7 @@
 function getRouteNextTrip($routeID, $directionID) {
     global $conn;
    
-    $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
+    $query = "select routes.route_id,routes.route_url,direction_id,trips.trip_id,trip_headsign,departure_time,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  arrival_time between :currentTime and :futureTime 
 and routes.route_id = :routeID and trips.direction_id = :directionID order by
 arrival_time limit 1";

directory:b/lib/amon-php (new)
--- /dev/null
+++ b/lib/amon-php

--- a/myway/myway_timeliness_route.json.php
+++ b/myway/myway_timeliness_route.json.php
@@ -21,12 +21,12 @@
 header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
 ?>
 {
-"label": "<?php echo $_REQUEST['routeid']; ?>",
+"label": "<?php echo $routename; ?>",
 "data": <?php
-$query = "select * from myway_timingdeltas where route_name = :route_name AND abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas)  order by stop_sequence;";
+$query = "select * from myway_timingdeltas where route_name = :route_name 
+AND abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas)  order by stop_sequence;";
 $query = $conn->prepare($query);
-$_REQUEST['routeid'].=" ";
-$query->bindParam(':route_name', $_REQUEST['routeid'], PDO::PARAM_STR);
+$query->bindParam(':route_name', $routename, PDO::PARAM_STR);
 
 $query->execute();
 if (!$query) {
@@ -39,3 +39,4 @@
 echo "[" . implode(",", $points) . "]";
 ?>
 }
+

--- a/myway/myway_timeliness_route.php
+++ b/myway/myway_timeliness_route.php
@@ -22,7 +22,7 @@
 
 <script language="javascript" type="text/javascript" src="../js/flot/jquery.flot.js"></script> 
 <form method="get" action="">
-    <select id="routeid" name="routeid">
+    <select id="routename" name="routename">
         <?php
         $query = "select distinct route_name from myway_timingdeltas order by route_name";
         $query = $conn->prepare($query);
@@ -59,12 +59,12 @@
             // fetch one series, adding to what we got
             var alreadyFetched = {};
     
-            $("#routeid").change(function () {
+            $("#routename").change(function () {
                 var select = $(this);
         
                 // find the URL in the link right next to us 
                 //    var dataurl = button.siblings('a').attr('href');
-                var dataurl = "myway_timeliness_route.json.php?routeid=" + select.val();
+                var dataurl = "myway_timeliness_route.json.php?routename=" + select.val();
                 // then fetch the data with jQuery
                 function onDataReceived(series) {
                     // extract the first coordinate pair so you can see that

--- a/routeList.php
+++ b/routeList.php
@@ -50,17 +50,17 @@
     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']);
+        $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>" . $time['trip_headsign'] . (strstr($time['trip_headsign'], "bound") === false ? "bound" : "") . " from ".$start['stop_name']." to ".$end['stop_name'] . " (" . ucwords($time['service_id']) . ")</p>";
+                <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 "<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";
+
+        echo"       </a></li>\n";
     }
 }
 
@@ -92,7 +92,8 @@
 } else if (isset($nearby)) {
     $routes = Array();
     include_header("Routes Nearby", "routeList", true, true);
-    if (isset($_SESSION['lat'])) 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'] == "") {
@@ -132,7 +133,7 @@
                     $seriesRange[$seriesNum]['max'] = $routeNumber;
                     $seriesRange[$seriesNum]['min'] = $routeNumber;
                 }
-                $routeSeries[$seriesNum][$seriesNum . "-" . $row[1] . "-" . $row[0]] = $row;
+                $routeSeries[$seriesNum][] = null;
             }
         }
         ksort($routeSeries);
@@ -157,7 +158,8 @@
         displayRoutes(getRoutesByDestination($routeDestination));
     } else {
         foreach (getRoutesByDestination() as $destination) {
-            echo '<li><a href="' . curPageURL() . '/routeList.php?routeDestination=' . urlencode($destination['stop_name']) . '">' . $destination['stop_name'] . "... </a></li>\n";
+            echo '<li><a href="' . curPageURL() . '/routeList.php?routeDestination='
+            . urlencode($destination['stop_name']) . '">' . $destination['stop_name'] . "... </a></li>\n";
         }
     }
 }

--- a/rtpis/gtfs-realtime.php
+++ b/rtpis/gtfs-realtime.php
@@ -15,7 +15,7 @@
   See the License for the specific language governing permissions and
   limitations under the License.
  */
-include ('include/common.inc.php');
+include ('../include/common.inc.php');
 function accept_header($header = false) {
     // http://jrgns.net/parse_http_accept_header
     $toret = null;
@@ -36,9 +36,23 @@
     }
     return $toret;
 }
+function usage() {
+echo "Usage notes: Must specify format json/protobuf and gtfs-realtime feedtype alerts/updates. If callback is specified, will provide jsonp. Can filter with parmaters filter_class route/stop and filter_id with the id specified in GTFS.";
+die();
+}
+
+$filter_class = (isset($_REQUEST['filter_class']) ? $_REQUEST['filter_class'] : "");
+$filter_id = (isset($_REQUEST['filter_id']) ? $_REQUEST['filter_id']:"");
+
 $json_types =  Array("application/json","application/x-javascript","text/javascript","text/x-javascript","text/x-json");
 if ($_REQUEST['json']) {
-    $return = getServiceAlertsAsJSON($_REQUEST['filter_class'], $_REQUEST['filter_id']);
+if ($_REQUEST['alerts']) {
+    $return = getServiceAlertsAsJSON($filter_class,$filter_id);
+} else if ($_REQUEST['updates']) {
+    $return = getTripUpdatesAsJSON($filter_class,$filter_id);
+} else {
+	usage();
+}
     header('Content-Type: application/json; charset=utf8');
 // header('Access-Control-Allow-Origin: http://bus.lambdacomplex.org/');
     header('Access-Control-Max-Age: 3628800');
@@ -47,7 +61,25 @@
         $json = '(' . $return . ');'; //must wrap in parens and end with semicolon
         //print_r($_GET['callback'] . $json); //callback is prepended for json-p
     }
-    else
+    else {
         echo $return;
+	}
+} else if ($_REQUEST['protobuf']) {
+if ($_REQUEST['alerts']) {
+    $return = getServiceAlertsAsBinary($filter_class,$filter_id);
+} else if ($_REQUEST['updates']) {
+    $return = getTripUpdatesAsBinary($filter_class,$filter_id);
+} else {
+	usage();
+}
+    header('Content-Type: application/x-protobuf');
+header('Content-Disposition: attachment; filename="'.(isset($_REQUEST['updates'])?"updates.":"alerts.").date("c").'.protobuf"');
+// header('Access-Control-Allow-Origin: http://bus.lambdacomplex.org/');
+    header('Access-Control-Max-Age: 3628800');
+    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
+        echo $return;
+} else {
+usage();
 }
 ?>
+

--- a/rtpis/servicealert_editor.php
+++ b/rtpis/servicealert_editor.php
@@ -35,18 +35,18 @@
     echo "Saved " . $_REQUEST['saveedit'];
     die();
 }
-if ($_REQUEST['delete']) {
+if (isset($_REQUEST['delete'])) {
     $deleteParts = explode(";", $_REQUEST['delete']);
     deleteInformedAlert($deleteParts[0], $deleteParts[1], $deleteParts[2]);
     echo "Deleted network inform for {$deleteParts[0]} ({$deleteParts[1]},{$deleteParts[2]})<br>\n";
     die();
 }
-if ($_REQUEST['networkinform']) {
+if (isset($_REQUEST['networkinform'])) {
     addInformedAlert($_REQUEST['networkinform'], "agency", "0", "inform");
     echo "Added network inform for" . $_REQUEST['networkinform'];
     die();
 }
-if ($_REQUEST['stopsearch']) {
+if (isset($_REQUEST['stopsearch'])) {
     addInformedAlert($_REQUEST['stopsearch'], "stop", $_REQUEST['stopid'], "remove");
     echo "Added stop remove for" . $_REQUEST['stopsearch'] . ", stop" . $_REQUEST['stopid'] . "<br>\n";
 
@@ -59,7 +59,7 @@
     }
     die();
 }
-if ($_REQUEST['streetsearch']) {
+if (isset($_REQUEST['streetsearch'])) {
 
     echo "Informing stops of street<br>\n";
     foreach (getStopsByName($_REQUEST['street']) as $stop) {
@@ -87,7 +87,7 @@
     ?>
 </table>
 <?php
-$alert = getServiceAlert($_REQUEST['edit']);
+$alert = getServiceAlert((isset($_REQUEST['edit'])?$_REQUEST['edit']:""));
 ?>
 <form action="<?php echo basename(__FILE__);
 ?>" method="get">
@@ -95,19 +95,21 @@
     <div data-role="fieldcontain">
         <label for="startdate"> Start Date</label>
         <input type="text" name="startdate" id="startdate" value="<?php
-      if ($alert['start'])
+      if ($alert['start']) {
           echo date("c", $alert['start']);
-      else
+      } else {
           echo date("c", strtotime("0:00"));
+}
 ?>"  />
     </div>
     <div data-role="fieldcontain">
         <label for="enddate"> End Date </label>
         <input type="text" name="enddate" id="enddate" value="<?php
-               if ($alert['end'])
+               if ($alert['end']) {
                    echo date("c", $alert['end']);
-               else
+               } else {
                    echo date("c", strtotime("23:59"));
+}
 ?>"  />
     </div>
     <div data-role="fieldcontain">
@@ -116,8 +118,7 @@
     </div>
     <div data-role="fieldcontain">
         <label for="description">Description</label>
-        <textarea name="description">
-            <?php echo $alert['description']; ?></textarea>
+        <textarea name="description"><?php echo $alert['description']; ?></textarea>
     </div>
     <div data-role="fieldcontain">
         <label for="url">URL</label>
@@ -142,12 +143,12 @@
             }
             ?>
         </select></div>
-    <input type="hidden" name="saveedit" value="<?php echo $_REQUEST['edit']; ?>"/>
+    <input type="hidden" name="saveedit" value="<?php if (isset($_REQUEST['edit']))echo $_REQUEST['edit']; ?>"/>
     <input type="submit" value="Save"/>
 </div></form>
 
 <?php
-if ($_REQUEST['edit']) {
+if (isset($_REQUEST['edit'])) {
     echo "Informed Entities for ID {$_REQUEST['edit']}:";
     echo '<table>';
     foreach (getInformedAlerts($_REQUEST['edit'], "", "") as $informed) {
@@ -185,3 +186,4 @@
 }
 include_footer();
 ?>
+

--- a/rtpis/siri.php
+++ b/rtpis/siri.php
@@ -1,8 +1,80 @@
 <?php
 
 /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
+ *    Copyright 2010,2011 Alexander Sadleir 
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
  */
+include ('include/common.inc.php');
+function accept_header($header = false) {
+    // http://jrgns.net/parse_http_accept_header
+    $toret = null;
+    $header = $header ? $header : (array_key_exists('HTTP_ACCEPT', $_SERVER) ? $_SERVER['HTTP_ACCEPT']: false);
+    if ($header) {
+        $types = explode(',', $header);
+        $types = array_map('trim', $types);
+        foreach ($types as $one_type) {
+            $one_type = explode(';', $one_type);
+            $type = array_shift($one_type);
+            if ($type) {
+                list($precedence, $tokens) = self::accept_header_options($one_type);
+                list($main_type, $sub_type) = array_map('trim', explode('/', $type));
+                $toret[] = array('main_type' => $main_type, 'sub_type' => $sub_type, 'precedence' => (float)$precedence, 'tokens' => $tokens);
+            }
+        }
+        usort($toret, array('Parser', 'compare_media_ranges'));
+    }
+    return $toret;
+}
+function usage() {
+echo "Usage notes: Must specify format json/xml. If callback is specified, will provide jsonp. Can filter with parmaters filter_class route/stop and filter_id with the id specified in GTFS."
+die();
+}
+$json_types =  Array("application/json","application/x-javascript","text/javascript","text/x-javascript","text/x-json");
+if ($_REQUEST['json']) {
+if ($_REQUEST['alerts']) {
+    $return = getServiceAlertsAsJSON($_REQUEST['filter_class'], $_REQUEST['filter_id']);
+} else if ($_REQUEST['updates']) {
+    $return = getTripUpdatesAsJSON($_REQUEST['filter_class'], $_REQUEST['filter_id']);
+} else {
+	usage();
+}
+    header('Content-Type: application/json; charset=utf8');
+// header('Access-Control-Allow-Origin: http://bus.lambdacomplex.org/');
+    header('Access-Control-Max-Age: 3628800');
+    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
+    if (isset($_GET['callback'])) {
+        $json = '(' . $return . ');'; //must wrap in parens and end with semicolon
+        //print_r($_GET['callback'] . $json); //callback is prepended for json-p
+    }
+    else {
+        echo $return;
+	}
+} else if ($_REQUEST['xml']) {
+if ($_REQUEST['alerts']) {
+    $return = getServiceAlertsAsBinary($_REQUEST['filter_class'], $_REQUEST['filter_id']);
+} else if ($_REQUEST['updates']) {
+    $return = getTripUpdatesAsBinary($_REQUEST['filter_class'], $_REQUEST['filter_id']);
+} else {
+	usage();
+}
+    header('Content-Type: application/json; charset=utf8');
+// header('Access-Control-Allow-Origin: http://bus.lambdacomplex.org/');
+    header('Access-Control-Max-Age: 3628800');
+    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
+        echo $return;
+} else {
+usage();
+}
 ?>
 

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -16,8 +16,9 @@
   limitations under the License.
  */
 include ('include/common.inc.php');
-if ($stopid)
+if (isset($stopid)) {
     $stop = getStop($stopid);
+}
 /* if ($stopcode != "" && $stop[5] != $stopcode) {
   $url = $APIurl . "/json/stopcodesearch?q=" . $stopcode;
   $stopsearch = json_decode(getPage($url));
@@ -85,7 +86,7 @@
   echo '<div id="servicewarning">'.$serviceAlert['alert']['description']['translation'].'</div>';
   } */
 
-echo '<span class="content-secondary">';
+echo '<div class="content-secondary">';
 echo $stopLinks;
 if (sizeof($stops) > 0) {
     trackEvent("View Stops", "View Combined Stops", $stop["stop_name"], $stop["stop_id"]);
@@ -102,7 +103,7 @@
 
 timeSettings();
 
-echo '</span><span class="content-primary">';
+echo '</div><div class="content-primary">';
 echo '  <ul data-role="listview"  data-inset="true">';
 if (sizeof($allStopsTrips) > 0) {
     sktimesort($allStopsTrips, "arrival_time", true);
@@ -173,7 +174,7 @@
     }
 }
 echo '</ul>';
-echo '</span>';
+echo '</div>';
 include_footer();
 ?>