function WindowSize(){
	var x,y;
	if(self.innerHeight){
		x=self.innerWidth;
		y=self.innerHeight;
	} else {
		if(document.documentElement&&document.documentElement.clientHeight){
			x=document.documentElement.clientWidth;
			y=document.documentElement.clientHeight;
		} else {
			if(document.body){
				x=document.body.clientWidth;
				y=document.body.clientHeight;
			}
		}
	}
	this.x=x;
	this.y=y;
}
WindowSize.prototype.getX=function(){
	return this.x;
};
WindowSize.prototype.getY=function(){
	return this.y;
};

function mapRecord(title, divID, coursesHref, tabID, tabSelected, tabAvailable) {
	this.title = title;
	this.divID = divID;
	this.coursesHref = coursesHref;
	this.tabID = tabID;
	this.tabSelected = tabSelected;
	this.tabAvailable = tabAvailable;
}

if (!(GBrowserIsCompatible())) {
    alert("Sorry, the Google Maps API is not compatible with this browser");
} else {
	//var validMaps = new Array("directions","courses","info","5k","frosh","modified");
	var defaultMap = "directions";
	var mapRecords = new Array();
	var course = [];
	mapRecords["directions"] = new mapRecord( 
        "Directions - " + titleBase,
		"contentdirections",
		"#courses",
		"navlinkdirections",
		"navitemhi",
		"navitem"
		);
	mapRecords["courses"] = new mapRecord(
		"5k Course Map - " + titleBase,
		"contentcourses",
		"#5k",
		"navlinkcourses",
		"navitemhi",
		"navitem"
		);
	mapRecords["5k"] = new mapRecord( 
		"5K Course Map - " + titleBase,
		"content5k",
		"#5k",
		"navlink5k",
		"navitemhi subnav",
		"navitem"
		);
	mapRecords["modified"] = new mapRecord(
		"Modified Course Map - " + titleBase,
		"contentmodified",
		"#modified",
		"navlinkmodified",
		"navitemhi subnav",
		"navitem"
		);
	mapRecords["info"] = new mapRecord(
		"Points of Interest - " + titleBase,
		"contentinfo",
		"#courses",
		"navlinkinfo",
		"navitemhi",
		"navitem"
		);
	var map = new GMap2(document.getElementById("map"));
	
	var mapIcons = new Array();
	mapIcons["info"] = new GIcon();
	mapIcons["info"].image = "/images/gicon_info.png";
	mapIcons["info"].iconSize = new GSize(20, 32);
	mapIcons["info"].shadow = "/images/gicon_shadow.png";
	mapIcons["info"].shadowSize = new GSize(51, 33);
	mapIcons["info"].iconAnchor = new GPoint(2, 32);
	mapIcons["info"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["aid"] = new GIcon();
	mapIcons["aid"].image = "/images/gicon_aid.png";
	mapIcons["aid"].iconSize = new GSize(20, 32);
	mapIcons["aid"].shadow = "/images/gicon_shadow.png";
	mapIcons["aid"].shadowSize = new GSize(51, 33);
	mapIcons["aid"].iconAnchor = new GPoint(2, 32);
	mapIcons["aid"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["apple"] = new GIcon();
	mapIcons["apple"].image = "/images/gicon_apple.png";
	mapIcons["apple"].iconSize = new GSize(20, 32);
	mapIcons["apple"].shadow = "/images/gicon_shadow.png";
	mapIcons["apple"].shadowSize = new GSize(51, 33);
	mapIcons["apple"].iconAnchor = new GPoint(2, 32);
	mapIcons["apple"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["band"] = new GIcon();
	mapIcons["band"].image = "/images/gicon_band.png";
	mapIcons["band"].iconSize = new GSize(20, 32);
	mapIcons["band"].shadow = "/images/gicon_shadow.png";
	mapIcons["band"].shadowSize = new GSize(51, 33);
	mapIcons["band"].iconAnchor = new GPoint(2, 32);
	mapIcons["band"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["food"] = new GIcon();
	mapIcons["food"].image = "/images/gicon_food.png";
	mapIcons["food"].iconSize = new GSize(20, 32);
	mapIcons["food"].shadow = "/images/gicon_shadow.png";
	mapIcons["food"].shadowSize = new GSize(51, 33);
	mapIcons["food"].iconAnchor = new GPoint(2, 32);
	mapIcons["food"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["parking"] = new GIcon();
	mapIcons["parking"].image = "/images/gicon_parking.png";
	mapIcons["parking"].iconSize = new GSize(20, 32);
	mapIcons["parking"].shadow = "/images/gicon_shadow.png";
	mapIcons["parking"].shadowSize = new GSize(51, 33);
	mapIcons["parking"].iconAnchor = new GPoint(2, 32);
	mapIcons["parking"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["rest"] = new GIcon();
	mapIcons["rest"].image = "/images/gicon_rest.png";
	mapIcons["rest"].iconSize = new GSize(20, 32);
	mapIcons["rest"].shadow = "/images/gicon_shadow.png";
	mapIcons["rest"].shadowSize = new GSize(51, 33);
	mapIcons["rest"].iconAnchor = new GPoint(2, 32);
	mapIcons["rest"].infoWindowAnchor = new GPoint(11, 1);
	mapIcons["tent"] = new GIcon();
	mapIcons["tent"].image = "/images/gicon_tent.png";
	mapIcons["tent"].iconSize = new GSize(20, 32);
	mapIcons["tent"].shadow = "/images/gicon_shadow.png";
	mapIcons["tent"].shadowSize = new GSize(51, 33);
	mapIcons["tent"].iconAnchor = new GPoint(2, 32);
	mapIcons["tent"].infoWindowAnchor = new GPoint(11, 1);
	  
    map.setCenter(new GLatLng(43.081113477214636, -75.2039909362793), 19);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.setMapType(G_HYBRID_MAP);
	new GKeyboardHandler(map);
	var defaultTourZoom=17;
	var defaultInfoZoom=18;

	var wSize = new WindowSize;
	var map_x = wSize.getX()-306;
	var map_y = wSize.getY()-200;
	if (map_y<550) {map_y=550;}
	// adjust variable for the height of the control panel content area.  Remove height of the banner and tabs
	var map_y_adjusted = map_y - 60 - document.getElementById("map_nav").offsetHeight;
	var controlhtml = "";
	var gmarkers = [];
	var htmls = [];
	var markersidx = 0;
/*	var controlhtml = "<p>Test</p>";
	controlhtml += "<p>Test 2</p>";
	controlhtml += "<ol>";
	for (var i = 1; i<=50;i++) {
		controlhtml += "<li>Step " + i + "</li>";
	}
	controlhtml += "</ol>";
	document.getElementById("coursehtml").innerHTML = controlhtml;
*/
//	document.getElementById("map").style.width=map_x+"px";
	document.getElementById("map").style.height=map_y+"px";
	document.getElementById("controlpanel").style.height=map_y+"px";
	document.getElementById("controlcontent").style.height=map_y_adjusted+"px";
//	alert(document.getElementById("map_nav").offsetHeight);
//	alert("testme" + document.getElementById("testme").offsetHeight);
	if (GetCookie("lastview")==null) {
		document.getElementById("navlinkback").href = "/index.html";
	} else {
		document.getElementById("navlinkback").href = GetCookie("lastview");
	}
	
	function mapFromURL() {
		var urlString = unescape(window.location);
		if (urlString.indexOf("#")==-1) {return "";}
		return urlString.substr(urlString.indexOf("#")+1, urlString.length);
	}
	
	function isValidMap( choice ) {
		var x;
		for (x in mapRecords) {
			if (x==choice) {return true;}
		}
		return false;
	}
	
//	function updateTabs(whichMap) {
	function doMap(whichMap) {
//		alert("drawing a map for " + whichMap);
		if (whichMap==null) { whichMap=mapFromURL(); }
		if (!(isValidMap(whichMap))) {whichMap = defaultMap;}
		document.title = mapRecords[whichMap].title;
		//alert("setting courses link to " + mapRecords[whichMap].coursesHref);
		//alert("whichMap is " + whichMap);
		for (x in mapRecords) {
			if (x==whichMap) {
				document.getElementById(mapRecords[x].divID).style.display="block";
				document.getElementById(mapRecords[x].tabID).className=mapRecords[x].tabSelected;
			} else {
				document.getElementById(mapRecords[x].divID).style.display="none";
				document.getElementById(mapRecords[x].tabID).className=mapRecords[x].tabAvailable;
			}
		}
		//alert("Setting courses tab to " + mapRecords[whichMap].coursesHref);
		//document.getElementById(mapRecords["courses"].tabID).href = mapRecords[whichMap].coursesHref;
		if (whichMap=="5k"||whichMap=="modified") {
			document.getElementById("contentcourses").style.display="block";
			document.getElementById("tour").style.display="block";
			document.getElementById("adobereq").style.display="block";
			document.getElementById(mapRecords["courses"].tabID).className=mapRecords["courses"].tabSelected;
		}
		if (whichMap=="courses") {
			document.getElementById("content5k").style.display = "block";
			document.getElementById("tour").style.display="block";
			document.getElementById("adobereq").style.display="block";
			document.getElementById(mapRecords["5k"].tabID).className = mapRecords["5k"].tabSelected;
		}
		if (whichMap=="directions") {
			document.getElementById("tour").style.display="none";
			document.getElementById("adobereq").style.display="none";
		}
		if (whichMap=="info") {
			document.getElementById("tour").style.display="none";
			document.getElementById("adobereq").style.display="block";
		}
//		alert("Tour id style.display is " + document.getElementById("tour").style.display);
		if (whichMap=="5k"||whichMap=="modified") {
			drawCourse(whichMap);
		}else if (whichMap=="courses") {
			drawCourse("5k");
		}else if (whichMap=="directions") {
			drawDirections(whichMap);
		}else{
			drawInfo(whichMap);
		}

	}
	
    // A function to create the marker and set up the event window
	function createMarker(point,name,iconType) {
//		if ((iconType==undefined)||(iconType==null)) {
		if (iconType==null) {
			var marker = new GMarker(point);
//			alert("GMap icon for " + name);
		}else{
			var marker = new GMarker(point,mapIcons[iconType]);
//			alert("local icon for " + iconType);
		}
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(name);
		});
		// save the info we need to use later for the sidebar
		gmarkers[markersidx] = marker;
		htmls[markersidx] = name;
		// add a line to the sidebar html
//		alert('<a href="javascript:myclick(' + markersidx + ')">' + name + '</a><br>');
//		controlhtml += '<a href="javascript:myclick(' + markersidx + ')">' + name + '</a><br>';
		markersidx++;
		return marker;
	}
	
	// This function picks up the click and opens the corresponding info window
	function myclick(i) {
		//map.setCenter(gmarkers[i].getPoint());
		map.panTo(gmarkers[i].getPoint());
		gmarkers[i].openInfoWindowHtml(htmls[i]);
		var tourstep = 0;
		if (i<(gmarkers.length-1)) {
			tourstep = i + 1;
		} else {
			tourstep = gmarkers.length-1;
		}
		document.getElementById("tourNext").attributes["onclick"].value = "myclick("+tourstep+");";
		if (i<1) {
			tourstep = 0;
		} else {
			tourstep = i - 1;
		}
		document.getElementById("tourPrev").attributes["onclick"].value = "myclick("+tourstep+");";
		map.setZoom(defaultTourZoom);
	}
	
	function infoclick(i) {
		//map.setCenter(gmarkers[i].getPoint());
		map.panTo(gmarkers[i].getPoint());
		gmarkers[i].openInfoWindowHtml(htmls[i]);
		map.setZoom(defaultInfoZoom);
	}
	
	function drawCourse(course) {
		// Add a polyline for a course
		var req = GXmlHttp.create();
		var courseXML = course+".xml";
		var urchinURL = "maps/"+course;
		var bounds = new GLatLngBounds();
		map.setZoom(16);
		map.clearOverlays();
		gmarkers = null;
		gmarkers = [];
		markersidx=0;
//		htmls = null;
		htmls = [];
		controlhtml = "";
//		alert("htmls: " + htmls);
		map.setCenter(new GLatLng(43.081113477214636, -75.2039909362793), 19);
		map.setMapType(G_SATELLITE_MAP);
//		urchinTracker(urchinURL);
		req.open("GET",courseXML,true);
		req.onreadystatechange = function() {
			if (req.readyState==4) {
				var xmlDoc = req.responseXML;
				var coursePoints = [];
				var startBoxPoints = [];
				var startLinePoints = [];
				var xmlDocPoints = xmlDoc.documentElement.getElementsByTagName("point");
				var xmlDocLines = xmlDoc.documentElement.getElementsByTagName("line");
				var xmlDocBox = xmlDoc.documentElement.getElementsByTagName("box");
				for (var i=0; i<xmlDocPoints.length; i++) {
					var lat = parseFloat(xmlDocPoints[i].getAttribute("lat"));
					var lng = parseFloat(xmlDocPoints[i].getAttribute("lng"));
					var ll = new GLatLng(lat,lng);
					bounds.extend(ll);
					var point = new GPoint(parseFloat(xmlDocPoints[i].getAttribute("lng")),
	                	parseFloat(xmlDocPoints[i].getAttribute("lat")));
					coursePoints.push(point);
				}
				for (i=0; i<xmlDocBox.length; i++) {
					var point = new GPoint(parseFloat(xmlDocBox[i].getAttribute("lng")),
	                	parseFloat(xmlDocBox[i].getAttribute("lat")));
					startBoxPoints.push(point);
				}
				for (i=0; i<xmlDocLines.length; i++) {
					var point = new GPoint(parseFloat(xmlDocLines[i].getAttribute("lng")),
	                	parseFloat(xmlDocLines[i].getAttribute("lat")));
					startLinePoints.push(point);
				}
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
					var lat = parseFloat(markers[i].getAttribute("lat"));
					var lng = parseFloat(markers[i].getAttribute("lng"));
					var point = new GLatLng(lat,lng);
					var label = markers[i].getAttribute("label");
//					alert("Point #: \"" + i + "; label: \"" + label + "\"");
					var marker = createMarker(point,label,null);
					map.addOverlay(marker);
				}
				document.getElementById("coursehtml").innerHTML = controlhtml;
				
				document.getElementById("tourReset").attributes["onclick"].value = "doMap('"+course+"');";
				document.getElementById("tourStart").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourPrev").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourNext").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourEnd").attributes["onclick"].value = "myclick("+(markers.length-1)+");";
				
				course=coursePoints;
				map.setZoom(map.getBoundsZoomLevel(bounds));
				//map.setCenter(bounds.getCenter());
				var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
				var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
				map.setCenter(new GLatLng(clat,clng));
//				map.setCenter(new GLatLng(course[0].y,course[0].x),14);
				map.addOverlay(new GPolyline(startBoxPoints,"#000000",6,0));
				map.addOverlay(new GPolyline(startBoxPoints,"#FFFF00",2,1));
				map.addOverlay(new GPolyline(coursePoints,"#000000",6,0));
				map.addOverlay(new GPolyline(coursePoints,"#FFFF00",2,1));
				map.addOverlay(new GPolyline(startLinePoints,"#000000",6,0));
				map.addOverlay(new GPolyline(startLinePoints,"#FFFFFF",2,1));
			}
		};
		req.send(null);
		return false;
		//var points = [];
		//for (var i = 0; i < 5; i++) {
			//points.push(new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()));
		//}
		//map.addOverlay(new GPolyline(points));
	}

	function drawInfo(course) {
		var req = GXmlHttp.create();
		var courseXML = course+".xml";
		var urchinURL = "maps/"+course;
		var bounds = new GLatLngBounds();
		map.setZoom(16);
		map.clearOverlays();
		gmarkers = null;
		gmarkers = [];
		markersidx=0;
//		htmls = null;
		htmls = [];
		controlhtml = "";
//		alert("htmls: " + htmls);
		map.setCenter(new GLatLng(43.081113477214636, -75.2039909362793), 19);
		map.setMapType(G_HYBRID_MAP);
//		urchinTracker(urchinURL);
		req.open("GET",courseXML,true);
		req.onreadystatechange = function() {
			if (req.readyState==4) {
				var xmlDoc = req.responseXML;
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
					var lat = parseFloat(markers[i].getAttribute("lat"));
					var lng = parseFloat(markers[i].getAttribute("lng"));
					var icon = markers[i].getAttribute("type");
					var point = new GLatLng(lat,lng);
					var label = markers[i].getAttribute("label");
//					alert("Point #: \"" + i + "; label: \"" + label + "\"");
					var marker = createMarker(point,label,icon);
					map.addOverlay(marker);
					var ll = new GLatLng(lat,lng);
					bounds.extend(ll);
				}
				document.getElementById("coursehtml").innerHTML = controlhtml;
				
				document.getElementById("tourReset").attributes["onclick"].value = "doMap('"+course+"');";
				document.getElementById("tourStart").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourPrev").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourNext").attributes["onclick"].value = "myclick(0);";
				document.getElementById("tourEnd").attributes["onclick"].value = "myclick("+(markers.length-1)+");";
				
				map.setZoom(map.getBoundsZoomLevel(bounds));
				//map.setCenter(bounds.getCenter());
				var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
				var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
				map.setCenter(new GLatLng(clat,clng));
			}
		};
		req.send(null);
		return false;
		//var points = [];
		//for (var i = 0; i < 5; i++) {
			//points.push(new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()));
		//}
		//map.addOverlay(new GPolyline(points));
	}

	function drawDirections(course) {
		var req = GXmlHttp.create();
		var courseXML = course+".xml";
		var urchinURL = "maps/"+course;
		var bounds = new GLatLngBounds();
		map.clearOverlays();
		gmarkers = null;
		gmarkers = [];
		markersidx=0;
//		htmls = null;
		htmls = [];
		controlhtml = "";
//		alert("htmls: " + htmls);
		map.setCenter(new GLatLng(43.081113477214636, -75.2039909362793), 19);
		map.setMapType(G_HYBRID_MAP);
		map.setZoom(16);
		urchinTracker(urchinURL);
		req.open("GET",courseXML,true);
		req.onreadystatechange = function() {
			if (req.readyState==4) {
				var xmlDoc = req.responseXML;
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
					var lat = parseFloat(markers[i].getAttribute("lat"));
					var lng = parseFloat(markers[i].getAttribute("lng"));
					var point = new GLatLng(lat,lng);
					var label = markers[i].getAttribute("label");
//					alert("Point #: \"" + i + "; label: \"" + label + "\"");
					var marker = createMarker(point,label,null);
					map.addOverlay(marker);
				}
				document.getElementById("coursehtml").innerHTML = controlhtml;
//				document.getElementById("tour").innerHTML = controlhtml;
				
				//map.setCenter(gmarkers[i].getPoint());
				map.panTo(gmarkers[0].getPoint());
				gmarkers[0].openInfoWindowHtml(htmls[0]);
			}
		};
		req.send(null);
		return false;
		//var points = [];
		//for (var i = 0; i < 5; i++) {
			//points.push(new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()));
		//}
		//map.addOverlay(new GPolyline(points));
	}

	doMap(mapFromURL());

}

