Add myway card balance/transaction API
Add myway card balance/transaction API

<?php <?php
function getPage($url) function getPage($url)
{ {
debug($url, "json"); debug($url, "json");
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$page = curl_exec($ch); $page = curl_exec($ch);
if (curl_errno($ch)) echo "<font color=red> Database temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch) . "</font><br>"; if (curl_errno($ch)) echo "<font color=red> Database temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch) . "</font><br>";
curl_close($ch); curl_close($ch);
  debug(print_r($page,true),"json");
return $page; return $page;
} }
function curPageURL() function curPageURL()
{ {
$isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on");
$port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443")));
$port = ($port) ? ':' . $_SERVER["SERVER_PORT"] : ''; $port = ($port) ? ':' . $_SERVER["SERVER_PORT"] : '';
$url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER["SERVER_NAME"] . $port . htmlentities(dirname($_SERVER['PHP_SELF']) , ENT_QUOTES) . "/"; $url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER["SERVER_NAME"] . $port . htmlentities(dirname($_SERVER['PHP_SELF']) , ENT_QUOTES) . "/";
return $url; return $url;
} }
?> ?>
<?php <?php
function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false) function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false)
{ {
echo ' echo '
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>' . $pageTitle . '</title>'; <title>' . $pageTitle . '</title>';
if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.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> <script type="text/javascript" src="js/jquery-1.5.js"></script>
<script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>'; <script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>';
else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.css" /> else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.js"></script> <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>'; <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>';
echo ' echo '
<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" /> <link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />
<script> <script>
//reset type=date inputs to text //reset type=date inputs to text
$( document ).bind( "mobileinit", function(){ $( document ).bind( "mobileinit", function(){
$.mobile.page.prototype.options.degradeInputs.date = true; $.mobile.page.prototype.options.degradeInputs.date = true;
}); });
</script> </script>
<script src="js/jQuery.ui.datepicker.js"></script> <script src="js/jQuery.ui.datepicker.js"></script>
<script src="js/jquery.ui.datepicker.mobile.js"></script> <script src="js/jquery.ui.datepicker.mobile.js"></script>
<style type="text/css"> <style type="text/css">
.ui-navbar { .ui-navbar {
width: 100%; width: 100%;
} }
.ui-btn-inner { .ui-btn-inner {
white-space: normal !important; white-space: normal !important;
} }
.ui-li-heading { .ui-li-heading {
white-space: normal !important; white-space: normal !important;
} }
.ui-listview-filter { .ui-listview-filter {
margin: 0 !important; margin: 0 !important;
} }
.ui-icon-navigation { .ui-icon-navigation {
background-image: url(css/images/113-navigation.png); background-image: url(css/images/113-navigation.png);
background-position: 1px 0; background-position: 1px 0;
} }
#footer { #footer {
text-size: 0.75em; text-size: 0.75em;
text-align: center; text-align: center;
} }
body { body {
background-color: #F0F0F0; background-color: #F0F0F0;
} }
</style> </style>
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-startup-image" href="startup.png" /> <link rel="apple-touch-startup-image" href="startup.png" />
<link rel="apple-touch-icon" href="apple-touch-icon.png" />'; <link rel="apple-touch-icon" href="apple-touch-icon.png" />';
if ($geolocate) { if ($geolocate) {
echo "<script> echo "<script>
   
function success(position) { function success(position) {
$('#geolocate').val(position.coords.latitude+','+position.coords.longitude); $('#geolocate').val(position.coords.latitude+','+position.coords.longitude);
$.ajax({ url: \"common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); $.ajax({ url: \"common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude });
$('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;}); $('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;});
$('#here').show(); $('#here').show();
} }
function error(msg) { function error(msg) {
console.log(msg); console.log(msg);
} }
   
if (navigator.geolocation) { if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, error); navigator.geolocation.getCurrentPosition(success, error);
} }
   
</script> "; </script> ";
} }
echo '</head> echo '</head>
<body> <body>
'; ';
if (isMetricsOn()) { if (isMetricsOn()) {
require_once ('owa/owa_env.php'); require_once ('owa/owa_env.php');
require_once (OWA_DIR . 'owa_php.php'); require_once (OWA_DIR . 'owa_php.php');
$owa = new owa_php(); $owa = new owa_php();
global $owaSiteID; global $owaSiteID;
$owa->setSiteId($owaSiteID); $owa->setSiteId($owaSiteID);
$owa->setPageTitle($pageTitle); $owa->setPageTitle($pageTitle);
$owa->setPageType($pageType); $owa->setPageType($pageType);
$owa->trackPageView(); $owa->trackPageView();
$owa->placeHelperPageTags(); $owa->placeHelperPageTags();
} }
if ($opendiv) { if ($opendiv) {
echo '<div data-role="page"> echo '<div data-role="page">
<script> <script>
$(document).ready(function () $(document).ready(function ()
{ {
document.title = "' . $pageTitle . '"; document.title = "' . $pageTitle . '";
}); });
</script> </script>
<div data-role="header"> <div data-role="header">
<h1>' . $pageTitle . '</h1> <h1>' . $pageTitle . '</h1>
</div><!-- /header --> </div><!-- /header -->
<div data-role="content"> '; <div data-role="content"> ';
} }
} }
function include_footer() function include_footer()
{ {
if ($geolocate && isset($_SESSION['lat'])) { if ($geolocate && isset($_SESSION['lat'])) {
echo "<script> echo "<script>
$('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;}); $('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;});
$('#here').show(); $('#here').show();
</script>"; </script>";
} }
echo '<div id="footer"><a href="about.php">About/Contact Us</a>&nbsp;<a href="feedback.php">Feedback/Bug Report</a></a>'; echo '<div id="footer"><a href="about.php">About/Contact Us</a>&nbsp;<a href="feedback.php">Feedback/Bug Report</a></a>';
echo '</div>'; echo '</div>';
} }
function timePlaceSettings($geolocate = false) function timePlaceSettings($geolocate = false)
{ {
global $service_periods; global $service_periods;
$geoerror = false; $geoerror = false;
if ($geolocate == true) { if ($geolocate == true) {
$geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "";
} }
if ($geoerror) { if ($geoerror) {
echo '<div class="error">Sorry, but your location could not currently be detected. echo '<div class="error">Sorry, but your location could not currently be detected.
Please allow location permission, wait for your location to be detected, Please allow location permission, wait for your location to be detected,
or enter an address/co-ordinates in the box below.</div>'; or enter an address/co-ordinates in the box below.</div>';
} }
echo '<div data-role="collapsible" data-collapsed="' . !$geoerror . '"> echo '<div data-role="collapsible" data-collapsed="' . !$geoerror . '">
<h3>Change Time/Place...</h3> <h3>Change Time/Place...</h3>
<form action="" method="post"> <form action="" method="post">
<div class="ui-body"> <div class="ui-body">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="geolocate"> Current Location: </label> <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>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="time"> Time: </label> <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>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="service_period"> Service Period: </label> <label for="service_period"> Service Period: </label>
<select name="service_period">'; <select name="service_period">';
foreach ($service_periods as $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> echo '</select>
<a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a> <a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a>
</div> </div>
<input type="submit" value="Update"/> <input type="submit" value="Update"/>
</form> </form>
</div></div>'; </div></div>';
} }
?> ?>
  <?php
  function cleanString($subject)
  {
  $subject = str_replace("&nbsp;", " ", $subject);
  $subject = str_replace("&", "&amp;", $subject);
  $subject = preg_replace('/[^\r\n\t\x20-\x7E\xA0-\xFF]/', '', $subject);
  $subject = str_replace(" ", " ", $subject);
  return trim($subject);
  }
  $return = Array();
  /*if (file_exists("mywayresponse.txt")) {
  @$fh = fopen("mywayresponse.txt", 'r');
  if ($fh) {
  $pageHTML = fread($fh, filesize("mywayresponse.txt"));
  fclose($fh);
  }
  }*/
  //set POST variables
  $url = 'https://www.action.act.gov.au/ARTS/use_Funcs.asp';
  $field_mapping = Array(
  "card_number" => "SRNO",
  "DOBmonth" => "month",
  "DOBday" => "day",
  "DOByear" => "year",
  "secret_answer" => "pwrd",
  "button" => "button"
  );
  foreach (Array(
  "card_number",
  "DOBday",
  "DOBmonth",
  "DOByear"
  ) as $field_name) {
  if (isset($_REQUEST[$field_name])) {
  $fields[$field_name] = filter_var($_REQUEST[$field_name], FILTER_SANITIZE_NUMBER_INT);
  }
  else {
  $return["error"][] = $field_name. " parameter invalid or unspecified";
  }
  }
  if (isset($_REQUEST['secret_answer'])) {
  $fields['secret_answer'] = filter_var($_REQUEST['secret_answer'], FILTER_SANITIZE_STRING, Array(
  FILTER_FLAG_NO_ENCODE_QUOTES,
  FILTER_FLAG_STRIP_HIGH,
  FILTER_FLAG_STRIP_LOW
  ));
  }
  else {
  $return["error"][] = "secret_answer parameter invalid or unspecified";
  }
  $fields['button'] = 'Submit';
  $fields_string = "";
  //url-ify the data for the POST
  foreach ($fields as $key => $value) {
  if (sizeof($value) === 0) $return['error'][] = $key . " parameter invalid or unspecified";
  $fields_string.= $field_mapping[$key] . '=' . $value . '&';
  }
  $fields_string = rtrim($fields_string, '&');
  if (!isset($return['error'])) {
  //open connection
  $ch = curl_init();
  //set the url, number of POST vars, POST data
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POST, count($fields));
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  //execute post
  $pageHTML = curl_exec($ch);
  if (curl_errno($ch)) $return["error"][] = "Network error " . curl_errno($ch) . " " . curl_error($ch) . " " . $url . $fields_string;
  //close connection
  curl_close($ch);
  }
  if (!isset($return['error'])) {
  include_once ('simple_html_dom.php');
  $page = str_get_html($pageHTML);
  $pageAlerts = $page->find(".smartCardAlert");
  if (sizeof($pageAlerts) > 0) {
  $return['error'][] = $pageAlerts[0]->plaintext;
  }
  if (!isset($return['error'])) {
  $tableNum = 0;
  $tableName = Array(
  1 => "myway_carddetails",
  2 => "myway_transactions"
  );
  foreach ($page->find("table") as $table) {
  $tableNum++;
  $tableColumns = Array();
  $tableColumnNum = 0;
  foreach ($table->find("th") as $th) {
  $tableColumns[$tableColumnNum] = cleanString($th->plaintext);
  $tableColumnNum++;
  }
  $tableRowNum = 0;
  foreach ($table->find("tr") as $tr) {
  $tableColumnNum = 0;
  foreach ($tr->find("td") as $td) {
  $return[$tableName[$tableNum]][$tableRowNum][$tableColumns[$tableColumnNum]] = cleanString($td->plaintext);
  $tableColumnNum++;
  }
  $tableRowNum++;
  }
  }
  }
  }
  if (sizeof($return) == 0) {
  $return['error'][] = "No data extracted from MyWay website - API may be out of date";
  print $pageHTML;
  }
  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
 
  }
  else echo json_encode($return);
  ?>
 
<?php <?php
include ('common.inc.php'); include ('common.inc.php');
include_header("Routes", "routeList"); include_header("Routes", "routeList");
echo ' echo '
<div data-role="navbar"> <div data-role="navbar">
<ul> <ul>
<li><a href="routeList.php">By Final Destination...</a></li> <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?bynumber=yes">By Number... </a></li>
<li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li> <li><a href="routeList.php?bysuburb=yes">By Suburb... </a></li>
<li><a href="routeList.php?nearby=yes">Nearby... </a></li> <li><a href="routeList.php?nearby=yes">Nearby... </a></li>
</ul> </ul>
</div> </div>
'; ';
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
$url = $APIurl . "/json/routes"; $url = $APIurl . "/json/routes";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
debug(print_r($contents, true));  
function printRoutes($routes) function printRoutes($routes)
{ {
foreach ($routes as $row) { foreach ($routes as $row) {
echo '<li>' . $row[1] . ' <a href="trip.php?routeid=' . $row[0] . '">' . $row[2] . " (" . ucwords($row[3]) . ")</a></li>\n"; echo '<li>' . $row[1] . ' <a href="trip.php?routeid=' . $row[0] . '">' . $row[2] . " (" . ucwords($row[3]) . ")</a></li>\n";
} }
} }
if ($_REQUEST['bynumber']) { if ($_REQUEST['bynumber']) {
$routeSeries = Array(); $routeSeries = Array();
$seriesRange = Array(); $seriesRange = Array();
foreach ($contents as $key => $row) { foreach ($contents as $key => $row) {
foreach (explode(" ", $row[1]) as $routeNumber) { foreach (explode(" ", $row[1]) as $routeNumber) {
$seriesNum = substr($routeNumber, 0, -1) . "0"; $seriesNum = substr($routeNumber, 0, -1) . "0";
if ($seriesNum == "0") $seriesNum = $routeNumber; if ($seriesNum == "0") $seriesNum = $routeNumber;
$finalDigit = substr($routeNumber, sizeof($routeNumber) - 1, 1); $finalDigit = substr($routeNumber, sizeof($routeNumber) - 1, 1);
if (isset($seriesRange[$seriesNum])) { if (isset($seriesRange[$seriesNum])) {
if ($finalDigit < $seriesRange[$seriesNum]['max']) $seriesRange[$seriesNum]['max'] = $routeNumber; if ($finalDigit < $seriesRange[$seriesNum]['max']) $seriesRange[$seriesNum]['max'] = $routeNumber;
if ($finalDigit > $seriesRange[$seriesNum]['min']) $seriesRange[$seriesNum]['min'] = $routeNumber; if ($finalDigit > $seriesRange[$seriesNum]['min']) $seriesRange[$seriesNum]['min'] = $routeNumber;
} }