//Global variables
var map;
var geocoder
var fncCount = 0;
var bounds = null;
var masterMapBounds = new GLatLngBounds();
var emptyResultPoint = 0;
var emptyResultPolygon = 0;
var stateNames= new Array();
var movementWatchFlag = 0;
stateNames["AL"]="Alabama";
stateNames["AK"]="Alaska";
stateNames["AZ"]="Arizona"; 
stateNames["AR"]="Arkansas"; 
stateNames["CA"]="California"; 
stateNames["CO"]="Colorado"; 
stateNames["CT"]="Connecticut"; 
stateNames["DC"]="District of Columbia"; 
stateNames["DE"]="Delaware"; 
stateNames["FL"]="Florida"; 
stateNames["GA"]="Georgia"; 
stateNames["HI"]="Hawaii"; 
stateNames["ID"]="Idaho"; 
stateNames["IL"]="Illinois"; 
stateNames["IN"]="Indiana"; 
stateNames["IA"]="Iowa"; 
stateNames["KS"]="Kansas"; 
stateNames["KY"]="Kentucky"; 
stateNames["LA"]="Louisiana"; 
stateNames["ME"]="Maine"; 
stateNames["MD"]="Maryland"; 
stateNames["MA"]="Massachusetts"; 
stateNames["MI"]="Michigan"; 
stateNames["MN"]="Minnesota"; 
stateNames["MS"]="Mississippi"; 
stateNames["MO"]="Missouri"; 
stateNames["MT"]="Montana"; 
stateNames["NE"]="Nebraska"; 
stateNames["NV"]="Nevada"; 
stateNames["NH"]="New Hampshire"; 
stateNames["NJ"]="New Jersey"; 
stateNames["NM"]="New Mexico"; 
stateNames["NY"]="New York"; 
stateNames["NC"]="North Carolina"; 
stateNames["ND"]="North Dakota"; 
stateNames["OH"]="Ohio"; 
stateNames["OK"]="Oklahoma"; 
stateNames["OR"]="Oregon"; 
stateNames["PA"]="Pennsylvania"; 
stateNames["RI"]="Rhode Island"; 
stateNames["SC"]="South Carolina"; 
stateNames["SD"]="South Dakota"; 
stateNames["TN"]="Tennessee"; 
stateNames["TX"]="Texas"; 
stateNames["UT"]="Utah"; 
stateNames["VT"]="Vermont"; 
stateNames["VA"]="Virginia"; 
stateNames["WA"]="Washington"; 
stateNames["WV"]="West Virginia"; 
stateNames["WI"]="Wisconsin"; 
stateNames["WY"]="Wyoming";
stateNames["PR"]="Puerto Rico";
stateNames["GU"]="Guam";
stateNames["VI"]="Virgin Islands";
stateNames["MH"]="Marshall Islands";
stateNames["AS"]="American Samoa";
stateNames["PW"]="Palau";
stateNames["FM"]="Micronesia";
stateNames["MP"]="Mariana Islands";


//Initialize function
function initialize(){
    if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
        map = new GMap2(document.getElementById('map'));
        map.addControl(new GSmallZoomControl3D());
        map.addControl(new GMapTypeControl());
        map.removeMapType(G_HYBRID_MAP);
        map.removeMapType(G_SATELLITE_MAP);
        map.addMapType(G_PHYSICAL_MAP);
        map.setCenter(new GLatLng(40, -100), 3);
        map.setMapType(G_PHYSICAL_MAP);
        map.enableScrollWheelZoom();
	    document.getElementById('content').innerHTML = 'Please enter a search criteria to display details about MRC units.';
	    GEvent.addListener(map,'moveend',function(){if(movementWatchFlag == 1){extentOn();}});
    }
}

function addPoly(polyItem) {
  if (document.getElementById('polygonsCheck').checked == true){	
 	 	map.addOverlay(polyItem);
	}
}

function populateMasterBounds(point){
	masterMapBounds.extend(point);
}

function extentOn(){
	if (document.getElementById('extentCheck').checked == true){
	 	movementWatch('off');
		displayGeography('extent');
		movementWatch('on');
	}
	else{
		document.getElementById('content').innerHTML = 'Please enter a search criteria to display details about MRC units.';
		movementWatch('off');
	}
}
function movementWatch(status){
 	if (status == 'on'){
 	 	movementWatchFlag = 1;
	}
	else if (status =='off'){
		movementWatchFlag = 0;
	}
	else{
	
	}
}

function polygonsOn(){
	var state = document.getElementById('stateSelect').value;
 	var region = document.getElementById('regionSelect').value;
 	var address = document.getElementById('addressInput').value;
 	var extent = document.getElementById('extentCheck').checked;
 	
 	if (document.getElementById('polygonsCheck').checked == true){
 	 	if (extent == false){
	 	 	if(state != 'Select a State'){
	 	 	 	getPolygons('state', state);
	 	 	}
	 	 	else if(region != 'Select a Region'){
	 	 	 	getPolygons('region', region);
	 	 	}
	 	 	else if(address != ''){
	 	 	 	searchLocations("both");
	 	 	}
	 	 	else{
	 	 	 	alert("Please enter a search criteria to display MRC jurisdictions or click the checkbox for updating results when panning or zooming the Map.");
 	 		}
 	 	}
 	 	else{
 	 		extentOn();
 	 	}
	}
	if (document.getElementById('polygonsCheck').checked == false){
	 	if (extent == false){
			map.clearOverlays();
			if(state != 'Select a State'){
			 	getPoints('state', state);
	 	 	 	getPolygons('state', state);
	 	 	}
	 	 	else if(region != 'Select a Region'){
	 	 	 	getPoints('region', region);
	 	 	 	getPolygons('region', region);
	 	 	}
	 	 	else if(address != ''){
	 	 	 	searchLocations("points");
	 	 	}
	 	 	else{
	 	 	 	alert("Please enter a search criteria to display MRC units or click the checkbox for updating results when panning or zooming the Map.");
 	 		}
 	 	}
 	 	else{
 	 		extentOn();
 	 	}
	
	}
}

function displayGeography(focus){
	movementWatch('off');
 	masterMapBounds = new GLatLngBounds();
	if (document.getElementById('MRC_Checkbox').style.display = 'none') {
		document.getElementById('MRC_Checkbox').style.display = 'block';
	}
	if (document.getElementById('Extent_Checkbox').style.display = 'none') {
		document.getElementById('Extent_Checkbox').style.display = 'none';
	}
 	switch (focus){
 	 	case "region":
 	 		document.getElementById('stateSelect').value='Select a State';
 	 		document.getElementById('addressInput').value='';
 	 		document.getElementById('extentCheck').checked = false;
 	 		var region = document.getElementById('regionSelect').value;
  	 		if (region == 'Select a Region'){
				document.getElementById('content').innerHTML = 'Please select a region to display the locations of Medical Reserve Corps Units.';
				alert('Please select a region to display the locations of Medical Reserve Corps Units.');
 			}
 			else{
 			 	map.clearOverlays();
 				if(region == 'All'){
 			 		document.getElementById('content').innerHTML = 'This may take a moment to load...please be patient.';
 				}
 				getPoints('region', region);
 				getPolygons('region', region);
	     	}
 	 		break;
 	 	case "state":
 	 		document.getElementById('regionSelect').value='Select a Region';
 	 		document.getElementById('addressInput').value='';
 	 		document.getElementById('extentCheck').checked = false;
  	 		var state = document.getElementById('stateSelect').value;
  	 		if (state == 'Select a State'){
				document.getElementById('content').innerHTML = 'Please select a state to display the locations of Medical Reserve Corps Units.';
				alert('Please select a state to display the locations of Medical Reserve Corps Units.');
 			}
 			else{
 				if(state == 'All'){
 			 		document.getElementById('content').innerHTML = 'This may take a moment to load...please be patient.';
 				}
 				getPoints('state', state);
 				getPolygons('state', state);
	     	}
 	 		break;
 	 	case "extent":
 	 		document.getElementById('regionSelect').value='Select a Region';
 	 		document.getElementById('stateSelect').value='Select a State';
 	 		document.getElementById('addressInput').value = '';
 	 		document.getElementById('content').innerHTML = '';
 	 		map.clearOverlays();
 	 		var currentExtent = map.getBounds();
 	 		getPoints('extent', currentExtent);
 	 		getPolygons('extent', currentExtent);
 	 		break;
 	 	default:
	}
}

function getPolygons(type, boundary) {
	bounds = masterMapBounds;
	switch(type)
	{
	 	case 'state':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_polygons.php?state=' + boundary;
	 		break;
	 	case 'region':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_polygons.php?region=' + boundary;
	 		break;
	 	case 'geocode':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_polygons.php?geocode=yes&latitude=' + boundary.lat() + '&longitude=' + boundary.lng() + '&distance=' + document.getElementById("ZipDistance").value;
	 		break;
	 	case 'extent':
	 		var southWest = boundary.getSouthWest();
		    var northEast = boundary.getNorthEast();
		    var southWest_lng = southWest.lng();
			var southWest_lat = southWest.lat();
			var northEast_lng = northEast.lng();
			var northEast_lat = northEast.lat();
	 		var searchUrl = '/GIS/maps/sql_generate_xml_polygons.php?extent=yes&latitudeSouth=' + southWest_lat + '&longitudeWest=' + southWest_lng + '&latitudeNorth=' + northEast_lat + '&longitudeEast=' + northEast_lng;
	 		break;
	 	default:
	 		break;
	}
	GDownloadUrl(searchUrl, function(data) {
	   var xml = GXml.parse(data);
	   var polygons = xml.documentElement.getElementsByTagName('polygon');
	   if (polygons.length == 0) {
	     	emptyResultPolygon = 1;
	     	return;
	   }
	   for (var i = 0; i < polygons.length; i++) {
	     if (polygons[i].getAttribute('Multipart')=='No'){
	         var id = polygons[i].getAttribute('Unit_ID');
	         var nodes = polygons[i].getElementsByTagName('node');		 
			 var points = [];
	  		 for (var j = 0; j < nodes.length; j++) {
			   var point = new GLatLng(parseFloat(nodes[j].getAttribute('Latitude')),parseFloat(nodes[j].getAttribute('Longitude')));  
	    	   points.push(point);
	    	   bounds.extend(point);
	    	   populateMasterBounds(point);
	  		 }
	  		 var polyItem = new GPolygon(points, "#464646", 2, 0.6, '#3d3d3d', 0.4);
			 addPoly(polyItem);
	     }
	     else {
	         var id = polygons[i].getAttribute('Unit_ID');
	         var parts = polygons[i].getElementsByTagName('part');		 
	  		 for (var k = 0; k < parts.length; k++) {
		  		 var nodes = parts[k].getElementsByTagName('node');		 
				 var points = [];
		  		 for (var l = 0; l < nodes.length; l++) {
				   var point = new GLatLng(parseFloat(nodes[l].getAttribute('Latitude')),parseFloat(nodes[l].getAttribute('Longitude')));  
		    	   points.push(point);
		    	   bounds.extend(point);
		    	   populateMasterBounds(point);
		  		 }
		  		 var polyItem = new GPolygon(points, "#464646", 2, 0.6, '#3d3d3d', 0.4);
  			 	 addPoly(polyItem);
	  		 }
	     }
	   }

	 if (type != 'extent'){
	  	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
  	 }
	 });
}

function getPoints(type, boundary) { 
 	var polyCheck = document.getElementById('polygonsCheck').checked;
 	switch(type)
	{
	 	case 'state':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_points.php?state=' + boundary;
	 		break;
	 	case 'region':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_points.php?region=' + boundary;
	 		break;
	 	case 'geocode':
	 		var searchUrl = '/GIS/maps/sql_generate_xml_points.php?geocode=yes&latitude=' + boundary.lat() + '&longitude=' + boundary.lng() + '&distance=' + document.getElementById("ZipDistance").value;
	 		break;
	 	case 'extent':
	 		var southWest = boundary.getSouthWest();
		    var northEast = boundary.getNorthEast();
		    var southWest_lng = southWest.lng();
			var southWest_lat = southWest.lat();
			var northEast_lng = northEast.lng();
			var northEast_lat = northEast.lat();
	 		var searchUrl = '/GIS/maps/sql_generate_xml_points.php?extent=yes&latitudeSouth=' + southWest_lat + '&longitudeWest=' + southWest_lng + '&latitudeNorth=' + northEast_lat + '&longitudeEast=' + northEast_lng;
	 		break;
	 	default:
	 		break;
	}
	GDownloadUrl(searchUrl, function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('marker');	   
		var content = document.getElementById('content');
		content.innerHTML = '';
		if (markers.length == 0) {
		 	switch(type)
			{
			 	case 'state':
			 		content.innerHTML = 'No Medical Reserve Corps Units in ' + stateNames[boundary] +'.';
			 		break;
			 	case 'region':
			 		content.innerHTML = 'No Medical Reserve Corps Units in Region ' + boundary +'.';
			 		break;
			 	case 'geocode':
			 		content.innerHTML = 'No Medical Reserve Corps Units near ' + document.getElementById('addressInput').value +'.';
			 	default:
			 		content.innerHTML = 'No Medical Reserve Corps Units in map extent.';
			 		break;
			}
		 	emptyResultPoint = 1;
	     	return;
		} else {
				content.innerHTML = '<h2 style="background: none; color: #0b479d; font-weight: bold; margin: 1em 0em;">' + markers.length + ' MRC Units found</h2>';
		}
		map.clearOverlays();
		for (var i = 0; i < markers.length; i++) {
		 	var id = markers[i].getAttribute('Unit_ID');
			var company_name = markers[i].getAttribute('UnitName');
			var address = markers[i].getAttribute('address');
			var distance = (markers[i].getAttribute('Distance') != '' ? markers[i].getAttribute('Distance') : null);
			var center = (document.getElementById("addressInput").value != '' ? document.getElementById("addressInput").value : null);
	   		var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')), parseFloat(markers[i].getAttribute('lng')));
	    	var marker = createMarker(point, id, company_name, address, distance, center);
			map.addOverlay(marker);
			var contentEntry = createContentEntry(marker, id, company_name, address, distance, center);
			content.appendChild(contentEntry);
	    	populateMasterBounds(point);
		}
	if (type == 'geocode' && polyCheck == false){
	  	map.setCenter(masterMapBounds.getCenter(), map.getBoundsZoomLevel(masterMapBounds));
  	 }
	});
}

function searchLocations(toDo) {
 	document.getElementById('stateSelect').value='Select a State';
	document.getElementById('regionSelect').value='Select a Region';
	document.getElementById('extentCheck').checked = false;
	masterMapBounds = new GLatLngBounds();
	map.clearOverlays();
	if(toDo == 'points' && document.getElementById('polygonsCheck').checked == true){
	 	toDo = 'both';
	}
	if (document.getElementById('MRC_Checkbox').style.display = 'none') {
		document.getElementById('MRC_Checkbox').style.display = 'block';
	}
	if (document.getElementById('Extent_Checkbox').style.display = 'none') {
		document.getElementById('Extent_Checkbox').style.display = 'none';
	}
/**
* 	if (toDo =='points'){
* 	 	document.getElementById('polygonsCheck').checked = false;
* 	}
*/
	var address = document.getElementById('addressInput').value;
	geocoder.getLatLng(address, function(latlng) {
		if (!latlng) {
			alert('Please enter a Zip Code.');
		}
		else {
 			if(toDo == "points"){
 	 			getPoints('geocode', latlng);
 	 		}
 	 		else if(toDo =="polygons"){
 	 		 	getPolygons('geocode', latlng);
 	 		}
 	 		else if (toDo =="both"){
 	 		 	getPoints('geocode', latlng);
 	 		 	getPolygons('geocode', latlng);
 	 		}
 	 		else{
 	 			return;
 			}

		}
 	});
}


function createMarker(point, id, company_name, address, distance, CenterAddress) {
	var MyIcon = new GIcon(G_DEFAULT_ICON);
	// Create our "tiny" marker icon
	MyIcon.image = "/GIS/maps/images/BlueDot.png";
	MyIcon.shadow = "/GIS/maps/images/BlueDot_shadow.png";
	MyIcon.iconSize = new GSize(12, 12);
	MyIcon.shadowSize = new GSize(12, 12);
	//MyIcon.iconAnchor = new GPoint(6, 20); //For pushpin
	MyIcon.iconAnchor = new GPoint(6, 6); //For dot
	MyIcon.infoWindowAnchor = new GPoint(5, 1);        
	// Set up our GMarkerOptions object
	markerOptions = { icon:MyIcon };
	var marker = new GMarker(point, markerOptions); 
	if (distance == null){
		var html = '<div style="padding-top:.5em;"><p style="font-size:small; margin:0;"><b><a href="http://www.medicalreservecorps.gov/detail.asp?id=' + id + '" target="_blank">' + company_name + '</a></b><br/>' + address + '</p></div>';	
	}
	else{
		var html = '<div style="padding-top:.5em;"><p style="font-size:small; margin:0;"><b><a href="http://www.medicalreservecorps.gov/detail.asp?id=' + id + '" target="_blank">' + company_name + '</a></b><br/>' + address + '<br/>' + distance +' miles from ' + CenterAddress + '</p></div>';
	}
  	GEvent.addListener(marker, 'click', function() {
    	marker.openInfoWindowHtml(html);
  });
  return marker;
}

function addCenterMarker(center, CenterAddress) {
	// Create our "tiny" marker icon
	var MyIcon = new GIcon(G_DEFAULT_ICON);
	// Create our "tiny" marker icon
	MyIcon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
	MyIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	MyIcon.iconSize = new GSize(12, 20);
	MyIcon.shadowSize = new GSize(22, 20);
	MyIcon.iconAnchor = new GPoint(6, 20);
	MyIcon.infoWindowAnchor = new GPoint(5, 1);     
	// Set up our GMarkerOptions object
	markerOptions = { icon:MyIcon };
	var marker = new GMarker(center, markerOptions);
	var html = '<b>' + CenterAddress + '</b>';	
	GEvent.addListener(marker, 'click', function() {
    	marker.openInfoWindowHtml(html);
  	});
	return marker;
}

function createContentEntry(marker, id, company_name, address, distance, CenterAddress) {
	var div = document.createElement('div');
	if (distance == null){
  		var html = '<p><b><a href="http://www.medicalreservecorps.gov/detail.asp?id=' + id + '" target="_blank">' + company_name + '</a></b><br/>' + address + '</p>';	
	}
	else{
		var html = '<p><b><a href="http://www.medicalreservecorps.gov/detail.asp?id=' + id + '" target="_blank">' + company_name + '</a></b><br/>' + address + '<br/>' + distance +' miles from ' + CenterAddress + '</p>';
	}
	div.innerHTML = html + '\n';
	div.style.cursor = 'pointer';
	div.style.marginBottom = '5px'; 
	GEvent.addDomListener(div, 'click', function() {
    	GEvent.trigger(marker, 'click');
	});
	GEvent.addDomListener(div, 'mouseover', function() {
		div.style.backgroundColor = '#D6DEEF';
	});
	GEvent.addDomListener(div, 'mouseout', function() {
		div.style.backgroundColor = '#fff';
	});
	return div;
}

function FilterSearch(nav, block) {
	var thisNav, thisElem;
	for (i = 1; i <= 3; i++) {
		thisNav = "nav" + i;
		document.getElementById(thisNav).className = '';
		//thisElem = document.getElementById(thisNav).class;
		//thisElem.style.backgroundPosition = "0px -30px";
		//thisElem.getElementsByTagName("a")[0].style.backgroundPosition = "100% -30px";
	}
	//document.getElementById(nav).style.backgroundPosition = "0px 0px";
	//document.getElementById(nav).a.style.backgroundPosition = "100% 0px";	
	document.getElementById(nav).className = 'current';
	
	document.getElementById("byRegion").style.display = "none";
	document.getElementById("byState").style.display = "none";
	document.getElementById("byZipCode").style.display = "none";
	document.getElementById(block).style.display = "block";
}

//Onload statment
window.onload = initialize;
//Unload statment
window.onunload = GUnload;