function loadGoogleMap() {
	if (GBrowserIsCompatible()) {
		gMap = new GMap2(document.getElementById('googleMap'));
		//gMap.addControl(new GSmallMapControl());
		gMap.setMapType(G_NORMAL_MAP);
		gMap.setUIToDefault();
		gMap.addMapType(G_HYBRID_MAP);
		//gMap.addControl(new GScaleControl());
		GEvent.addListener(gMap, 'load', function() {
			//gMgr = new GMarkerManager(gMap);
			var statusBox = document.getElementById('googleMapStatus');
			if (gMapMarkers.length > 0) {
				statusBox.innerHTML = 'Loading map markers, please wait....';
				setTimeout('processMarker(gMapMarkers[0])', markerInterval);
			} else {
				statusBox.innerHTML = '';
			}
			if (gMapLines.length > 0) {
				var polyLine;
				for (var i = 0; i < gMapLines.length; i++) {
					polyline = gMapLines[i];
					gMap.addOverlay(polyline);
				}
			}
		});
		gMap.setCenter(new GLatLng(googleMapLat, googleMapLng), googleMapZoom);
	}
}

function requestTimedOut() {
	if (gMapMarkersDone<gMapMarkers.length) {
			gMapMarkersDone++;
			setTimeout('processMarker(gMapMarkers[gMapMarkersDone])',markerInterval);
	} else {
		markersComplete();
	}
}

function markersComplete() {
	var statusBox = document.getElementById('googleMapStatus');
	GEvent.clearListeners(gMap,'load');
	//gMgr.refresh();
	if ((googleMapMinLat!=googleMapMaxLat) || (googleMapMinLng!=googleMapMaxLng)) {
		var markerBounds = new GLatLngBounds(new GLatLng(googleMapMinLat,googleMapMinLng),new GLatLng(googleMapMaxLat,googleMapMaxLng));
		//alert('maxlat:'+googleMapMaxLat+';maxlng:'+googleMapMaxLng+';minlat:'+googleMapMinLat+';minlng:'+googleMapMinLng);
		var centrePoint = markerBounds.getCenter();
		//alert('lat:'+centrePoint.lat()+';lng:'+centrePoint.lng());
		gMap.setCenter(centrePoint);
		var zoomLevel = gMap.getBoundsZoomLevel(markerBounds);
		gMap.setZoom(zoomLevel);
	} else {
		var centrePoint = new GLatLng(googleMapMinLat,googleMapMinLng);
		gMap.setCenter(centrePoint);
	}
	statusBox.innerHTML = '';
}

function processMarker(markerDef) {
	if ((markerDef.latitude=='') || (markerDef.longitude=='')) {
		//gMapMarkerTimer = setTimeout('requestTimedOut()',10000);
		gLocalSearch.execute(markerDef.postcode);
	} else {
		if ((markerDef.latitude>=googleMapLatLowerLimit) && (markerDef.latitude<=googleMapLatUpperLimit) && (markerDef.longitude>=googleMapLngLowerLimit) && (markerDef.longitude<=googleMapLngUpperLimit)) {
			placeMarkerOnMap(markerDef)
		}
		var statusBox = document.getElementById('googleMapStatus');
		statusBox.innerHTML = 'Loading map markers, loaded ' + (gMapMarkersDone+1) + ' of ' + gMapMarkers.length + ', please wait....';
		gMapMarkersDone++;
		if (gMapMarkersDone<gMapMarkers.length) {
			setTimeout('processMarker(gMapMarkers[gMapMarkersDone])',markerInterval);
		} else {
			statusBox.innerHTML = 'Finished loading markers, centering, please wait....';
			setTimeout('markersComplete()',markerInterval);
		}
	}
}

function placeMarkerOnMap(markerDef) {
	//if ((markerDef.latitude>googleMapLatLowerLimit) && (markerDef.latitude<googleMapLatUpperLimit) && (markerDef.longitude>googleMapLngLowerLimit) && (markerDef.longitude<googleMapLngUpperLimit)) {
		if (+markerDef.latitude>+googleMapMaxLat) {
			googleMapMaxLat = markerDef.latitude
		}
		if (+markerDef.latitude<+googleMapMinLat) {
			googleMapMinLat = markerDef.latitude
		}
		if (+markerDef.longitude>+googleMapMaxLng) {
			googleMapMaxLng = markerDef.longitude
		}
		if (+markerDef.longitude<+googleMapMinLng) {
			googleMapMinLng = markerDef.longitude
		}
		var point = new GLatLng(markerDef.latitude,markerDef.longitude);
		var marker = new GMarker(point,markerDef.icon);
		if ((markerDef.infoHTML!='') && (markerDef.bubbleAction!='')) {
			GEvent.addListener(marker, markerDef.bubbleAction, function() {
					marker.openInfoWindowHtml(markerDef.infoHTML);
			});
		}
		if ((markerDef.infoLink!='') && (markerDef.linkAction!='')) {
			GEvent.addListener(marker, markerDef.linkAction, function() {
					document.location.href = markerDef.infoLink;
			});
		}
		//gMgr.addMarker(marker,1);
		gMap.addOverlay(marker);
	//}
}

function onSearchReturn() {
	//clearTimeout(gMapMarkerTimer);
	var statusBox = document.getElementById('googleMapStatus');
	statusBox.innerHTML = 'Loading map markers, loaded ' + (gMapMarkersDone+1) + ' of ' + gMapMarkers.length + ', please wait....';
	if (gLocalSearch.results) {
		if (gLocalSearch.results.length>0) {
			for (var i = 0; i < gLocalSearch.results.length; i++) {
				if ((+gLocalSearch.results[i].lat>+googleMapLatLowerLimit) && (+gLocalSearch.results[i].lat<+googleMapLatUpperLimit) && (+gLocalSearch.results[i].lng>+googleMapLngLowerLimit) && (+gLocalSearch.results[i].lng<+googleMapLngUpperLimit)) {
					gMapMarkers[gMapMarkersDone].latitude = gLocalSearch.results[i].lat;
					gMapMarkers[gMapMarkersDone].longitude = gLocalSearch.results[i].lng;
					//var geoCodeBox = document.getElementById('geocodes');
					//geoCodeBox.value = geoCodeBox.value + gMapMarkers[gMapMarkersDone].postcode + ',' + gMapMarkers[gMapMarkersDone].latitude + ',' + gMapMarkers[gMapMarkersDone].longitude + '\n';
					placeMarkerOnMap(gMapMarkers[gMapMarkersDone]);
					break;
				}
			}
		}
	}
	gMapMarkersDone++;
	if (gMapMarkersDone<gMapMarkers.length) {
		setTimeout('processMarker(gMapMarkers[gMapMarkersDone])',markerInterval);
	} else {
		statusBox.innerHTML = 'Finished loading markers, centering, please wait....';
		setTimeout('markersComplete()',markerInterval);
	}
}

function markerDefn(postcode,latitude,longitude,info,iconName,infoLink,bubbleAction,linkAction,itemID,outputTo)
{
	this.postcode=postcode;
	this.latitude = latitude;
	this.longitude = longitude;
	this.infoHTML= info; 
	if (iconName!='') {
		this.icon=eval(iconName);
	}
	this.infoLink= infoLink;
	this.bubbleAction = bubbleAction;
	this.linkAction = linkAction;
	this.itemID = itemID;
	this.outputTo = outputTo;
}
