// Google Maps functonality, register multiple Markers and load multiple Google Maps

	var markers = new Array; // stores the marker objects
	var markersLatLonDesc = new Array(); // stores the lat and long values for markers
	var mapLoadState = new Array(); // keeps the map loading state (in case the user cancels)
	var maps = new Array; // stores the map objects

	/** creates and registers a marker object in the markers array */
	function registerMarker(lat,lon,name,timeofday) {
		markersLatLonDesc.push(new Array(lat,lon,name,timeofday));
		mapLoadState.push(1);
	}
	
	function doMarkers() {
		if(markers.length==0) {
			for (var i=0; i<markersLatLonDesc.length; i++) {
				var point = new GLatLng(markersLatLonDesc[i][0],markersLatLonDesc[i][1]);
				var marker = new createMarker(markersLatLonDesc[i][2], point, getInfoWindowHTML(markersLatLonDesc[i][2],markersLatLonDesc[i][3]));
				markers.push(marker); // register the marker object
			}
		}
	}

	function timeMarkersZIndex(marker,b) {
		return 10000;
	}

	/** never called externally. create a marker object */
	function createMarker(markertitle,point,html) {

	    var markerOptions = { draggable:true, title:markertitle, zIndexProcess:timeMarkersZIndex };		
		var marker = new GMarker(point,markerOptions);
		GEvent.addListener(marker,"click", function() {
			marker.openInfoWindowHtml("Drag me to re-position");
		}); 
                GEvent.addListener(marker,"dragend", function(position) {
                        //marker.opacity = 60;
                          // round lat and long...
                          var floatlat = Math.round(position.lat()*100)/100;
                          var floatlng = Math.round(position.lng()*100)/100;
                          marker.openInfoWindowHtml("<a href=\"/dotime/" + floatlat + "," + floatlng + "\">View Current Time</a>");
                });

		// register eventListener...
		return marker;		
	}

	/** creates a new marker object, removes existing marker from all maps, adds new marker to all maps */
	function updateMarker(markerId,timeofday) {
		markersLatLonDesc[markerId][3] = timeofday;
		if(markers.length<=i+1) {
			for (var i=0; i<markers.length; i++){ // update for each map object
				var point = new GLatLng(markersLatLonDesc[markerId][0],markersLatLonDesc[markerId][1]);
				var marker = new createMarker(markersLatLonDesc[markerId][2], point, getInfoWindowHTML(markersLatLonDesc[markerId][2],markersLatLonDesc[markerId][3]));
				if(maps.length>=i+1) maps[i].removeOverlay(markers[markerId]);
				markers[markerId] = marker;
				if(maps.length>=i+1) maps[i].addOverlay(markers[markerId]); // update marker on map, but only if map exists
			}
		}
	}

	/** formats the content to set up in the maps */
	function getInfoWindowHTML(name, timeofday) {
		var html = '<strong>' + name + '</strong><br />' + timeofday;
		return html;
	}

	/** if s user wants to cancel a map loading then this is called */
	function cancelMap(id) {
			mapLoadState[id] = 0;
			// update the display
			var map = document.getElementById('map' + id);
			if (navigator.appVersion.indexOf("MSIE")==-1) {
				map.setAttribute('class', 'mapCancelled');
			} else {
				map.setAttribute('className', 'mapCancelled');
			}
			map.innerHTML = "<img src=\"/images/stopmap.gif\" width=\"16\" height=\"24\" alt=\"Map Loading Cancelled\" /> Map Loading Cancelled <a href=\"javascript:loadMap(" + id + ")\">Load Map</a>";
	}

	/** if s user wants to cancel a map loading then this is called */
	function loadMap(id) {
			mapLoadState[id] = 1;
			// update the display
			var map = document.getElementById('map' + id);
			if (navigator.appVersion.indexOf("MSIE")==-1) {
				map.setAttribute('class', 'map');
			} else {
				map.setAttribute('className', 'map');
			}
			
			map.innerHTML = "<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><img src=\"/images/loading.gif\" width=\"32\" height=\"32\" alt=\"Loading Map\" /><br /><br /><font size=\"-1\"><strong>Loading Map...</strong></font><br /><br /><a href=\"javascript:cancelMap(" + id + ")\">cancel</a>";
			// perform map loading
			renderMap(id);
	}

	/** stop all maps from loading */
	function cancelAllMaps() {
		for (var i=0; i<mapLoadState.length; i++) {
			cancelMap(i);
		}
	}

function findIndex(array, value){
var ctr = "";
for (var i=0; i < array.length; i++) {
// use === to check for Matches. ie., identical (===), ;
if (array[i] == value) {
return i;
}
}
return ctr;
};

	function renderMap(id) {
		var map = new GMap2(document.getElementById('map' + id));
		map.setCenter(new GLatLng(markersLatLonDesc[id][0],markersLatLonDesc[id][1]), 5);
		map.enableContinuousZoom();
		map.enableDoubleClickZoom();
		//map.enableScrollWheelZoom();
		map.addControl(new GLargeMapControl());
		map.addMapType(G_PHYSICAL_MAP);
		map.addControl(new GHierarchicalMapTypeControl());
		keyboardhandler = new GKeyboardHandler(map);				
		map.setMapType(G_HYBRID_MAP);
		map.addControl(new GOverviewMapControl(new GSize(160,100)));
		for (var i=0; i<markers.length; i++){ // add each marker to each map
                GEvent.addListener(markers[i],"dragstart", function(position) {
                  map.closeInfoWindow();
		  // ...drop a marker in the previous position on each map
		  // ...only drop marker if it is the original point!
		  for (var j=0; j<markersLatLonDesc.length; j++) {
	                if (position.lat() == markersLatLonDesc[j][0] && position.lng() == markersLatLonDesc[j][1]) {
		  	  for (var k=0; k<maps.length; k++) {
		  		  var oldPoint = new GLatLng(position.lat(), position.lng());
		                  var oldMarkerOptions = { draggable:false, zIndexProcess:timeMarkersZIndex };
				  var oldMarker = new GMarker(oldPoint, oldMarkerOptions);
		                  maps[k].addOverlay(oldMarker);
			  }
			break;
			}
		  }
	        });
			map.addOverlay(markers[i]);
		}
		// GGEOXML
		var kml = new GGeoXml("http://worldtimeengine.com/maps/weather_overlay.php?ip=" + ipAddress); // add the weather overlay
		map.addOverlay(kml);
		maps.push(map); // register map object		
	}

	/** render all of the maps */
	function initialiseMaps() {	
		// Google Maps loaded successfully?
		if(typeof(GBrowserIsCompatible)!="function") return;
		if (GBrowserIsCompatible() && markersLatLonDesc.length>0) {
			doMarkers(); // load in the markers
			for (var i=0; i<markers.length; i++){ // for each map
				// did the user cancel map loading for this map?
				if(mapLoadState[i]==1) {
					renderMap(i);
				}
			}
		}
	}

Event.observe(window, 'load', initialiseMaps);
