window.onunload = function() {
	GUnload();
}

function load() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		directionsPanel = document.getElementById("directions");
  	  	geocoder = new GClientGeocoder();
		fromName = "";
		toName = "";
		
		//build marker array
		markers = new Array();

		map.addControl(new GLargeMapControl());
	   map.addControl(new GMapTypeControl());
		//map.enableScrollWheelZoom();
	   map.setCenter(new GLatLng(42.281627, -83.748436), 13);
		var point  = new GLatLng(42.281627, -83.748436);
		var info = "Ann Arbor, MI";
		//var marker = new GMarker(point, markerOptions);
		//map.addOverlay(marker);
		map.addOverlay(createMarker(point, info));
		//marker.openInfoWindowHtml(info);
		markers[0].openInfoWindowHtml(info);
		
		directions = new GDirections(map, directionsPanel);
		GEvent.addListener(directions, "load", onGDirectionsLoad);
		GEvent.addListener(directions, "addoverlay", setPreferredHeaders);
		GEvent.addListener(directions, "error", handleErrors);
		//GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", wheelEvent); //Prevent page scroll while zooming in map with scroll wheel
		//map.getContainer().onmousewheel = wheelEvent; //Prevent page scroll while zooming in map with scroll wheel
		
		
		
	}
}

function createMarker(point, info) {
	//Create custom icon
	var baseIcon = new GIcon();
	//baseIcon.shadow = "";
	baseIcon.image = "http://www.umich.edu/~info/images/iconCicSign.png";
	baseIcon.iconSize = new GSize(30,50);
	baseIcon.iconAnchor = new GPoint(16,50);
	baseIcon.infoWindowAnchor = new GPoint(15, 5);
	markerOptions = {icon:baseIcon};
	
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(info);
	});	
	
	markers.push(marker);
	
	return marker;
}


//Prevent page scroll while zooming in map with scroll wheel
function wheelEvent(e) {
	if (!e){
		e = window.event
	}
	if (e.preventDefault){
		e.preventDefault()
	}
	e.returnValue = false;
}

function getDirections() {
	var fromAddress, toAddress;
	map.clearOverlays();
	
	var userFromInput = document.getElementById('from');
	var userFromSelect = document.form_directions.fromBuilding;
	var userToInput = document.getElementById('to');
	var userToSelect = document.form_directions.toBuilding;
	var userDestSelect = document.form_directions.commonDest;
	
	var errorDiv = document.getElementById('error');
	errorDiv = "";
	
	if((userFromSelect.value == "initial") && (userFromInput.value == "")) {
		errorDiv.innerHTML = "Please enter a starting address OR select a starting building";
		return false;
	}
	else if (userFromSelect.value == "initial") {
		fromAddress = userFromInput.value;
		fromName = fromAddress;
		fromDisplayAddress = fromAddress;
	}
	else {
		
		fromName = userFromSelect.options[userFromSelect.selectedIndex].innerHTML;
		
		/*To/From drop down info in the following form (geocodeLat,geocodeLng|Address)*/
		var temp = userFromSelect.value;
		temp = temp.split("|");
		//fromAddress = userFromSelect.value;
		fromAddress = temp[0];
		fromDisplayAddress = temp[1];

	}
	
	if((userToSelect.value == "initial") && (userToInput.value == "") && (userDestSelect == "initial")) {
		errorDiv.innerHTML = "Please enter a destination address OR select a destination building";
		return false;
	}
	else if (userDestSelect.value != "initial") {
		toAddress = userDestSelect.value;
		toName = userDestSelect.options[userDestSelect.selectedIndex].innerHTML;
		toDisplayAddress = userDestSelect.value;
	}
	else if (userToSelect.value != "initial") {
		//toAddress = userToSelect.value;
		toName = userToSelect.options[userToSelect.selectedIndex].innerHTML;
		
		// To-From drop down info in the following form (geocodeLat,geocodeLng|Address)
		var temp = userToSelect.value;
		temp = temp.split("|");
		toAddress = temp[0];
		toDisplayAddress = temp[1];
	}
	else {
		toAddress = userToInput.value;
		toName = toAddress;
		toDisplayAddress = toAddress;
	} 
	
	setDirections(fromAddress, toAddress);
	setCurrentInfo();
}

function setDirections(fromAddress, toAddress) {
	directions.load("from: " + fromAddress + " to: " + toAddress);
	GEvent.addListener(directions, "load", markerProcess);
	GEvent.addListener(directions, "addoverlay", hideDirMarkers)
	markers.pop();
}

function markerProcess() {
	//var startPoint = new GLatLng(directions.getMarker(0), directions.getMarker(0));
	//var startPoint = new GLatLng(directions.getMarker(0).X.y, directions.getMarker(0).X.x);
	var startPoint = new GLatLng(directions.getMarker(0).getPoint().y, directions.getMarker(0).getPoint().x);
	//var endPoint = new GLatLng(directions.getMarker(1), directions.getMarker(1));
	//var endPoint = new GLatLng(directions.getMarker(1).X.y, directions.getMarker(1).X.x);
	var endPoint = new GLatLng(directions.getMarker(1).getPoint().y, directions.getMarker(0).getPoint().x);
	
	map.addOverlay(createDirMarker(startPoint, "start"));
	map.addOverlay(createDirMarker(endPoint, "end"));
}

function hideDirMarkers() {
	directions.getMarker(0).hide();
	directions.getMarker(1).hide();
}

function createDirMarker(point, type) {
	//Create custom icon
	var baseIcon = new GIcon();
	//baseIcon.shadow = "";
	if(type == "start")
		baseIcon.image = "http://www.umich.edu/~info/images/iconDirStart.png";
	else
		baseIcon.image = "http://www.umich.edu/~info/images/iconDirStop.png";
	baseIcon.iconSize = new GSize(30,50);
	baseIcon.iconAnchor = new GPoint(16,50);
	baseIcon.infoWindowAnchor = new GPoint(15, 5);
	markerOptions = {icon:baseIcon};
	
	var marker = new GMarker(point, markerOptions);	
		
	return marker;
}


function setPreferredHeaders() {
	document.getElementsByTagName('tbody')[0].childNodes[0].childNodes[1].innerHTML = fromName;
	document.getElementsByTagName('tbody')[2].childNodes[0].childNodes[1].innerHTML = toName;
	document.getElementsByTagName('tbody')[0].childNodes[0].childNodes[0].innerHTML = "<img src='http://www.umich.edu/~info/images/iconDirStart.png'>";
	document.getElementsByTagName('tbody')[2].childNodes[0].childNodes[0].innerHTML = "<img src='http://www.umich.edu/~info/images/iconDirStop.png'>";
}


function setCurrentInfo() {
	$('currentStart').style.display = "none";
	$('currentFrom').innerHTML = fromName + "<br />" + fromDisplayAddress;
	$('currentTo').innerHTML = toName + "<br />" + toDisplayAddress;
	$('currentDirections').style.display = "block";
}


function getPoint(address, dest, isGeo) {
	map.clearOverlays();
	directions.clear();
	resetCurrent();
	
	globalAddress = address;
	
	var directionText = "<ul><li><a onclick='slider.slideIn(); populate(&quot;to&quot;)'>Get directions to here</a></li><li><a onclick='slider.slideIn(); populate(&quot;from&quot;)'>Get directions from here</a></li></ul>";
	
	geocoder.getLatLng(address,
		function(point)  {
			map.setCenter(point, 16);
			if(isGeo == 0)
				var info = dest + "<br />" + address;
			else
				info = dest;
			var completeInfo = info + "<br /><br />" + directionText;
			
			map.addOverlay(createMarker(point, completeInfo, 'open'));
			var last = markers.length - 1;
			markers[last].openInfoWindowHtml(completeInfo);
			$('currentStart').style.display = "none";
			$('currentPoint').innerHTML = info;
			$('currentPoint').style.display = "block";
		}
	);
}

function populate(direction) {
	resetDirectionSelect();	
	
	var toBox = $('to');
	var fromBox = $('from');
	
	
	if(direction == "to") {
		toBox.value = globalAddress;
		fromBox.value = "";
	}
	else {
		fromBox.value = globalAddress;
		toBox.value = "";
	}
}

function resetDirectionSelect() {
	var selects = $$('#directionSelect select');
	var arLen = selects.length;
	for(var i = 0; i < arLen; i++) {
		selects[i].options.selectedIndex = 0;
	}
}

function resetCurrent() {
	$('currentStart').style.display = "block";
	$('currentDirections').style.display = "none";
	$('currentPoint').style.display = "none";
	$('currentPoint').innerHTML = "";
}

function resetMap() {
	map.clearOverlays();
	directions.clear();
	resetCurrent();
	resetDirectionSelect();
	
	map.setCenter(new GLatLng(42.281627, -83.748436), 13);
	var point  = new GLatLng(42.281627, -83.748436);
	var info = "Ann Arbor, MI";
	//var marker = new GMarker(point);
	//map.addOverlay(marker);
	//marker.openInfoWindowHtml(info);	
	map.addOverlay(createMarker(point, info));
		//marker.openInfoWindowHtml(info);
	markers[0].openInfoWindowHtml(info);
}

function printMap() {
	url = "css/mapPrint.cfm?from=" + printFrom + "&to=" + printTo;
	
	window.open(url);
}
 
function handleErrors(){
if (directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
  alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.  Please try being more specific or a different address\nError code: " + directions.getStatus().code);
else if (directions.getStatus().code == G_GEO_SERVER_ERROR)
  alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + directions.getStatus().code);

else if (directions.getStatus().code == G_GEO_MISSING_QUERY)
  alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + directions.getStatus().code);

//   else if (directions.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + directions.getStatus().code);
  
else if (directions.getStatus().code == G_GEO_BAD_KEY)
  alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + directions.getStatus().code);

else if (directions.getStatus().code == G_GEO_BAD_REQUEST)
  alert("A directions request could not be successfully parsed.\n Error code: " + directions.getStatus().code);
 
else alert("An unknown error occurred.");

}

function onGDirectionsLoad(){ 
	 // Use this function to access information about the latest load()
	 // results.

	 // e.g.
	// document.getElementById("getStatus").innerHTML = directions.getStatus().code;
	// and yada yada yada...
}


