var map          = null;
var geocoder     = null;
var markerPixels = []; //keeps track of markers in pixels to offset close markers
var markers      = []; //keeps track of markers so that users can click on an assembly and have it pop up on the map
var circle       = null;

var baseIcon     = null;
var manIcon      = null;

google.load("maps", "2");
google.setOnLoadCallback(initialize);

function initialize() {
	window.onunload = google.maps.Unload;
	map      = new google.maps.Map2(document.getElementById("map"));
	geocoder = new google.maps.ClientGeocoder();
	map.addControl(new google.maps.SmallMapControl());
	map.addControl(new google.maps.MapTypeControl());
	centerMap();
	initializeIcons();
	addManMarker();
	listMarkers('people.json' + getUrlQueryString());
	drawRadius();
}

function rendermap(queryString) {
	map.removeOverlay(circle);
	for (var i = 0; i < markers.length; i++) map.removeOverlay(markers[i]);
	markers      = [];
	markerPixels = [];
	listMarkers('people.json' + queryString);
	drawRadius();
}

function listMarkers(url) {
	var request = google.maps.XmlHttp.create();
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var posts = eval( request.responseText );
			for (var i = 0 ; i < posts.length ; i++) {
				var post = posts[i];
				for(var type in post) {
					var lat = post[type].lat;
					var lng = post[type].lng;
					if (lat && lng) {
						var point = new google.maps.LatLng(parseFloat(lat),parseFloat(lng));
			        	var infoTabs = [
											new google.maps.InfoWindowTab("Title",  post[type].first_name + " " + post[type].last_name + "<br/>" + "Has " + post[type].comments_count + " reviews."),
											new google.maps.InfoWindowTab("Location",post[type].address )
										];
						point = offsetCloseMarkers(point); //offset markers that are at or near the same location as another marker
						map.addOverlay(addMarkerToMap(point, infoTabs, i+1));
					}					
				}
			}
		}
	}
	request.open('GET', url, true);
	request.send(null);
}

function offsetCloseMarkers(point) {
	var point_pixel = map.fromLatLngToDivPixel(point);
	for (var i = 0 ; i < markerPixels.length ; i++) {
		var p = markerPixels[i];
		if ((point_pixel.x == p.x) && (point_pixel.y == p.y)) { //2 markers close in location
		    point_pixel = new google.maps.Point(point_pixel.x+3, point_pixel.y+3);
			point = map.fromDivPixelToLatLng(point_pixel);
		}
	}
	markerPixels.push(point_pixel);
	return point;
}

function addMarkerToMap(point, info, i) {
	var icon = new google.maps.Icon(baseIcon);
	icon.image = image_tag("/images/map/markers/red/" + i + ".png");
	var marker = new google.maps.Marker(point, icon);
	markers.push(marker);
  	google.maps.Event.addListener(marker, "click", function() {
    	marker.openInfoWindowTabsHtml(info);
  	});
  	return marker;
}

function initializeIcons() {
	baseIcon = new google.maps.Icon();
	baseIcon.shadow = image_tag("/images/map/markers/shadow.png"); //"http://www.google.com/map/shadow50.png";
	baseIcon.iconSize = new google.maps.Size(15, 26);                       //new GSize(20, 34);
	baseIcon.shadowSize = new google.maps.Size(28, 26);                     //new GSize(37, 34);
	baseIcon.iconAnchor = new google.maps.Point(9, 26);                     //new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new google.maps.Point(9, 2);
	baseIcon.infoShadowAnchor = new google.maps.Point(18, 25);

	manIcon                  = new google.maps.Icon();
	manIcon.image            = image_tag("/images/map/man/orange.png");
	manIcon.iconSize         = new google.maps.Size(38, 50);
	manIcon.iconAnchor       = new google.maps.Point(8, 50);
}

function selectResult(i) {
	google.maps.Event.trigger(markers[i],"click");
} 

function centerMap() {
	var point = new google.maps.LatLng(parseFloat(document.getElementById("lat").value),
	                                   parseFloat(document.getElementById("lng").value));
	map.setCenter(point, getZoomExtents());
}

function addManMarker() {
	var point = new google.maps.LatLng(parseFloat(document.getElementById("lat").value),
	                                   parseFloat(document.getElementById("lng").value));

	var marker = new google.maps.Marker(point, {icon: manIcon, draggable: true});
	map.addOverlay(marker);
	
 	google.maps.Event.addListener(marker, "dragend", function() {
		var point = marker.getLatLng();
		document.getElementById('lat').value = point.lat();
    	document.getElementById('lng').value = point.lng();
		document.getElementById('search').onsubmit();
	});		
}

function drawRadius() {
	var miles = document.getElementById("radius").value;
	var point = new google.maps.LatLng(parseFloat(document.getElementById("lat").value),
	                                   parseFloat(document.getElementById("lng").value));
	
	var R   = 3963.189;                              //radius of earth in miles
	var lat = miles/R*180/Math.PI;                   //convert miles to degrees lat
	var lng = lat/Math.cos(point.lat()*Math.PI/180); //convert miles to degrees lng at that lat
	
	var circlePoints = Array();
	var bounds = new google.maps.LatLngBounds();
	for (var i = 0 ; i < 361 ; i+=1 ) {
		var angle = i*(Math.PI/180);                 //angle in radians
		var x = point.lng() + lng*Math.cos(angle);
		var y = point.lat() + lat*Math.sin(angle);
		var circlePoint = new google.maps.LatLng(parseFloat(y),parseFloat(x));
		bounds.extend(circlePoint);
		circlePoints.push(circlePoint);
	}                                 	

	circle = new google.maps.Polygon(circlePoints, '#ffffff', 3, 0.4, '#ffffff', 0.3); //(points,  strokeColor?,  strokeWeight?,  strokeOpacity?,  fillColor?,  fillOpacity?,  opts?)
	map.addOverlay(circle);		
}

function getZoomExtents() {
	var miles = document.getElementById("radius").value;
	var point = new google.maps.LatLng(parseFloat(document.getElementById("lat").value),
	                                   parseFloat(document.getElementById("lng").value));
	
	var R   = 3963.189;                              //radius of earth in miles
	var lat = miles/R*180/Math.PI;                   //convert miles to degrees lat
	var lng = lat/Math.cos(point.lat()*Math.PI/180); //convert miles to degrees lng at that lat
	
	var circlePoints = Array();
	var bounds = new google.maps.LatLngBounds();
	for (var i = 0 ; i < 361 ; i+=1 ) {
		var angle = i*(Math.PI/180);                 //angle in radians
		var x = point.lng() + lng*Math.cos(angle);
		var y = point.lat() + lat*Math.sin(angle);
		var circlePoint = new google.maps.LatLng(parseFloat(y),parseFloat(x));
		bounds.extend(circlePoint);
		circlePoints.push(circlePoint);
	}                                 	
	var zoom = map.getBoundsZoomLevel(bounds) + 1;
//	map.setZoom(zoom);
	return zoom;
}