	var zoomMax = 16;
	
	var map;   
	var directions;
	var markers;

	var addresses;


	function Address(centerPt_, title_, address1_, address2_, city_, state_, zip_, phone_) {
		this.centerPt = centerPt_;
		this.title = title_;
		this.address1 = address1_; 
		this.address2 = address2_;
		this.city = city_;
		this.state = state_;
		this.zip = zip_;
		this.phone = phone_;

		this.determineSearchAddress = function() {
			var addressBreak = "";
		    
		    if (this.address2 != "") {
		    	addressBreak = ", "	
		    }
			
			return this.address1 + addressBreak + this.address2 + ", " + this.city + ", " + this.state + " " + this.zip + " @ " + this.centerPt.lat() + ", " + this.centerPt.lng();  
		};

		this.determineDisplayAddress = function() {
		    var addressBreak = "";
		    
		    if (this.address2 != "") {
		    	addressBreak = "<br />"	
		    }
		
			return "<h1 style='font: 16px Arial; font-weight: bold; margin-top: 0px; margin-left: 0xp; margin-bottom: 4px; margin-right: 10px;'>" + this.title + "</h1><font style='font: 14px Arial;'>" + this.address1 + addressBreak + this.address2 + "<br />" + this.city + ", " + this.state + " " + this.zip + "<br />" + this.phone + "</font>"; 
		};

		this.determineMarkerHtml = function(addressIndex, markerIndex, prevValue) {
			var toAddressWithCoordinates = this.determineSearchAddress();   
			var displayAddress = this.determineDisplayAddress();
      
			var directionForm = "<form style='margin-top: 2px; margin-bottom:2px; margin-left: 0px; margin-right: 0px; vertical-align: middle;' name=directions onsubmit='getDirections(" + addressIndex + ", " + markerIndex + ", this.fromAddress.value, this.toAddress.value); return false;'><font style='font: 14px Arial;'>Directions From:</font> <input type=text name=fromAddress value=\"" + escapeHtml(prevValue) + "\" style='width: 190px;'><input type=hidden name=toAddress value='" + escapeHtml(toAddressWithCoordinates) + "'> <input type=submit value=Go></form>";
			var markerHtml = displayAddress + directionForm;

			return markerHtml;
		};
	}


	function initializeMap(addresses_) {
		addresses = addresses_;
     
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map_area")); 
			setMapCenter();

			addMarkers();

			map.addControl(new GLargeMapControl()); 
		} 
		else {
		    var mapAreaElem = document.getElementById("map_area");
		    var errorMessage = "Unable to display map. Mapping software does not support your browser. Please call " + addresses[0].phone + " for driving directions."
		    
		    if (mapAreaElem) {
				mapAreaElem.innerHTML = "<p style='font: 24px Arial; padding-top: 165px; padding-left: 35px; padding-right: 35px; padding-bottom: 0px; margin: 0px;'>" + errorMessage + "</p>";
			}
			else {
				alert(errorMessage);
			}
		}
	}

    
	function reset() {
		if (directions) {
			directions.clear();
		}

		setMapCenter();

		removeMarkers();
		addMarkers();
	}


	function addMarkers() {
		markers = new Array();
	    var openWindow = (addresses.length == 1);

		for (var i = 0; i < addresses.length; i++) {
			addMarker(i, openWindow);   
		}
	}     


	function removeMarkers() {
	    while (markers.length > 0) {
			map.removeOverlay(markers.pop());        
		}
	}

      
	function setMapCenter() {
		var highLat;
		var lowLat;

		var highLng;
		var lowLng;

		for (var i = 0; i < addresses.length; i++) {
			if (!highLat || highLat < addresses[i].centerPt.lat()) {
				highLat = addresses[i].centerPt.lat();
			}

			if (!lowLat || lowLat > addresses[i].centerPt.lat()) {
				lowLat = addresses[i].centerPt.lat();
			}

			if (!highLng || highLng < addresses[i].centerPt.lng()) {
				highLng = addresses[i].centerPt.lng();
			}

			if (!lowLng || lowLng > addresses[i].centerPt.lng()) {
				lowLng = addresses[i].centerPt.lng();
			}
		}

		var centerLat = (highLat + lowLat) / 2;
		var centerLng = (highLng + lowLng) / 2;

        var zoomLevel;
        
        if (addresses.length > 1) {
        	zoomLevel = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(lowLat, lowLng), new GLatLng(highLat, highLng)));
		
			if (zoomLevel > zoomMax) {
				zoomLevel = zoomMax;
			}
		}
		else {
			zoomLevel = zoomMax;
			centerLat += 0.00105;
		}

		map.setCenter(new GLatLng(centerLat, centerLng), zoomLevel);
	}


	function addMarker(addressIndex, open) {
		var address = addresses[addressIndex];
		var markerIndex = markers.length;      
      
		var marker = new GMarker(address.centerPt);
		markers[markerIndex] = marker;

		map.addOverlay(marker);

		var markerHtml = address.determineMarkerHtml(addressIndex, markerIndex, "");
		marker.bindInfoWindowHtml(markerHtml, {noCloseOnClick: true});

		if (open) {
			marker.openInfoWindowHtml(markerHtml, {noCloseOnClick: true});
		}
	}


	function getDirections(addressIndex, markerIndex, fromAddress, toAddress) {
		var markerHtml = addresses[addressIndex].determineMarkerHtml(addressIndex, markerIndex, fromAddress);
		
		if (!fromAddress.match(/^\s*$/)) {
			var directionsPanel = document.getElementById("directions_area");
			directions = new GDirections(map, directionsPanel);
      
			GEvent.addListener(directions, "load", function () {
		    	var directionAreaElem = document.getElementById("directions_area");
		
				if (directionAreaElem) {
					directionAreaElem.innerHTML = " ";
					directionAreaElem.style.textAlign = "left";
					directionAreaElem.style.width = "756px";
					directionAreaElem.style.height = "auto";
					directionAreaElem.style.marginTop = "5px";
					directionAreaElem.style.marginLeft = "5px";
					directionAreaElem.style.verticalAlign = "top";
					directionAreaElem.style.backgroundColor = "#FFFFFF";
					directionAreaElem.style.color = "#000000";
				}
			
				removeMarkers();
			});
		
			GEvent.addListener(directions, "addoverlay", function() {	
		    	document.getElementById("directions_area").style.height = (document.getElementById("directions_area").scrollHeight + 25) + "px";
			});

			GEvent.addListener(directions, "error", function () {
				var tempMarkerHtml = markerHtml + "<font color=red style='font: 12px Arial;'>Unable to understand this location. Please enter a valid address.<br />Example: 1600 Pennsylvania Ave, Washington, DC 20500</font>";        
				
				markers[markerIndex].closeInfoWindow();
				markers[markerIndex].openInfoWindowHtml(tempMarkerHtml, {noCloseOnClick: true});
			});

			directions.load("from: " + fromAddress + " to: " + toAddress);
		}
		else {
			var tempMarkerHtml = markerHtml + "<font color=red style='font: 12px Arial;'>Please enter a starting address.<br />Example: 1600 Pennsylvania Ave, Washington, DC 20500</font>";        
			
			markers[markerIndex].closeInfoWindow();
			markers[markerIndex].openInfoWindowHtml(tempMarkerHtml, {noCloseOnClick: true});
		}
	}   
	
	
	function escapeHtml(str) {
	    if (!str || str.match(/^\s*$/)) {
	    	return str;
	    }
	    else {
			var div = document.createElement('div');
			var text = document.createTextNode(str);
		
			div.appendChild(text);
			var result = div.innerHTML.replace(/\"/, "&quot;");
		
			return result;
		}
	}