var http;

var blue;

var agents;
var locations;
var centerPoint;
var selectedAgent;
var selectedAddress;
var map;

function selectAgent(id)
{
	var div;
	if ( selectedAgent != -1 )
	{
		div = document.getElementById("agent" + selectedAgent);
		div.style.backgroundColor = "#FFFFFF";
	}
	selectedAgent = id;	

	div = document.getElementById("agent" + id);
	div.style.backgroundColor = "#FFF9EE";
	div.scrollIntoView();	


	agents[id].marker.openInfoWindow( agents[id].markerText );

}

function getTextForAgent(agent)
{
	var text = new Array();
	text.push("<div class='agent' id='agent" + agent.id + "' + onclick='selectAgent(" + agent.id + ")'>");
	text.push("<p class='agn'>" + agent.name );
	text.push("<p class='aga'>" + agent.address );
	text.push("<br>" + agent.city.toUpperCase() + ", " + agent.state + " " + agent.zip );
	var agentAddress = agent.address + " " + agent.city + ", " + agent.state + " " + agent.zip;
	text.push("<br><a href=\"http://maps.google.com/maps?f=d&hl=en&saddr=" + escape(selectedAddress) + "&daddr=" + escape(agentAddress) + "\" target=\"_blank\">Get Directions</a>");
	text.push("<p class='agp'><span class='ph'>" + agent.phone + "</span>");
	if ( agent.website != "" )
		text.push("&nbsp;&nbsp;&nbsp;<a href='" + agent.website + "' target='_blank'>website</a>");
	text.push("<p class='agb'>" + agent.agencies );
	var d = Math.round(agent.distance*100)/100 
	text.push("<p class='agd'>" + d + " miles distant" );
	text.push("</div>");
	return text.join("");
}


function readAgents() 
{
	var response;

	if (http.readyState == 4)
	{
		response = http.responseText;	
	}
	else return;

	var lines = response.split("\r\n");
	agents = new Array();

	if ( lines[0] != "200" )
	{
		var results = document.getElementById("results");
		results.innerHTML = "";
	
		var d = document.getElementById("status");
		d.innerHTML = lines[1] + "<p>Try scrolling or contracting the map, and then click <input type='button' onclick='populateAgents()' value='Find All Agents in Map Area'>";
		return;
	}


	for (i=1; i<lines.length; i++)
	{
		var line = lines[i];
		line = line.replace(/^\s+|\s+$/, '');
		if ( line.length ==  0 )
			continue;
		var agent = new Agent(line);
		agent.calcDistance();
		agents.push(agent);
	}

	if ( agents.length <= 0 )
	{
		var results = document.getElementById("results");
		results.innerHTML = "";
	}
	else
	{
		agents.sort(sortAgentsByLocation);

		locations = new Array();
	
		var loc = new Array();
		var key = "";
		var a;

		var results = document.getElementById("results");
		var html = new Array();

		for (i=0; i<agents.length; i++)
		{
			var a = agents[i];
			a.id = i;
			html.push( getTextForAgent(a) );
			var tkey = a.lat + "," + a.lon 
			if ( tkey != key )
			{
				if ( loc.length != 0 )
					locations.push(loc);
				key = tkey;
				loc = new Array();
			}
			loc.push(a);
		}
		locations.push(loc);
		results.innerHTML = html.join("");

		markers = new Array(locations.length);
		for (i=0; i<locations.length; i++)
		{
			loc = locations[i];
			a = loc[0];
			var point = new GLatLng(a.lat, a.lon);
	
			var text = getBubbleTextForLocation(loc);
			marker = createMarker(point, text);
			map.addOverlay(marker);
			for (var j=0; j<loc.length; j++)
			{
				a = loc[j];
				a.marker = marker;
				a.markerText = text;
			}	
		}
	}
	
	var d = document.getElementById("status");
	var status = "Found " + agents.length + " agents within the map area.";
	status += "<p>Want more?  Try scrolling or expanding the map, and then click <input type='button' onclick='populateAgents()' value='Find All Agents in Map Area'>";
	d.innerHTML = status;
}

function getBubbleTextForLocation(loc)
{
	var text = new Array();
	text.push("<b><p>Agents At This Location</b><p>");
	for (var i=0; i<loc.length; i++)
	{
		var a = loc[i];
		if ( i != 0 )
			text.push(" - ");
		text.push("<a href='javascript:selectAgent(" + a.id + ")'>");
		text.push(a.name);
		text.push("</a>");
	}
	return text.join("");
}



function sortAgentsByLocation(a, b)
{
	if ( a.distance < b.distance )
		return -1;
	if ( a.distance > b.distance )
		return 1;
	if ( a.lat < b.lat )
		return -1;
	if ( a.lat > b.lat )
		return 1;
	if ( a.lon < b.lon )
		return -1;
	if ( a.lon > b.lon )
		return 1;
	return 0;
}


function Agent(line)
{
	var splits = line.split(";");

	this.name = splits[0];
	this.agencies = splits[1];
	this.address = splits[2];
	this.city = splits[3];
	this.state = splits[4];
	this.zip = splits[5];
	this.lat = parseFloat(splits[6]);
	this.lon = parseFloat(splits[7]);
	this.website = splits[8];
	this.phone = splits[9];
	this.calcDistance = calcDistance;
}

function calcDistance()
{
	var x = Math.abs(this.lat - centerPoint.lat() ) * 69.97;
	var lonFactor = 69.171 * Math.cos( (centerPoint.lat() * 3.14159265 ) / 180 );
	var y = Math.abs(this.lon - centerPoint.lng() ) * lonFactor;
	this.distance = Math.sqrt(x*x + y*y);
}

function findAddress()
{
	selectedAddress = document.getElementById("address").value;

	var url = "google-address.php?address=" + escape(selectedAddress);

	http = createRequestObject();
	http.open("get", url);
	http.onreadystatechange = readGoogleResponse;
	http.send(null);

}

function createRequestObject()
{
	var ro;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer"){
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		ro = new XMLHttpRequest();
	}
	return ro;
}

function readGoogleResponse() 
{
	var response;

	if (http.readyState == 4)
	{
		response = http.responseText;	
	}
	else return;

	var tabs = response.split(",");

	var d = document.getElementById("status");
	d.style.display = "block";
	if ( tabs[0] == "200" )
	{
		d.innerHTML = "Address Found.";
		setLocation(tabs[2], tabs[3]);
	
	}
	else
	{
		d.innerHTML = "Error: Google can't find that address";
	}
}



function setLocation(lat, lon)
{
	centerPoint = new GLatLng(lat, lon);
	map.setCenter(centerPoint);
	map.setZoom(13);
	populateAgents();
	
}

function load()
{
	var div = document.getElementById("map");
     	map = new GMap2(div);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.setCenter(new GLatLng(40, -95));
	map.setZoom(4);
	blue = new GIcon(G_DEFAULT_ICON, "http://www.calculateme.com/car-insurance-tools/marker-blue.png");
}

function createMarkerIcon(point, html, icon) 
{
	var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "click", function() {
	    marker.openInfoWindowHtml(html);
	});
	return marker;
}

function createMarker(point, html) 
{
	var marker = new GMarker(point);
	GEvent.addListener(marker, "click", function() {
	    marker.openInfoWindowHtml(html);
	});
	return marker;
}

function populateAgents()
{
	map.clearOverlays();
	var marker = createMarkerIcon(centerPoint, "<p><b>Your Location</b><p>" + selectedAddress, blue);
	map.addOverlay(marker);

	selectedAgent = -1;
	

	var bounds = map.getBounds();
	var url = "get-agents.php?latmin=" + bounds.getSouthWest().lat() + "&latmax=" + bounds.getNorthEast().lat() + "&lonmin=" + bounds.getSouthWest().lng() + "&lonmax=" + bounds.getNorthEast().lng();

	var d = document.getElementById("status");
	d.innerHTML = "Retrieving agents...";
	//d.innerHTML += "<p>" + url;

	http = createRequestObject();
	http.open("get", url);
	http.onreadystatechange = readAgents;
	http.send(null);
}

