
var map;
var markerManager;
var markers = [];
var markersHTML = { };
var agencies = { };
var geocoder = new GClientGeocoder();

var closest;
var nearby = [];
var centerOnNearest = false;
var circleOverlay = null;

var locdir = "Enter a city & state, or zip code, to begin your search";

document.observe("dom:loaded", function()
{
  if (GBrowserIsCompatible())
  {
    map = new GMap2(document.getElementById("map_canvas"));
    map.setCenter(new GLatLng(41.489167, -90.573056), 6);
    map.addControl(new GLargeMapControl());
    
    markerManager = new GMarkerManager(map, {maxZoom: 15});

    loading(true);
    
		GDownloadUrl("get-agency-list.rpc.php", function(data, status)
		{
			loading(false);

			if (status != 200)
			{
				alert("Unable to retrieve agency data.");
				return;
			}
			
			agencies = eval("(" + data + ")");
			
			for (var agency_num in agencies)
			{
				var agency = agencies[agency_num];
				
				var latlng = new GLatLng(agency.latitude, agency.longitude);
				agencies[agency_num].marker = new GMarker(latlng, {clickable: true});				
				
				agencies[agency_num].html = markersHTML[agency_num] = "<div style='line-height: 1.5;'>" + 
					"<b style='font-size: 120%;'>" + agency.agency_name + "</b><br />" +
					agency.city + ", " + agency.state + " " + agency.zip_code + "<br /><br />" +
					"Phone: " + agency.phone + "<br />" + 
					"Fax: " + agency.fax + "<br />" + 
					"<a href='mailto:" + agency.e_mail + "'>" + agency.e_mail + "</a><br />" + 
					(agency.web_site ? "Website: <a href='http://" + agency.web_site + "' target='_blank'>" + agency.web_site + "</a>" : "") + 
					"</div>";
					
				agencies[agency_num].marker.bindInfoWindowHtml(markersHTML[agency_num]);
				markers.push(agencies[agency_num].marker);
			}
			
			markerManager.addMarkers(markers, 8);
			markerManager.refresh();
			
		});
	}
	
	$('address').observe('focus', function()
	{
		if ($('address').value == locdir) $('address').value = "";
	});
	
	$('address').observe('blur', function()
	{
		if ($('address').value == "") $('address').value = locdir;
	});
	
	$('map-tab').observe('click', showMap);
	$('list-tab').observe('click', showList);
	$('address').value = locdir;
	
});

function loading(status)
{
	if (status)
	{
		var div = new Element("div", {id: "divLoader", style: "background-color: #000; color: #fff; position: absolute; top: 0; right: 0; padding: 4px 8px;"});
		div.appendChild(document.createTextNode("Please wait..."));
		div.appendChild(new Element("img", {src: "../images/loading.gif", width: "16", height: "16", alt: "spinner", align: "top", style: "margin-left: 8px;"}));
		$("canvas").appendChild(div);
	}
	else
	{
		$("divLoader").remove();
	}
}

function showMap()
{
	if (!$('map-tab').hasClassName("selected"))
	{
		$('map-tab').addClassName("selected");
		$("list-tab").removeClassName("selected");
		$('map_canvas').show();
		$('agents').hide();
		
		if (centerOnNearest)
		{
			centerOnNearest = false;
			if (closest)
			{
				map.setCenter(closest.marker.getLatLng(), 10);
				closest.marker.openInfoWindowHtml(closest.html);	
			}
		}
	}
}

function showList()
{
	if (!$('list-tab').hasClassName("selected"))
	{
		$('map-tab').removeClassName("selected");
		$("list-tab").addClassName("selected");
		$('map_canvas').hide();
		$('agents').show();
	}
}

function centerAgentOnMap(event)
{
	var o = event.element();
	
	if (o.nodeName == "A") return;
	else if (o.nodeName != "LI") o = o.up("li");
		
	centerOnNearest = false;

	showMap();
	
	var agency_num = /-(\d+)/.exec(o.id)[1];
	var agency = agencies[agency_num];
	if (!agency) return;
	
	map.setCenter(agency.marker.getLatLng(), 10);
	agency.marker.openInfoWindowHtml(agency.html);	
}

function deg2rad(deg)
{
	return deg * Math.PI / 180;
}

function calc_gc_distance(s, f)
{
	var d_omega = deg2rad(s.latitude - f.latitude);
	var d_lambda = deg2rad(s.longitude - f.longitude);
	
	var a = Math.sin(d_omega / 2);
	var b = Math.sin(d_lambda / 2);
	
	return 2 * Math.asin(Math.sqrt(a * a + Math.cos(deg2rad(s.latitude)) * Math.cos(deg2rad(s.latitude)) * b * b)) * 3958.76;
}

function findNearestAgents(address)
{
	if ($("divLoader")) return;
	var radius = $("miles").value || 50;      
	var limit = $("miles").value ? 100 : 10;

	loading(true);
	geocoder.getLatLng(address, function(latlng)
	{
		loading(false);
		if (!latlng)
		{
			alert("Unable to locate address.");
			return false;
		}
		
		var point = {latitude: latlng.lat(), longitude: latlng.lng() };
		
		closest = null;
		nearby = [];
			
		for (var agency_num in agencies)
		{
			var agency = agencies[agency_num];
			
			agency.miles = calc_gc_distance(point, agency);
			
			if (!closest || agency.miles < closest.miles)
			{
				closest = agency;
			}
			
			if (agency.miles < radius)
				nearby.push(agency);
		}
		
		if (!nearby.length)
		{
			nearby.push(closest);
			alert("No agency was found within " + radius + " miles of the location.\nThe closest one will be shown.");
		}
		
		nearby.sort(function(a, b) 
		{
			var diff =  a.miles - b.miles;
			if (diff != 0) return diff;
			
			return (a.agency_name < b.agency_name) ? -1 : 1;
			
		});

		if (nearby.length > limit)
		{
			nearby.length = limit;
			radius = nearby[limit - 1].miles + 0.01;
		}
		
		$("list-tab").update("List (" + nearby.length + ")");

		var bounds = new GLatLngBounds();
		nearby.each(function(agency)
		{
			bounds.extend(new GLatLng(agency.latitude, agency.longitude));
		});

		var zoom = map.getBoundsZoomLevel(bounds);
		if (zoom < 8) zoom = 8;
		else if (zoom > 11) zoom = 11;
		map.setCenter(bounds.getCenter(), zoom);

		if (circleOverlay) map.removeOverlay(circleOverlay);

		circleOverlay = new CircleOverlay(latlng, radius, "#336699", 1, 1, '#336699', 0.25);
		map.addOverlay(circleOverlay);
		
//		map.setCenter(closest.marker.getLatLng(), 10);

//		if (nearby.length == 1 || calc_gc_distance(nearby[1], nearby[0]) > 4.5)
//			closest.marker.openInfoWindowHtml.bind(closest.marker).defer(closest.html);
		
		var ul = document.getElementById("agent-list");
		if (ul) ul.parentNode.removeChild(ul);
		
		ul = document.createElement("ul");
		ul.id = "agent-list";
		ul.style.padding = "0";
		ul.style.margin = "0";
		ul.style.listStyleType = "none";
		
		nearby.each(function(agency)
		{
			var li = new Element("li");
			li.id = "agent-" + agency.agency_num;
			li.style.margin = "0 0 8px 0";
			li.style.cursor = "pointer";
			li.observe('click', centerAgentOnMap.bindAsEventListener());
					
			li.innerHTML = "<h1>" + agency.agency_name + " <span>(" + (Math.round(agency.miles * 100) / 100) + "&nbsp;miles)</span></h1>" +
				"<div>" +
				agency.city + ", " + agency.state + " " + agency.zip_code + "<br />" +
				agency.county + " County<br />" +
				agency.phone + " Fax: " + agency.fax + "<br />" +
				"<a href='mailto:" + agency.e_mail + "'>" + agency.e_mail + "</a><br />" +
				(agency.web_site ? "Website: <a href='http://" + agency.web_site + "' target='_blank'>" + agency.web_site + "</a>" : "") + 
				"</div>";
			
			ul.appendChild(li);
		});
		
		$("agents").appendChild(ul);
		
		$("agents").scrollTop = 0;
		
		centerOnNearest = $("list-tab").hasClassName("selected");
		
	});
}

