	var map; // GMap2 object
	var normGeo; // GClientGeocoder object
	var revGeo; // GReverseGeocoder object
	var localSearch; // GlocalSearch object
	var fieldGroup;

	function geocodeMap() {
		if (GBrowserIsCompatible()) {	
			map = new GMap2(document.getElementById("mapRevGeo"));
			map.setCenter(new GLatLng(52.220439,-0.917187), 15);
			
			normGeo = new GClientGeocoder();
			revGeo = new GReverseGeocoder(map); // Create Reverse Geocode object
			localSearch = new GlocalSearch();
			
			// Add listners for the reverse geocode results
			GEvent.addListener(revGeo, "load", goodGeoResult);
			GEvent.addListener(revGeo, "error", badGeoResult);
		}
	}
	
	function getGeocodeLatLng(address) {	
		alert(address);
		normGeo.getLatLng(
				address, 
				function(point) {
					if (!point) {
						alert(address + " not found");
					} else {
						reverseGeocoder(point);
					}
				}
			);
	}
	
	function usePointFromPostcode(postcode, group) {	
		if (postcode == '') {
			alert('Please Complete Postcode');
			return false;
		}
		fieldGroup = group;
		
		if (postcode != "") {
			localSearch.setSearchCompleteCallback(null,  
				function() {
					if (localSearch.results[0]) {		
						var resultLat = localSearch.results[0].lat;
						var resultLng = localSearch.results[0].lng;
						var point = new GLatLng(resultLat,resultLng);
						reverseGeocoder(point);
					} else {
						alert("Postcode not found!");
					}
				});	
			localSearch.execute(postcode + ", UK");
		}
	}
	
	// Called with a successful reverse geocode request
	function goodGeoResult(placemark) {		
		var address1 	= revGeo.getPlacemarkProperty(placemark, "ThoroughfareName");
		var town 		= revGeo.getPlacemarkProperty(placemark, "LocalityName");
		var county 		= revGeo.getPlacemarkProperty(placemark, "AdministrativeAreaName");
		var country 	= revGeo.getPlacemarkProperty(placemark, "CountryName");
		var postcodeObj = document.getElementById(fieldGroup + "personalPostcode");
		
		// Clean up the Google abbreviations
		lastTwoChars = address1.substring(address1.length-3);
		if (lastTwoChars == ' Rd') {
			address1 = address1.substring(0, address1.length-3) + ' Road';
		} else if (lastTwoChars == ' Dr') {
			address1 = address1.substring(0, address1.length-3) + ' Drive';
		} else if (lastTwoChars == ' St') {
			address1 = address1.substring(0, address1.length-3) + ' Street';
		} else if (lastTwoChars == ' Ln') {
			address1 = address1.substring(0, address1.length-3) + ' Lane';
		}
		
		document.getElementById(fieldGroup + "personalAddress1").value = address1;
		document.getElementById(fieldGroup + "personalTown").value = town;
		document.getElementById(fieldGroup + "personalCounty").value = county;
				
		postcodeObj.value = postcodeObj.value.toUpperCase();
		
		document.getElementById(fieldGroup + "personalCounty").value = county;
		collapseGeocode.slidedown();
	}
	
	// Called with a unsuccessful reverse geocode request
	function badGeoResult() {
		alert("Unable to reverse geocode");
	}
	
	// Fetch the placemark object for the point
	function reverseGeocoder(point) {
		revGeo.reverseGeocode(point);
	}
