--- a/include/common-template.inc.php +++ b/include/common-template.inc.php @@ -1,148 +1,130 @@ <?php + +/* + * 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. + */ + // Copyright 2009 Google Inc. All Rights Reserved. $GA_ACCOUNT = "MO-22173039-1"; $GA_PIXEL = "/lib/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 ' + +function googleAnalyticsGetImageUrl() { + global $GA_ACCOUNT, $GA_PIXEL; + //if (stristr($_SERVER['HTTP_USER_AGENT'], 'Googlebot') return ""; + $url = ""; + $url.= $GA_PIXEL . "?"; + $url.= "utmac=" . $GA_ACCOUNT; + $url.= "&utmn=" . rand(0, 0x7fffffff); + $referer = (isset($_SERVER["HTTP_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) { + global $basePath, $GTFSREnabled; + echo ' <!DOCTYPE html> <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.0a4.css" /> - - <script type="text/javascript" src="js/jquery-1.5.js"></script> - <script>$(document).bind("mobileinit", function(){ +<meta name="viewport" content="width=device-width, initial-scale=1"> +<title>' . $pageTitle . ' - Canberra Bus Timetable</title> + <meta name="google-site-verification" content="-53T5Qn4TB_de1NyfR_ZZkEVdUNcNFSaYKSFkWKx-sY" /> +<link rel="dns-prefetch" href="//code.jquery.com"> +<link rel="dns-prefetch" href="//ajax.googleapis.com"> + <link rel="stylesheet" href="' . $basePath . 'css/jquery-ui-1.8.12.custom.css" />'; + $jqmVersion = "1.0"; + if (isDebugServer()) { + $jqmcss = $basePath . "css/jquery.mobile-$jqmVersion.css"; + $jqjs = $basePath . "js/jquery-1.6.4.min.js"; + $jqmjs = $basePath . "js/jquery.mobile-$jqmVersion.js"; + + $jqmcss = $basePath . "css/jquery.mobile-b90eab4935.css"; + $jqmjs = $basePath . "js/jquery.mobile-b90eab4935.js"; + } else { + $jqmcss = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.css"; + $jqjs = "//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"; + $jqmjs = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.js"; + + } + echo '<link rel="stylesheet" href="' . $jqmcss . '" /> + <script src="' . $jqjs . '"></script> + <script>$(document).bind("mobileinit", function(){ $.mobile.ajaxEnabled = false; }); -</script> - <script type="text/javascript" src="js/jquery.mobile-1.0a4.js"></script>'; - } - else { - echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" /> - <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script> - <script>$(document).bind("mobileinit", function(){ - $.mobile.ajaxEnabled = false; -}); -</script> - <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>'; - } - if ($datepicker) { - echo '<script> - //reset type=date inputs to text - $( document ).bind( "mobileinit", function(){ - $.mobile.page.prototype.options.degradeInputs.date = true; - }); - </script> - <script src="js/jQuery.ui.datepicker.js"></script>'; - } - echo '<style type="text/css"> - .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(css/images/113-navigation.png); - background-position: 1px 0; - } - .ui-icon-beaker { - background-image: url(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; - } - // 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" /> +</script> + <script src="' . $jqmjs . '"></script> + +<script src="' . $basePath . 'js/jquery.ui.core.min.js"></script> +<script src="' . $basePath . 'js/jquery.ui.position.min.js"></script> +<script src="' . $basePath . 'js/jquery.ui.widget.min.js"></script> + <script src="' . $basePath . 'js/jquery.ui.autocomplete.min.js"></script> + <script> + $(function() { + $( "#geolocate" ).autocomplete({ + source: "lib/autocomplete.php", + minLength: 2 + }); + $( "#from" ).autocomplete({ + source: "lib/autocomplete.php", + minLength: 2 + }); + $( "#to" ).autocomplete({ + source: "lib/autocomplete.php", + minLength: 2 + }); + }); + </script>'; + 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, +.ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d,.ui-bar-d,.ui-body-e,.ui-btn-up-e,.ui-btn-hover-e, +.ui-btn-down-e,.ui-bar-e,.ui-overlay-shadow,.ui-shadow,.ui-btn-active,.ui-body-a,.ui-bar-a { + text-shadow: none; + box-shadow: none; + -webkit-box-shadow: none; +}'; + echo '</style>'; + echo '<link rel="stylesheet" href="' . $basePath . 'css/local.css.php" />'; + if (isIOSDevice()){ + 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> + } + if ($geolocate) { + echo "<script> function success(position) { $('#error').val('Location now detected. Please wait for data to load.'); $('#geolocate').val(position.coords.latitude+','+position.coords.longitude); -$.ajax({ url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); -location.reload(true); +$.ajax({ async: false, +success: function(){ + location.reload(true); + }, +url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); } function error(msg) { $('#error').val('Error: '+msg); @@ -160,51 +142,64 @@ } $(document).ready(function() { $('#here').click(function(event) { $('#geolocate').val(geolocate()); return false;}); -$('#here').show(); + $('#here').show(); }); "; - if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") echo "geolocate();"; - echo "</script> "; - } - if (isAnalyticsOn()) echo ' + if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") + echo "geolocate();"; + echo "</script> "; + } + if (isAnalyticsOn()) + echo ' <script type="text/javascript">' . " var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-22173039-1']); _gaq.push(['_trackPageview']); + _gaq.push(['_trackPageLoadTime']); </script>"; - echo '</head> + echo '</head> <body> <div id="skip"> <a href="#maincontent">Skip to content</a> </div> '; - if ($opendiv) { - echo '<div data-role="page"> + if ($opendiv) { + echo '<div data-role="page"> <div data-role="header" data-position="inline"> - <a href="' . $_SERVER["HTTP_REFERER"] . '" data-icon="arrow-l" data-rel="back" class="ui-btn-left">Back</a> + <a href="' . (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "javascript:history.go(-1)") . '" data-icon="arrow-l" data-rel="back" class="ui-btn-left">Back</a> <h1>' . $pageTitle . '</h1> - <a href="/index.php" data-icon="home" class="ui-btn-right">Home</a> + <a href="' . $basePath . '/index.php" data-icon="home" class="ui-btn-right">Home</a> </div><!-- /header --> <a name="maincontent" id="maincontent"></a> <div data-role="content"> '; - $overrides = getServiceOverride(); - if ($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 + if ($GTFSREnabled) { + $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 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>'; - } - } - } -} -function include_footer() -{ - echo '<div id="footer"><a href="about.php">About/Contact Us</a> <a href="feedback.php">Feedback/Bug Report</a></a>'; - echo '</div>'; - if (isAnalyticsOn()) { - echo "<script> (function() { + } 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>'; + } + } + $serviceAlerts = getServiceAlertsAsArray("agency", "0"); + if (isset($serviceAlerts['entity']) && sizeof($serviceAlerts['entity']) > 0) { + foreach ($serviceAlerts['entity'] as $entity) { + echo "<div id='servicewarning'>" . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['start'])) . " to " . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['end'])) . "{$entity['alert']['header_text']['translation'][0]['text']}<br>Warning: {$entity['alert']['description_text']['translation'][0]['text']} + <br><a href='{$entity['alert']['url']['translation'][0]['text']}'>Source</a> </div>"; + } + } + } + } +} + +function include_footer() { + global $basePath; + echo '<div id="footer"><a href="' . $basePath . 'about.php">About/Contact Us</a> <a href="' . $basePath . 'feedback.php">Feedback/Bug Report</a> <a href="' . $basePath . 'privacy.php">Privacy Policy</a>'; + echo '</div>'; + if (isAnalyticsOn()) { + echo "<script> (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? @@ -212,54 +207,102 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();</script>"; - $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); - echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>'; - } -} -function timePlaceSettings($geolocate = false) -{ - global $service_periods; - $geoerror = false; - if ($geolocate == true) { - $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; - } - if ($geoerror) { - echo '<div id="error">Sorry, but your location could not currently be detected. + $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); + echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>'; + } + echo "\n</div></div></body></html>"; +} +function timeSettings() { + global $service_periods; +echo '<div id="settings" data-role="collapsible" data-collapsed="true"> +<h3>Change Time (' . (isset($_REQUEST['time']) ? $_REQUEST['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...</h3> + <form action="' . basename($_SERVER['PHP_SELF']) . '" method="GET"> + <input type="hidden" name="suburb" id="suburb" value="' . (isset($_REQUEST['suburb']) ? $_REQUEST['suburb'] : "") . '"/> + + <input type="hidden" name="stopid" id="stopid" value="' . (isset($_REQUEST['stopid']) ? $_REQUEST['stopid'] : "") . '"/> + <input type="hidden" name="stopcode" id="stopcode" value="' . (isset($_REQUEST['stopcode']) ? $_REQUEST['stopcode'] : "") . '"/> + <div class="ui-body"> + <div data-role="fieldcontain"> + <label for="time"> Time: </label> + <input type="time" name="time" id="time" value="' . (isset($_REQUEST['time']) ? $_REQUEST['time'] : date("H:i")) . '"/> + <a href="#" name="currentTime" id="currentTime" onClick="var d = new Date();' . "$('#time').val(d.getHours() +':'+ (d.getMinutes().toString().length == 1 ? '0'+ d.getMinutes(): d.getMinutes()));" . '">Current Time?</a> + </div> + <div data-role="fieldcontain"> + <label for="service_period"> Service Period: </label> + <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 '</select> + <a href="#" style="display:none" name="currentPeriod" id="currentPeriod">Current Period?</a> + </div> + + <input type="submit" value="Update"/> + </div></form> + </div>'; +} +function placeSettings() { + + $geoerror = false; + $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; + + echo '<div id="error">'; + if ($geoerror) { + echo 'Sorry, but your location could not currently be detected. Please allow location permission, wait for your location to be detected, - 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> + or enter an address/co-ordinates in the box below.'; + } + echo '</div>'; + echo '<div id="settings" data-role="collapsible" data-collapsed="' . !$geoerror . '"> + <h3>Change Location...</h3> <form action="' . basename($_SERVER['PHP_SELF']) . "?" . $_SERVER['QUERY_STRING'] . '" 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> </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" onClick="var d = new Date();' . "$('#time').val(d.getHours() +':'+ (d.getMinutes().toString().length == 1 ? '0'+ d.getMinutes(): d.getMinutes()));" . '">Current Time?</a> - </div> - <div data-role="fieldcontain"> - <label for="service_period"> Service Period: </label> - <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 '</select> - <a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a> - </div> <input type="submit" value="Update"/> - </form> - </div></div>'; -} -function trackEvent($category, $action, $label = "", $value = - 1) -{ - if (isAnalyticsOn()) { - echo "\n<script> _gaq.push(['_trackEvent', '$category', '$action'" . ($label != "" ? ", '$label'" : "") . ($value != - 1 ? ", $value" : "") . "]);</script>"; - } + </div></form> + </div>'; +} + +function trackEvent($category, $action, $label = "", $value = - 1) { + if (isAnalyticsOn()) { + echo "\n<script> _gaq.push(['_trackEvent', '$category', '$action'" . ($label != "" ? ", '$label'" : "") . ($value != - 1 ? ", $value" : "") . "]);</script>"; + } +} + +//stop list collapsing +function stopCompare($stopName) { + return substr(trim(preg_replace("/\(Platform.*/", "", $stopName)),0,9); +} +function stopGroupTitle($stopName,$stopdesc) { + if (preg_match("/Dr |Cct |Cir |Av |St |Cr |Parade |Way |Bank /",$stopName)) { + $descParts = explode("<br>",$stopdesc); + return trim(str_replace("Street: ","",$descParts[0])); + } else { + return trim(preg_replace("/\(Platform.*/", "",$stopName)); + } +} + +function viaPointNames($tripid, $stop_sequence = "") { + $viaPointNames = Array(); + foreach (viaPoints($tripid, $stop_sequence) as $point) { + if (strstr($point['stop_name'], "Station") + || strstr($point['stop_name'], "Shops") + || strstr($point['stop_name'], "CIT") + || strstr($point['stop_name'], "School") + || strstr($point['stop_name'], "University") + ) { + $viaPointNames[] = $point['stop_name']; + } + } + if (sizeof($viaPointNames) > 0) { + return r_implode(", ", $viaPointNames); + } else { + return ""; + } } ?>