Add Google Analytics for Mobile
Add Google Analytics for Mobile

<?php <?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("&", "&amp;", $url);
  }
   
function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false) function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false)
{ {
echo ' echo '
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>' . $pageTitle . '</title>'; <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 ($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" /> 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.min.css" /> else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script> <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js"></script>'; <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js"></script>';
if ($datepicker) echo '<script> if ($datepicker) echo '<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>';
echo '<style type="text/css"> echo '<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;
} }
#jqm-homeheader { #jqm-homeheader {
text-align: center; text-align: center;
} }
// source http://webaim.org/techniques/skipnav/ // source http://webaim.org/techniques/skipnav/
#skip a, #skip a:hover, #skip a:visited #skip a, #skip a:hover, #skip a:visited
{ {
position:absolute; position:absolute;
left:0px; left:0px;
top:-500px; top:-500px;
width:1px; width:1px;
height:1px; height:1px;
overflow:hidden; overflow:hidden;
} }
   
#skip a:active, #skip a:focus #skip a:active, #skip a:focus
{ {
position:static; position:static;
width:auto; width:auto;
height:auto; height:auto;
} }
</style>'; </style>';
if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod')) { if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod')) {
echo '<meta name="apple-mobile-web-app-capable" content="yes" /> echo '<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) {
var options = { var options = {
enableHighAccuracy: false, enableHighAccuracy: false,
timeout: 60000, timeout: 60000,
maximumAge: 10000 maximumAge: 10000
} }
navigator.geolocation.getCurrentPosition(success, error, options); navigator.geolocation.getCurrentPosition(success, error, options);
} }
   
</script> "; </script> ";
} }
echo '</head> echo '</head>
<body> <body>
<div id="skip"> <div id="skip">
<a href="#maincontent">Skip to content</a> <a href="#maincontent">Skip to content</a>
</div> </div>
'; ';
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 -->
<a name="maincontent" id="maincontent"></a> <a name="maincontent" id="maincontent"></a>
<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>';
  if (!isDebug()) {
  $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl();
  echo '<img src="' . $googleAnalyticsImageUrl . '" />';
  }
} }
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 (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...</h3> <h3>Change Time/Place (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...</h3>
<form action="'.basename($_SERVER['PHP_SELF']).'" method="post"> <form action="'.basename($_SERVER['PHP_SELF']).'" 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" id="service_period">'; <select name="service_period" id="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>';
} }
?> ?>
   
file:b/ga.php (new)
  <?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=" .