function reset() {
	 		setStartingZoomLevel();
	 		
	 		for(var i=0; i<locationMarkers.length; i++) {
	 			map.removeOverlay(locationMarkers[i]);
	 		}
	 		zoomedIn = false;
	 	}
	 
	 	function setStartingZoomLevel() {
	 		map.setCenter(new GLatLng(38.5, -93), 4);
	 		currentZoomLevel = 4;
	 	}
	 	
	 	function MLegend() {}
		MLegend.prototype = new GControl;
		MLegend.prototype.initialize = function(map) {
			var me = this;
			me.panel = document.createElement("div");
			me.panel.style.width = "180px";
			me.panel.style.height = "20px";
			me.panel.style.border = "1px solid gray";
			me.panel.style.background = "white";
			me.panel.style.padding = "3px";
			
			var divStyle = "margin:3px;float:left;width:15px;height:15px;background-color:";
			var locationDivSrc = "<div style='"+divStyle+highlightColor+"'>&nbsp;</div>";
			var noLocationDivSrc = "<div style='"+divStyle+noLocationColor+"'>&nbsp;</div>";
			var textStyle = "margin:3px;float:left;"
			me.panel.innerHTML = "<div style='"+textStyle+"'>Location</div>" + locationDivSrc + " <div style='"+textStyle+"'>No Location</div>" + noLocationDivSrc;
			map.getContainer().appendChild(me.panel);
			return me.panel;
		};
			
		MLegend.prototype.getDefaultPosition = function() {
			return new GControlPosition(
				G_ANCHOR_TOP_RIGHT, new GSize(10, 10));
		};
			
		MLegend.prototype.getPanel = function() {
			return me.panel;
		}
	 	
	 	var map;
	 	var zoomedIn = false;
	 	var currentZoomLevel = 4;

	    function initialize() {
	      if (GBrowserIsCompatible()) {
	        map = new GMap2(document.getElementById(canvasId));
	        map.setMapType(G_PHYSICAL_MAP);
	        map.disableDragging();
	        //map.addControl(new MLegend());
	        //GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng){ alert(latlng); });
	        
	        setStartingZoomLevel();
	        setupStates();
	      }
	    }
	    
	    var stateOverlays = [];
	    var stateLabels = [];
	    var locationMarkers = [];
	    var stateXmlDoc;
	    var locationXmlDoc;
	    function setupStates() {
	    	var request = GXmlHttp.create();
	    	request.open("GET", "/kserver/googlemap/states.xml", false);
		    request.send(null);
		    
		    stateXmlDoc = GXml.parse(request.responseText);
		    var states = stateXmlDoc.documentElement.getElementsByTagName("state");
		    		
		    for(var i = 0; i < states.length; i++) {
		    	var label = states[i].getAttribute("name");
		    	var color = states[i].getAttribute("colour");
		    	var shouldDisplay = states[i].getAttribute("shouldDisplay");
			   	var pointElements = states[i].getElementsByTagName("point");
			    var lat = parseFloat(states[i].getAttribute("lat"));
			    var lng = parseFloat(states[i].getAttribute("lng"));
			    
			    var zoomLevel = parseFloat(states[i].getAttribute("zoomLevel"));
		    	if(!zoomLevel) {
			    	zoomLevel = 6;
			    }
		    
		    	var points = [];
			    for(var j = 0; j < pointElements.length; j++) {
			    	points[j] = new GLatLng(
			    	parseFloat(pointElements[j].getAttribute("lat")),
			    	parseFloat(pointElements[j].getAttribute("lng")));
			    }
		    
		    	addState(label, points, new GLatLng(lat, lng), zoomLevel, hasLocation(label), shouldDisplay);
		    }
	    }
	    
	    function hasLocation(stateLabel) {
	    	if(!locationXmlDoc) {
	 			loadLocations();
	 		}
	 		
	 		var states = locationXmlDoc.documentElement.getElementsByTagName("state");	
	 		for(var i = 0; i < states.length; i++) {
	 			var name = states[i].getAttribute("name");
	 			if(name == stateLabel) {
	 				return true;
	 			}
	 		}
	 		return false;
	    }
	    
	    function loadLocations() {
	    	var request = GXmlHttp.create();
		    request.open("GET", getLocationsURL, false);
		    request.send(null); 
	    	locationXmlDoc = GXml.parse(request.responseText);	
	    }
	    
	    function pause(millis) 
		{
			var date = new Date();
			var currDate = null;
			do {
				currDate = new Date();
			} 
			while(currDate-date < millis);
		} 
	    
	    function getNoLocationText(stateLabel) {
			return noLocationText;
    	}
	    
	    function addState(stateLabel, points, latLng, zoomLevel, hasLocations, shouldDisplay) {
	    	var color = highlightColor;
	    	if(!hasLocations) {
	    		color = noLocationColor;
	    	}
	    	
	    	var alpha = 0.5;
	    	if(shouldDisplay == "false") {
	    		alpha = 0;
	    	}
	    	
	    	var stateOverlay = new GPolygon(points, "#000000", 0.5, 0.5, color, alpha);
	    	stateOverlays.push(stateOverlay);
		    stateLabels.push(stateLabel);
	    
	    	map.addOverlay(stateOverlay);
	    	if(hasLocations) {
		    	GEvent.addListener(stateOverlay, "click", function() {
		    		if(!zoomedIn) {
		    			map.panTo(latLng);
		    			while(currentZoomLevel < zoomLevel) {
		    				map.zoomIn(latLng, true, true);
		    				currentZoomLevel++;
		    			}
		    			
		    			zoomedIn = true;
		    			addStateMarkers(stateLabel);
		    		}
		    		else {
		    			reset();
		    			map.panTo(latLng);
		    			while(currentZoomLevel < zoomLevel) {
		    				map.zoomIn(latLng, true, true);
		    				currentZoomLevel++;
		    			}
		    			
		    			zoomedIn = true;
		    			addStateMarkers(stateLabel);
		    		}
		    	});
		    	
		    	GEvent.addListener(stateOverlay, "mouseover", function() {
		    		stateOverlay.color = mouseoverColor;
		    		stateOverlay.redraw(true);
		    	});
		    	
		    	GEvent.addListener(stateOverlay, "mouseout", function() {
		    		stateOverlay.color = highlightColor;
		    		stateOverlay.redraw(true);
		    	});
	    	}
	    	else {
	    		GEvent.addListener(stateOverlay, "click", function() {
			 		map.openInfoWindowHtml(latLng, getNoLocationText(stateLabel));
				});
    		}
	    }
	    
	    function buildLink(homepageUrl, text) {
	    	return "<a href='http://"+homepageUrl+"'>"+text+"</a>";
	    }
	    
	    function getLocationPinpointText(location) {
			var display = location.getAttribute("pinpointDisplay");
			if (display != null) {
				return display;
			}
			else {
				var name = location.getAttribute("name");
				var displayContact = location.getAttribute("displayContact");
				var homepageUrl = location.getAttribute("homepage");
				var phoneNumber = location.getAttribute("phone");
				var text = "<br/><span style='font-size:120%'>" + name + "</span>";
				if(phoneNumber && phoneNumber != "null") {
					text += "<br/>Phone Number: " + phoneNumber;
				}
				text += "<br/>" + buildLink(homepageUrl,homepageUrl);
				text += "<br/>";
				return text;
			}
	    }
	    
	    function createMarker(latLng, text) {
	    	var marker = new GMarker(latLng);
		    GEvent.addListener(marker, "mouseover", function() {
			 	marker.openInfoWindowHtml(text);
			});
			GEvent.addListener(marker, "click", function() {
			 	marker.openInfoWindowHtml(text);
			});
			return marker;
	    }
	    
	    function addStateMarkers(stateLabel) {
	 		if(!locationXmlDoc) {
	 			loadLocations();
	 		}
	 		
	 		var states = locationXmlDoc.documentElement.getElementsByTagName("state");	
	 		locationMarkers = [];
	 		for(var i = 0; i < states.length; i++) {
		    	var name = states[i].getAttribute("name");
		    	if(name == stateLabel) {
		    		var locations = states[i].getElementsByTagName("location");
		    		for(var j = 0; j < locations.length; j++) {
		    			var point = new GLatLng(
		    					parseFloat(locations[j].getAttribute("lat"))/10000,
		    					parseFloat(locations[j].getAttribute("lng"))/10000);
		    			
		    			var marker = createMarker(point, getLocationPinpointText(locations[j]));
		    			locationMarkers.push(marker);
		    			map.addOverlay(marker);
		    		}
		    	}
		    }
	 	}
