Fix typos in headboards/destination names
Fix typos in headboards/destination names

--- a/busui/common.inc.php
+++ b/busui/common.inc.php
@@ -8,6 +8,9 @@
     return true;
 }
 
+function debug($msg) {
+    if (isDebug()) echo "<!-- $msg -->";
+}
 function isFastDevice() {
     return true;
 }
@@ -26,13 +29,55 @@
      width: 100%;
      }
 </style>
-	<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script><script type="text/javascript" 
-src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script> 
- <meta name="apple-mobile-web-app-capable" content="yes" />
+	<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
+        <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script>
+    <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  <link rel="apple-touch-startup-image" href="startup.png" />
- <link rel="apple-touch-icon" href="apple-touch-icon.png" />
-</head> 
+ <link rel="apple-touch-icon" href="apple-touch-icon.png" />';
+ if ($geolocate) {
+echo "<script>
+
+function setCookie(c_name,value,expiredays)
+{
+var exdate=new Date();
+exdate.setDate(exdate.getDate()+expiredays);
+document.cookie=c_name+ \"=\" +escape(value)+
+((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString());
+}
+
+function getCookie(c_name)
+{
+if (document.cookie.length>0)
+  {
+  c_start=document.cookie.indexOf(c_name + \"=\");
+  if (c_start!=-1)
+    {
+    c_start=c_start + c_name.length+1;
+    c_end=document.cookie.indexOf(\";\",c_start);
+    if (c_end==-1) c_end=document.cookie.length;
+    return unescape(document.cookie.substring(c_start,c_end));
+    }
+  }
+return \"\";
+}
+
+function success(position) {
+$('#geolocate').val(position.coords.latitude+','+position.coords.longitude);
+setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1);
+}
+
+function error(msg) {
+ console.log(msg);
+}
+
+if (navigator.geolocation) {
+  navigator.geolocation.getCurrentPosition(success, error);
+}
+
+</script> ";
+ }
+echo '</head> 
 <body> 
  ';
 if ($opendiv) echo '<div data-role="page"> 
@@ -48,6 +93,8 @@
     echo '</div>';
 }
 
+$service_periods = Array ('sunday','saturday','weekday');
+
 function service_period()
 {
 switch (date('w')){
@@ -59,6 +106,11 @@
 default:
 	return 'weekday';
 }	
+}
+
+function remove_spaces($string)
+{
+    return str_replace(' ','',$string);
 }
 
 function midnight_seconds()

--- a/busui/index.php
+++ b/busui/index.php
@@ -1,30 +1,53 @@
 <?php 
 include('common.inc.php');
-include_header("bus.lambdacomplex.org",false)
+include_header("bus.lambdacomplex.org",false, true)
 ?>
 <div data-role="page" data-theme="b" id="jqm-home" class="ui-page ui-body-b ui-page-active">
 	<div id="jqm-homeheader">
-	    	<center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="jQuery Mobile Framework" width="64" height="64" />
+	    	<center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="logo" width="64" height="64" /><br>
 		bus.lambdacomplex.org</h1></center>
 	</div> 
-	<div data-role="content"> 
+	<div data-role="content">
+	    <a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a>
             <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
-                <li data-role="list-divider">Stops</li>
-                <li><a href="stopList.php">All stops List</a></li>
-		<li class="nearby"><a href="stopList.php?nearby=yes">Nearby List</a></li>
-                <li><a href="stopList.php?favourites=yes">Favourites List</a></li>
+                <li data-role="list-divider">Timetables - Stops</li>
+                <li><a href="stopList.php">Major (Timing Point) Stops</a></li>
+		<li><a href="stopList.php">All Stops</a></li>
+		<li><a href="stopList.php?nearbyfavs=yes">Nearby/Favourite Stops</a></li>
             </ul>
 	    <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
-                <li data-role="list-divider">Routes</li>
-                <li><a href="routeList.php">All Routes List</a></li>
-		<li class="nearby"><a href="routeList.php?nearby=yes">Nearby List</a></li>
-                <li><a href="routeList.php?favourites=yes">Favourites List</a></li>
+                <li data-role="list-divider">Timetables - Routes</li>
+                <li><a href="routeList.php">Routes By Final Destination</a></li>
+		<li><a href="routeList.php?bynumber=yes">Routes By Number</a></li>
+		<li><a href="routeList.php?nearbyfavs=yes">Nearby/Favourites Routes</a></li>
             </ul>
-            <div class="ui-body ui-body-c info">
-		<p class="latlng"></p>
-		Time: <?php echo date("H:m"); ?> <br>
-		Service Period: <?php echo ucwords(service_period()); ?> 
+            <div class="ui-body ui-body-c">
+		<h3>Time/Place Settings</h3>
+		<div data-role="fieldcontain">
+	            <label for="geolocate"> Current Location: </label>
+			<input type="text" id="geolocate" name="geolocate"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a>
+	        </div>
+    		<div data-role="fieldcontain">
+		        <label for="time"> Time: </label>
+		    	<input type="time" value="<?php echo date("H:m"); ?>"/> <a href="#" style="display:none" name="currentTime" id="currentTime"/>Current Time?</a>
+	        </div>
+		<div data-role="fieldcontain">
+		    <label for="service_period"> Service Period:  </label>
+			<select name="service_period">	
+			   <?php
+			   foreach ($service_periods as $service_period) {
+			    echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>';
+			   }?>
+			</select>
+			<a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a>
+		</div>
+		
+		<input type="submit" value="Update"/>
             </div>
+	<script>
+$('#here').click(function(event) { $('#geolocate').val(getCookie('geolocate')); return false;});
+$('#here').show();
+        </script>
         </div>
    </div>
  </body>

--- a/busui/routeList.php
+++ b/busui/routeList.php
@@ -1,55 +1,90 @@
 <?php
 include('common.inc.php');
 include_header("Routes");
-/* data-filter="true">';
-echo "<script> $('#routeList').listnav({prefixes: ['to'] }); </script>";*/
+echo'
+		<div data-role="navbar"> 
+			<ul> 
+				<li><a href="routeList.php">By Final Destination...</a></li> 
+				<li><a href="routeList.php?bynumber=yes">By Number... </a></li>
+				<!--<li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li>-->
+			</ul>
+                </div>
+	';
 echo '  <ul data-role="listview">';
 $url = $APIurl."/json/routes";
+$contents = json_decode(getPage($url));
+debug(print_r($contents,true));
 
-$contents = json_decode(getPage($url));
+function printRoutes($routes){
+	foreach($routes as $row) {
+				echo  '<li>'.$row[1].' <a href="trip.php?routeid='.$row[0].'">'.$row[2]." (".ucwords($row[3]).")</a></li>\n";
+			}
+}
+
 if ($_REQUEST['bynumber']) {
 	$routeSeries = Array();
+	$seriesRange = Array();
 	foreach ($contents as $key => $row) {
 		foreach (explode(" ",$row[1]) as $routeNumber ) {
 			$seriesNum = substr($routeNumber, 0, -1)."0";
 			if ($seriesNum == "0") $seriesNum = $routeNumber;
+			$finalDigit = substr($routeNumber, sizeof($routeNumber)-1, 1);
+			if (isset($seriesRange[$seriesNum])) {
+				if ($finalDigit < $seriesRange[$seriesNum]['max'])
+					$seriesRange[$seriesNum]['max'] = $routeNumber;
+				if ($finalDigit > $seriesRange[$seriesNum]['min'])
+					$seriesRange[$seriesNum]['min'] = $routeNumber;
+			} else {
+				$seriesRange[$seriesNum]['max'] = $routeNumber;
+				$seriesRange[$seriesNum]['min'] = $routeNumber;
+			}
 			$routeSeries[$seriesNum][$seriesNum."-".$row[1]."-".$row[0]]  = $row;
-
-			
 		}
 	}
 	ksort($routeSeries);
+	ksort($seriesRange);
+		echo '<div class="noscriptnav"> Go to route numbers: ';
+		foreach ($seriesRange as $series => $range) 
+		{
+		  if ($range['min'] == $range['max']) echo "<a href=\"#$series\">$series</a>&nbsp;"; 
+		  else  echo "<a href=\"#$series\">{$range['min']}-{$range['max']}</a>&nbsp;"; 
+		}
+		echo "</div>
+			<script>
+		$('.noscriptnav').hide();
+			</script>";
 	foreach ($routeSeries as $series => $routes)
 	{
-		echo '<li>'.$series."... <ul>\n";
-			foreach($routes as $row) {
-				echo  '<li>'.$row[1].' <a href="route.php?routeid='.$row[0].'">'.$row[2]."</a></li>\n";
-			}
+		echo '<a name="'.$series.'"></a>';
+		if ($series <= 9) echo '<li>'.$series."<ul>\n";
+		else echo "<li>{$seriesRange[$series]['min']}-{$seriesRange[$series]['max']}<ul>\n";
+			printRoutes($routes);
 		echo "</ul></li>\n";
 	}
 } else {
 	foreach ($contents as $key => $row) {
 	    $routeDestinations[$row[2]][]  = $row;
 	}
+	echo '<div class="noscriptnav"> Go to Destination: ';
+		foreach(ksort($routeDestinations) as $destination => $routes) 
+		{ 
+		   echo "<a href=\"#$destination\">$destination</a>&nbsp;"; 
+		}
+		echo "</div>
+			<script>
+		$('.noscriptnav').hide();
+			</script>";
 	foreach ($routeDestinations as $destination => $routes)
 	{
+		echo '<a name="'.$destination.'"></a>';
 		echo '<li>'.$destination."... <ul>\n";
-			foreach($routes as $row) {
-				echo  '<li>'.$row[1].' <a href="trip.php?routeid='.$row[0].'">'.$row[2]."</a></li>\n";
-			}
+		printRoutes($routes);
 		echo "</ul></li>\n";
 	}
 }
 echo "</ul>\n";
-echo'
- <div data-role="footer" data-id="foo1" data-position="fixed"> 
-		<div data-role="navbar"> 
-			<ul> 
-				<li><a href="routeList.php" class="ui-btn-active">By Final Destination...</a></li> 
-				<li><a href="routeList.php?bynumber=yes">By Number... </a></li>
-				<li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li> 
-			</ul> 
-	';
+
+
 include_footer();
 ?>
 

--- a/busui/schedule_viewer.py
+++ b/busui/schedule_viewer.py
@@ -256,7 +256,12 @@
     schedule = self.server.schedule
     result = []
     for r in schedule.GetRouteList():
-      result.append( (r.route_id, r.route_short_name, r.route_long_name) )
+      servicep = None
+      for t in schedule.GetTripList():
+        if t.route_id == r.route_id:
+          servicep = t.service_period
+          break
+      result.append( (r.route_id, r.route_short_name, r.route_long_name, servicep.service_id) )
     result.sort(key = lambda x: x[1:3])
     return result
 
@@ -273,8 +278,6 @@
     for t in schedule.GetTripList():
       if t.route_id == query:
         result.append ( (t.GetStartTime(), t.trip_id) )
-        """ UGH fails for 300s """
-    """return result"""
     return sorted(result, key=lambda trip: trip[0])
   
   def handle_json_GET_triprows(self, params):

--- a/busui/stop.php
+++ b/busui/stop.php
@@ -8,6 +8,7 @@
 echo '  <ul data-role="listview" >';
 $url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period();
 $trips = json_decode(getPage($url));
+debug(print_r($trips,true));
 foreach ($trips as $row)
 {
 echo  '<li>';

--- a/busui/stopList.php
+++ b/busui/stopList.php
@@ -4,27 +4,41 @@
 echo'
 		<div data-role="navbar"> 
 			<ul> 
-				<li><a href="stopList.php" class="ui-btn-active">Timing Points</a></li> 
+				<li><a href="stopList.php">Timing Points</a></li> 
 				<li><a href="stopList.php?allstops=yes">All Stops</a></li> 
 			</ul>
                 </div>
 	';
-echo '  <ul data-role="listview" data-filter="true">';
+        
+        echo '<div class="noscriptnav"> Go to letter: ';
+foreach(range('A','Z') as $letter) 
+{ 
+   echo "<a href=\"#$letter\">$letter</a>&nbsp;"; 
+}
+echo "</div>
+	<script>
+$('.noscriptnav').hide();
+        </script>";
+echo '  <ul data-role="listview" data-filter="true" data-inset="true" >';
 $url = $APIurl."/json/timingpoints";
 if ($_REQUEST['allstops']) $url = $APIurl."/json/stops";
 if ($_REQUEST['lat'] && $_REQUEST['lon']) $url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=15";
 $contents = json_decode(getPage($url));
+debug(print_r($contents,true));
 foreach ($contents as $key => $row) {
     $stopName[$key]  = $row[1];
 }
 
-// Sort the data with volume descending, edition ascending
-// Add $data as the last parameter, to sort by the common key
+// Sort the stops by name
 array_multisort($stopName, SORT_ASC, $contents);
 
+$firstletter = "";
 foreach ($contents as $row)
 {
-
+    if (substr($row[1],0,1) != $firstletter){
+        echo "<a name=$firstletter></a>";
+        $firstletter = substr($row[1],0,1);
+    }
       echo  '<li><a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></li>';
         }
 echo '</ul>';

--- a/busui/trip.php
+++ b/busui/trip.php
@@ -4,6 +4,7 @@
 if ($_REQUEST['routeid']) {
     $url = $APIurl."/json/routetrips?route_id=".$_REQUEST['routeid'];
     $trips = json_decode(getPage($url));
+debug(print_r($trips,true));
 foreach ($trips as $trip)
          {
             if ($trip[0] < midnight_seconds()) {
@@ -15,7 +16,7 @@
 }
 $url = $APIurl."/json/triprows?trip=".$tripid;
 $trips = array_flatten(json_decode(getPage($url)));
-
+debug(print_r($trips,true));
 include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name);
 echo '  <ul data-role="listview" >';
 
@@ -23,6 +24,7 @@
 $url = $APIurl."/json/tripstoptimes?trip=".$tripid;
 
 $json = json_decode(getPage($url));
+debug(print_r($json,true));
 $stops = $json[0];
 $times = $json[1];
 foreach ($stops as $key => $row)

--- a/busui/tripPlanner.php
+++ b/busui/tripPlanner.php
@@ -1,6 +1,6 @@
 <?php
   include('common.inc.php');
-  include_header("Trip Planner");
+  include_header("Trip Planner", true, true);
   function tripPlanForm($errorMessage = "")
   {
       $from = (isset($_REQUEST['from']) ? $_REQUEST['from'] : "Brigalow");
@@ -12,20 +12,29 @@
     <div data-role="fieldcontain">
         <label for="from">I would like to go from</label>
         <input type="text" name="from" id="from" value="' . $from . '"  />
+        <a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a>
     </div>
         <div data-role="fieldcontain">
         <label for="to"> to </label>
         <input type="text" name="to" id="to" value="' . $to . '"  />
+        <a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a>
     </div>
     <div data-role="fieldcontain">
         <label for="date"> on </label>
-        <input type="text" name="date" id="date" value="' . $date . '"  />
+        <input type="date" name="date" id="date" value="' . $date . '"  />
     </div>
         <div data-role="fieldcontain">
         <label for="time"> at </label>
-        <input type="text" name="time" id="time" value="' . $time . '"  />
+        <input type="time" name="time" id="time" value="' . $time . '"  />
     </div>
         <input type="submit" value="Go!"></form>';
+        echo "<script>
+$('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;});
+$('#toHere').show();
+$('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;});
+$('#fromHere').show();
+
+        </script>";
   }
   
   function processItinerary($itineraryNumber, $itinerary)
@@ -94,6 +103,7 @@
           $page = curl_exec($ch);
           curl_close($ch);
           $tripplan = json_decode($page);
+          debug(print_r($triplan,true));
           echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>";
           echo "<h1> At: {$tripplan->plan->date} </h1>";
          

--- a/maxious-canberra-transit-feed/01-extracttimes.rb
+++ b/maxious-canberra-transit-feed/01-extracttimes.rb
@@ -14,7 +14,9 @@
 	timetable = {"between_stops" => [], "short_name" => short_name}
 	time_points = table.xpath('tr[1]//th').map do |tp|
 		if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>"
-			timing_point = tp.content.squeeze(" ").gsub("Bus Station"," Bus Station ").gsub(" Platform"," (Platform").gsub("  - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(","," ").gsub("\302\240","").squeeze(" ").strip
+			timing_point = tp.content.squeeze(" ").gsub("Shops"," ").gsub("Bus Station"," Bus Station ").gsub("Interchange"," Bus Station ").gsub(" Platform"," (Platform")
+			timing_point = timing_point.gsub("Machonochie","Maconochie").gsub("Hume"," ").gsub("Market Place","Marketplace").gsub("Terminus Fyshwick","Terminus")
+			timing_point = timing_point.gsub("  - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(","," ").gsub("\302\240","").squeeze(" ").strip
 			if (tp.content.match('Platform'))
 			  timing_point.concat(")")
 			end;

--- a/maxious-canberra-transit-feed/02-tidytimepoints.rb
+++ b/maxious-canberra-transit-feed/02-tidytimepoints.rb
@@ -34,7 +34,7 @@
  "NarrabundahTerminus"=>"Narrabundah Terminus",
  "Railway StationKingston"=>"Railway Station Kingston",
  "Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes",
- "Dickson ShopsAntill Street"=>"Dickson Shops",
+ "DicksonAntill Street"=>"Dickson",
  "Cohen St Bus Station (Platform 3)" => "Cohen Street Bus Station (Platform 3)",
  "Cohen St Bus Station (Platform 6)" => "Cohen Street Bus Station (Platform 6)",
  "Newcastle Streetafter Isa Street" => "Newcastle Street after Isa Street",
@@ -52,8 +52,8 @@
  "Flemington Road / Nullabor Ave"=>"Flemington Rd / Nullabor Ave",
  "Flemington Road / Sandford St"=>"Flemington Rd / Sandford St",
  "Heagney Cres Clift Cres Richardson"=>  "Heagney / Clift Richardson",
- "Charnwood Shops (Tillyard Drive)"=> "Charnwood Shops",
- "charnwood Shops"=> "Charnwood Shops",
+ "Charnwood (Tillyard Drive)"=> "Charnwood",
+ "charnwood"=> "Charnwood",
  "Black Moutain- Telstra Tower"=>"Black Mountain Telstra Tower",
  "Bonython Primary"=> "Bonython Primary School",
  "Athllon Drive / Sulwood Dr Kambah"=>"Athllon / Sulwood Kambah",
@@ -61,31 +61,37 @@
  "Alexander Maconochie Centre Hume"=>"Alexander Maconochie Centre",
  "Anthony Rolfe Ave / Moonight Ave" =>"Anthony Rolfe Av / Moonlight Av",
  "Australian National Botanic Gardens"=>"Botanic Gardens",
- "Calwell shops"=> "Calwell Shops", 
+ "Calwell shops"=> "Calwell", 
  "Chuculba / William Slim Drive"=>"Chuculba / William Slim Dr",
  "Fyshwick direct Factory Outlet"=>"Fyshwick Direct Factory Outlet",
  "Kaleen Village / Maibrynong"=>"Kaleen Village / Marybrynong",
  "Kaleen Village / Marybrynong Ave"=>"Kaleen Village / Marybrynong",
  "National Aquarium"=>"National Zoo and Aquarium",
- "chisholm Shops"=>"Chisholm Shops",
- "O'connor Shops"=>"O'Connor Shops",
- "Mckellar Shops"=>"McKellar Shops",
- "Melba shops"=> "Melba Shops",
+ "chisholm"=>"Chisholm",
+ "O'connor"=>"O'Connor",
+ "Mckellar"=>"McKellar",
  "William Web / Ginninderra Drive"=>"William Webb / Ginninderra Drive",
  "Procor / Mead"=>"Proctor / Mead",
  "Fyshwick DirectFactory Outlet"=>"Fyshwick Direct Factory Outlet",
- "Yarrulumla Shops"=>"Yarralumla Shops",
+ "Yarrulumla"=>"Yarralumla",
  "Tharwa Dr / Pocket Ave"=>"Tharwa Dr / Pockett Ave",
  "Paul Coe / Mirrebei Dr"=>"Paul Coe / Mirrabei Dr",
  "Mirrebei Drive / Dam Wall"=>"Mirrabei Drive / Dam Wall",
  "Tharwa / Knoke" => "Tharwa Drive / Knoke Ave",
- "Tharwa / Pocket" => "Tharwa Dr / Pockett Ave",
+ "Tharwa / Pocket" => "Tharwa Drive / Pockett Ave",
+ 'Tharwa Dr / Pockett Ave' => "Tharwa Drive / Pockett Ave",
  "Outrim / Duggan" => "Outtrim / Duggan",
  "ANU Burton and Garran Hall Daley Rd" => "Burton and Garran Hall Daley Road",
  "Farrer Primary"=>"Farrer Primary School",
  "St Thomas More Campbell"=>"St Thomas More's Campbell",
- "Lyneham Shops"=>"Lyneham Shops Wattle Street",
- 
+ "Lyneham Wattle Street"=>"Lyneham / Wattle St",
+ "Dickson" => "Dickson / Antill St",
+ 'Dickson Antill Street' => 'Dickson / Antill St',
+ "Livingston / Kambah" => "Kambah / Livingston St",
+ 'Melba shops' => 'Melba',
+ 'St Clare of Assisi' => 'St Clare of Assisi Primary',
+ 'War Memorial Limestone Ave' => 'War Memorial / Limestone Ave'
+
  
 }
 	time_point_corrections.each do |wrong, right|

--- a/maxious-canberra-transit-feed/03-locatetimepoints.rb
+++ b/maxious-canberra-transit-feed/03-locatetimepoints.rb
@@ -38,6 +38,7 @@
         $time_points = []
         $time_points_sources = Hash.new([])
         Dir.glob("*.yml") { |file|
+	       pp file
                 timetable = YAML::load_file(file)
                 $time_points = $time_points | timetable["time_points"]
                 timetable["time_points"].each do |timepoint|

--- a/maxious-canberra-transit-feed/cbrtable.yml
+++ b/maxious-canberra-transit-feed/cbrtable.yml
@@ -11,12 +11,10 @@
   - { name: ACTEW AGL House,stop_code: ACTEW AGL House, lat: -35.282374, lng: 149.132047}
   - { name: ADFA,stop_code: ADFA, lat: -35.2937972, lng: 149.1643403}
   - { name: Ainslie,stop_code: Ainslie, lat: -35.2620105, lng: 149.1443302}
-  - { name: Ainslie Shops,stop_code: Ainslie Shops, lat: -35.26198, lng: 149.14535}
   - { name: Alexander Maconochie Centre,stop_code: Alexander Maconochie Centre, lat: -35.3720651, lng: 149.1696618}
   - { name: Alpen & Clifford St,stop_code: Alpen & Clifford St, lat: -35.20562, lng: 149.06259}
   - { name: Anthony Rolfe Av / Moonlight Av,stop_code: Anthony Rolfe Av / Moonlight Av, lat: -35.1856021, lng: 149.1543639}
   - { name: Aranda,stop_code: Aranda, lat: -35.257534, lng: 149.0762963}
-  - { name: Aranda Shops,stop_code: Aranda Shops, lat: -35.25753, lng: 149.0763}
   - { name: Athllon / Sulwood Kambah,stop_code: Athllon / Sulwood Kambah, lat: -35.38442, lng: 149.09328}
   - { name: Australian Institute of Sport,stop_code: Australian Institute of Sport, lat: -35.246351, lng: 149.101478}
   - { name: Belconnen Community Bus Station,stop_code: Belconnen Community Bus Station, lat: -35.23987, lng: 149.0619}
@@ -37,7 +35,7 @@
   - { name: Bugden Sternberg,stop_code: Bugden Sternberg, lat: -35.4017223, lng: 149.0992172}
   - { name: Burton and Garran Hall Daley Road,stop_code: Burton and Garran Hall Daley Road, lat: -35.2753671, lng: 149.1172822}
   - { name: Calvary Hospital,stop_code: Calvary Hospital, lat: -35.25212, lng: 149.09088}
-  - { name: Calwell Shops,stop_code: Calwell Shops, lat: -35.43524, lng: 149.113942}
+  - { name: Calwell,stop_code: Calwell, lat: -35.43524, lng: 149.113942}
   - { name: Cameron Ave Bus Station,stop_code: Cameron Ave Bus Station, lat: -35.2410195, lng: 149.0722506}
   - { name: Cameron Ave Bus Station (Platform 1),stop_code: Cameron Ave Bus Station (Platform 1), lat: -35.2410195, lng: 149.0722506}
   - { name: Cameron Ave Bus Station (Platform 2),stop_code: Cameron Ave Bus Station (Platform 2), lat: -35.2410108, lng: 149.0717142}
@@ -52,13 +50,10 @@
   - { name: Causeway,stop_code: Causeway, lat: -35.31615, lng: 149.15058}
   - { name: Centrelink Tuggeranong,stop_code: Centrelink Tuggeranong, lat: -35.4207496, lng: 149.0700973}
   - { name: Chapman,stop_code: Chapman, lat: -35.3557877, lng: 149.0408111}
-  - { name: Chapman Shops,stop_code: Chapman Shops, lat: -35.35579, lng: 149.04082}
   - { name: Charnwood,stop_code: Charnwood, lat: -35.2052138, lng: 149.0337266}
-  - { name: Charnwood Shops,stop_code: Charnwood Shops, lat: -35.20472, lng: 149.03336}
   - { name: Charnwood Tillyard Dr,stop_code: Charnwood Tillyard Dr, lat: -35.20295, lng: 149.04027}
   - { name: Chifley,stop_code: Chifley, lat: -35.350985, lng: 149.077319}
-  - { name: Chifley Shops,stop_code: Chifley Shops, lat: -35.35099, lng: 149.07732}
-  - { name: Chisholm Shops,stop_code: Chisholm Shops, lat: -35.41341, lng: 149.12833}
+  - { name: Chisholm,stop_code: Chisholm, lat: -35.41341, lng: 149.12833}
   - { name: Chuculba / William Slim Dr,stop_code: Chuculba / William Slim Dr, lat: -35.208931, lng: 149.088499}
   - { name: CIT Weston,stop_code: CIT Weston, lat: -35.330234, lng: 149.058632}
   - { name: City Bus Station,stop_code: City Bus Station, lat: -35.2794346, lng: 149.1305879}
@@ -84,19 +79,14 @@
   - { name: Cohen Street Bus Station (Platform 6),stop_code: Cohen Street Bus Station (Platform 6), lat: -35.2400028, lng: 149.060315}
   - { name: Conder Primary,stop_code: Conder Primary, lat: -35.4643475, lng: 149.0986908}
   - { name: Cook,stop_code: Cook, lat: -35.2596, lng: 149.0638}
-  - { name: Cook Shops,stop_code: Cook Shops, lat: -35.25898, lng: 149.06343}
   - { name: Cooleman Court,stop_code: Cooleman Court, lat: -35.34147, lng: 149.05338}
   - { name: Copland College,stop_code: Copland College, lat: -35.2127018, lng: 149.0596387}
   - { name: Curtin,stop_code: Curtin, lat: -35.3248779, lng: 149.081441}
-  - { name: Curtin Shops,stop_code: Curtin Shops, lat: -35.32515, lng: 149.08224}
   - { name: Deakin,stop_code: Deakin, lat: -35.3158608, lng: 149.1084563}
-  - { name: Deakin Shops,stop_code: Deakin Shops, lat: -35.31473, lng: 149.10771}
   - { name: Deamer / Clift Richardson,stop_code: Deamer / Clift Richardson, lat: -35.4319597, lng: 149.1187876}
-  - { name: Dickson,stop_code: Dickson, lat: -35.2498434, lng: 149.1391218}
+  - { name: Dickson / Antill St,stop_code: Dickson / Antill St, lat: -35.2489, lng: 149.14012}
   - { name: Dickson College,stop_code: Dickson College, lat: -35.24923, lng: 149.15315}
-  - { name: Dickson Cowper St,stop_code: Dickson Cowper St, lat: -35.250297, lng: 149.141336}
-  - { name: Dickson Shops,stop_code: Dickson Shops, lat: -35.25045, lng: 149.14044}
-  - { name: Dickson Shops/Antill St,stop_code: Dickson Shops/Antill St, lat: -35.2251335, lng: 149.1658895}
+  - { name: Dickson / Cowper St,stop_code: Dickson / Cowper St, lat: -35.250297, lng: 149.141336}
   - { name: Duffy,stop_code: Duffy, lat: -35.3366908, lng: 149.0324311}
   - { name: Duffy Primary,stop_code: Duffy Primary, lat: -35.334219, lng: 149.033656}
   - { name: Dunlop,stop_code: Dunlop, lat: -35.1942693, lng: 149.0206702}
@@ -104,59 +94,47 @@
   - { name: Erindale Dr / Charleston St Monash,stop_code: Erindale Dr / Charleston St Monash, lat: -35.414616, lng: 149.07888}
   - { name: Erindale / Sternberg Cres,stop_code: Erindale / Sternberg Cres, lat: -35.4014472, lng: 149.0956545}
   - { name: Evatt,stop_code: Evatt, lat: -35.2091093, lng: 149.0735343}
-  - { name: Evatt Shops,stop_code: Evatt Shops, lat: -35.21203, lng: 149.06505}
   - { name: Eye Hospital,stop_code: Eye Hospital, lat: -35.3341884, lng: 149.1656213}
   - { name: Fairbairn Park,stop_code: Fairbairn Park, lat: -35.3001773, lng: 149.2041185}
   - { name: Farrer Primary School,stop_code: Farrer Primary School, lat: -35.37887, lng: 149.10641}
   - { name: Farrer Terminus,stop_code: Farrer Terminus, lat: -35.3771794, lng: 149.1046948}
   - { name: Federation Square,stop_code: Federation Square, lat: -35.1908726, lng: 149.0848153}
   - { name: Fisher,stop_code: Fisher, lat: -35.3605627, lng: 149.0576481}
-  - { name: Fisher Shops,stop_code: Fisher Shops, lat: -35.36056, lng: 149.05765}
   - { name: Flemington Rd,stop_code: Flemington Rd, lat: -35.20756, lng: 149.14778}
   - { name: Flemington Rd / Nullabor Ave,stop_code: Flemington Rd / Nullabor Ave, lat: -35.2008585, lng: 149.1493407}
   - { name: Flemington Rd / Sandford St,stop_code: Flemington Rd / Sandford St, lat: -35.221231, lng: 149.144645}
-  - { name: Florey Shops,stop_code: Florey Shops, lat: -35.2258544, lng: 149.0546214}
+  - { name: Florey,stop_code: Florey, lat: -35.2258544, lng: 149.0546214}
   - { name: Flynn,stop_code: Flynn, lat: -35.2019283, lng: 149.0478356}
   - { name: Fraser,stop_code: Fraser, lat: -35.1896539, lng: 149.0435012}
   - { name: Fraser East Terminus,stop_code: Fraser East Terminus, lat: -35.1896539, lng: 149.0435012}
-  - { name: Fraser Shops,stop_code: Fraser Shops, lat: -35.18966, lng: 149.0435}
   - { name: Fraser West Terminus,stop_code: Fraser West Terminus, lat: -35.191513, lng: 149.038006}
   - { name: Fyshwick Direct Factory Outlet,stop_code: Fyshwick Direct Factory Outlet, lat: -35.3359862, lng: 149.1796322}
   - { name: Fyshwick Terminus,stop_code: Fyshwick Terminus, lat: -35.3285202, lng: 149.1785592}
   - { name: Garran,stop_code: Garran, lat: -35.3423286, lng: 149.10811}
-  - { name: Garran Shops,stop_code: Garran Shops, lat: -35.34236, lng: 149.1082}
   - { name: Geoscience Australia,stop_code: Geoscience Australia, lat: -35.3429702, lng: 149.1583893}
   - { name: Giralang,stop_code: Giralang, lat: -35.2115608, lng: 149.0960692}
-  - { name: Giralang Shops,stop_code: Giralang Shops, lat: -35.2115608, lng: 149.0960692}
   - { name: Gordon Primary,stop_code: Gordon Primary, lat: -35.455517, lng: 149.086978}
   - { name: Gowrie,stop_code: Gowrie, lat: -35.4120264, lng: 149.1110804}
-  - { name: Gowrie Shops,stop_code: Gowrie Shops, lat: -35.4120264, lng: 149.1110804}
   - { name: Gungahlin Marketplace,stop_code: Gungahlin Marketplace, lat: -35.1769532, lng: 149.1319017}
   - { name: Gwydir Square Kaleen,stop_code: Gwydir Square Kaleen, lat: -35.2338677, lng: 149.1031998}
   - { name: Hackett,stop_code: Hackett, lat: -35.2481617, lng: 149.1626094}
-  - { name: Hackett Shops,stop_code: Hackett Shops, lat: -35.24825, lng: 149.16271}
   - { name: Hawker,stop_code: Hawker, lat: -35.2437386, lng: 149.0432804}
   - { name: Hawker College,stop_code: Hawker College, lat: -35.2454598, lng: 149.0324251}
-  - { name: Hawker Shops,stop_code: Hawker Shops, lat: -35.24398, lng: 149.04361}
   - { name: Heagney / Clift Richardson,stop_code: Heagney / Clift Richardson, lat: -35.4251299, lng: 149.11375}
   - { name: Hibberson / Kate Crace,stop_code: Hibberson / Kate Crace, lat: -35.1861642, lng: 149.1391756}
   - { name: Higgins,stop_code: Higgins, lat: -35.2313901, lng: 149.0271811}
-  - { name: Higgins Shops,stop_code: Higgins Shops, lat: -35.23136, lng: 149.02611}
   - { name: Holder,stop_code: Holder, lat: -35.3378123, lng: 149.0449433}
-  - { name: Holder Shops,stop_code: Holder Shops, lat: -35.33781, lng: 149.04494}
   - { name: Holt,stop_code: Holt, lat: -35.223099, lng: 149.0126269}
-  - { name: Holt