function centerTo(oMap, sCenLat, sCenLng) {
	var oCenterTo = new google.maps.LatLng(sCenLat, sCenLng);
	oMap.setCenter(oCenterTo);
}

function searchAddr(oMap, sAddress) {
	var oGeocoder = new google.maps.ClientGeocoder();

	oGeocoder.setBaseCountryCode('NZ');
	oGeocoder.getLocations(sAddress, function(response) {
		if (!response || response.Status.code != 200) {
			// TODO: Clean error message
		} else {
			var place = response.Placemark[0];
			var sGeoLat = place.Point.coordinates[1];
			var sGeoLng = place.Point.coordinates[0];

			centerTo(oMap, sGeoLat, sGeoLng);
		}
	});
}

function showInfoWindow(oMap, latlng, str) {
	oMap.openInfoWindowHtml(latlng, str, { maxWidth: 250 });
}

function loadMap() {
	var oConfig = gMapConfig;
	
	var oMap = new google.maps.Map2(document.getElementById(oConfig.mapId));
	var oCenter = new google.maps.LatLng(oConfig.centerLat, oConfig.centerLong);
	var oMarker = new google.maps.Marker(oCenter);

	switch(oConfig.mapType) {
		case 'Satellite':
			oMap.setMapType(G_SATELLITE_MAP);
			break;
			
		case 'Hybrid':
			oMap.setMapType(G_HYBRID_MAP);
			break;
			
		case 'Terrain':
			oMap.setMapType(G_PHYSICAL_MAP);
			break;

		default:
			oMap.setMapType(G_NORMAL_MAP);
			break;
	}
	
	oMap.setCenter(oCenter);
	oMap.setZoom(oConfig.zoomLevel);
	oMap.disableDoubleClickZoom();
	oMap.enableScrollWheelZoom();
	oMap.addControl(new google.maps.SmallZoomControl3D());
	oMap.addControl(new google.maps.MapTypeControl());
	oMap.addOverlay(oMarker);

	var sInfo = oConfig.infoWindowHtml;
	if (sInfo.length > 0) {
		showInfoWindow(oMap, oCenter, sInfo);
		google.maps.Event.addListener(oMarker, 'click', function() {
			showInfoWindow(oMap, oCenter, sInfo);
		});
	}

	oSearch = document.getElementById('GSearchAddress');
	oSearchButton = document.getElementById('GSearchAddressButton');
	if (oSearch) {
		google.maps.Event.addDomListener(oSearchButton , 'click', function() {
			searchAddr(oMap, oSearch.value);
		});
		google.maps.Event.addListener(oMap, 'moveend', function() {
			var sCenter = oMap.getCenter().toString();
			var sZoom = oMap.getZoom().toString();
			document.getElementById('GMapDebug').innerHTML = 'Map Center: ' + sCenter + '<br />' + 'Zoom Level: ' + sZoom;
        });
	}
}

function initMaps() {
	google.load('maps', '2', {"callback": loadMap});
}

function initGoogle(apiKey, callback) {
	var script = document.createElement('script');
	script.src = 'http://www.google.com/jsapi?key=' + apiKey + '&callback=' + callback;
	script.type = 'text/javascript';
	document.getElementsByTagName('head')[0].appendChild(script);
}

initGoogle(gApiKey, 'initMaps');