More lax geolocation
--- a/common-template.inc.php
+++ b/common-template.inc.php
@@ -1,26 +1,28 @@
<?php
-function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false)
+function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false)
{
echo '
<!DOCTYPE html>
<html>
<head>
<title>' . $pageTitle . '</title>';
- 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>
<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" />
- <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>';
- if ($datepicker) echo '<script>
+ 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/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>';
+ echo '
+<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />
+ <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">
+ <script src="js/jQuery.ui.datepicker.js"></script>
+ <script src="js/jquery.ui.datepicker.mobile.js"></script>
+ <style type="text/css">
.ui-navbar {
width: 100%;
}
@@ -63,7 +65,12 @@
}
if (navigator.geolocation) {
- navigator.geolocation.getCurrentPosition(success, error);
+var options = {
+ enableHighAccuracy: false,
+ timeout: 60000,
+ maximumAge: 10000
+}
+ navigator.geolocation.getCurrentPosition(success, error, options);
}
</script> ";
@@ -71,6 +78,17 @@
echo '</head>
<body>
';
+ if (isMetricsOn()) {
+ require_once ('owa/owa_env.php');
+ require_once (OWA_DIR . 'owa_php.php');
+ $owa = new owa_php();
+ global $owaSiteID;
+ $owa->setSiteId($owaSiteID);
+ $owa->setPageTitle($pageTitle);
+ $owa->setPageType($pageType);
+ $owa->trackPageView();
+ $owa->placeHelperPageTags();
+ }
if ($opendiv) {
echo '<div data-role="page">
<script>
@@ -135,4 +153,3 @@
</div></div>';
}
?>
-
--- a/common.inc.php
+++ b/common.inc.php
@@ -4,6 +4,7 @@
$cloudmadeAPIkey = "daa03470bb8740298d4b10e3f03d63e6";
$googleMapsAPIkey = "ABQIAAAA95XYXN0cki3Yj_Sb71CFvBTPaLd08ONybQDjcH_VdYtHHLgZvRTw2INzI_m17_IoOUqH3RNNmlTk1Q";
$otpAPIurl = 'http://localhost:8080/opentripplanner-api-webapp/';
+$owaSiteID = 'fe5b819fa8c424a99ff0764d955d23f3';
//$debugOkay = Array("session","json","phperror","other");
$debugOkay = Array(
"session",
@@ -52,6 +53,22 @@
}
}
}
+ if ($_SESSION['lat'] != "" && isMetricsOn()) {
+ // Create a new Instance of the tracker
+ $owa = new owa_php($config);
+ // Set the ID of the site being tracked
+ $owa->setSiteId($owaSiteID);
+ // Create a new event object
+ $event = $owa->makeEvent();
+ // Set the Event Type, in this case a "video_play"
+ $event->setEventType('geolocate');
+ // Set a property
+ $event->set('lat', $_SESSION['lat']);
+ $event->set('lon', $_SESSION['lon']);
+ $event->set('geocoded', $geocoded);
+ // Track the event
+ $owa->trackEvent($event);
+ }
}
debug(print_r($_SESSION, true) , "session");
function isDebugServer()
@@ -62,6 +79,10 @@
{
global $debugOkay;
return in_array($debugReason, $debugOkay, false) && isDebugServer();
+}
+function isMetricsOn()
+{
+ return !isDebugServer();
}
function debug($msg, $debugReason = "other")
{
@@ -129,5 +150,33 @@
{
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;
+}
?>
Binary files a/css/images/113-navigation.png and b/css/images/113-navigation.png differ
--- a/css/jquery.ui.datepicker.mobile.css
+++ b/css/jquery.ui.datepicker.mobile.css
@@ -1,18 +1,30 @@
-div.hasDatepicker{display:block;padding:0;overflow:visible;margin:8px 0;}
-.ui-datepicker{overflow:visible;margin:0;max-width:500px;}
-.ui-datepicker .ui-datepicker-header{position:relative;padding:.4em 0;border-bottom:0;font-weight:bold;}
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next{padding:1px 0 1px 2px;position:absolute;top:.5em;margin-top:0;text-indent:-9999px;}
-.ui-datepicker .ui-datepicker-prev{left:6px;}
-.ui-datepicker .ui-datepicker-next{right:6px;}
-.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;}
-.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;}
-.ui-datepicker select.ui-datepicker-month-year{width:100%;}
-.ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year{width:49%;}
-.ui-datepicker table{width:100%;border-collapse:collapse;margin:0;}
-.ui-datepicker td{border-width:1px;padding:0;text-align:center;}
-.ui-datepicker td span, .ui-datepicker td a{display:block;padding:.2em 0;font-weight:bold;margin:0;border-width:0;text-align:center;text-decoration:none;}
-.ui-datepicker-calendar th{padding-top:.3em;padding-bottom:.3em;}
-.ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default{opacity:.3;}
-.ui-datepicker-calendar td a{padding-top:.5em;padding-bottom:.5em;}
-.min-width-480px div.hasDatepicker{width:63%;display:inline-block;margin:0;}
+/*
+ * jQuery UI Datepicker @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+div.hasDatepicker{ display: block; padding: 0; overflow: visible; margin: 8px 0; }
+.ui-datepicker { overflow: visible; margin: 0; max-width: 500px; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.4em 0; border-bottom: 0; font-weight: bold; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { padding: 1px 0 1px 2px; position:absolute; top: .5em; margin-top: 0; text-indent: -9999px; }
+.ui-datepicker .ui-datepicker-prev { left:6px; }
+.ui-datepicker .ui-datepicker-next { right:6px; }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; border-collapse: collapse; margin:0; }
+.ui-datepicker td { border-width: 1px; padding: 0; text-align: center; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em 0; font-weight: bold; margin: 0; border-width: 0; text-align: center; text-decoration: none; }
+
+.ui-datepicker-calendar th { padding-top: .3em; padding-bottom: .3em; }
+.ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default { opacity: .3; }
+.ui-datepicker-calendar td a { padding-top: .5em; padding-bottom: .5em; }
+
+.min-width-480px div.hasDatepicker { width: 63%; display: inline-block; margin: 0; }
--- a/index.php
+++ b/index.php
@@ -19,6 +19,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 class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li>
</ul>
<?php
--- a/js/jQuery.ui.datepicker.js
+++ b/js/jQuery.ui.datepicker.js
@@ -95,62 +95,4 @@
"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery);
-;/*
-* jQuery Mobile Framework : temporary extension to port jQuery UI's datepicker for mobile
-* Copyright (c) jQuery Project
-* Dual licensed under the MIT or GPL Version 2 licenses.
-* http://jquery.org/license
-*/
-(function($, undefined ) {
-
- //cache previous datepicker ui method
- var prevDp = $.fn.datepicker;
-
- //rewrite datepicker
- $.fn.datepicker = function( options ){
-
- var dp = this;
-
- //call cached datepicker plugin
- prevDp.call( this, options );
-
- //extend with some dom manipulation to update the markup for jQM
- //call immediately
- function updateDatepicker(){
- $( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
- $( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#");
- $( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true});
- $( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true});
- $( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c");
- $( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c");
- $( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false});
- $( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date
- $( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date
- $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
- var el = $(this);
- // remove extra button markup - necessary for date value to be interpreted correctly
- el.html( el.find( ".ui-btn-text" ).text() );
- });
- };
-
- //update now
- updateDatepicker();
-
- // and on click
- $( dp ).click( updateDatepicker );
-
- //return jqm obj
- return this;
- };
-
- //bind to pagecreate to automatically enhance date inputs
- $( ".ui-page" ).live( "pagecreate", function(){
- $( "#date, input[type='date'], input[data-type='date']" ).each(function(){
- if ($(this).hasClass("hasDatepicker") == false) {
- $(this).after( $( "<div />" ).datepicker({ altField: "#" + $(this).attr( "id" ), showOtherMonths: true }) );
- $(this).addClass("hasDatepicker");
- }
- });
- });
-})( jQuery );
-
+;
--- /dev/null
+++ b/js/jquery.ui.datepicker.mobile.js
@@ -1,1 +1,59 @@
+/*
+* jQuery Mobile Framework : temporary extension to port jQuery UI's datepicker for mobile
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+*/
+(function($, undefined ) {
+ //cache previous datepicker ui method
+ var prevDp = $.fn.datepicker;
+
+ //rewrite datepicker
+ $.fn.datepicker = function( options ){
+
+ var dp = this;
+
+ //call cached datepicker plugin
+ prevDp.call( this, options );
+
+ //extend with some dom manipulation to update the markup for jQM
+ //call immediately
+ function updateDatepicker(){
+ $( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
+ $( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#");
+ $( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true});
+ $( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true});
+ $( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c");
+ $( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c");
+ $( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false});
+ $( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date
+ $( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date
+ $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
+ var el = $(this);
+ // remove extra button markup - necessary for date value to be interpreted correctly
+ el.html( el.find( ".ui-btn-text" ).text() );
+ });
+ };
+
+ //update now
+ updateDatepicker();
+
+ // and on click
+ $( dp ).click( updateDatepicker );
+
+ //return jqm obj
+ return this;
+ };
+
+ //bind to pagecreate to automatically enhance date inputs
+ $( ".ui-page" ).live( "pagecreate", function(){
+ $( "#date, input[type='date'], input[data-type='date']" ).each(function(){
+ if ($(this).hasClass("hasDatepicker") == false) {
+ $(this).after( $( "<div />" ).datepicker({ altField: "#" + $(this).attr( "id" ), showOtherMonths: true }) );
+ $(this).addClass("hasDatepicker");
+ }
+ });
+ });
+})( jQuery );
+
--- a/mywaybalance.php
+++ b/mywaybalance.php
@@ -1,6 +1,6 @@
<?php
include ('common.inc.php');
-include_header("MyWay Balance", "mywayBalance", true, false, true);
+include_header("MyWay Balance", "mywayBalance");
$return = Array();
function printBalance($cardNumber, $date, $pwrd)
{
@@ -61,4 +61,3 @@
}
include_footer();
?>
-
--- /dev/null
+++ b/owa/Callbacks.inc
@@ -1,1 +1,10 @@
+<?php
+
+/**
+ * Gallery Template Callbacks class placeholder
+ * Needed for fake out the require_once() in Gallery's template class callback method
+ * See OWA Gallery module for the actual callback class
+ */
+
+?>
--- /dev/null
+++ b/owa/action.php
@@ -1,1 +1,48 @@
+<?php
+//
+// Open Web Analytics - An Open Source Web Analytics Framework
+//
+// Copyright 2006 Peter Adams. All rights reserved.
+//
+// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html
+//
+// 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.
+//
+// $Id$
+//
+
+include_once('owa_env.php');
+require_once(OWA_BASE_DIR.'/owa_php.php');
+
+/**
+ * Special HTTP Requests Controler
+ *
+ * @author Peter Adams <peter@openwebanalytics.com>
+ * @copyright Copyright © 2006 Peter Adams <peter@openwebanalytics.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0
+ * @category owa
+ * @package owa
+ * @version $Revision$
+ * @since owa 1.0.0
+ * @depricated
+ */
+
+$owa = new owa_php;
+
+$owa->e->debug('Special action request received by action.php...');
+
+if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) {
+
+ // run controller or view and echo page content
+ echo $owa->handleRequestFromURL();
+} else {
+ // unload owa
+ $owa->restInPeace();
+}
+
+?>
--- /dev/null
+++ b/owa/api.php
@@ -1,1 +1,49 @@
+<?php
+//
+// Open Web Analytics - An Open Source Web Analytics Framework
+//
+// Copyright 2006 Peter Adams. All rights reserved.
+//
+// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html
+//
+// 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.
+//
+// $Id$
+//
+
+include_once('owa_env.php');
+require_once(OWA_BASE_DIR.'/owa_php.php');
+
+/**
+ * REST API
+ *
+ * @author Peter Adams <peter@openwebanalytics.com>
+ * @copyright Copyright © 2010 Peter Adams <peter@openwebanalytics.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0
+ * @category owa
+ * @package owa
+ * @version $Revision$
+ * @since owa 1.3.0
+ * @link http://wiki.openwebanalytics.com/index.php?title=REST_API
+ */
+
+// define entry point cnstant
+define('OWA_API', true);
+// invoke OWA
+$owa = new owa_php;
+
+if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) {
+
+ // run api command and echo page content
+ echo $owa->handleRequest('', 'base.apiRequest');
+} else {
+ // unload owa
+ $owa->restInPeace();
+}
+
+?>
--- /dev/null
+++ b/owa/cli.php
@@ -1,1 +1,92 @@
+<?php
+//
+// Open Web Analytics - An Open Source Web Analytics Framework
+//
+// Copyright 2006 Peter Adams. All rights reserved.
+//
+// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html
+//
+// 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.
+//
+// $Id$
+//
+
+require_once('owa_env.php');
+require_once(OWA_DIR.'owa_php.php');
+require_once(OWA_BASE_CLASS_DIR.'cliController.php');
+
+/**
+ * OWA Comand Line Interface (CLI)
+ *
+ * @author Peter Adams <peter@openwebanalytics.com>
+ * @copyright Copyright © 2010 Peter Adams <peter@openwebanalytics.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0
+ * @category owa
+ * @package owa
+ * @version $Revision$
+ * @since owa 1.2.1
+ */
+
+define('OWA_CLI', true);
+
+if (!empty($_POST)) {
+ exit();
+} elseif (!empty($_GET)) {
+ exit();
+} elseif (!empty($argv)) {
+ $params = array();
+ // get params from the command line args
+ // $argv is a php super global variable
+
+ for ($i=1; $i<count($argv);$i++)
+ {
+ $it = split("=",$argv[$i]);
+ $params[$it[0]] = $it[1];
+ }
+ unset($params['action']);
+ unset($params['do']);
+
+} else {
+ // No params found
+ exit();
+}
+
+// Initialize owa
+$owa = &new owa_php;
+
+if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) {
+
+ // setting CLI mode to true
+ $owa->setSetting('base', 'cli_mode', true);
+ // setting user auth
+ $owa->setCurrentUser('admin', 'cli-user');
+ // run controller or view and echo page content
+ $s = owa_coreAPI::serviceSingleton();
+ $s->loadCliCommands();
+
+ if (array_key_exists('cmd', $params)) {
+
+ $cmd = $s->getCliCommandClass($params['cmd']);
+
+ if ($cmd) {
+ $params['do'] = $cmd;
+ echo $owa->handleRequest($params);
+ } else {
+ echo "Invalid command name.";
+ }
+
+ } else {
+ echo "Missing a command argument.";
+ }
+
+} else {
+ // unload owa
+ $owa->restInPeace();
+}
+
+?>
--- /dev/null
+++ b/owa/conf/countryCodes2Names.php
@@ -1,1 +1,253 @@
-
+<?php
+/**
+ * ISO-3166-1 http://en.wikipedia.org/wiki/ISO_3166-1
+ */
+$countryCode2Name = array (
+ 'AF' => 'Afghanistan',
+ 'AX' => 'Åland Islands',
+ 'AL' => 'Albania',
+ 'DZ' => 'Algeria',
+ 'AS' => 'American Samoa',
+ 'AD' => 'Andorra',
+ 'AO' => 'Angola',
+ 'AI' => 'Anguilla',
+ 'AQ' => 'Antarctica',
+ 'AG' => 'Antigua and Barbuda',
+ 'AR' => 'Argentina',
+ 'AM' => 'Armenia',
+ 'AW' => 'Aruba',
+ 'AU' => 'Australia',
+ 'AT' => 'Austria',
+ 'AZ' => 'Azerbaijan',
+ 'BS' => 'Bahamas',
+ 'BH' => 'Bahrain',
+ 'BD' => 'Bangladesh',
+ 'BB' => 'Barbados',
+ 'BY' => 'Belarus',
+ 'BE' => 'Belgium',
+ 'BZ' => 'Belize',
+ 'BJ' => 'Benin',
+ 'BM' => 'Bermuda',
+ 'BT' => 'Bhutan',
+ 'BO' => 'Bolivia, Plurinational State of',
+ 'BA' => 'Bosnia and Herzegovina',
+ 'BW' => 'Botswana',
+ 'BV' => 'Bouvet Island',
+ 'BR' => 'Brazil',
+ 'IO' => 'British Indian Ocean Territory',
+ 'BN' => 'Brunei Darussalam',
+ 'BG' => 'Bulgaria',
+ 'BF' => 'Burkina Faso',
+ 'BI' => 'Burundi',
+ 'KH' => 'Cambodia',
+ 'CM' => 'Cameroon',
+ 'CA' => 'Canada',
+ 'CV' => 'Cape Verde',
+ 'KY' => 'Cayman Islands',
+ 'CF' => 'Central African Republic',
+ 'TD' => 'Chad',
+ 'CL' => 'Chile',
+ 'CN' => 'China',
+ 'CX' => 'Christmas Island',
+ 'CC' => 'Cocos (Keeling) Islands',
+ 'CO' => 'Colombia',
+ 'KM' => 'Comoros',
+ 'CG' => 'Congo',
+ 'CD' => 'Congo, the Democratic Republic of the',
+ 'CK' => 'Cook Islands',
+ 'CR' => 'Costa Rica',
+ 'CI' => "Côte d'Ivoire",
+ 'HR' => 'Croatia',
+ 'CU' => 'Cuba',
+ 'CY' => 'Cyprus',
+ 'CZ' => 'Czech Republic',
+ 'DK' => 'Denmark',
+ 'DJ' => 'Djibouti',
+ 'DM' => 'Dominica',
+ 'DO' => 'Dominican Republic',
+ 'EC' => 'Ecuador',
+ 'EG' => 'Egypt',
+ 'SV' => 'El Salvador',
+ 'GQ' => 'Equatorial Guinea',
+ 'ER' => 'Eritrea',
+ 'EE' => 'Estonia',
+ 'ET' => 'Ethiopia',
+ 'FK' => 'Falkland Islands (Malvinas)',
+ 'FO' => 'Faroe Islands',
+ 'FJ' => 'Fiji',
+ 'FI' => 'Finland',
+ 'FR' => 'France',
+ 'GF' => 'French Guiana',
+ 'PF' => 'French Polynesia',
+ 'TF' => 'French Southern Territories',
+ 'GA' => 'Gabon',
+ 'GM' => 'Gambia',
+ 'GE' => 'Georgia',
+ 'DE' => 'Germany',
+ 'GH' => 'Ghana',
+ 'GI' => 'Gibraltar',
+ 'GR' => 'Greece',
+ 'GL' => 'Greenland',
+ 'GD' => 'Grenada',
+ 'GP' => 'Guadeloupe',
+ 'GU' => 'Guam',
+ 'GT' => 'Guatemala',
+ 'GG' => 'Guernsey',
+ 'GN' => 'Guinea',
+ 'GW' => 'Guinea-Bissau',
+ 'GY' => 'Guyana',
+ 'HT' => 'Haiti',
+ 'HM' => 'Heard Island and McDonald Islands',
+ 'VA' => 'Holy See (Vatican City State)',
+ 'HN' => 'Honduras',
+ 'HK' => 'Hong Kong',
+ 'HU' => 'Hungary',
+ 'IS' => 'Iceland',
+ 'IN' => 'India',
+ 'ID' => 'Indonesia',
+ 'IR' => 'Iran, Islamic Republic of',
+ 'IQ' => 'Iraq',
+ 'IE' => 'Ireland',
+ 'IM' => 'Isle of Man',
+ 'IL' => 'Israel',
+ 'IT' => 'Italy',
+ 'JM' => 'Jamaica',
+ 'JP' => 'Japan',
+ 'JE' => 'Jersey',
+ 'JO' => 'Jordan',
+ 'KZ' => 'Kazakhstan',
+ 'KE' => 'Kenya',
+ 'KI' => 'Kiribati',
+ 'KP' => "Korea, Democratic People's Republic of",
+ 'KR' => 'Korea, Republic of',
+ 'KW' => 'Kuwait',
+ 'KG' => 'Kyrgyzstan',
+ 'LA' => "Lao People's Democratic Republic",
+ 'LV' => 'Latvia',
+ 'LB' => 'Lebanon',
+ 'LS' => 'Lesotho',
+ 'LR' => 'Liberia',
+ 'LY' => 'Libyan Arab Jamahiriya',
+ 'LI' => 'Liechtenstein',
+ 'LT' => 'Lithuania',
+ 'LU' => 'Luxembourg',
+ 'MO' => 'Macao',
+ 'MK' => 'Macedonia, the former Yugoslav Republic of',
+ 'MG' => 'Madagascar',
+ 'MW' => 'Malawi',
+ 'MY' => 'Malaysia',
+ 'MV' => 'Maldives',
+ 'ML' => 'Mali',
+ 'MT' => 'Malta',
+ 'MH' => 'Marshall Islands',
+ 'MQ' => 'Martinique',
+ 'MR' => 'Mauritania',
+ 'MU' => 'Mauritius',
+ 'YT' => 'Mayotte',
+ 'MX' => 'Mexico',
+ 'FM' => 'Micronesia, Federated States of',
+ 'MD' => 'Moldova, Republic of',
+ 'MC' => 'Monaco',
+ 'MN' => 'Mongolia',
+ 'ME' => 'Montenegro',
+ 'MS' => 'Montserrat',
+ 'MA' => 'Morocco',
+ 'MZ' => 'Mozambique',
+ 'MM' => 'Myanmar',
+ 'NA' => 'Namibia',
+ 'NR' => 'Nauru',
+ 'NP' => 'Nepal',
+ 'NL' => 'Netherlands',
+ 'AN' => 'Netherlands Antilles',
+ 'NC' => 'New Caledonia',
+ 'NZ' => 'New Zealand',
+ 'NI' => 'Nicaragua',
+ 'NE' => 'Niger',
+ 'NG' => 'Nigeria',
+ 'NU' => 'Niue',
+ 'NF' => 'Norfolk Island',
+ 'MP' =>