Move open transit data experiments to labs
Move open transit data experiments to labs

  <?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) {
  if ($tableNum == 1) $return[$tableName[$tableNum]][$tableColumns[$tableColumnNum]] = cleanString($td->plaintext);
  else $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";
  }
 
  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
  include ('../include/common.inc.php');
  include_header("MyWay Balance", "mywayBalance", true, false, true);
  $return = Array();
  function printBalance($cardNumber, $date, $pwrd)
  {
  global $return;
  $return = json_decode(getPage(curPageURL() . "/myway_api.json.php?card_number=$cardNumber&DOBday={$date[0]}&DOBmonth={$date[1]}&DOByear={$date[2]}&secret_answer=$pwrd"), true);
 
  if (isset($return['error'])) {
  echo "<font color=red>" . var_dump($return['error']) . "</font>";
  } else {
  echo "<h2>Balance: " . $return['myway_carddetails']['Card Balance'] . "</h2>";
  echo '<ul data-role="listview" data-inset="true"><li data-role="list-divider"> Recent Transactions </li>';
  foreach ($return['myway_transactions'] as $transaction) {
  echo "<li><b>" . $transaction["Date / Time"] . "</b>";
  echo "<br><small>" . $transaction["TX Reference No / Type"]. "</small>";
  echo '<p class="ui-li-aside">'.$transaction["TX Amount"].'</p>';
  echo "</li>";
  }
  echo "</ul>";
  }
  }
  if (isset($_REQUEST['card_number']) && isset($_REQUEST['date']) && isset($_REQUEST['secret_answer'])) {
  $cardNumber = $_REQUEST['card_number'];
  $date = explode("/", $_REQUEST['date']);
  $pwrd = $_REQUEST['secret_answer'];
  if ($_REQUEST['remember'] == true) {
  $_COOKIE['card_number'] = $cardNumber;
  $_COOKIE['date'] = $date;
  $_COOKIE['secret_answer'] = $pwrd;
  }
  printBalance($cardNumber, $date, $pwrd);
  }
  else if (isset($_COOKIE['card_number']) && isset($_COOKIE['date']) && isset($_COOKIE['secret_answer'])) {
  $cardNumber = $_COOKIE['card_number'];
  $date = explode("/", $_COOKIE['date']);
  $pwrd = $_COOKIE['secret_answer'];
  printBalance($cardNumber, $date, $pwrd);
  }
  else {
  $date = (isset($_REQUEST['date']) ? filter_var($_REQUEST['date'], FILTER_SANITIZE_STRING) : date("m/d/Y"));
  echo '<form action="" method="post">
  <div data-role="fieldcontain">
  <label for="card_number">Card number</label>
  <input type="text" name="card_number" id="card_number" value="' . $card_number . '" />
  </div>
  <div data-role="fieldcontain">
  <label for="date"> Date of birth </label>
  <input type="text" name="date" id="date" value="' . $date . '" />
  </div>
  <div data-role="fieldcontain">
  <label for="secret_answer"> Secret question answer </label>
  <input type="text" name="secret_answer" id="secret_answer" value="' . $secret_answer . '" />
  </div>
  <div data-role="fieldcontain">
  <label for="remember"> Remember these details? </label>
  <input type="checkbox" name="remember" id="remember" checked="yes" />
  </div>
  <input type="submit" value="Go!"></form>';
  }
  include_footer();
  ?>
 
file:b/labs/stop.pdf.php (new)
  <?php
  include ('../include/common.inc.php');
  $stopid = filter_var($_REQUEST['stopid'], FILTER_SANITIZE_NUMBER_INT);
  $url = $APIurl . "/json/stop?stop_id=" . $stopid;
  $stop = json_decode(getPage($url));
  $html.= '<table><tr><td><br><br> ';
  $url = $APIurl . "/json/stoproutes?stop=" . $stopid . "&time=" . midnight_seconds() . "&service_period=" . service_period();
  $routes = json_decode(getPage($url));
  foreach ($routes as $route) {
  $html.= '<br> <a href="trip.php?routeid=' . $route[0] . '&stopid=' . $stopid . '">' . $route[1] . ' - ' . $route[2] . '</a>';
  $viaPoints = viaPointNames($route[3], $stopid);
  if ($viaPoints != "") $html.= '<br><small>Via: ' . $viaPoints . '</small>';
  $html.= "<br>";
  }
  $html.= '</td><td>' . staticmap(Array(
  0 => Array(
  $stop[2],
  $stop[3]
  )
  ) , 0, "iconb", false) . "</td></tr>";
  $url = $APIurl . "/json/stoptrips?stop=" . $stopid . "&time=" . midnight_seconds() . "&service_period=" . service_period();
  $trips = json_decode(getPage($url));
  $html.= "</table><br><br><table>";
  $html.= "<thead><tr><th>Route</th><th>Time</th></tr></thead>";
  debug(print_r($trips, true));
  foreach ($trips as $row) {
  $html.= '<tr><td><a href="trip.php?stopid=' . $stopid . '&tripid=' . $row[1][0] . '">' . $row[1][1] . "</a></td>";
  $html.= '<td>' . midnight_seconds_to_time($row[0]) . '</td>';
  $html.= '</tr>';
  }
  $html.= '</table>';
  if (sizeof($trips) == 0) $html.= "<center>No trips in the near future.</center>";
  require_once ('lib/tcpdf/config/lang/eng.php');
  require_once ('lib/tcpdf/tcpdf.php');
  // create new PDF document
  class Custom_TCPDF extends TCPDF
  {
  var $QRCodeURL;
  function set_QRCodeURL($url)
  {
  $this->QRCodeURL = $url;
  }
  /**
  * This method is used to render the page header.
  * It is automatically called by AddPage() and could be overwritten in your own inherited class.
  * @public
  */
  public function Header()
  {
  if ($this->header_xobjid < 0) {
  // start a new XObject Template
  $this->header_xobjid = $this->startTemplate($this->w, $this->tMargin + 10);
  $headerfont = $this->getHeaderFont();
  $headerdata = $this->getHeaderData();
  $this->y = $this->header_margin;
  if ($this->rtl) {
  $this->x = $this->w - $this->original_rMargin;
  }
  else {
  $this->x = $this->original_lMargin - 10;
  }
  if (isset($this->QRCodeURL)) {
  // QRCODE,H : QR-CODE Best error correction
  $style = array(
  'border' => 1,
  'padding' => 0,
  'fgcolor' => array(
  0,
  0,
  0
  ) ,
  'bgcolor' => false, //array(255,255,255)
  'module_width' => 1, // width of a single module in points
  'module_height' => 1
  // height of a single module in points
 
  );
  $this->write2DBarcode($this->QRCodeURL, 'QRCODE,H', '', '', 25, 25, $style, 'T');
  $imgy = 50 + 20;
  }
  elseif (($headerdata['logo']) AND ($headerdata['logo'] != K_BLANK_IMAGE)) {
  $imgtype = $this->getImageFileType(K_PATH_IMAGES . $headerdata['logo']);
  if (($imgtype == 'eps') OR ($imgtype == 'ai')) {
  $this->ImageEps(K_PATH_IMAGES . $headerdata['logo'], '', '', $headerdata['logo_width']);
  }
  elseif ($imgtype == 'svg') {
  $this->ImageSVG(K_PATH_IMAGES . $headerdata['logo'], '', '', $headerdata['logo_width']);
  }
  else {
  $this->Image(K_PATH_IMAGES . $headerdata['logo'], '', '', $headerdata['logo_width']);
  }
  $imgy = $this->getImageRBY();
  }
  else {
  $imgy = $this->y;
  }
  $cell_height = round(($this->cell_height_ratio * $headerfont[2]) / $this->k, 2);
  // set starting margin for text data cell
  if ($this->getRTL()) {
  $header_x = $this->original_rMargin + ($headerdata['logo_width'] * 1.1);
  }
  else {
  $header_x = $this->original_lMargin + ($headerdata['logo_width'] * 1.1);
  }
  $cw = $this->w - $this->original_lMargin - $this->original_rMargin - ($headerdata['logo_width'] * 1.1);
  $this->SetTextColor(0, 0, 0);
  // header title
  $this->SetFont($headerfont[0], 'B', $headerfont[2] + 1);
  $this->SetX($header_x);
  $this->Cell($cw, $cell_height, $headerdata['title'], 0, 1, '', 0, '', 0);
  // header string
  $this->SetFont($headerfont[0], $headerfont[1], $headerfont[2]);
  $this->SetX($header_x);
  $this->MultiCell($cw, $cell_height, $headerdata['string'], 0, '', 0, 1, '', '', true, 0, false);
  // print an ending header line
  //$this->SetLineStyle(array('width' => 0.85 / $this->k, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)));
  //$this->SetY((2.835 / $this->k) + max($imgy, $this->y));
  if ($this->rtl) {
  $this->SetX($this->original_rMargin);
  }
  else {
  $this->SetX($this->original_lMargin);
  }
  //$this->Cell(($this->w - $this->original_lMargin - $this->original_rMargin), 0, '', 'T', 0, 'C');
  $this->endTemplate();
  }
  // print header template
  $x = 0;
  $dx = 0;
  if ($this->booklet AND (($this->page % 2) == 0)) {
  // adjust margins for booklet mode
  $dx = ($this->original_lMargin - $this->original_rMargin);
  }
  if ($this->rtl) {
  $x = $this->w + $dx;
  }
  else {
  $x = 0 + $dx;
  }
  $this->printTemplate($this->header_xobjid, $x, 0, 0, 0, '', '', false);
  }
  }
  $pdf = new Custom_TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  // set document information
  $pdf->SetCreator(PDF_CREATOR);
  $pdf->SetAuthor('bus.lambdacomplex.org');
  $pdf->SetTitle($stop[1]);
  // set default header data
  $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, $stop[1] . " Timetable", "Some description of customization like Weekdays, 9am-10am");
  $pdf->set_QRCodeURL(curPageURL() . "stop.php?stopid=" . $_REQUEST['stopid']);
  // set header and footer fonts
  $pdf->setHeaderFont(Array(
  PDF_FONT_NAME_MAIN,
  '',
  PDF_FONT_SIZE_MAIN
  ));
  $pdf->setFooterFont(Array(
  PDF_FONT_NAME_DATA,
  '',
  PDF_FONT_SIZE_DATA
  ));
  // set default monospaced font
  $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  //set margins
  $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
  //set auto page breaks
  $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  //set image scale factor
  $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  //set some language-dependent strings
  $pdf->setLanguageArray($l);
  // ---------------------------------------------------------
  // set default font subsetting mode
  $pdf->setFontSubsetting(true);
  // Set font
  // dejavusans is a UTF-8 Unicode font, if you only need to
  // print standard ASCII chars, you can use core fonts like
  // helvetica or times to reduce file size.
  $pdf->SetFont('helvetica', '', 14, '', true);
  // Add a page
  // This method has several options, check the source code documentation for more information.
  $pdf->AddPage();
  // Print text using writeHTMLCell()
  $pdf->writeHTMLCell($w = 0, $h = 0, $x = '', $y = '', $html, $border = 0, $ln = 1, $fill = 0, $reseth = true, $align = '', $autopadding = true);
  // ---------------------------------------------------------
  // Close and output PDF document
  // This method has several options, check the source code documentation for more information.
  $pdf->Output('example_001.pdf', 'I');
  //============================================================+
  // END OF FILE
  //============================================================+
 
  ?>
 
  <?php
  include ('../include/common.inc.php');
  //Test code to grab transit times
  // make sure to sleep(10);
  $boundingBoxes = Array(
  "belconnen" => Array(
  "startlat" => - 35.1828,
  "startlon" => 149.0295,
  "finishlat" => - 35.2630,
  "finishlon" => 149.1045,
  ) ,
  "north gungahlin civic" =>