var map;
var container;
var locations = {};
var opacity = 0.05;
var circle;
var centerMarker;
var circleRadius;
var zoom = 2;
var lat;
var lng;
var dist;

function load() {
	container = document.getElementById("map")
	map = new GMap2(container, {draggableCursor:"crosshair"});
	map.setCenter(new GLatLng(38, -97),4);
	map.enableScrollWheelZoom();
	map.setUIToDefault();

	var mgr = new MarkerManager(map);

	GDownloadUrl("/includes/getfranchises.asp", function(data)
	{
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++)
		{
			var name = markers[i].getAttribute("name");
			var nameurl = markers[i].getAttribute("nameurl").toLowerCase();
			var address = markers[i].getAttribute("address");
			var type = markers[i].getAttribute("type");
			var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			
			if (window.location.href.toLowerCase().indexOf(nameurl)>-1)
			{
				map.setCenter(latlng,14);
			}

			var store = {latlng: latlng, name: name, address: address, type: type};
			var latlngHash = (latlng.lat().toFixed(6) + "" + latlng.lng().toFixed(6));
			latlngHash = latlngHash.replace(".","").replace(".", "").replace("-","");
			if (locations[latlngHash] == null)
			{
				locations[latlngHash] = []
			}
			locations[latlngHash].push(store);
		}
		for (var latlngHash in locations)
		{
			var stores = locations[latlngHash];
			if (stores.length > 1)
			{
				map.addOverlay(createClusteredMarker(stores));
			}
			else
			{
				map.addOverlay(createMarker(stores));
			}
		}
	});
}

function createMarker(offices) {
  var officeIcon = new GIcon();
  officeIcon.image = '/images/office24.png';
  officeIcon.iconSize = new GSize(24, 24);
  officeIcon.iconAnchor = new GPoint(12, 12);
  officeIcon.infoWindowAnchor = new GPoint(12, 12);

  var office = offices[0];
  var marker = new GMarker(office.latlng, {icon: officeIcon});
  var html = "<b>" + office.name.replace(/\[/g,"<").replace(/\]/g,">") + "</b> <br/>" + office.address.replace(/\[/g,"<").replace(/\]/g,">");
  GEvent.addListener(marker, 'click', function() {
	marker.openInfoWindowHtml(html);
  });
  return marker;
}

function createClusteredMarker(offices) {
  var officeIcon = new GIcon();
  officeIcon.image = '/images/office32.png';
  officeIcon.iconSize = new GSize(32, 32);
  officeIcon.iconAnchor = new GPoint(16, 16);
  officeIcon.infoWindowAnchor = new GPoint(16, 16);

  var marker = new GMarker(offices[0].latlng, {icon: officeIcon});
  var html = "";
  for (var i = 0; i < offices.length; i++) {
	html += "<strong>" + offices[i].name.replace(/\[/g,"<").replace(/\]/g,">") + "</strong> <br/>" + offices[i].address.replace(/\[/g,"<").replace(/\]/g,">") + "<br/><br />";
  }
  GEvent.addListener(marker, 'click', function() {
	marker.openInfoWindowHtml(html);
  });
  return marker;
}

function doSearch()
{
	resetMap();
	getCenterPoint();
	get('resultsDiv').innerHTML = "Searching... <img src='/common/progress.gif' alt='' />";
	var t=setTimeout('doAjaxyStuff()',1000);
	return false;
}

function doAjaxyStuff()
{
	getLocations();
	//getNearest();
}

function getCenterPoint()
{
	var oZip = get('zipCodeInput');
	var oCity = get('cityInput');
	var oState = get('stateInput');

	if (oZip.value.length>0)
	{
		getPage('/includes/getlatlong.asp?zip='+oZip.value, 'setCenterPoint()', 'setCenter');
	}
	else if (oCity.value.length>0 && oState.selectedIndex>-1)
	{
		getPage('/includes/getlatlong.asp?city='+oCity.value+'&state='+oState.options[oState.selectedIndex].value, 'setCenterPoint()', 'setCenter');
	}
	else
	{
		alert('Please enter either your ZIP code or city and state.');
	}
}

function setCenterPoint()
{
	if (xmlresult.length>0)
	{
		var parts = xmlresult.split('|', 2);

		lat = parts[0];
		lng = parts[1];

		map.setCenter(new GLatLng(parseFloat(parts[0]),parseFloat(parts[1])));
		centerMarker = new GMarker(new GLatLng(parseFloat(parts[0]),parseFloat(parts[1])),{draggable:true});
		GEvent.addListener(centerMarker,'dragend',drawCircle)
		map.addOverlay(centerMarker);
		var t=setTimeout('drawCircle()',250);
	}
	else
	{
		alert('Location not found!');
	}
}

function getLocations()
{
	if (lat && lng && dist && lat.match(/-?\d+(.\d+)/gi) && lng.match(/-?\d+(.\d+)/gi) && dist.match(/\d+(.\d+)/gi))
	{
		getPage('/includes/getlocations.asp?lat='+lat+'&lng='+lng+'&dist='+dist,'setLocationsHTML()','setLocations');
	}
}

function setLocationsHTML()
{
	if (xmlresult.length>0)
	{
		get('resultsDiv').innerHTML = xmlresult;
		get('resultsDiv').style.display = '';
	}
}

function getNearest()
{
	if (lat && lng && dist && lat.match(/-?\d+(.\d+)/gi) && lng.match(/-?\d+(.\d+)/gi) && dist.match(/\d+(.\d+)/gi))
	{
		getPage('/includes/getnearest.asp?lat='+lat+'&lng='+lng+'&dist='+dist,'setNearestHTML()','setNearest');
	}
}

function setNearestHTML()
{
	if (xmlresult.length>0)
	{
		get('nearestDiv').innerHTML = xmlresult;
		get('nearestDiv').style.display = '';
	}
}

function resetMap()
{
	if (centerMarker)
	{
		map.removeOverlay(centerMarker);
	}
}

function doReset()
{
	if (centerMarker)
	{
		map.removeOverlay(centerMarker);
	}
	if (circle)
	{
		map.removeOverlay(circle);
	}
	load();
}

function drawCircle()
{
	var oRadius = document.getElementById('radiusInput');
	oRadius.value = oRadius.value ? oRadius.value : 500;

	dist = oRadius.value;

	if (oRadius.value.match(/[^\d.]/)) {
		alert("Please enter a number for radius");
		return;
	}
	if (oRadius.value > 9999) {
	}

	circleRadius = oRadius.value;

	doDrawCircle();
}


function doDrawCircle(){

	if (circle) {
		map.removeOverlay(circle);
	}


	if (centerMarker)
	{
		map.setCenter(centerMarker.getLatLng())
	}
	else
	{
		centerMarker = new GMarker(map.getCenter(),{draggable:true});

		GEvent.addListener(centerMarker,'dragend',drawCircle);
		map.addOverlay(centerMarker);
	}

	var center = map.getCenter();

	var bounds = new GLatLngBounds();


	var circlePoints = Array();

	with (Math) {
		var d = circleRadius/3963.189;	// radians
		var lat1 = (PI/180)* center.lat(); // radians
		var lng1 = (PI/180)* center.lng(); // radians

		for (var a = 0 ; a < 361 ; a++ ) {
			var tc = (PI/180)*a;
			var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
			var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
			var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
			var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
			circlePoints.push(point);
			bounds.extend(point);
		}

		if (d < 1.5678565720686044) {
			circle = new GPolygon(circlePoints, '#000000', 2, 1, '#000000', 0.25);
		}
		else {
			circle = new GPolygon(circlePoints, '#000000', 2, 1);
		}
		map.addOverlay(circle);

		map.setZoom(map.getBoundsZoomLevel(bounds));
	}
}
