Last active
August 29, 2015 14:17
-
-
Save josephabrahams/7206f0854906131867e6 to your computer and use it in GitHub Desktop.
Use browser geolocation and the Google Maps API to auto-select your current country from a dropdown menu.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<title>Where am I?</title> | |
<h1>Where am I?</h1> | |
<select id="countries" name="countries"> | |
<option selected>----------</option> | |
<option value="AF">Afghanistan</option> | |
<option value="AL">Albania</option> | |
<option value="DZ">Algeria</option> | |
<option value="AS">American Samoa</option> | |
<option value="AD">Andorra</option> | |
<option value="AO">Angola</option> | |
<option value="AI">Anguilla</option> | |
<option value="AQ">Antarctica</option> | |
<option value="AG">Antigua & Barbuda</option> | |
<option value="AR">Argentina</option> | |
<option value="AM">Armenia</option> | |
<option value="AW">Aruba</option> | |
<option value="AC">Ascension Island</option> | |
<option value="AU">Australia</option> | |
<option value="AT">Austria</option> | |
<option value="AZ">Azerbaijan</option> | |
<option value="BS">Bahamas</option> | |
<option value="BH">Bahrain</option> | |
<option value="BD">Bangladesh</option> | |
<option value="BB">Barbados</option> | |
<option value="BY">Belarus</option> | |
<option value="BE">Belgium</option> | |
<option value="BZ">Belize</option> | |
<option value="BJ">Benin</option> | |
<option value="BM">Bermuda</option> | |
<option value="BT">Bhutan</option> | |
<option value="BO">Bolivia</option> | |
<option value="BA">Bosnia & Herzegovina</option> | |
<option value="BW">Botswana</option> | |
<option value="BV">Bouvet Island</option> | |
<option value="BR">Brazil</option> | |
<option value="IO">British Indian Ocean Territory</option> | |
<option value="VG">British Virgin Islands</option> | |
<option value="BN">Brunei</option> | |
<option value="BG">Bulgaria</option> | |
<option value="BF">Burkina Faso</option> | |
<option value="BI">Burundi</option> | |
<option value="KH">Cambodia</option> | |
<option value="CM">Cameroon</option> | |
<option value="CA">Canada</option> | |
<option value="IC">Canary Islands</option> | |
<option value="CV">Cape Verde</option> | |
<option value="BQ">Caribbean Netherlands</option> | |
<option value="KY">Cayman Islands</option> | |
<option value="CF">Central African Republic</option> | |
<option value="EA">Ceuta & Melilla</option> | |
<option value="TD">Chad</option> | |
<option value="CL">Chile</option> | |
<option value="CN">China</option> | |
<option value="CX">Christmas Island</option> | |
<option value="CP">Clipperton Island</option> | |
<option value="CC">Cocos (Keeling) Islands</option> | |
<option value="CO">Colombia</option> | |
<option value="KM">Comoros</option> | |
<option value="CD">Congo (DRC)</option> | |
<option value="CG">Congo (Republic)</option> | |
<option value="CK">Cook Islands</option> | |
<option value="CR">Costa Rica</option> | |
<option value="HR">Croatia</option> | |
<option value="CU">Cuba</option> | |
<option value="CW">Curçao</option> | |
<option value="CY">Cyprus</option> | |
<option value="CZ">Czech Republic</option> | |
<option value="CI">Côte d’Ivoire</option> | |
<option value="DK">Denmark</option> | |
<option value="DG">Diego Garcia</option> | |
<option value="DJ">Djibouti</option> | |
<option value="DM">Dominica</option> | |
<option value="DO">Dominican Republic</option> | |
<option value="EC">Ecuador</option> | |
<option value="EG">Egypt</option> | |
<option value="SV">El Salvador</option> | |
<option value="GQ">Equatorial Guinea</option> | |
<option value="ER">Eritrea</option> | |
<option value="EE">Estonia</option> | |
<option value="ET">Ethiopia</option> | |
<option value="FK">Falkland Islands (Islas Malvinas)</option> | |
<option value="FO">Faroe Islands</option> | |
<option value="FJ">Fiji</option> | |
<option value="FI">Finland</option> | |
<option value="FR">France</option> | |
<option value="GF">French Guiana</option> | |
<option value="PF">French Polynesia</option> | |
<option value="TF">French Southern Territories</option> | |
<option value="GA">Gabon</option> | |
<option value="GM">Gambia</option> | |
<option value="GE">Georgia</option> | |
<option value="DE">Germany</option> | |
<option value="GH">Ghana</option> | |
<option value="GI">Gibraltar</option> | |
<option value="GR">Greece</option> | |
<option value="GL">Greenland</option> | |
<option value="GD">Grenada</option> | |
<option value="GP">Guadeloupe</option> | |
<option value="GU">Guam</option> | |
<option value="GT">Guatemala</option> | |
<option value="GG">Guernsey</option> | |
<option value="GN">Guinea</option> | |
<option value="GW">Guinea-Bissau</option> | |
<option value="GY">Guyana</option> | |
<option value="HT">Haiti</option> | |
<option value="HM">Heard & McDonald Islands</option> | |
<option value="HN">Honduras</option> | |
<option value="HK">Hong Kong</option> | |
<option value="HU">Hungary</option> | |
<option value="IS">Iceland</option> | |
<option value="IN">India</option> | |
<option value="ID">Indonesia</option> | |
<option value="IR">Iran</option> | |
<option value="IQ">Iraq</option> | |
<option value="IE">Ireland</option> | |
<option value="IM">Isle of Man</option> | |
<option value="IL">Israel</option> | |
<option value="IT">Italy</option> | |
<option value="JM">Jamaica</option> | |
<option value="JP">Japan</option> | |
<option value="JE">Jersey</option> | |
<option value="JO">Jordan</option> | |
<option value="KZ">Kazakhstan</option> | |
<option value="KE">Kenya</option> | |
<option value="KI">Kiribati</option> | |
<option value="XK">Kosovo</option> | |
<option value="KW">Kuwait</option> | |
<option value="KG">Kyrgyzstan</option> | |
<option value="LA">Laos</option> | |
<option value="LV">Latvia</option> | |
<option value="LB">Lebanon</option> | |
<option value="LS">Lesotho</option> | |
<option value="LR">Liberia</option> | |
<option value="LY">Libya</option> | |
<option value="LI">Liechtenstein</option> | |
<option value="LT">Lithuania</option> | |
<option value="LU">Luxembourg</option> | |
<option value="MO">Macau</option> | |
<option value="MK">Macedonia (FYROM)</option> | |
<option value="MG">Madagascar</option> | |
<option value="MW">Malawi</option> | |
<option value="MY">Malaysia</option> | |
<option value="MV">Maldives</option> | |
<option value="ML">Mali</option> | |
<option value="MT">Malta</option> | |
<option value="MH">Marshall Islands</option> | |
<option value="MQ">Martinique</option> | |
<option value="MR">Mauritania</option> | |
<option value="MU">Mauritius</option> | |
<option value="YT">Mayotte</option> | |
<option value="MX">Mexico</option> | |
<option value="FM">Micronesia</option> | |
<option value="MD">Moldova</option> | |
<option value="MC">Monaco</option> | |
<option value="MN">Mongolia</option> | |
<option value="ME">Montenegro</option> | |
<option value="MS">Montserrat</option> | |
<option value="MA">Morocco</option> | |
<option value="MZ">Mozambique</option> | |
<option value="MM">Myanmar (Burma)</option> | |
<option value="NA">Namibia</option> | |
<option value="NR">Nauru</option> | |
<option value="NP">Nepal</option> | |
<option value="NL">Netherlands</option> | |
<option value="NC">New Caledonia</option> | |
<option value="NZ">New Zealand</option> | |
<option value="NI">Nicaragua</option> | |
<option value="NE">Niger</option> | |
<option value="NG">Nigeria</option> | |
<option value="NU">Niue</option> | |
<option value="NF">Norfolk Island</option> | |
<option value="KP">North Korea</option> | |
<option value="MP">Northern Mariana Islands</option> | |
<option value="NO">Norway</option> | |
<option value="OM">Oman</option> | |
<option value="PK">Pakistan</option> | |
<option value="PW">Palau</option> | |
<option value="PS">Palestine</option> | |
<option value="PA">Panama</option> | |
<option value="PG">Papua New Guinea</option> | |
<option value="PY">Paraguay</option> | |
<option value="PE">Peru</option> | |
<option value="PH">Philippines</option> | |
<option value="PN">Pitcairn Islands</option> | |
<option value="PL">Poland</option> | |
<option value="PT">Portugal</option> | |
<option value="PR">Puerto Rico</option> | |
<option value="QA">Qatar</option> | |
<option value="RO">Romania</option> | |
<option value="RU">Russia</option> | |
<option value="RW">Rwanda</option> | |
<option value="RE">Réunion</option> | |
<option value="WS">Samoa</option> | |
<option value="SM">San Marino</option> | |
<option value="SA">Saudi Arabia</option> | |
<option value="SN">Senegal</option> | |
<option value="RS">Serbia</option> | |
<option value="SC">Seychelles</option> | |
<option value="SL">Sierra Leone</option> | |
<option value="SG">Singapore</option> | |
<option value="SX">Sint Maarten</option> | |
<option value="SK">Slovakia</option> | |
<option value="SI">Slovenia</option> | |
<option value="SB">Solomon Islands</option> | |
<option value="SO">Somalia</option> | |
<option value="ZA">South Africa</option> | |
<option value="GS">South Georgia & South Sandwich Islands</option> | |
<option value="KR">South Korea</option> | |
<option value="SS">South Sudan</option> | |
<option value="ES">Spain</option> | |
<option value="LK">Sri Lanka</option> | |
<option value="BL">St. Barthélemy</option> | |
<option value="SH">St. Helena</option> | |
<option value="KN">St. Kitts & Nevis</option> | |
<option value="LC">St. Lucia</option> | |
<option value="MF">St. Martin</option> | |
<option value="PM">St. Pierre & Miquelon</option> | |
<option value="VC">St. Vincent & Grenadines</option> | |
<option value="SD">Sudan</option> | |
<option value="SR">Suriname</option> | |
<option value="SJ">Svalbard & Jan Mayen</option> | |
<option value="SZ">Swaziland</option> | |
<option value="SE">Sweden</option> | |
<option value="CH">Switzerland</option> | |
<option value="SY">Syria</option> | |
<option value="ST">São Tomé & Príncipe</option> | |
<option value="TW">Taiwan</option> | |
<option value="TJ">Tajikistan</option> | |
<option value="TZ">Tanzania</option> | |
<option value="TH">Thailand</option> | |
<option value="TL">Timor-Leste</option> | |
<option value="TG">Togo</option> | |
<option value="TK">Tokelau</option> | |
<option value="TO">Tonga</option> | |
<option value="TT">Trinidad & Tobago</option> | |
<option value="TA">Tristan da Cunha</option> | |
<option value="TN">Tunisia</option> | |
<option value="TR">Turkey</option> | |
<option value="TM">Turkmenistan</option> | |
<option value="TC">Turks & Caicos Islands</option> | |
<option value="TV">Tuvalu</option> | |
<option value="UM">U.S. Outlying Islands</option> | |
<option value="VI">U.S. Virgin Islands</option> | |
<option value="UG">Uganda</option> | |
<option value="UA">Ukraine</option> | |
<option value="AE">United Arab Emirates</option> | |
<option value="US">United States</option> | |
<option value="GB">United Kingdom</option> | |
<option value="UY">Uruguay</option> | |
<option value="UZ">Uzbekistan</option> | |
<option value="VU">Vanuatu</option> | |
<option value="VA">Vatican City</option> | |
<option value="VE">Venezuela</option> | |
<option value="VN">Vietnam</option> | |
<option value="WF">Wallis & Futuna</option> | |
<option value="EH">Western Sahara</option> | |
<option value="YE">Yemen</option> | |
<option value="ZM">Zambia</option> | |
<option value="ZW">Zimbabwe</option> | |
<option value="AX">Åland Islands</option> | |
</select> | |
<script> | |
(function() { | |
'use strict'; | |
// jshint -W106 | |
var countries = document.getElementById('countries'); | |
// check if geolocation is available | |
// if so run getCountry | |
function whereAmI() { | |
if ('geolocation' in navigator) { // see Modernizr.geolocation | |
navigator.geolocation.getCurrentPosition(getCountry, function() { | |
console.log('Error getting geolocation.'); | |
}); | |
} else { | |
console.log('Geolocation not available.'); | |
} | |
} | |
// make request to Google Maps API with current location | |
// select country in dropdown if found | |
function getCountry(position) { | |
var lat = position.coords.latitude; | |
var lng = position.coords.longitude; | |
var requestUrl = '//maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + lng; | |
var request = new XMLHttpRequest(); | |
request.open('GET', requestUrl, true); | |
request.onload = function() { | |
if (request.status >= 200 && request.status < 400) { | |
// Success! | |
var data; | |
// make sure response is valid JSON | |
try { | |
data = JSON.parse(request.responseText); | |
} catch(e) { | |
console.log('Error parsing response.'); | |
console.log(e); | |
return; | |
} | |
if (data.status === 'OK') { | |
// get first result | |
var result = data.results.slice(-1).pop(); | |
// get country name and code | |
var country = findCountryName(result.address_components); | |
// set country code in dropdown | |
if (country) { | |
// console.log(country); | |
selectCountry(country.code); | |
} else { | |
console.log('Country not found in result.'); | |
} | |
// } else if (data.status === 'ZERO_RESULTS') { | |
// console.log('No results found.'); | |
} else if ('error_message' in data) { | |
console.log(data.error_message); | |
} else { | |
console.log('Error: ' + data.status); | |
} | |
} else { | |
console.log('We reached our target server, but it returned an error.'); | |
} | |
}; | |
request.onerror = function() { | |
console.log('There was a connection error of some sort.'); | |
}; | |
request.send(); | |
} | |
// parse address_components in Google Maps response | |
// address_components are ordered most to least specific | |
// searching backwards finds country faster | |
function findCountryName(addressComponents) { | |
for (var i = addressComponents.length - 1; i >= 0; i--) { | |
if (addressComponents[i].types[0] === 'country') { | |
return { | |
// jshint -W106 | |
code: addressComponents[i].short_name, | |
name: addressComponents[i].long_name | |
}; | |
} | |
} | |
return false; | |
} | |
// loop thru all options in dropdown and set | |
// to country if country code matches value | |
function selectCountry(countryCode) { | |
for (var i = 0; i < countries.length; i++) { | |
if (countries[i].value === countryCode) { | |
countries[i].selected = true; | |
return; | |
} | |
} | |
console.log('Country code not found in list'); | |
} | |
whereAmI(); | |
})(); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://developers.google.com/maps/coverage