Use AWS resources for debugging
--- a/about.php
+++ b/about.php
@@ -4,9 +4,14 @@
?>
<p>
Busness Time - An ACT bus timetable webapp<br />
-Based on the maxious-canberra-transit-feed (<a href="cbrfeed.zip">download</a>, last updated <?php
+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 />
-Source code for the transit feed and this site @ <a href="http://maxious.lambdacomplex.org/git">http://maxious.lambdacomplex.org/git</a><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
+site</a> available from github.<br />
Uses jQuery Mobile, PHP, Ruby, Python, Google Transit Feed Specification tools, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service<br />
<br />
Feedback encouraged; contact maxious@lambdacomplex.org<br />
--- a/aws/awsStartup.sh
+++ b/aws/awsStartup.sh
@@ -4,7 +4,6 @@
#screen php-cli php-gd tomcat6-webapps tomcat6-admin-webapps svn maven2
#http://www.how2forge.org/installing-lighttpd-with-php5-and-mysql-support-on-fedora-12
-cp -rfv /tmp/busui/* /var/www
cp /root/aws.php /tmp/
chcon -h system_u:object_r:httpd_sys_content_t /var/www
chcon -R -h root:object_r:httpd_sys_content_t /var/www/*
@@ -14,7 +13,8 @@
-O /var/www/cbrfeed.zip
easy_install transitfeed
easy_install simplejson
-screen -d -m /var/www/view.sh
+screen -S viewsh -X quit
+screen -S viewsh -d -m /var/www/view.sh
wget http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \
-O /tmp/Graph.obj
--- /dev/null
+++ b/aws/compress.conf
@@ -1,1 +1,33 @@
+#######################################################################
+##
+## Output Compression
+## --------------------
+##
+## see http://www.lighttpd.net/documentation/compress.html
+##
+server.modules += ( "mod_compress" )
+##
+## where should the compressed files be cached?
+## see the base config for the declaration of the variable.
+##
+## This directory should be changed per vhost otherwise you can
+## run into trouble with overlapping filenames
+##
+compress.cache-dir = cache_dir + "/compress"
+
+##
+## FileTypes to compress.
+##
+#compress.filetype = ("text/plain", "text/html")
+compress.filetype = ("text/plain", "text/html", "text/javascript", "text/css", "text/xml")
+
+##
+## Maximum filesize that will be compressed.
+## Default is 0, which means unlimited file size.
+##
+#compress.max-filesize = 0
+
+##
+#######################################################################
+
--- /dev/null
+++ b/aws/expire.conf
@@ -1,1 +1,29 @@
+#######################################################################
+##
+## Expire Module
+## ---------------
+##
+## See http://www.lighttpd.net/documentation/expire.html
+##
+server.modules += ( "mod_expire" )
+##
+## assignes a expiration to all files below the specified path. The
+## specification of the time is made up of:
+##
+## <access|modification> <number> <years|months|days|hours|minutes|seconds>
+##
+#expire.url = (
+# "/buggy/" => "access 2 hours",
+# "/images/" => "access plus 1 seconds 2 minutes"
+#)
+etag.use-mtime = "enable"
+etag.use-inode = "disable"
+static-file.etags = "enable"
+$HTTP["url"] =~ "\.(css|js|png|jpg|ico|gif)$" {
+ expire.url = ( "" => "access 7 days" )
+}
+
+##
+#######################################################################
+
--- a/aws/modules.conf
+++ b/aws/modules.conf
@@ -76,7 +76,7 @@
##
## mod_compress
##
-#include "conf.d/compress.conf"
+include "conf.d/compress.conf"
##
## mod_userdir
@@ -106,7 +106,7 @@
##
## mod_expire
##
-#include "conf.d/expire.conf"
+include "conf.d/expire.conf"
##
## mod_secdownload
--- a/aws/php.ini
+++ b/aws/php.ini
@@ -1,4 +1,6 @@
[PHP]
+
+date.timezone = "Australia/Sydney"
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
@@ -288,7 +290,7 @@
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
; http://www.php.net/manual/en/zlib.configuration.php#ini.zlib.output-compression
-zlib.output_compression = Off
+zlib.output_compression = on
; http://www.php.net/manual/en/zlib.configuration.php#ini.zlib.output-compression-level
;zlib.output_compression_level = -1
@@ -1264,7 +1266,7 @@
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; http://www.php.net/manual/en/session.configuration.php#ini.session.save-path
-session.save_path = "/var/lib/php/session"
+session.save_path = "/tmp"
; Whether to use cookies.
; http://www.php.net/manual/en/session.configuration.php#ini.session.use-cookies
--- a/common-template.inc.php
+++ b/common-template.inc.php
@@ -1,11 +1,38 @@
<?php
+ // Copyright 2009 Google Inc. All Rights Reserved.
+ $GA_ACCOUNT = "MO-22173039-1";
+ $GA_PIXEL = "/ga.php";
+
+ function googleAnalyticsGetImageUrl() {
+ global $GA_ACCOUNT, $GA_PIXEL;
+ $url = "";
+ $url .= $GA_PIXEL . "?";
+ $url .= "utmac=" . $GA_ACCOUNT;
+ $url .= "&utmn=" . rand(0, 0x7fffffff);
+ $referer = $_SERVER["HTTP_REFERER"];
+ $query = $_SERVER["QUERY_STRING"];
+ $path = $_SERVER["REQUEST_URI"];
+ if (empty($referer)) {
+ $referer = "-";
+ }
+ $url .= "&utmr=" . urlencode($referer);
+ if (!empty($path)) {
+ $url .= "&utmp=" . urlencode($path);
+ }
+ $url .= "&guid=ON";
+ return str_replace("&", "&", $url);
+ }
+
function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false)
{
echo '
<!DOCTYPE html>
-<html>
- <head>
- <title>' . $pageTitle . '</title>';
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <title>' . $pageTitle . '</title>
+ <meta name="google-site-verification"
+content="-53T5Qn4TB_de1NyfR_ZZkEVdUNcNFSaYKSFkWKx-sY" />';
if ($datepicker) echo '<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />';
if (isDebugServer()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" />
<script type="text/javascript" src="js/jquery-1.5.js"></script>
@@ -20,7 +47,7 @@
});
</script>
<script src="js/jQuery.ui.datepicker.js"></script>';
-echo '<style type="text/css">
+ echo '<style type="text/css">
.ui-navbar {
width: 100%;
}
@@ -44,11 +71,40 @@
body {
background-color: #F0F0F0;
}
-</style>
-<meta name="apple-mobile-web-app-capable" content="yes" />
+ #jqm-homeheader {
+ text-align: center;
+ }
+ .viaPoints {
+ display: none;
+ text-size: 0.2em;
+ }
+ .min-width-480px .viaPoints {
+ display: block;
+ }
+ // 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>';
+ if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod')) {
+ echo '<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" />';
+ }
if ($geolocate) {
echo "<script>
@@ -73,8 +129,27 @@
</script> ";
}
- echo '</head>
+ echo '
+<script type="text/javascript">
+
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-22173039-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type =
+'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ?
+'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0];
+s.parentNode.insertBefore(ga, s);
+ })();
+
+</script></head>
<body>
+ <div id="skip">
+ <a href="#maincontent">Skip to content</a>
+ </div>
';
if ($opendiv) {
echo '<div data-role="page">
@@ -87,6 +162,7 @@
<div data-role="header">
<h1>' . $pageTitle . '</h1>
</div><!-- /header -->
+ <a name="maincontent" id="maincontent"></a>
<div data-role="content"> ';
}
}
@@ -100,6 +176,10 @@
}
echo '<div id="footer"><a href="about.php">About/Contact Us</a> <a href="feedback.php">Feedback/Bug Report</a></a>';
echo '</div>';
+ if (!isDebug()) {
+ $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl();
+ echo '<img src="' . $googleAnalyticsImageUrl . '" />';
+ }
}
function timePlaceSettings($geolocate = false)
{
@@ -114,22 +194,22 @@
or enter an address/co-ordinates in the box below.</div>';
}
echo '<div data-role="collapsible" data-collapsed="' . !$geoerror . '">
- <h3>Change Time/Place (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' '.ucwords(service_period()).')...</h3>
- <form action="" method="post">
+ <h3>Change Time/Place (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...</h3>
+ <form action="'.basename($_SERVER['PHP_SELF']).'" method="post">
<div class="ui-body">
<div data-role="fieldcontain">
<label for="geolocate"> Current Location: </label>
- <input type="text" id="geolocate" name="geolocate" value="' . (isset($_SESSION['lat']) && isset($_SESSION['lon']) ? $_SESSION['lat'] . "," . $_SESSION['lon'] : "Enter co-ordinates or address here") . '"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a>
+ <input type="text" id="geolocate" name="geolocate" value="' . (isset($_SESSION['lat']) && isset($_SESSION['lon']) ? $_SESSION['lat'] . "," . $_SESSION['lon'] : "Enter co-ordinates or address here") . '"/> <a href="#" style="display:none" name="here" id="here">Here?</a>
</div>
<div data-role="fieldcontain">
<label for="time"> Time: </label>
- <input type="time" name="time" id="time" value="' . (isset($_SESSION['time']) ? $_SESSION['time'] : date("H:i")) . '"/> <a href="#" name="currentTime" id="currentTime"/>Current Time?</a>
+ <input type="time" name="time" id="time" value="' . (isset($_SESSION['time']) ? $_SESSION['time'] : date("H:i")) . '"/> <a href="#" name="currentTime" id="currentTime">Current Time?</a>
</div>
<div data-role="fieldcontain">
<label for="service_period"> Service Period: </label>
- <select name="service_period">';
+ <select name="service_period" id="service_period">';
foreach ($service_periods as $service_period) {
- echo "<option value=\"$service_period\"" . (service_period() === $service_period ? "SELECTED" : "") . '>' . ucwords($service_period) . '</option>';
+ echo "<option value=\"$service_period\"" . (service_period() === $service_period ? " SELECTED" : "") . '>' . ucwords($service_period) . '</option>';
}
echo '</select>
<a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a>
--- a/common.inc.php
+++ b/common.inc.php
@@ -1,16 +1,23 @@
<?php
date_default_timezone_set('Australia/ACT');
$APIurl = "http://localhost:8765";
-$cloudmadeAPIkey = "daa03470bb8740298d4b10e3f03d63e6";
-$googleMapsAPIkey = "ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q";
-$otpAPIurl = 'http://localhost:8080/opentripplanner-api-webapp/';
-//$debugOkay = Array("session","json","phperror","other");
$debugOkay = Array(
"session",
"json",
"phperror",
+ "awsgtfs",
+ "awsotp",
"other"
);
+if (isDebug("awsgtfs")) {
+ $APIurl = "http://bus-main.lambdacomplex.org:8765";
+}
+$cloudmadeAPIkey = "daa03470bb8740298d4b10e3f03d63e6";
+$googleMapsAPIkey = "ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q";
+$otpAPIurl = 'http://localhost:8080/opentripplanner-api-webapp/';
+if (isDebug("awsotp") || php_uname('n') == "maxious.xen.prgmr.com") {
+ 'http://bus-main.lambdacomplex.org:8080/opentripplanner-api-webapp/';
+}
if (isDebug("phperror")) error_reporting(E_ALL ^ E_NOTICE);
include_once ("common-geo.inc.php");
include_once ("common-net.inc.php");
@@ -25,31 +32,31 @@
$_SESSION['time'] = filter_var($_REQUEST['time'], FILTER_SANITIZE_STRING);
}
if (isset($_REQUEST['geolocate'])) {
-
$geocoded = false;
if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) {
$_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
}
else {
- $geolocate = filter_var($_REQUEST['geolocate'], FILTER_SANITIZE_URL);
- echo $_REQUEST['geolocate'];
- if (startsWith($geolocate, "-")) {
- $locateparts = explode(",",$geolocate);
- $_SESSION['lat'] = $locateparts[0];
- $_SESSION['lon'] =$locateparts[1];
- } else {
- $contents = geocode($geolocate, true);
- print_r($contents);
- if (isset($contents[0]->centroid)) {
- $geocoded = true;
- $_SESSION['lat'] = $contents[0]->centroid->coordinates[0];
- $_SESSION['lon'] = $contents[0]->centroid->coordinates[1];
+ $geolocate = filter_var($_REQUEST['geolocate'], FILTER_SANITIZE_URL);
+ echo $_REQUEST['geolocate'];
+ if (startsWith($geolocate, "-")) {
+ $locateparts = explode(",", $geolocate);
+ $_SESSION['lat'] = $locateparts[0];
+ $_SESSION['lon'] = $locateparts[1];
}
else {
- $_SESSION['lat'] = "";
- $_SESSION['lon'] = "";
- }
+ $contents = geocode($geolocate, true);
+ print_r($contents);
+ if (isset($contents[0]->centroid)) {
+ $geocoded = true;
+ $_SESSION['lat'] = $contents[0]->centroid->coordinates[0];
+ $_SESSION['lon'] = $contents[0]->centroid->coordinates[1];
+ }
+ else {
+ $_SESSION['lat'] = "";
+ $_SESSION['lon'] = "";
+ }
}
}
}
@@ -66,6 +73,12 @@
function debug($msg, $debugReason = "other")
{
if (isDebug($debugReason)) echo "\n<!-- " . date(DATE_RFC822) . "\n $msg -->\n";
+}
+function isJQueryMobileDevice()
+{
+ // http://forum.jquery.com/topic/what-is-the-best-way-to-detect-all-useragents-which-can-handle-jquery-mobile#14737000002087897
+ $user_agent = $_SERVER['HTTP_USER_AGENT'];
+ return preg_match('/iphone/i', $user_agent) || preg_match('/android/i', $user_agent) || preg_match('/webos/i', $user_agent) || preg_match('/ios/i', $user_agent) || preg_match('/bada/i', $user_agent) || preg_match('/maemo/i', $user_agent) || preg_match('/meego/i', $user_agent) || preg_match('/fennec/i', $user_agent) || (preg_match('/symbian/i', $user_agent) && preg_match('/s60/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/symbian/i', $user_agent) && preg_match('/platform/i', $user_agent) && $browser['majorver'] >= 3) || (preg_match('/blackberry/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/opera mobile/i', $user_agent) && $browser['majorver'] >= 10) || (preg_match('/opera mini/i', $user_agent) && $browser['majorver'] >= 5);
}
function isFastDevice()
{
@@ -118,6 +131,7 @@
}
return (strcasecmp(substr($haystack, 0, strlen($needle)) , $needle) === 0);
}
+
function endsWith($haystack, $needle, $case = true)
{
if ($case) {
@@ -129,33 +143,27 @@
{
return str_replace(")", "</small>", str_replace("(", "<br><small>", $input));
}
-
-function sksort(&$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 strtolower($val[$subkey]) > strtolower($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 sksort(&$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 strtolower($val[$subkey]) > strtolower($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;
}
?>
--- /dev/null
+++ b/ga.php
@@ -1,1 +1,187 @@
+<?php
+/**
+ Copyright 2009 Google Inc. All Rights Reserved.
+**/
+
+ // Tracker version.
+ define("VERSION", "4.4sh");
+
+ define("COOKIE_NAME", "__utmmobile");
+
+ // The path the cookie will be available to, edit this to use a different
+ // cookie path.
+ define("COOKIE_PATH", "/");
+
+ // Two years in seconds.
+ define("COOKIE_USER_PERSISTENCE", 63072000);
+
+ // 1x1 transparent GIF
+ $GIF_DATA = array(
+ chr(0x47), chr(0x49), chr(0x46), chr(0x38), chr(0x39), chr(0x61),
+ chr(0x01), chr(0x00), chr(0x01), chr(0x00), chr(0x80), chr(0xff),
+ chr(0x00), chr(0xff), chr(0xff), chr(0xff), chr(0x00), chr(0x00),
+ chr(0x00), chr(0x2c), chr(0x00), chr(0x00), chr(0x00), chr(0x00),
+ chr(0x01), chr(0x00), chr(0x01), chr(0x00), chr(0x00), chr(0x02),
+ chr(0x02), chr(0x44), chr(0x01), chr(0x00), chr(0x3b)
+ );
+
+ // The last octect of the IP address is removed to anonymize the user.
+ function getIP($remoteAddress) {
+ if (empty($remoteAddress)) {
+ return "";
+ }
+
+ // Capture the first three octects of the IP address and replace the forth
+ // with 0, e.g. 124.455.3.123 becomes 124.455.3.0
+ $regex = "/^([^.]+\.[^.]+\.[^.]+\.).*/";
+ if (preg_match($regex, $remoteAddress, $matches)) {
+ return $matches[1] . "0";
+ } else {
+ return "";
+ }
+ }
+
+ // Generate a visitor id for this hit.
+ // If there is a visitor id in the cookie, use that, otherwise
+ // use the guid if we have one, otherwise use a random number.
+ function getVisitorId($guid, $account, $userAgent, $cookie) {
+
+ // If there is a value in the cookie, don't change it.
+ if (!empty($cookie)) {
+ return $cookie;
+ }
+
+ $message = "";
+ if (!empty($guid)) {
+ // Create the visitor id using the guid.
+ $message = $guid . $account;
+ } else {
+ // otherwise this is a new user, create a new random id.
+ $message = $userAgent . uniqid(getRandomNumber(), true);
+ }
+
+ $md5String = md5($message);
+
+ return "0x" . substr($md5String, 0, 16);
+ }
+
+ // Get a random number string.
+ function getRandomNumber() {
+ return rand(0, 0x7fffffff);
+ }
+
+ // Writes the bytes of a 1x1 transparent gif into the response.
+ function writeGifData() {
+ global $GIF_DATA;
+ header("Content-Type: image/gif");
+ header("Cache-Control: " .
+ "private, no-cache, no-cache=Set-Cookie, proxy-revalidate");
+ header("Pragma: no-cache");
+ header("Expires: Wed, 17 Sep 1975 21:32:10 GMT");
+ echo join($GIF_DATA);
+ }
+
+ // Make a tracking request to Google Analytics from this server.
+ // Copies the headers from the original request to the new one.
+ // If request containg utmdebug parameter, exceptions encountered
+ // communicating with Google Analytics are thown.
+ function sendRequestToGoogleAnalytics($utmUrl) {
+ $options = array(
+ "http" => array(
+ "method" => "GET",
+ "user_agent" => $_SERVER["HTTP_USER_AGENT"],
+ "header" => ("Accepts-Language: " . $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
+ );
+ if (!empty($_GET["utmdebug"])) {
+ $data = file_get_contents(
+ $utmUrl, false, stream_context_create($options));
+ } else {
+ $data = @file_get_contents(
+ $utmUrl, false, stream_context_create($options));
+ }
+ }
+
+ // Track a page view, updates all the cookies and campaign tracker,
+ // makes a server side request to Google Analytics and writes the transparent
+ // gif byte data to the response.
+ function trackPageView() {
+ $timeStamp = time();
+ $domainName = $_SERVER["SERVER_NAME"];
+ if (empty($domainName)) {
+ $domainName = "";
+ }
+
+ // Get the referrer from the utmr parameter, this is the referrer to the
+ // page that contains the tracking pixel, not the referrer for tracking
+ // pixel.
+ $documentReferer = $_GET["utmr"];
+ if (empty($documentReferer) && $documentReferer !== "0") {
+ $documentReferer = "-";
+ } else {
+ $documentReferer = urldecode($documentReferer);
+ }
+ $documentPath = $_GET["utmp"];
+ if (empty($documentPath)) {
+ $documentPath = "";
+ } else {
+ $documentPath = urldecode($documentPath);
+ }
+
+ $account = $_GET["utmac"];
+ $userAgent = $_SERVER["HTTP_USER_AGENT"];
+ if (empty($userAgent)) {
+ $userAgent = "";
+ }
+
+ // Try and get visitor cookie from the request.
+ $cookie = $_COOKIE[COOKIE_NAME];
+
+ $guidHeader = $_SERVER["HTTP_X_DCMGUID"];
+ if (empty($guidHeader)) {
+ $guidHeader = $_SERVER["HTTP_X_UP_SUBNO"];
+ }
+ if (empty($guidHeader)) {
+ $guidHeader = $_SERVER["HTTP_X_JPHONE_UID"];
+ }
+ if (empty($guidHeader)) {
+ $guidHeader = $_SERVER["HTTP_X_EM_UID"];
+ }
+
+ $visitorId = getVisitorId($guidHeader, $account, $userAgent, $cookie);
+
+ // Always try and add the cookie to the response.
+ setrawcookie(
+ COOKIE_NAME,
+ $visitorId,
+ $timeStamp + COOKIE_USER_PERSISTENCE,
+ COOKIE_PATH);
+
+ $utmGifLocation = "http://www.google-analytics.com/__utm.gif";
+
+ // Construct the gif hit url.
+ $utmUrl = $utmGifLocation . "?" .
+ "utmwv=" . VERSION .
+ "&utmn=" . getRandomNumber() .
+ "&utmhn=" . urlencode($domainName) .
+ "&utmr=" . urlencode($documentReferer) .
+ "&utmp=" . urlencode($documentPath) .
+ "&utmac=" . $account .
+ "&utmcc=__utma%3D999.999.999.999.999.1%3B" .
+ "&utmvid=" . $visitorId .
+ "&utmip=" . getIP($_SERVER["REMOTE_ADDR"]);
+
+ sendRequestToGoogleAnalytics($utmUrl);
+
+ // If the debug parameter is on, add a header to the response that contains
+ // the url that was used to contact Google Analytics.
+ if (!empty($_GET["utmdebug"])) {
+ header("X-GA-MOBILE-URL:" . $utmUrl);
+ }
+ // Finally write the gif data to the response.
+ writeGifData();
+ }
+?><?php
+ trackPageView();
+?>
+
--- a/index.php
+++ b/index.php
@@ -5,9 +5,10 @@
<div data-role="page">
<div data-role="content">
<div id="jqm-homeheader">
- <center><h3>busness time</h3><br><small>Canberra Bus Timetables and Trip Planner</small></center>
+ <h1>busness time</h1><br><small>Canberra Bus Timetables and Trip Planner</small>
</div>
- <a href="tripPlanner.php" data-role="button" data-icon="navigation">Launch Trip Planner...</a>
+ <a name="maincontent" id="maincontent"></a>
+ <a href="tripPlanner.php" data-role="button" data-icon="navigation">Launch Trip Planner...</a>
<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
<li data-role="list-divider">Timetables - Stops</li>
<li><a href="stopList.php">Major (Timing Point) Stops</a></li>
@@ -19,7 +20,7 @@
<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?bysuburb=yes">Stops By Suburb</a></li>
+ <li><a href="routeList.php?bysuburb=yes">Routes By Suburb</a></li>
<li><a class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li>
</ul>
<?php
--- a/readme.txt
+++ b/readme.txt
@@ -1,30 +1,15 @@
-# input location (via GPS or favourites or search) and destination (via searchable list, optional)
-# http://10.0.1.153:8765/json/boundboxstops?n=-35.27568499917103&e=149.1346514225006&s=-35.279495003493516
-&w=149.12622928619385&limit=50
-# http://10.0.1.153:8765/json/stoptrips?stop=43&time=64440 # recursively call to show all services nearby, sort by distance, need to filter by service period
-# Hey, can pick destination again from a list filtered to places these stops go if you're curious!
-# http://10.0.1.153:8765/json/tripstoptimes?trip=2139 # Can recursively call and parse based on intended destination to show ETA
-# http://10.0.1.153:8765/json/triprows?trip=2139 # For pretty maps
+Busness Time - An ACT bus timetable webapp
+Based on the maxious-canberra-transit-feed @ http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip
+Source code for the https://github.com/maxious/ACTBus-data transit
+feed and https://github.com/maxious/ACTBus-ui this site available from github.
+Uses jQuery Mobile, PHP, Ruby, Python, Google Transit Feed Specification
+tools, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder
+and Tile Service
-have to do
+Must have view.sh running on port 8765 for this webapp to work
+
+For static maps, may have to do
/usr/sbin/setsebool -P httpd_can_network_connect=1
on fedora
-might need http://forum.jquery.com/topic/google-maps-inside-jquery-mobile
-some extras
-/json/routes = all routes
-/json/neareststops?lat/lng/number
-TODO
-Destinations
-Favourites
-OOP stops/routes
-Stop sorting/search-filter
-
-static maps
-https://code.google.com/apis/maps/documentation/staticmaps/
-http://www.multimap.com/openapidocs/1.2/web_service/staticmaps.htm
-http://dev.openstreetmap.de/staticmap/ (os @ http://sourceforge.net/projects/staticmaplite/)
-(php and open source @ http://trac.openstreetmap.org/browser/sites/other/StaticMap?rev=16348)
-http://pafciu17.dev.openstreetmap.org/
-
--- a/routeList.php
+++ b/routeList.php
@@ -17,14 +17,16 @@
include_header("Routes by Suburb", "routeList");
navbar();
echo ' <ul data-role="listview" data-filter="true" data-inset="true" >';
- foreach ($suburbs as $suburb) {
- if (!isset($_REQUEST['firstLetter'])) {
- foreach (range('A', 'Z') as $letter) {
- echo "<li><a href=\"routeList.php?firstLetter=$letter&bysuburb=yes\">$letter...</a></li>\n";
+ if (!isset($_REQUEST['firstLetter'])) {
+ foreach (range('A', 'Z') as $letter) {
+ echo "<li><a href=\"routeList.php?firstLetter=$letter&bysuburb=yes\">$letter...</a></li>\n";
+ }
+ }
+ else {
+ foreach ($suburbs as $suburb) {
+ if (startsWith($suburb, $_REQUEST['firstLetter'])) {
+ echo '<li><a href="routeList.php?suburb=' . urlencode($suburb) . '">' . $suburb . '</a></li>';
}
- }
- else if (startsWith($suburb, $_REQUEST['firstLetter'])) {
- echo '<li><a href=&