Fix Android viewport zoom
Fix Android viewport zoom

file:b/css/local.css.php (new)
--- /dev/null
+++ b/css/local.css.php
@@ -1,1 +1,216 @@
-
+<?php
+  header('Content-type: text/css');
+  ob_start("compress");
+  function compress($buffer) {
+    /* remove comments */
+    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
+    /* remove tabs, spaces, newlines, etc. */
+    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);
+    return $buffer;
+  }
+
+echo '
+.ui-li-thumb, .ui-li-icon { position: relative; }
+
+     .ui-navbar {
+     width: 100%;
+     }
+     .ui-btn-inner {
+        white-space: normal !important;
+     }
+     .ui-li-heading {
+        white-space: normal !important;
+     }
+    .ui-listview-filter {
+        margin: 0 !important;
+     }
+    .ui-icon-navigation {
+        background-image: url('.$_REQUEST['labsPath'].'css/images/113-navigation.png);
+        background-position: 1px 0;
+     }
+    .ui-icon-beaker {
+        background-image: url('.$_REQUEST['labsPath'].'css/images/91-beaker-2.png);
+        background-position: 1px 0;
+    }
+    #footer {
+        text-size: 0.75em;
+        text-align: center;
+    }
+    body {
+        background-color: #F0F0F0;
+    }
+    #jqm-homeheader {
+        text-align: center;
+    }        
+    .viaPoints {
+        display: none;
+        text-size: 0.2em;
+    }
+    .min-width-480px .viaPoints {
+        display: inline;
+    }
+    #extrainfo {
+    visibility: hidden;
+    display: none;
+    }
+    #servicewarning {
+    padding: 1em;
+    margin-bottom: 0.5em;
+    text-size: 0.2em;
+    background-color: #FF9;
+    -moz-border-radius: 15px;
+border-radius: 15px;
+    }
+
+
+#footer {
+clear:both;
+text-align:center;
+}
+    // source http://webaim.org/techniques/skipnav/
+    #skip a, #skip a:hover, #skip a:visited 
+{ 
+position:absolute; 
+left:0px; 
+top:-500px; 
+width:1px; 
+height:1px; 
+overflow:hidden;
+} 
+
+#skip a:active, #skip a:focus 
+{ 
+position:static; 
+width:auto; 
+height:auto; 
+}';
+
+//if (false)
+ echo '
+// adaptive layout from jQuery Mobile docs site
+.type-interior .content-secondary {
+	border-right: 0;
+	border-left: 0;
+	margin: 10px -15px 0;
+	background: #fff;
+	border-top: 1px solid #ccc;
+}
+.type-home .ui-content {
+	margin-top: 5px;
+}
+.type-interior .ui-content {
+	padding-bottom: 0;
+}
+.content-secondary .ui-collapsible-contain {
+	padding: 10px 15px;
+
+}
+.content-secondary .ui-collapsible-heading {
+	margin: 0 0 30px;
+}
+.content-secondary .ui-collapsible-heading-collapsed,
+.content-secondary .ui-collapsible-content {
+	padding:0;
+	margin: 0;
+}
+@media all and (min-width: 650px){
+.content-secondary {
+		text-align: left;
+		float: left;
+		width: 45%;
+		background: none;
+		border-top: 0;
+	}
+	.content-secondary,
+	.type-interior .content-secondary {
+		margin: 30px 0 20px 2%;
+		padding: 20px 4% 0 0;
+			background: none;
+	}
+	.type-index .content-secondary {
+		padding: 0;
+	}
+	.type-index .content-secondary .ui-listview {
+		margin: 0;
+	}
+	.content-primary {
+		width: 45%;
+		float: right;
+		margin-top: 30px;
+		margin-right: 1%;
+		padding-right: 1%;
+	}
+	.content-primary ul:first-child {
+		margin-top: 0;
+	}
+
+	.type-interior .content-primary {
+		padding: 1.5em 6% 3em 0;
+		margin: 0;
+	}
+	/* fix up the collapsibles - expanded on desktop */
+	.content-secondary .ui-collapsible-heading {
+		display: none;
+	}
+	.content-secondary .ui-collapsible-contain {
+		margin:0;
+	}
+	.content-secondary .ui-collapsible-content {
+		display: block;
+		margin: 0;
+		padding: 0;
+	}
+		.type-interior  .content-secondary .ui-li-divider {
+		padding-top: 1em;
+		padding-bottom: 1em;
+	}
+	.type-interior .content-secondary {
+		margin: 0;
+		padding: 0;
+	}
+}
+@media all and (min-width: 750px){
+	.type-home .ui-content,
+	.type-interior .ui-content {
+		background-position: 39%;
+	}
+	.content-secondary {
+		width: 34%;
+	}
+	.content-primary {
+		width: 56%;
+		padding-right: 1%;
+	}	
+	.type-interior .ui-content {
+		background-position: 34%;
+	}
+}
+
+@media all and (min-width: 1200px){
+	.type-home .ui-content{
+		background-position: 38.5%;
+	}
+	.type-interior .ui-content {
+		background-position: 30%;
+	}
+	.content-secondary {
+		width: 30%;
+		padding-right:6%;
+		margin: 30px 0 20px 5%;
+	}
+	.type-interior .content-secondary {
+		margin: 0;
+		padding: 0;
+	}
+	.content-primary {
+		width: 50%;
+		margin-right: 5%;
+		padding-right: 3%;
+	}
+	.type-interior .content-primary {
+		width: 60%;
+	}
+}';
+  ob_end_flush();
+?>
+

--- a/dotcloud/postinstall
+++ b/dotcloud/postinstall
@@ -3,8 +3,8 @@
 
 curl http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip \
 -o /home/dotcloud/current/cbrfeed.zip
-wget http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \
--O /tmp/Graph.obj
+curl http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \
+-o /tmp/Graph.obj
 
 #db setup
 #curl https://github.com/maxious/ACTBus-ui/raw/master/transitdata.cbrfeed.sql.gz -o transitdata.cbrfeed.sql.gz

--- a/include/common-geo.inc.php
+++ b/include/common-geo.inc.php
@@ -1,7 +1,7 @@
 <?php
 // SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',')
 $suburbs = explode(",", "Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O'Connor,O'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla");
-function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb", $collapsible = true)
+function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb", $collapsible = true, $twotone = false)
 {
 	global $labsPath;
 	$width = 300;
@@ -13,14 +13,11 @@
 	$metersperpixel[13] = 19.093 * $width;
 	$metersperpixel[14] = 9.547 * $width;
 	$metersperpixel[15] = 4.773 * $width;
-	$metersperpixel[16] = 2.387 * $width;
+	//$metersperpixel[16] = 2.387 * $width;
 	// $metersperpixel[17]=1.193*$width;
 	$center = "";
 	$markers = "";
-	$minlat = 999;
-	$minlon = 999;
-	$maxlat = 0;
-	$maxlon = 0;
+	$mapwidthinmeters = 50;
 	if (sizeof($mapPoints) < 1) return "map error";
 	if (sizeof($mapPoints) === 1) {
 		if ($zoom == 0) $zoom = 14;
@@ -29,27 +26,30 @@
 	}
 	else {
 		foreach ($mapPoints as $index => $mapPoint) {
-			$markers.= $mapPoint[0] . "," . $mapPoint[1] . "," . $markerImage . ($index + 1);
+			if ($twotone && $index == 0) {
+				$markers.= $mapPoint[0] . "," . $mapPoint[1] . "," . "iconr" . ($index + 1);
+				$center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
+			}
+			else {
+				$markers.= $mapPoint[0] . "," . $mapPoint[1] . "," . $markerImage . ($index + 1);
+			}
 			if ($index + 1 != sizeof($mapPoints)) $markers.= "|";
-			if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0];
-			if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0];
-			if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1];
-			if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1];
+			$dist = distance($mapPoints[0][0], $mapPoint[0][1], $mapPoint[0], $mapPoint[1]);
+			$mapwidthinmeters = ($dist > $mapwidthinmeters ? $dist : $mapwidthinmeters);
 			$totalLat+= $mapPoint[0];
 			$totalLon+= $mapPoint[1];
 		}
 		if ($zoom == 0) {
 			$mapwidthinmeters = distance($minlat, $minlon, $minlat, $maxlon);
 			foreach (array_reverse($metersperpixel, true) as $zoomLevel => $maxdistance) {
-				if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel;
+				if ($zoom == 0 && $mapwidthinmeters * 1.5 < ($maxdistance)) $zoom = $zoomLevel;
 			}
 		}
 		$center = $totalLat / sizeof($mapPoints) . "," . $totalLon / sizeof($mapPoints);
 	}
 	$output = "";
 	if ($collapsible) $output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>';
-	$output.= '<img class="map" src="' . curPageURL() . '/'. $labsPath. '/lib/staticmaplite/staticmap.php?center=' . $center . '&amp;zoom=' . $zoom . '&amp;size=' . $width . 'x' . $height . '&amp;markers=' . 
-$markers . '" width=' . $width . ' height=' . $height . '>';
+	$output.= '<img class="map" src="' . curPageURL() . '/' . $labsPath . '/lib/staticmaplite/staticmap.php?center=' . $center . '&amp;zoom=' . $zoom . '&amp;size=' . $width . 'x' . $height . '&amp;markers=' . $markers . '" width=' . $width . ' height=' . $height . '>';
 	if ($collapsible) $output.= '</div>';
 	return $output;
 }
@@ -67,11 +67,11 @@
 	$c = 2 * atan2(sqrt($a) , sqrt(1 - $a));
 	$km = $r * $c;
 	if ($roundLargeValues) {
-	  if ($km < 1) return floor($km * 1000);
-	  else return round($km,2)."k";
-	} else return floor($km * 1000);
+		if ($km < 1) return floor($km * 1000);
+		else return round($km, 2) . "k";
+	}
+	else return floor($km * 1000);
 }
-
 function decodePolylineToArray($encoded)
 {
 	// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5

--- a/include/common-request.inc.php
+++ b/include/common-request.inc.php
@@ -15,7 +15,7 @@
 	$nearby = true;
 }
 if (isset($_REQUEST['suburb'])) {
-	$suburb = filter_var($_REQUEST['suburb'], FILTER_SANITIZE_STRING);
+	$suburb = $_REQUEST['suburb'];
 }
 $pageKey = filter_var($_REQUEST['pageKey'], FILTER_SANITIZE_NUMBER_INT);
 $lat = filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

--- a/include/common-template.inc.php
+++ b/include/common-template.inc.php
@@ -32,7 +32,8 @@
 <html lang="en">
 	<head>
         <meta charset="UTF-8">
-	<title>' . $pageTitle . '</title>
+<meta name="viewport" content="width=device-width, initial-scale=1"> 	
+<title>' . $pageTitle . '</title>
         <meta name="google-site-verification" 
 content="-53T5Qn4TB_de1NyfR_ZZkEVdUNcNFSaYKSFkWKx-sY" />
 	<link rel="stylesheet"  href="'.$labsPath.'css/jquery-ui-1.8.12.custom.css" />';
@@ -77,8 +78,7 @@
 	});
 	</script>
 	';
-	echo '<style type="text/css">
-.ui-li-thumb, .ui-li-icon { position: relative; }';
+	echo '<style type="text/css">';
 
 if (strstr($_SERVER['HTTP_USER_AGENT'], 'Android')) echo '.ui-shadow,.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a,.ui-body-b,.ui-btn-up-b,.ui-btn-hover-b,
 .ui-btn-down-b,.ui-bar-c,.ui-body-c,.ui-btn-up-c,.ui-btn-hover-c,.ui-btn-down-c,.ui-bar-c,.ui-body-d,
@@ -88,94 +88,11 @@
  box-shadow: none;
  -webkit-box-shadow: none;
 }';
-echo '
-     .ui-navbar {
-     width: 100%;
-     }
-     .ui-btn-inner {
-        white-space: normal !important;
-     }
-     .ui-li-heading {
-        white-space: normal !important;
-     }
-    .ui-listview-filter {
-        margin: 0 !important;
-     }
-    .ui-icon-navigation {
-        background-image: url('.$labsPath.'css/images/113-navigation.png);
-        background-position: 1px 0;
-     }
-    .ui-icon-beaker {
-        background-image: url('.$labsPath.'css/images/91-beaker-2.png);
-        background-position: 1px 0;
-    }
-    #footer {
-        text-size: 0.75em;
-        text-align: center;
-    }
-    body {
-        background-color: #F0F0F0;
-    }
-    #jqm-homeheader {
-        text-align: center;
-    }        
-    .viaPoints {
-        display: none;
-        text-size: 0.2em;
-    }
-    .min-width-480px .viaPoints {
-        display: inline;
-    }
-    #extrainfo {
-    visibility: hidden;
-    display: none;
-    }
-    #servicewarning {
-    padding: 1em;
-    margin-bottom: 0.5em;
-    text-size: 0.2em;
-    background-color: #FF9;
-    -moz-border-radius: 15px;
-border-radius: 15px;
-    }
- 
-/*#leftcolumn { 
-	float: none;
-}			
-.min-width-768px #leftcolumn {
-	float: left;
-	width: 30%;
-}
-#rightcolumn { 
-	float: none;
-}			
-.min-width-768px #rightcolumn {
-	float: right;
-	width: 68%;
-}*/	
-
-#footer {
-clear:both;
-text-align:center;
-}
-    // source http://webaim.org/techniques/skipnav/
-    #skip a, #skip a:hover, #skip a:visited 
-{ 
-position:absolute; 
-left:0px; 
-top:-500px; 
-width:1px; 
-height:1px; 
-overflow:hidden;
-} 
-
-#skip a:active, #skip a:focus 
-{ 
-position:static; 
-width:auto; 
-height:auto; 
-}
-</style>';
+echo '</style>';
+
+echo '<link rel="stylesheet"  href="'.$labsPath.'css/local.css.php?labsPath='.$labsPath.'" />';
+	
+
 	if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad')) {
 		echo '<meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
@@ -208,10 +125,6 @@
 $(document).ready(function() {
         $('#here').click(function(event) { $('#geolocate').val(geolocate()); return false;});
         $('#here').show();
-	/*if ($.mobile.media('screen and (min-width: 768px)')) {
-	  $('map a:first').click();
-	  $('#settings a:first').click();
-	}*/
 });
 ";
 		if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") echo "geolocate();";

--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -6,7 +6,7 @@
 	"phperror",
 	"awsotp",
 	//"squallotp",
-	"vanilleotp",
+	//"vanilleotp",
 	"database",
 	"other"
 );

--- a/include/db/servicealert-dao.inc.php
+++ b/include/db/servicealert-dao.inc.php
@@ -2,7 +2,7 @@
 function getServiceOverride($date="") {
 	global $conn;
 	$query = "Select * from calendar_dates where date = :date and exception_type = '1' LIMIT 1";
-	 debug($query,"database");
+	// debug($query,"database");
 	$query = $conn->prepare($query); // Create a prepared statement
 	$query->bindParam(":date", date("Ymd",($date != "" ? $date : time())));
 	$query->execute();
@@ -12,4 +12,42 @@
 	}
 	return $query->fetch(PDO::FETCH_ASSOC);
 }
+
+function getCurrentAlerts() {
+		global $conn;
+	$query = "SELECT * from servicealerts_alerts";
+	//debug($query, "database");
+	$query = $conn->prepare($query);
+	//if ($stop_sequence != "") $query->bindParam(":stop_sequence", $stop_sequence);
+	$query->execute();
+	if (!$query) {
+		databaseError($conn->errorInfo());
+		return Array();
+	}
+	return $query->fetchAll();
+}
+function getInformedAlerts($id,$filter_class,$filter_id) {
+	
+		global $conn;
+	$query = "SELECT * from servicealerts_informed where servicealert_id = :servicealert_id";
+	
+	if ($filter_class != "" && $filter_id != "") {
+		$query .= " AND (informed_class = :informed_class OR informed_class = 'network') AND informed_id = :informed_id";
+	
+	}
+	//debug($query, "database");
+	$query = $conn->prepare($query);
+	if ($filter_class != "" && $filter_id != "") {
+		$query->bindParam(":informed_class", $filter_class);
+		$query->bindParam(":informed_id", $filter_id);
+	}
+	$query->bindParam(":servicealert_id", $id);
+	$query->execute();
+	if (!$query) {
+		databaseError($conn->errorInfo());
+		return Array();
+	}
+	return $query->fetchAll();
+}
+
 ?>

--- a/labs/myway_timeliness.php
+++ b/labs/myway_timeliness.php
@@ -6,17 +6,16 @@
     <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../js/flot/excanvas.min.js"></script><![endif]--> 
  
     <script language="javascript" type="text/javascript" src="../js/flot/jquery.flot.js"></script> 
-  <div id="placeholder" style="width:800px;height:600px"></div> 
+  <div id="placeholder" style="width:1000px;height:600px"></div> 
 <script type="text/javascript"> 
 $(function () {
     var d = new Date();
 						d.setUTCMinutes(0);
 						d.setUTCHours(0);
     var midnight = d.getTime();
-    var d1 = [];
+
 <?php
-//$query = "select * from myway_timingdeltas order by time";
-$query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas)  order by time;";
+$query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas)  order by route_full_name;";
 $query = $conn->prepare($query);
 $query->execute();
 if (!$query) {
@@ -24,39 +23,34 @@
 	return Array();
 }
 $i = 0;
+$labels = Array();
+$lastRoute = "";
 foreach ($query->fetchAll() as $delta) {
-	echo "d1.push([ midnight+ (1000*" . midnight_seconds(strtotime($delta['time'])) . "), {$delta['timing_delta']}]); \n";
-	$i++;
+    $routeName = $delta['route_full_name'];
+    if (strstr($routeName," 3")) $routeName = "312-319";
+    else $routeName = preg_replace('/\D/', '', $routeName);
+    if ($routeName != $lastRoute) {
+        	$i++;
+                echo "    var d$i = [];";
+                $lastRoute = $routeName;
+                $labels[$i] = $routeName;
+    }
+	echo "d$i.push([ midnight+ (1000*" . midnight_seconds(strtotime($delta['time'])) . "), {$delta['timing_delta']}]); \n";
 };
 ?>
 
-    var d2 = [];
-<?php
-//$query = "select * 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_full_name";
-$query = $conn->prepare($query);
-$query->execute();
-if (!$query) {
-	databaseError($conn->errorInfo());
-	return Array();
-}
-$i = 0;
-foreach ($query->fetchAll() as $delta) {
-	//  echo "d2.push([$i, {$delta['timing_delta']}]); \n";
-	$i++;
-};
-?>
        var placeholder = $("#placeholder");
 
     var plot = $.plot(placeholder, [
-        {
-            data: d1,
-            points: { show: true }
-        },
-        {
-            data: d2,
-            points: { show: true }
-        },
+<?php
+foreach ($labels as $key => $label) {
+    echo "        {
+            data: d$key,
+            points: { show: true },
+            label: '$label'
+        },";
+}
+        ?>
     ],
         {
             xaxis: {
@@ -111,7 +105,7 @@
 
                     
                     showTooltip(item.pageX, item.pageY,
-                                item.series.label + " of " + x + " "+ time +" = " + y +" ( "+ y/60+" minutes )");
+                                item.series.label + " at "+ time +" = " + y +" ( "+ y/60+" minutes )");
                 }
             }
             else {

--- a/routeList.php
+++ b/routeList.php
@@ -38,7 +38,7 @@
 		navbar();
 		timePlaceSettings();
 		trackEvent("Route Lists", "Routes By Suburb", $suburb);
-		$routes = getRoutesbysuburbs($suburb);
+		$routes = getRoutesBySuburb($suburb);
 	}
 	if (isset($nearby)) {
 		include_header("Routes Nearby", "routeList", true, true);

--- a/servicealerts_api.php
+++ b/servicealerts_api.php
@@ -6,48 +6,43 @@
          - add,remove,patch
             - stop
             - trip
+            - network
           - patterns (WHERE=)
             - route (short_name or route_id)
             - street
             - stop
             - trip */
-/* header {
-  gtrtfs_version: "1"
-  timestamp: 1307926866
+$return = Array();
+$return['header']['gtrtfs_version'] = "1";
+$return['header']['timestamp'] = time();
+$return['entities'] = Array();
+foreach(getCurrentAlerts() as $alert) {
+	$informedEntities = getInformedAlerts($alert['id'],$_REQUEST['filter_class'],$_REQUEST['filter_id']);
+	if (sizeof($informedEntities) >0) {
+		$entity = Array();
+		$entity['id'] = $alert['id'];
+		$entity['alert']['active_period']['start'] = $alert['start'];
+		$entity['alert']['active_period']['start'] = $alert['end'];
+		$entity['alert']['url']['translation'] = $alert['url'];
+		$entity['alert']['description']['translation'] = $alert['description'];
+		
+		foreach ($informedEntities as $informedEntity) {
+			$informed = Array();
+			$informed[$informedEntity['informed_class']."_id"] = $informedEntity['informed_id'];
+			if ($informedEntity['informed_action'] != "") $informed["x-action"] = $informedEntity['informed_action'];
+			//$informed[$informedEntity['class']."_type"] = $informedEntity['type'];
+			$entity['informed'][] = $informed; 
+		}
+		$return['entities'][] = $entity;
+	}
 }
-entity {
-  id: "21393"
-  alert {
-    active_period {
-      start: 1307955600
-      end: 1307988000
-    }
-    informed_entity {
-      route_id: "100"
-      route_type: 1
-    }
-    url {
-      translation {
-        text: "http://trimet.org/alerts/"
-      }
-    }
-    description_text {
-      translation {
-        text: "Rose Festival fleet departures will cause bridge lifts until around 10 a.m. Expect delays."
-      }
-    }
-  }
-}*/
-$return = Array();
-
-header('Content-Type: text/javascript; charset=utf8');
+//header('Content-Type: text/javascript; 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 = '(' . json_encode($return) . ');'; //must wrap in parens and end with semicolon
-	print_r($_GET['callback'] . $json); //callback is prepended for json-p
-	
+	//print_r($_GET['callback'] . $json); //callback is prepended for json-p
 }
 else echo json_encode($return);
             ?>

file:a/stop.php -> file:b/stop.php
--- a/stop.php
+++ b/stop.php
@@ -12,6 +12,7 @@
 	// expand out to all platforms
 	
 }*/
+
 $stops = Array();
 $stopPositions = Array();
 $stopNames = Array();
@@ -60,8 +61,13 @@
 	}
 }
 include_header($stop['stop_name'], "stop");
-echo '<span id="leftcolumn">';
-timePlaceSettings();
+/*$serviceAlerts = json_decode(getPage(curPageURL() . "/servicealerts_api.php?filter_class=stop&filter_id=".$stopid) , true);
+
+foreach($serviceAlerts['entities'] as $serviceAlert) {
+    echo '<div id="servicewarning">'.$serviceAlert['alert']['description']['translation'].'</div>';
+}*/
+
+echo '<span class="content-secondary">';
 echo $stopLinks;
 if (sizeof($stops) > 0) {
 	trackEvent("View Stops", "View Combined Stops", $stop["stop_name"], $stop["stop_id"]);
@@ -76,7 +82,8 @@
 		)
 	)) ;
 }
-echo '</span><span id="rightcolumn">';
+timePlaceSettings();
+echo '</span><span class="content-primary">';
 echo '  <ul data-role="listview"  data-inset="true">';
 if (sizeof($allStopsTrips) > 0) {
     sktimesort($allStopsTrips,"arrival_time", true);

--- a/stopList.php
+++ b/stopList.php
@@ -47,12 +47,26 @@
 		include_header("Nearby Stops", "stopList", true, true);
 		trackEvent("Stop Lists", "Stops Nearby", $_SESSION['lat'] . "," . $_SESSION['lon']);
 		navbar();
-		timePlaceSettings(true);
 		if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") {
+			timePlaceSettings(true);
 			include_footer();
 			die();
 		}
 		$stops = getNearbyStops($_SESSION['lat'], $_SESSION['lon'], 15);
+		echo '<span class="content-secondary">';
+		$stopPositions[] = Array(
+			$_SESSION['lat'],
+			$_SESSION['lon']
+		);
+		foreach ($stops as $sub_stop) {
+			$stopPositions[] = Array(
+				$sub_stop["stop_lat"],
+				$sub_stop["stop_lon"]
+			);
+		}
+		echo staticmap($stopPositions, 0, "iconb", true, true);
+		timePlaceSettings(true);
+		echo '</span><span class="content-primary">';
 	}
 	else if (isset($suburb)) {
 		$stops = getStopsBySuburb($suburb);
@@ -129,6 +143,7 @@
 		}
 	}
 	echo '</ul>';
+	if (isset($nearby)) echo '</span>';
 }
 include_footer();
 ?>

file:a/trip.php -> file:b/trip.php
--- a/trip.php
+++ b/trip.php
@@ -1,39 +1,54 @@
 <?php
 include ('include/common.inc.php');
-
 $routetrips = Array();
-
 if (isset($routeid) && !isset($tripid)) {
-    $trip = getRouteNextTrip($routeid);
-    $tripid = $trip['trip_id'];
-} else {
-    $trip = getTrip($tripid);
-    $routeid = $trip["route_id"];
+	$trip = getRouteNextTrip($routeid);
+	$tripid = $trip['trip_id'];
+}
+else {
+	$trip = getTrip($tripid);
+	$routeid = $trip["route_id"];
 }
 
-$routetrips = getRouteTrips($routeid);
-    
 include_header("Stops on " . $trip['route_short_name'] . ' ' . $trip['route_long_name'], "trip");
-trackEvent("Route/Trip View","View Route",  $trip['route_short_name'] . ' ' . $trip['route_long_name'], $routeid);
-
-echo '<span id="leftcolumn">';
+trackEvent("Route/Trip View", "View Route", $trip['route_short_name'] . ' ' . $trip['route_long_name'], $routeid);
+echo '<span class="content-secondary">';
+echo '<a href="' . $trip['route_url'] . '">View Original Timetable/Map</a>';
 echo '<h2>Via:</h2> <small>' . viaPointNames($tripid) . '</small>';
 echo '<h2>Other Trips:</h2> ';
-foreach (getRouteTrips($routeid) as $othertrip) {
-	echo '<a href="trip.php?tripid=' . $othertrip['trip_id'] . "&amp;routeid=" . $routeid . '">' . str_replace("  ",":00",str_replace(":00"," ",$othertrip['arrival_time'])). '</a> ';
+$routeTrips = getRouteTrips($routeid);
+foreach ($routeTrips as $key => $othertrip) {
+    if ($othertrip['trip_id']!= $tripid) {
+	echo '<a href="trip.php?tripid=' . $othertrip['trip_id'] . "&amp;routeid=" . $routeid . '">' . str_replace("  ", ":00", str_replace(":00", " ", $othertrip['arrival_time'])) . '</a> ';
+    } else {
+        // skip this trip but look forward/back
+        if ($key-1 > 0) $prevTrip = $routeTrips[$key-1]['trip_id'];
+        if ($key+1 < sizeof($routeTrips)) $nextTrip = $routeTrips[$key+1]['trip_id'];
+        
+    }
 }
-flush(); @ob_flush();
+flush();
+@ob_flush();
 echo '<h2>Other directions/timing periods:</h2> ';
+$otherDir = 0;
 foreach (getRoutesByNumber($trip['route_short_name']) as $ro