	//global variables
	var map = null;
	var results = [ ];
	var iwhtml = [ ];
	//initialize with default view
 	var centerlng = -98.8;
	var centerlat = 39.5;
	var zoom = 4;	
	var minZoomLevel = 6;
	var defaultLandmarkZoom = 8;  //this is also set in com.reserveamerica.publicweb.controller.maps.MapControllerConstants
	var defaultStateZoom = 7; 
	var defaultParkZoom = 10; 
	var mapParam;
	var infoOpened = false;	
	var mapTypeChanged = false;	
	var mapInitialized = false;	
	var facility;
	var contractCode;	
	var chosenParkMarker;	 
	var overlays = new Array();
	var i = 0;
	var startIndex = 0;
	var resultSize = 0;
	var previous = false;
	var firstLetter = "";
	var mapStatusMsg;
//    var gdir = null;
	var CONTRAT_CODE_ELS = 'ELS';
	var CONTRAT_CODE_TRLS = 'TRLS';
	var CONTRAT_CODE_KOA = 'KOA';
	var CONTRAT_CODE_CM = 'CMGR';
	var attrInitialized = false;	
	var attractionMarkers = new Array();
	var maxAttractionZoom = 7; 
	var directionsDisplay;
	var directionsService = new google.maps.DirectionsService();
	var userHomeAddress=null;
	var inDrivingDirections=false;
	var startAddInstructions="Enter Starting Address or City";
	var regionalWithDrivingDirections=false;
	var listingAddress = "";
	//set global vars associated w/ XML parsing
	var parks = new Array();
	var excludedContracts = new Array();
	var excludedParkNames = new Array();


	function isExcludedContract(contract)
	{
	  for(var i=0; i<excludedContracts.length; i++)
	    if(excludedContracts[i]==contract) return true;
	  return false;
	}
	function isExcludedParkName(parkName)
	{
	  for(var i=0; i<excludedParkNames.length; i++)
	    if(excludedParkNames[i]==parkName) return true;
	  return false;
	}
		
	function onLoad() { 		  
		try {
			init();   
		} catch(e){}
		var latlng = new google.maps.LatLng(centerlng, centerlat);
		var myOptions = {
			zoom : zoom,
			center : latlng,
			disableDefaultUI: true,
		    panControl: true,
		    panControlOptions: {
		        //position: google.maps.ControlPosition.LEFT_TOP //position creates issues with IE7 and IE8 (as of today, Oct. 6, 2011).
		    },	    
		    zoomControl: true,
		    zoomControlOptions: {
		        style: google.maps.ZoomControlStyle.SMALL/*,
		        position: google.maps.ControlPosition.LEFT_TOP*/
		    },	    
		    scaleControl: true,
		    mapTypeControl: true,
		    mapTypeControlOptions: {
		      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU/*,
		      position: google.maps.ControlPosition.RIGHT_TOP*/
		    },
			mapTypeId : google.maps.MapTypeId.ROADMAP
	}
		map = new google.maps.Map(document.getElementById("mapviewport"), myOptions);
		
		mapStatusMsg = new MapStatusControl();
	  	map.controls[google.maps.ControlPosition.TOP_LEFT].push(mapStatusMsg);
		infoWindow = new google.maps.InfoWindow();
		
	    // add directions control
		directionsDisplay = new google.maps.DirectionsRenderer();
		directionsDisplay.setMap(map);
		directionsDisplay.setPanel(document.getElementById("directions"));
		
		showMap();
		initializeClientGeocoder();

	}
	
	function showMap() {
		if ("PARK" == mapParam) {		
			getChosenPark();			
		} else if ("SEARCH" == mapParam) {	 
			createZoomListener();
			map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);
		} else if ("BROWSE" == mapParam) {
			createListeners(); 
			map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);
	   	} else if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {
	   		createZoomListener();
		   	getParks();  		
		   	map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);
	   	}	 
	   	mapInitialized = true;		
	}
	
	function createListeners() {			
		google.maps.event.addListener(map, "idle", function() {			
			if (infoOpened == true ) { 				  
            	infoOpened = false; 
           	    return; 
		    } 		   	
		    if (mapTypeChanged == true) { 				  
            	mapTypeChanged = false;
            	if (mapInitialized) { 
	           	    return; 
	           	}
		    } 			    		    		    		  
		   	if (map.getZoom() > minZoomLevel) {		   		
			  	document.getElementById('mapmessage').innerHTML = "";	
	  	 		//window.setTimeout("getParks()",700);	
	  	 		getParks();
//	  	 		saveCurrentCoords();	  	 	
		   	} else {
				closeStatus();
				if(!inDrivingDirections)
					document.getElementById('mapmessage').innerHTML = "<div class='msg error'>Too many campgrounds in the area.  Zoom in and try again.</div>";	
			}
			if (attrInitialized == true)
				showAttractionMarkers();
		} );
		google.maps.event.addListener(map, "click", function() {
			infoWindow.close();
		} );
	}		
	
	function createZoomListener() {		
		google.maps.event.addListener(map, "zoom_changed", function() {
			showZoomInMessage(false);
			if (attrInitialized == true) 
				showAttractionMarkers();
			else
				getAttractions();						
		} );	
	}
	
	function saveCurrentCoords() {
		var curcent = map.getCenter();
	   	var curzoom = map.getZoom();        	
       	var url = "/generateBrowseMap.do?topTabIndex=CampgroundMap&currentLat="+curcent.lat()+"&currentLon="+curcent.lng()+"&currentZoom="+curzoom;		
       	makePostRequest(url);
	}				
	
	function showMarkers(){
		if(map.getZoom() > minZoomLevel || ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam)){								
			if(i < parks.length){
				var max = Math.min(i+20, parks.length);	//select the minimum batch size of 20 facilities or the remainder of total facilities divided by 20				
				showStatus(max, parks.length);	//show loading status bar
				while(i < max){		
					var parkID = parks[i].getAttribute("contractCode") + parks[i].getAttribute("parkid"); 															//loop thru all facilities to be plotted in this batch
					var j = 0;
					var exists = false;
  					var marker; 	  	  											  						  					  						  					  					
					while(j < overlays.length){
						if (parkID == overlays[j].parkID) { //check if parks already exists
							exists = true;	//set flag
							marker = overlays[j];
							break;			//if already plotted, break out of loop
						}
						j++;
					}
		       	 	var contractType;
  	        		if (parkID == contractCode + facility) {
	       	        	contractType = "chosen";
	       	        	chosenParkMarker = parks[i]; 
    			        if("PARK" == mapParam && regionalWithDrivingDirections==true)
 				  		{
	  					 showDirectionsBox(chosenParkMarker.getAttribute("id"),chosenParkMarker.getAttribute("parkname"),chosenParkMarker.getAttribute("lat"), chosenParkMarker.getAttribute("lng"),chosenParkMarker.getAttribute("code"));
						 location.hash="dirnAnchor";
						 regionalWithDrivingDirections=false;
				  		}	 			
	        	    } else {  	                  
			       	    contractType = parks[i].getAttribute("contractType");
	       			}
	       			var availStatus;
	       			var bookButton;
	       			var reservableType = parks[i].getAttribute("reservableType");
	       			var channel = "Book Now";
	       			if (reservableType == "2")
	       				var channel = "Call Now";
	       			else if (reservableType == "1")
	       				var channel = "Walkup Only***";
	       			
	       			var hiddenOnMap = parks[i].getAttribute("hiddenOnMap") == "true";
	       				
					if ( isELS_TRLSPark(parks[i].getAttribute("contractCode")) )
					{
						availStatus = parks[i].getAttribute("status") == "A" || parks[i].getAttribute("status") == "N" ? "" : "_NA";
						bookButton = getELS_TRLSButton(parks[i].getAttribute("contractCode"), parks[i].getAttribute("parkid"));
						channel = "";
					}      				
	       			else if (parks[i].getAttribute("status") == "A" || parks[i].getAttribute("status") == "N" || "BROWSE" == mapParam || "PARK" == mapParam) {
	       				availStatus = "";
	       				if (parks[i].getAttribute("status") == "A") {
		       				bookButton = "<a href=\"/campgroundMap.do?contractCode=" + parks[i].getAttribute("contractCode") 
		       							+ "&parkId=" + parks[i].getAttribute("parkid") 
		       							+ "\" class=\"book now\" onclick=\"\">See Details</a>" ;
		       							
		       			} else {
		       				channel = "";
		       				bookButton = "<a href=\"/campgroundMap.do?contractCode=" + parks[i].getAttribute("contractCode") 
		       							+ "&parkId=" + parks[i].getAttribute("parkid") 
		       							+ "&criteria=new"
		       							+ "\" class=\"book now\" onclick=\"\">Enter Date</a>";
		       			}
	       			} else {
	       				availStatus = "_NA";
	       				channel="";
	       				bookButton = "<a href=\"/campsiteCalendar.do?findavail=next&contractCode=" + parks[i].getAttribute("contractCode") 
	       							+ "&parkId=" + parks[i].getAttribute("parkid") 
	       							+ "\" class=\"book next\" onclick=\"\">Find Next Avail. Date*</a>";
	       			}
					if (exists == false && hiddenOnMap == false){ //if this marker is not already plotted...
						//prepare marker												 			 	  			
						var point = new google.maps.LatLng(parseFloat(parks[i].getAttribute("lat")), parseFloat(parks[i].getAttribute("lng")));
		    	        setInfoWindowHTML(parkID, parks[i], bookButton, channel);			    	     
			  			if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
				  			marker = createAvailMarker(point, parks[i].getAttribute("parkname") + ", " + parks[i].getAttribute("state"), iwhtml[parkID], i, availStatus);   
			 	  		} else {		
				 	  		marker = createMarker(point, parks[i].getAttribute("parkname") + ", " + parks[i].getAttribute("state"), iwhtml[parkID], contractType);   				 	  	
				 	  	} 			
				 	  	marker.parkID = parkID;			
				 	  	results[parkID] = marker; 
				 	  	overlays.push(marker);	//add marker to map and array of overlays	
					}	//end if not already plotted
					// Generate the link in the mapviewcampgroundlist 
					 var region="";
		  			if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
			  			var letter = String.fromCharCode("A".charCodeAt(0) + i);
			  			
			  			var pinElement = "<div class='pinContainer'><a href=\"javascript:clickResult('" + parkID + "')\">" +
						"<img src=\"/images/maps/marker" + letter + availStatus + ".png\" class=\"pin\" width=\"20\" height=\"34\">" +
						"</img></a></div>";
						  	
						html = "<div class=\"mapresult\">";
						  		
		  				if (hiddenOnMap == false) {
		  					html += pinElement;
		  				}
		  				else {
		  					html += "<div style='margin-left:20px; float:left'> &nbsp;</div>"; //make up for lost pin space
		  				}	
		  					
		  					
		  				html += "<div class='linkContainer'><a href=\"/campgroundDetails.do?contractCode=" + parks[i].getAttribute("contractCode") 
								+ "&parkId=" + parks[i].getAttribute("parkid") + "\">" 
								+ parks[i].getAttribute("parkname") + ", " + parks[i].getAttribute("state") + "</a>"; 
							
						if (parks[i].getAttribute("region")!="") {
                              html += ", <br>" + parks[i].getAttribute("region") + "<br>";  
                        } 
						html += "<div class='btnRow'>" + bookButton +
						"<div class=\"amenities\"><img border=\"0\" src=\"/images/icon_amps" + parks[i].getAttribute("amps") + ".gif\" width=\"22\" height=\"22\" alt=\"" + parks[i].getAttribute("ampsAlt") + "\" /><img border=\"0\" src=\"/images/icon_fullhookup" 
							+ parks[i].getAttribute("full") + ".gif\" width=\"22\" height=\"22\" alt=\"" + parks[i].getAttribute("fullAlt") + "\" /><br><img border=\"0\" src=\"/images/icon_pets" + parks[i].getAttribute("pets") + ".gif\" width=\"22\" height=\"22\" alt=\"" 
							+ parks[i].getAttribute("petsAlt") + "\" /><img border=\"0\" src=\"/images/icon_waterfront" + parks[i].getAttribute("water") + ".gif\" width=\"22\" height=\"22\" alt=\"" + parks[i].getAttribute("waterAlt") + "\" /></div>" +			
						"" + "</div><div class='mapstatus'>" + channel + "</div></div></div>";
				 		document.getElementById("mapviewcampgroundlist").innerHTML = document.getElementById("mapviewcampgroundlist").innerHTML + html; 	      	 	  									 							 			
		 	  		} else {		
						if ("chosen" == contractType) {	
							letterHeader = "";
                            if (parks[i].getAttribute("region")!="") {
                              region = ", <br>"+ parks[i].getAttribute("region"); //"<BR>" + 
                          } 
						} else {	 	  		
				 	  		if (firstLetter == (parks[i].getAttribute("parkname")).charAt(0)) {
					 	  		letterHeader = "";
				 	  		} else {
				 	  			if (hiddenOnMap == false) {
					 	  			firstLetter = (parks[i].getAttribute("parkname")).charAt(0);
					 	  			letterHeader = "<label>" + firstLetter + "</label>";
				 	  			}
				 	  			else 
				 	  				letterHeader = "";
			 		  		}			 	  		
			 		  	}
			 		  	if (hiddenOnMap == false) {
							html = letterHeader + "<div class=\"pin\">" + 
							"<a href=\"javascript:clickResult('" + parkID + "')\">" +
							"<img src=\"/images/maps/mm_20_" + contractType + ".png\"></img></a>" + 						
							"<a href=\"/campgroundDetails.do?contractCode=" + parks[i].getAttribute("contractCode") + "&parkId=" + parks[i].getAttribute("parkid") + "\">" + parks[i].getAttribute("parkname") + region + ", " + parks[i].getAttribute("state") + "</a>&nbsp;</div>";
	                        
	 	  									 	  				
	  						if ("chosen" == contractType) {
		 	  					document.getElementById("chosencampground").innerHTML = html; 
	  						} else {
								document.getElementById("mapviewcampgroundlist").innerHTML = document.getElementById("mapviewcampgroundlist").innerHTML + html;
							}					 	
						}	    	
			 	  	} 			
					i++;
				}	//end while			
				if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
					if (resultSize > 10) {
						if (startIndex == 0) {
							document.getElementById("nextten").innerHTML = "<a href=\"javascript:getParks();\">Next 10 ></a>";		
						} else {
							document.getElementById("nextten").innerHTML = "<a href=\"javascript:getParksPrevious();\">< Previous 10 </a>&nbsp;&nbsp;<a href=\"javascript:getParks();\">Next 10 ></a>";		
						}					
						startIndex = startIndex + 10;
						if (resultSize <= startIndex) {				
							startIndex = startIndex - 20					
							document.getElementById("nextten").innerHTML = "<a href=\"javascript:getParks();\">< Previous 10 </a>";														 		
						}		
					} 
				}				
				window.setTimeout(showMarkers,1);
			} else {
				closeStatus();
			}
		}	//end if
	}	//end function showMarkers
	
	function getParks(){
		plotting = true;	
		if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	 
			removeSearchMarkers();
		}
		document.getElementById('mapmessage').innerHTML = "";			
		document.getElementById("mapviewcampgroundlist").innerHTML = "";							
		setMapStatusMsg('loading...');
		var url;
		if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {				
			if (previous == true) {
				startIndex = startIndex - 20;
				previous = false;
			}
			url = "/getParksForMap.do?start=searchResults&startIndex=" + startIndex;	 
		} else {
			var bounds = map.getBounds();
			var southWest = bounds.getSouthWest();
			var northEast = bounds.getNorthEast();	
			url = "/getParksForMap.do?start=parksInView&minX=" + southWest.lng() + "&minY=" + southWest.lat()  +
			"&maxX=" + northEast.lng() + "&maxY=" + northEast.lat() + "&long=" +  centerlng + "&lat=" + centerlat + "&map=" + mapParam;										
		}
		makeHttpRequest(url, function(data) {
			var xmlDoc = raParseXmlData(data);
			if (xmlDoc == null) {
				closeStatus();		
				document.getElementById('mapmessage').innerHTML = "<div class='msg error'>Error retrieving data!</div>";			
				return;
			}		
			if (xmlDoc.documentElement != null) {
	    		parks = xmlDoc.documentElement.getElementsByTagName("marker");
	    	}	
    		if (parks == null) {
    			closeStatus();		
    			showNoResultsFoundMessage();
    			return;
    		}
    		var count = 0;
    		count = parks.length;       	    				 		    		
    		if(count == 0){	//if no matching facilities were found...
				closeStatus();			
				showNoResultsFoundMessage();
				return;
			} else if (count > 0) {	
				//removeUnusedOverlays();    	
    			i = 0;		
 	  			window.setTimeout(showMarkers,1);		    					
 	  		}
			if ("PARK" == mapParam && chosenParkMarker != null) {	   
				//if in "Regional Map" mode, check if chosen campground exists in new view
				var	chosenParkExists = false; 			
				var j = 0;					
				while(j < parks.length){ //loop thru existing markers to see if the marker is already plotted
					if(chosenParkMarker.getAttribute("contractCode") + chosenParkMarker.getAttribute("parkid") 
						== parks[j].getAttribute('contractCode') +  parks[j].getAttribute('parkid')){	
						chosenParkExists = true;	//set flag
						break;			//if already plotted, break out of loop
					}
					j++;
				}
				if (!chosenParkExists) {
					var bookButton = "<a href=\"/campgroundMap.do?contractCode=" + contractCode + "&parkId=" + facility + "\" class=\"book now\" onclick=\"\">Book Now</a>";
					setInfoWindowHTML(contractCode + facility, chosenParkMarker, bookButton);	
					var point = new google.maps.LatLng(parseFloat(chosenParkMarker.getAttribute("lat")), parseFloat(chosenParkMarker.getAttribute("lng")));
					var marker = createMarker(point, parks[i].getAttribute("parkname") + ", " + parks[i].getAttribute("state"), iwhtml[contractCode + facility], "chosen");    	  									  						  					  						  				
  					results[contractCode + facility] = marker; 
		  			overlays.push(marker);	 
	  			}  			
	  		}
	  		if (attrInitialized == false) {	   		
				getAttractions();			
			}
		}, false, false);		
	}
	
	function getAttractions() {	
		attrInitialized = true;		
		var url = "/getParksForMap.do?start=getAttractions";	 
		makeHttpRequest(url, function(data) {
			var xmlDoc = raParseXmlData(data);
			if (xmlDoc == null) {					
				return;
			}	
			var attrs;
			if (xmlDoc.documentElement != null) {
	    		attrs = xmlDoc.documentElement.getElementsByTagName("marker");
	    	}	    
			if (attrs == null) {		
				return;
			}			
			for (var i = 0; i < attrs.length; i++) {    
				var point = new google.maps.LatLng(parseFloat(attrs[i].getAttribute("lat")), parseFloat(attrs[i].getAttribute("lng")));
				var marker = createAttractionMarker(point, attrs[i]);
				attractionMarkers.push(marker);				
			}			
			showAttractionMarkers();
		}, false, false);			
	}

	function createAttractionMarker(point, attraction) {
		var icon = new GIcon();
		icon.image = "/images/maps/" + attraction.getAttribute("icon"); 		
		icon.iconSize = new GSize(60, 60);				
		icon.iconAnchor = new GPoint(18, 53);
		icon.infoWindowAnchor = new GPoint(5, 1);		
		var marker = new GMarker(point, icon);
		marker.value = attraction.getAttribute("id");  
	 	GEvent.addListener(marker, "click", function() {
	 		var gaTracker = "";
	 		if ( attraction.getAttribute("contractCode") == "Camping World" ) {
	 			gaTracker = "onclick='pageTracker._trackPageview(\"/outgoing/CW_MapBubble\");'";
	 		}
	 		 	 		
	  		var myHtml = "<b>" + attraction.getAttribute("name") + "</b><br>" + 
	  					 attraction.getAttribute("address") +  "<br>" +
	  					 attraction.getAttribute("city") + ", " + attraction.getAttribute("state") + " " + attraction.getAttribute("zipcode") + "<br><hr width='230px'>" +	  					
	  					 "<img border='0' src='" + "/images/maps/" + attraction.getAttribute("image") + "' align ='left'/>" +
	  					  attraction.getAttribute("description") + "<br>" +
	  					 "<a href='" + attraction.getAttribute("url") + "' " +  gaTracker + ">Go to " + attraction.getAttribute("contractCode") + "</a>";	  					 
	  		map.openInfoWindowHtml(point, myHtml);  
	  	});  
	  	return marker;		
	}
	
	function showAttractionMarkers() {	
		for (var i = 0; i < attractionMarkers.length; i++) {
			if(map.getZoom() >= maxAttractionZoom) {			
				if ( attractionMarkers[i].isHidden() ) {
					attractionMarkers[i].show();
				} else {
					break;
				}
			} else {
				if ( !attractionMarkers[i].isHidden() ) {					
					attractionMarkers[i].hide();
				} else {
					break;
				}
			}			
		}	
	}
	
	function removeSearchMarkers() {		
		var j = 0;					
		while(j < overlays.length){
			overlays[j].setMap(null);
			j++;
		}
		overlays.length = 0;	
	}
	
	function removeUnusedOverlays() { // Not used right now.
		var newParks = [ ];
		var j = 0;					
		while(j < parks.length){
			newParks[parks[j].getAttribute('contractCode') +  parks[j].getAttribute('parkid')] = 1;
			j++;
		}
		var j = 0;		
		var k = 0;
		while(j < overlays.length){
			_tmpParkID = overlays[j].parkID;
			if (newParks[_tmpParkID] != 1) { 
				overlays[j].setMap(null);
				if (j < overlays.length - 1) {
					overlays[j] = overlays[overlays.length - 1] ; 
					j--;
					
				}
				overlays.pop();
			}
			j++;
		}
	}
	
	function getParksPrevious() {
		previous = true;
		getParks();
	}
	
	function getChosenPark() {
		var url = "/getParksForMap.do?start=onePark&parkId=" + facility + "&contractCode=" + contractCode;		
		makeHttpRequest(url, function(data) {
			var xmlDoc = raParseXmlData(data);
			if (xmlDoc == null) {
				showMapNotAvailableMessage();	  								
			} else {
				if (xmlDoc.documentElement != null)
		   			var markers = xmlDoc.documentElement.getElementsByTagName("marker");	    			    			    	
			    if (!markers || markers.length == 0) {	   		
			    	showMapNotAvailableMessage();	 		  	    	  			    					    				    	
			    } else if (markers.length > 0) {
					centerlng = markers[0].getAttribute("lng");					
					centerlat = markers[0].getAttribute("lat"); 
					zoom = defaultParkZoom;								
					map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);	
					createListeners(); 
			    	getParks();					
			    	return;
		    	}    
	    	}		    	
    	}, false, false);
	}
	
	function createMarker(point, name, desc, contractType) {	
		var shadowSrc = "";
		var imageSize = null;
		var shadowSize = null;
		if ("chosen"  == contractType || "encore" == contractType || "koa" == contractType) {
			if ("encore" == contractType || "koa" == contractType) {
				shadowSrc = "/images/maps/shadow_encore.png";
				imageSize = new google.maps.Size(25, 34);
				shadowSize = new google.maps.Size(39, 34);			
			} else {
				shadowSrc = "/images/maps/shadow50.png";
				imageSize = new google.maps.Size(20, 34);
				shadowSize = new google.maps.Size(37, 34);			
			}
		} else {
			shadowSrc = "/images/maps/mm_20_shadow.png";	
			imageSize = new google.maps.Size(12, 20);
			shadowSize = new google.maps.Size(22, 20);
		}	
		var origin = new google.maps.Point(0,0);
		var iconAnchor = new google.maps.Point(6, 20);
		var pinImgSrc = "/images/maps/mm_20_" + contractType + ".png";
		var image = new google.maps.MarkerImage(pinImgSrc,
				imageSize,
				// The origin for this image is 0,0.
				origin,
				// The anchor for this image is the base of the flagpole at 0,32.
			    iconAnchor);
		var shadow = new google.maps.MarkerImage(shadowSrc,
				// The shadow image is larger in the horizontal dimension
				// while the position and offset are the same as for the main image.
				shadowSize,
				origin,
				iconAnchor);
			
	    var marker = new google.maps.Marker({
	        position: point,
	        map: map,
	        shadow: shadow,
	        icon: image,
	        //shape: shape,
	        title: name
	    });	
	    google.maps.event.addListener(marker, "click", function() {
		   infoWindow.setContent(desc);
		   infoWindow.open(map, marker);    	
		   
	  	});	  	
	  	
	  	return marker;
	}
	
	function createAvailMarker(point, name, desc, index, status) {
	
		var letter = String.fromCharCode("A".charCodeAt(0) + index);
		var pinImgSrc = "/images/maps/marker" + letter + status + ".png";
		var shadowSrc = "http://www.google.com/mapfiles/shadow50.png";
		var imageSize = new google.maps.Size(20, 34);
		var shadowSize = new google.maps.Size(37, 34);
		var origin = new google.maps.Point(0,0);
		var iconAnchor = new google.maps.Point(9, 34);
		order = 10-index;
		var image = new google.maps.MarkerImage(pinImgSrc,
				imageSize,
				// The origin for this image is 0,0.
				origin,
				// The anchor for this image is the base of the flagpole at 0,32.
			    iconAnchor);
		var shadow = new google.maps.MarkerImage(shadowSrc,
				// The shadow image is larger in the horizontal dimension
				// while the position and offset are the same as for the main image.
				shadowSize,
				origin,
				iconAnchor);
			
	    var marker = new google.maps.Marker({
	        position: point,
	        map: map,
	        shadow: shadow,
	        icon: image,
	        //shape: shape,
	        title: name,
	        zIndex: order
	    });	
	    google.maps.event.addListener(marker, "click", function() {
		   infoWindow.setContent(desc);
		   infoWindow.open(map, marker);    	
		   
	  	});	  	
	  	
	  	return marker;
	}
	
	function setInfoWindowHTML(parkID, marker, bookButton, channel) {
		photoUrl = marker.getAttribute("photoPath");
		var defaultPhotoUrl = "this.src=\"/images/nophoto.jpg\";"
		var channelTag = "";
        
        var region = ""; 
        if (marker.getAttribute("region")!="") {
            region = "<BR>" + marker.getAttribute("region");
        } 
       
		if (channel && channel != "") channelTag = "<tr><td NOWRAP><span class='mapstatus'>" + channel + "</span></td></tr>";
		iwhtml[parkID] =  
			"<table cellspacing='0' cellpadding='0'>" +
			"<tr><td colspan=\"2\" style=\"vertical-align:top; padding-bottom:5px\" >" +		
			"<a href='/campgroundDetails.do?contractCode=" + marker.getAttribute("contractCode") + "&parkId=" + marker.getAttribute("parkid") + "'><span style='font-size:12px;'>" + marker.getAttribute("parkname") + 
			", " + marker.getAttribute("state") + "</span></a>" + region + "&nbsp;&nbsp;&nbsp;</td></tr>";			
			if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
				iwhtml[parkID] = iwhtml[parkID] + "<tr><td style=\"width:80px; vertical-align:top\" NOWRAP>" +			
				"<img border=\"0\" src=\"/images/icon_amps" + parks[i].getAttribute("amps") + ".gif\" width=\"16\" height=\"16\" alt=\"" + parks[i].getAttribute("ampsAlt") + "\" style=\"padding-right:4px\" />" +
				"<img border=\"0\" src=\"/images/icon_fullhookup" + parks[i].getAttribute("full") + ".gif\" width=\"16\" height=\"16\" alt=\"" + parks[i].getAttribute("fullAlt") + "\" style=\"padding-right:4px\" />" +
				"<img border=\"0\" src=\"/images/icon_pets" + parks[i].getAttribute("pets") + ".gif\" width=\"16\" height=\"16\" alt=\"" + parks[i].getAttribute("petsAlt") + "\" style=\"padding-right:4px\" />" +
				"<img border=\"0\" src=\"/images/icon_waterfront" + parks[i].getAttribute("water") + ".gif\" width=\"16\" height=\"16\" alt=\"" + parks[i].getAttribute("waterAlt") + "\" style=\"padding-right:4px\" />" +
				"</td><td rowspan=\"2\" style=\"float:left; padding-left:6px\">" + 
				"<img src=\"" + photoUrl + "\" border=0 width=\"80px\" height=\"53px\"/ onError='" + defaultPhotoUrl + "'\"></td>" +
				"</tr><tr><td style=\"width:80px; float:left; vertical-align:top; text-align:center\">" + bookButton + 
			    "</td></tr>" + channelTag;
			} else {
				iwhtml[parkID] = iwhtml[parkID] + "<tr><td style=\"width:80px; float:left; vertical-align:center; text-align:center\">" + bookButton +
		   		 "</td><td style=\"float:left; padding-left:6px\">" +
		   		 "<img src=\"" + photoUrl + "\" border=0 width=\"80px\" height=\"53px\"/ onError='" + defaultPhotoUrl + "'\" ></td></tr>";
			}
			iwhtml[parkID] = iwhtml[parkID] + "<tr><td colspan=\"2\" style=\"vertical-align:top;\" >" +		
			"<a href='/generateBrowseMap.do?topTabIndex=CampgroundMap&pageOrigin=mapBrowse&map=PARK&contractCode=" + marker.getAttribute("contractCode") + "&parkId=" + marker.getAttribute("parkid") + "'><span style='font-size:12px;'>" + 
			"View regional map</span></a></td></tr>";
		    var drivingDirectionTR = "<tr><td colspan=\"2\">Get Directions: <a href='javascript:showDirectionsBox(" + marker.getAttribute("id") + ", \"" + marker.getAttribute("parkname") + "\", " + 
				marker.getAttribute("lat") + ", " + marker.getAttribute("lng") + ", " + marker.getAttribute("code") + ");'>To here</a></td></tr>";
			if(isExcludedContract(marker.getAttribute("contractCode"))  ||	isExcludedParkName(marker.getAttribute("parkname")))
			  drivingDirectionTR = "";		
		    iwhtml[parkID] = iwhtml[parkID] + "<tr><td colspan=\"2\" style=\"vertical-align:top;\" >" +		
			"<a href='/generateBrowseMapRecGov.do?topTabIndex=CampgroundMap&topTabIndex=CampgroundMap&pageOrigin=mapBrowse&map=PARK&contractCode=" + marker.getAttribute("contractCode") + "&parkId=" + marker.getAttribute("id") + "'>" +
			"</a></td></tr>" + 
			drivingDirectionTR +
		    "</table>";
	}
    function fillAddress()
    {
      document.getElementById('fromAddress').value = userHomeAddress;
    }
	function showDirectionsBox(epid, epname, eplat, eplng, epcode) {
		var onclickstr = "javascript:getDirections(document.getElementById(\"fromAddress\").value,\"" + eplat + "," + eplng + "\");return false";	
   		document.getElementById('selectedep').style.display = "block";
   		var toDest = epname;
		var selectedDepInnerHtml = "<A name=\"dirnAnchor\"></A><p><h4>Get Directions</h4></p>";
		selectedDepInnerHtml +="<div id='dirnError'></div>";
		selectedDepInnerHtml +="<div style='margin-top:0.0em;margin-left:0.0'>From</div>";		
		if (listingAddress != null && listingAddress != "") {
			var listInfo = listingAddress.split("&#916;");
			selectedDepInnerHtml +="<input type='text' readonly='true' size='50' id='fromAddress' name='fromAdd' style='margin-left:0.0' value=\"" +toDest+ "\"/>";
			toDest = listInfo[0];
			onclickstr = "javascript:getDirections(\"" + eplat + "," + eplng + "\",\"" + listInfo[1] + "\");return false";
		}else{
			if(userHomeAddress!=null)
				  selectedDepInnerHtml+="<A href=\"javascript:fillAddress()\">Use Home Address</A><BR>";
			selectedDepInnerHtml +="<input onFocus=\"javascript:possiblyClear('fromAddress')\" type='text' size='50' id='fromAddress' name='fromAdd' style='margin-left:0.0' value='"+startAddInstructions+"'/>";
		}
		selectedDepInnerHtml +="<br>";
		selectedDepInnerHtml +="<div style='margin-top:0.05em;margin-left:0.0em'>To</div>";
		selectedDepInnerHtml +="<input type='text' readonly='true' size='50' id='toAddress' name='toAdd' style='margin-left:0.0' value=\"" + toDest + "\"/>";
		//"<BR><div class='content btn'>" +
		selectedDepInnerHtml +="<BR><BR><button class='all search' id='directionsbutton' type='button' onclick='" + onclickstr + "'>";
		selectedDepInnerHtml +="Get Directions!";
		selectedDepInnerHtml +="</button>";
		//"</div>";
		document.getElementById('selectedep').innerHTML = selectedDepInnerHtml;			 
	  	document.getElementById('directions').innerHTML = "";
        document.getElementById('directionsControl').style.display = "none";
		location.hash="dirnAnchor";
	}
	function closeDirections()
	{
		directionsDisplay.setMap(null);
		inDrivingDirections=false;
        document.getElementById('directions').style.display = "none";
        document.getElementById('directionsControl').style.display = "none";
        document.getElementById('selectedep').style.display = "none";
	}
	function getDirections(fromA, toA) {
	    // trim from
	    fromA = fromA.replace(/^\s+|\s+$/g, '') ;
		if (fromA == "Enter Starting Address or City" || fromA == "") {
			alert ("Please enter a starting Address or City!");
		} else {
    		inDrivingDirections=true;
    	    document.getElementById('progressSlider').style.display = "inline";
    		showProgressBar('progressSlider','Loading Directions ...',null,null);
    		var trackingStr = mapParam+'-DrivingDirections';
    		pageTracker._trackPageview(trackingStr);
			var request = {
				origin : fromA,
				destination : toA,
				travelMode : google.maps.TravelMode.DRIVING
			};
			directionsService.route(request, function(result, status) {
				if (status == google.maps.DirectionsStatus.OK) {
				    directionsDisplay.setMap(map);
					directionsDisplay.setDirections(result);
					document.getElementById('progressSlider').style.display = "none";
					document.getElementById('mapmessage').innerHTML="";
		            document.getElementById('directionsControl').style.display = "block";
		            document.getElementById('directions').style.display = "block";
					document.getElementById('dirnError').innerHTML = "";
				} else {
					handleErrors(status);
				}
			});    		
		}
	}

	function handleErrors(status){
	   if (status == google.maps.DirectionsStatus.NOT_FOUND)
	   {
	   	 var fromAddress = document.getElementById('fromAddress').value;
	     document.getElementById('dirnError').innerHTML = "<div class='msg error'>\""+fromAddress+"\" is not found. Please check your spelling and try again</div>";
    	 document.getElementById('progressSlider').style.display = "none";
	   }
	   else if (status == google.maps.DirectionsStatus.UNKNOWN_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known");
	   else if (status == google.maps.DirectionsStatus.REQUEST_DENIED)
	     alert("The webpage is not allowed to use the directions service.");
	   else if (status == google.maps.DirectionsStatus.INVALID_REQUEST)
	     alert("A directions request could not be successfully parsed.");
	   else if (status == google.maps.DirectionsStatus.ZERO_RESULTS)
	   {
	   	 var fromAddress = document.getElementById('fromAddress').value;
	   	 var toAddress = document.getElementById('toAddress').value;
	     document.getElementById('dirnError').innerHTML = "<div class='msg error'>Driving directions are not available between \""+fromAddress+"\" and \""+toAddress+"\"</div>";
    	 document.getElementById('progressSlider').style.display = "none";
		}
	   else {
		   alert("An unknown error occurred.");
	   }
	   document.getElementById('directions').innerHTML = "";
	   directionsDisplay.setMap(null);
	}

	function showStatus(index, total){ //this function shows the "loading" status window
		setMapStatusMsg('loading park '+index+' of '+total+'...');
	}
	
	function closeStatus(){ //this function hides the "loading" status window
		closeMapStatusMsg();
		plotting = false;			
	}
	
	function setCoords(lng, lat, zm) {		
		centerlng = lng;
		centerlat = lat;
		zoom = zm;		
	} 	
	
	function setFacility(pkId, agCd) {		
		facility = pkId;		
		contractCode = agCd;		
	}
	
	function clickResult( id ) {	
		try {
			google.maps.event.trigger(results[id], 'click');
		} catch( err ){}
		
	}	
	
	function setHiddenCoords() {
		var center = map.getCenter();
	  	var bounds = map.getBounds();	  	
	  	var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();			
		document.reservationSearchForm['zoom'].value = map.getZoom();	
		document.reservationSearchForm['long'].value = center.lng();
		document.reservationSearchForm['lat'].value = center.lat();
		document.reservationSearchForm['minX'].value = southWest.lng();
		document.reservationSearchForm['maxX'].value = northEast.lng();
		document.reservationSearchForm['maxY'].value = northEast.lat();
		document.reservationSearchForm['minY'].value = southWest.lat();	
	}
	
	function getUrl(mapType) {			
		var center = map.getCenter();
	  	var zoomLevel = map.getZoom();	
	  	var bounds = map.getBounds();	
	  	var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();			
	  	var pageUri;  		
		if ("SEARCH" == mapType) {
			pageUri= "/generateSearchMap.do?pageOrigin=mapSearch&zoom=" + zoomLevel + "&map=" + mapType +"&long=" +  center.lng() + "&lat=" + center.lat();		
		} else if ("BROWSE" == mapType) { 	
			pageUri= "/generateBrowseMap.do?topTabIndex=CampgroundMap&pageOrigin=mapBrowse&zoom=" + zoomLevel + "&map=" + mapType +"&long=" + center.lng() + "&lat=" + center.lat();		
		} else if ("viewSEARCH" == mapType) {		
			pageUri= "/generateSearchMap.do?pageOrigin=mapSearch&zoom=" + zoomLevel + "&map=" + mapType +"&long=" +  center.lng() 
				+ "&lat=" + center.lat() + "&minX=" + southWest.lng() + "&minY=" + southWest.lat() + "&maxX=" + northEast.lng() + "&maxY=" + northEast.lat();		
		}
		window.location.href = pageUri;
		return;
	}	
	
	function getUrlPath(mapType) {			
		var center = map.getCenter();
	  	var zoomLevel = map.getZoom();	
	  	var bounds = map.getBounds();	
	  	var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();			
	  	var pageUri;
	  	  		
		if ("SEARCHAGAIN" == mapType) {
			pageUri= "/generateSearchMap.do";
			setHiddenCoords();
			document.reservationSearchForm['map'].value = "viewSEARCH";	
			document.reservationSearchForm['searchAgain'].value = "Y";
		} 
		return pageUri;
	}
		
	function showNoResultsFoundMessage() {
		if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
			document.getElementById('mapmessage').innerHTML = "<div class='msg error'>No matching campgrounds found in the viewing area.  Zoom out or pan and try again.</div>";			
		} else {
			document.getElementById('mapmessage').innerHTML = "<div class='msg error'>No campgrounds found in the viewing area.  Zoom out or pan and try again.</div>";							
		}
	}
	
	function showZoomInMessage(show) {
		if (show) {
			document.getElementById('mapmessage').innerHTML = "<div class='msg error'>Too many campgrounds to search at this zoom level.  Zoom in and try again.</div>";
		} else {
			document.getElementById('mapmessage').innerHTML = "";
		}
	}
	
	function showMapNotAvailableMessage() {
		document.getElementById("mapmessage").innerHTML = "<div class='msg error'><h2>Map not available!</h2></div>"; 
	} 
	
	function checkZoom() {
		document.getElementById('mapmessage').innerHTML = "";
		if(map.getZoom() <= minZoomLevel) {
			showZoomInMessage(true);
			return false;
		} else {
			return true;
		}
	}
	
	function changeState(selectedStateCode) {
		if (selectedStateCode != "") {
			var url = "/getParksForMap.do?start=getState&stateCode=" + selectedStateCode;		
			makeHttpRequest(url, function(data) {
				var xmlDoc = raParseXmlData(data);
			    var markers = xmlDoc.documentElement.getElementsByTagName("marker");	    			    			    	
			    if (markers.length == 0) {	   		
		 		   	document.getElementById("mapmessage").innerHTML = "<div class=\"component\"><h2>State not found!</h2></div>"; 	  	    	  			    			
	 		    } else if (markers.length > 0) {
		 		   if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
						map.setCenter(new google.maps.LatLng(markers[0].getAttribute("lat"), markers[0].getAttribute("lng")), map.getZoom());		
					} else {
						centerlng = markers[0].getAttribute("lng");					
						centerlat = markers[0].getAttribute("lat"); 
						zoom = defaultStateZoom;								
						map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);												
					}
				}																	   			 									    		  					    		  		   		    		    				    			
	    	}, false, false);					    	
		}
			
	}
	
	function changeLandmark(selectedLandmarkID) {	
		if (selectedLandmarkID != "") {			
			var url = "/getParksForMap.do?start=getLandmark&landmarkId=" + selectedLandmarkID;		
			makeHttpRequest(url, function(data) {
				var xmlDoc = raParseXmlData(data);
			    var markers = xmlDoc.documentElement.getElementsByTagName("marker");	    			    			    	
			    if (markers.length == 0) {	   		
		 		   	document.getElementById("mapmessage").innerHTML = "<div class=\"component\"><h2>Landmark not found!</h2></div>"; 	  	    	  			    			
		 	    } else if (markers.length > 0) {
			 	   if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
						map.setCenter(new google.maps.LatLng(markers[0].getAttribute("lat"), markers[0].getAttribute("lng")), map.getZoom());		
					} else {
						centerlng = markers[0].getAttribute("lng");					
						centerlat = markers[0].getAttribute("lat"); 
						zoom = defaultLandmarkZoom;								
						map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);												
					}
				}																				   			 									    		  					    		  		   		    		    				    			
		    }, false, false);				    
	    }
	}
	
	function changeLandmarkText(selectedLandmarkText, lat, lng) {	
		if (selectedLandmarkText != "" && lat != "" && lng != "") {			
			var url = "/getParksForMap.do?start=getLandmark&landmarkLat=" + lat + "&landmarkLng=" + lng + "&landmarkText=" + selectedLandmarkText;		
			makeHttpRequest(url, function(data) {
				var xmlDoc = raParseXmlData(data);
			    var markers = xmlDoc.documentElement.getElementsByTagName("marker");
			    document.getElementById("pstate").value="";
			    document.getElementById("pstate").selectedIndex = 0;	    			    			    	
			    if (markers.length == 0) {	   		
		 		   	document.getElementById("mapmessage").innerHTML = "<div class=\"component\"><h2>Landmark not found!</h2></div>"; 	  	    	  			    			
		 	    } else if (markers.length > 0) {
			 	   if ("usaSEARCH" == mapParam || "viewSEARCH" == mapParam) {	
						map.setCenter(new google.maps.LatLng(markers[0].getAttribute("lat"), markers[0].getAttribute("lng")), map.getZoom());		
					} else {
						centerlng = markers[0].getAttribute("lng");					
						centerlat = markers[0].getAttribute("lat"); 
						zoom = defaultLandmarkZoom;								
						map.setCenter(new google.maps.LatLng(centerlat, centerlng), zoom);												
					}
				}																				   			 									    		  					    		  		   		    		    				    			
		    }, false, false);				    
	    }
	}
	
	function MapStatusControl() {
		var container = document.createElement("div");
		var statusDiv = document.createElement("div");
		statusDiv.id = 'mapStatusMsg';
		statusDiv.style.width = "390px";
		statusDiv.style.backgroundColor = "#FAE5BA";
		statusDiv.style.font = "11px bold";
		statusDiv.style.fontFamily = "Arial,Helvetica,sans-serif";
		statusDiv.style.padding = "2px";
		statusDiv.style.marginBottom = "3px";
		statusDiv.style.textAlign = "center";
		statusDiv.style.display = "none";
		container.appendChild(statusDiv);
		container.index = 1;
		return container;
	}

	function setMapStatusMsg(msg){ //this function sets the map status message window
		if (document.getElementById('mapStatusMsg')) {
			document.getElementById('mapStatusMsg').innerHTML = msg;
			document.getElementById('mapStatusMsg').style.display = "block";
		}
	}

	function closeMapStatusMsg(){ //this function hides the status message window
		if (document.getElementById('mapStatusMsg')) {
			document.getElementById('mapStatusMsg').innerHTML = "";
			document.getElementById('mapStatusMsg').style.display = "none";
		}
	}
	
	function isELS_TRLSPark(contratCode)
	{
		return contratCode == CONTRAT_CODE_ELS || contratCode == CONTRAT_CODE_TRLS || contratCode == CONTRAT_CODE_KOA || contratCode == CONTRAT_CODE_CM;
	}
	
	function getELS_TRLSButton(contract, facility)
	{
		return "<a href='campgroundDetails.do?page=details&contractCode=" + contract + "&parkId=" + facility + "'" + " class='book now'>See Details</a>"; 
	}

	function possiblyClear(id)
	{
	  if(document.getElementById(id).value==startAddInstructions)
	    document.getElementById(id).value="";
	}

