// ********************************************************************************************
// JavaScript library for routines used by the Drupal online soil survey interface page.
//
// Implemented by Dylan Beaudette Summer 2005
// University of California at Davis
// Davis, Ca 95616
// ********************************************************************************************

/**
These functions are called from within the Drupal interface to the online soil survey. See figure below. Note that function names are click-able.


*/



/**
\brief simple function to convert image coordinates into AEA coordinates for the status map
from example posted on: http://www.thescripts.com/forum/thread527139.html
*/
function setClick(e)
	{
	var el = e.target || e.srcElement;
	
	// Get mouse click co-ords
	var ePos = {x:0, y:0};
	if ('number' == typeof e.pageX)
		{
		ePos.x = e.pageX;
		ePos.y = e.pageY;
		} 
	else if ('number' == typeof e.clientX)
		{
		ePos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		ePos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}

	// Get image top left co-ords
	var elPos = {x:0, y:0};
	if (el.offsetParent) 
		{
		elPos.x = el.offsetLeft;
		elPos.y = el.offsetTop;
		while (el = el.offsetParent) 
			{
			elPos.x += el.offsetLeft;
			elPos.y += el.offsetTop;
			}
		}
	
	
	// the status map has an extent of :
	// 	EXTENT -2237055.086272 -933057.100163 -1093703.721522 560666.283923
	// coordinate system based on bottom left corner
	var x_0_real = -2237055 ;
	var y_0_real = -933057 ;
	
	var dx_real = 1143352;
	var dy_real = 1493723;
	
	// the status map image has a pixel size of :
	// 	450 500
	// coordinate system shifted to bottom left corner
	var x_screen = (ePos.x - elPos.x);
	var y_screen = 500 - (ePos.y - elPos.y);
	
	// 	map image coordinates to AEA coordinates in simple 1:1 transform
	var x_real = ((x_screen / 450) * dx_real) + x_0_real;
	var y_real = ((y_screen / 500) * dy_real) + y_0_real;
	
	// send the user to that location!
	document.location = "http://casoilresource.lawr.ucdavis.edu/ka-map/htdocs/?map=casoil&cps=" + x_real + "," + y_real + ",500000&layers=__base__";
	}




/**
\brief perform a browser-independent XML-RPC request and run callback function

*/
function executeXhr(callback, url) 
	{
	
// this would make req a private variable
// 	var req;

// establish a mechanism for opening a XML-rpc request 
	try
		{
		// Firefox, Opera, Safari
		req = new XMLHttpRequest();
		req.onreadystatechange = callback;
		req.open("GET", url, true);
		req.send(null);
		}
	catch (e)
		{
		// Internet Explorer
		try
			{
			req = new ActiveXObject("Msxml2.XMLHTTP");
			req.onreadystatechange = callback;
			req.open("GET", url, true);
			req.send(null);
			}
		catch (e)
			{
			try
			{
			req = new ActiveXObject("Microsoft.XMLHTTP");
			req.onreadystatechange = callback;
			req.open("GET", url, true);
			req.send(null);
			}
			catch (e)
				{
				alert('Your browser is not IE 5 or higher, or Firefox or Safari or Opera');
				}
			}
		}

		
	}



function geocode_address(url) {
  var callback = processGeoCodedAddress;
  executeXhr(callback, url);
}

function lookup_plss_coordinates(url) {
  var callback = processPLSScoordinates;
  executeXhr(callback, url);
}

function query_coordinates(url) {
  var callback = processMatchingSurvey;
  executeXhr(callback, url);
}

function process_new_status_map_request(url) {
  var callback = processNewStatusMap;
  executeXhr(callback, url);
}






// dynamically create a new status map with a point marked on it.
function remake_status_map_with_user_coordinates(aea_coordinates)
	{
	
	// construct the url: this will return a new url for the image
	url = "http://casoilresource.lawr.ucdavis.edu/reflector_api/status_map_query.php?x=" + aea_coordinates[0] + "&y=" + aea_coordinates[1];
	
	process_new_status_map_request(url);
	}



// this function actually updates the image, once we have URL
function processNewStatusMap()
	{
	
	// only if req shows "loaded"
	if (req.readyState == 4) 
		{
		
// 		if(req.status == 200)
// 			{
			// check for an error
			if(req.responseText != -1)
				{
				
				var i = "http://casoilresource.lawr.ucdavis.edu" + req.responseText ;
				
				// debug
// 				document.getElementById("message_output").innerHTML = i ;
				
				// update the image source
				document['status_map'].src = i ;
				
				}
				
// 			}
		}

	}



// this is a special version of the processGeoCodedAddress function
function processPLSScoordinates() {

	// only if req shows "loaded"
	if (req.readyState == 4) 
		{
		
		
		// check for an error
		if(req.responseText != 'bad coordinates')
			{
				// take-apart the address_coordinates: lon lat
			longlat_coordinates = req.responseText.split(' ');
			
			document.getElementById("message_output").style.color = 'green' ;
			document.getElementById("message_output").innerHTML = 'Looking up matching survey data ...' ;
			
			lookup_survey_at_coordinates(longlat_coordinates);
			}
		
		// the query did not work
		else
			{
			document.getElementById("message_output").style.color = 'red' ;
			document.getElementById("message_output").innerHTML = 'Invalid PLSS coordinates!' ;
			}
		
      
		} 
// 	else 
// 		{
// 		alert("There was a problem retrieving the XML data:\n" + req.statusText);
// 		}
	}


function processGeoCodedAddress() {

	// only if req shows "loaded"
	if (req.readyState == 4) 
		{
		
		document.getElementById("message_output").style.color = 'green' ;
		document.getElementById("message_output").innerHTML = 'Looking up matching survey data ...' ;
		
		
		
		// check for an error
		if(req.responseText != -1)
			{
			// take-apart the address_coordinates: lon,lat
			coords = req.responseText.split(',');
			
			lookup_survey_at_coordinates(coords);
			
			}
		
		// the query did not work
		else
			{
			// some user feedback
			document.getElementById("message_output").style.color = 'red' ;
			document.getElementById("message_output").innerHTML = 'Invalid Address!' ;
			
			}
		
      
		} 
// 	else 
// 		{
// 		alert("There was a problem retrieving the XML data:\n" + req.statusText);
// 		}
	}


// TODO:
// might be good to adjust how the zooming works based on PLSS query items:

// if($query_type == 'plss_query') // correct query type
// 	{
// 	//note that this function will return an appropriate message when there is either no survey, or no x,y values
// 	if($plss['plss_q_section'] != '' && $plss['plss_qq_section'] != '')
// 		$mapscale = 5000;
// 	else if($plss['plss_q_section'] != '')
// 		$mapscale = 12000;
// 	else if($plss['plss_section'] != '')
// 		$mapscale = 12000;
// 	else
// 		$mapscale = 23000;
// 		
// 	display_found_survey_message($plss_query_results['x'], $plss_query_results['y'], $matching_survey_area, $mapscale);	
// 	}

function processMatchingSurvey() {

	// only if req shows "loaded"
	if (req.readyState == 4) 
		{
		
		// take-apart the address_coordinates: lon,lat
		survey_id_data = req.responseText.split(',');
		
		var areasymbol = survey_id_data[0];
		var ogc_fid = survey_id_data[1];
		var x = survey_id_data[2] ;
		var y = survey_id_data[3] ;
		
		// ka-map zoom-to-url style
		var base_url = '/ka-map/htdocs/?map=casoil' ;
		
		// some user feedback
// 		document.getElementById("message_output").style.color = 'blue' ;
		document.getElementById("message_output").innerHTML = '' ;
		
		// update the status map:
		var aea_coordinates = new Array(x, y);
		remake_status_map_with_user_coordinates(aea_coordinates);
	
		// no matching ssurgo data
		if(areasymbol == -1)
			{
			
			var pop_up_message = '&message=zoomed_to_statsgo' ;
			var scale = 100000 ;
			var mapxy_and_scale = "&cps=" + x + "," + y + "," + scale ;
			
			var link_url = base_url  + mapxy_and_scale + pop_up_message;
			
			message_html = "";
			message_html = message_html + 'No matching SSURGO survey at this location.' ;
			message_html = message_html + '<br>Try STATSGO instead:' ;
			message_html = message_html + '<br><a href="' + link_url + '"><b>Go to this point!</b></a>' ;
			}
		
		// a matching survey
		else
			{
			var pop_up_message = '&message=zoomed_to_ssurgo-point' ;
			var scale = 12000 ;
			var mapxy_and_scale = "&cps=" + x + "," + y + "," + scale ;
			
			var link_url = base_url + mapxy_and_scale + pop_up_message;
			
			message_html = "";
			message_html = message_html + 'Associated Survey Area:  ' + areasymbol + '<br>' ;
			message_html = message_html + '<a href="' + link_url + '"><b>Go to this point!</b></a></span>'
			
			}
		
		// feedback to the user
		document.getElementById("query_result_output").style.color = 'red';
		document.getElementById("query_result_output").innerHTML = message_html ;
		
		} 
// 	else 
// 		{
// 		alert("There was a problem retrieving the XML data:\n" + req.statusText);
// 		}
	}




/**
\brief geocode an address
 */
function process_address()
	{
	
	// some user feedback
	document.getElementById("message_output").style.color = 'green' ;
	document.getElementById("message_output").innerHTML = 'Looking up address ...' ;
	document.getElementById("query_result_output").innerHTML = '' ;
	
	// get from form elements
		
	// city and state	
	var address = document.address_input.address.value;
	var city = document.address_input.city.value;
	var state = document.address_input.state.value;

	// compose a URL
	var url = "http://casoilresource.lawr.ucdavis.edu/soil_web/geocode.php?address=" + address + "," + city + "," + state ;

	// do the look-up asynchronously
	geocode_address(url);
	
	
	}



/**
\brief get the approximate coordinates for a plss query
 */
function process_plss()
	{
	
	// some user feedback
	document.getElementById("message_output").style.color = 'green' ;
	document.getElementById("message_output").innerHTML = 'Starting PLSS query ...' ;
	document.getElementById("query_result_output").innerHTML = '' ;
	
	// get from form elements
	var plss_qq_section = document.plss_input.plss_qq_section.value;
	var plss_q_section = document.plss_input.plss_q_section.value;
	var plss_section = document.plss_input.plss_section.value;
	var plss_range_dir = document.plss_input.plss_range_dir.value;
	var plss_range_num = document.plss_input.plss_range_num.value;
	var plss_township_dir = document.plss_input.plss_township_dir.value;
	var plss_township_num = document.plss_input.plss_township_num.value;
	var plss_meridian = document.plss_input.plss_meridian.value;

	// compose a URL
// 	http://casoilresource.lawr.ucdavis.edu/reflector_api/plss_query.php?
// plss_qq_section=SW
// plss_q_section=NE
// plss_section=18
// plss_township_num=12
// plss_township_dir=S
// plss_range_num=21
// plss_range_dir=E
// plss_meridian=Diablo
	
	var url = "http://casoilresource.lawr.ucdavis.edu/reflector_api/plss_query.php?srid=4269&plss_qq_section=" + plss_qq_section + "&plss_q_section=" + plss_q_section + "&plss_section=" + plss_section + "&plss_township_num=" + plss_township_num + "&plss_township_dir=" + plss_township_dir + "&plss_range_num=" + plss_range_num + "&plss_range_dir=" + plss_range_dir + "&plss_meridian=" + plss_meridian ;

// 	var url = "http://casoilresource.lawr.ucdavis.edu/reflector_api/plss_query.php?plss_qq_section=" + plss_qq_section + "&plss_q_section=" + plss_q_section + "&plss_section=" + plss_section + "&plss_township_num=" + plss_township_num + "&plss_township_dir=" + plss_township_dir + "&plss_range_num=" + plss_range_num + "&plss_range_dir=" + plss_range_dir + "&plss_meridian=" + plss_meridian ;
	
	
	// do the look-up asynchronously
	lookup_plss_coordinates(url);
	
	}




/**
\brief lookup any matching ssurgo data
 */
function lookup_survey_at_coordinates(coordinates)
	{
	
	// compose a URL coordinates
	var url = "http://casoilresource.lawr.ucdavis.edu/soil_web/reflector_api/soils.php?what=survey_id&lon=" + coordinates[0] + "&lat=" + coordinates[1] ;	
	// do the look-up asynchronously
	query_coordinates(url);	

	}




/**
\brief Check for surveys at a LatLon point.
\note This function extracts latitude and longitude values from the main online soil survey interface, projects them to AEA, re-directs to the drupal online soil survey interface.
 */
function process_user_coordinates()
	{
	
	//do some semi-intellegent checking of form elements to determine if the use has input in DD or DMS:
	
	if( (!document.latlon_input.lat_d.value || !document.latlon_input.lon_d.value) && (document.latlon_input.lat_deg.value && document.latlon_input.lon_deg.value) )
		{
		//DMS mode: convert dms values to DD values
		// DD = deg +min/60 + sec/3600
		
		//latitude:
		var lat = parseInt(document.latlon_input.lat_deg.value) ;
		
		if(document.latlon_input.lat_min.value != '')
			lat = parseFloat(lat + parseFloat(document.latlon_input.lat_min.value) / 60) ;
		if(document.latlon_input.lat_sec.value != '')
			lat = parseFloat(lat + parseFloat(document.latlon_input.lat_sec.value) / 3600) ;
		
		//longitude:
		var lon = parseInt(document.latlon_input.lon_deg.value) ;
		
		if(document.latlon_input.lon_min.value != '')
			lon = parseFloat(lon + parseFloat(document.latlon_input.lon_min.value)  / 60) ; 
		if(document.latlon_input.lon_sec.value != '')
			lon = parseFloat(lon + parseFloat(document.latlon_input.lon_sec.value) / 3600) ;
			
		// update the DD fields accordingly
		document.latlon_input.lat_d.value = lat ;
		document.latlon_input.lon_d.value = lon ;
			
		}
	else //DD mode:
		{
		// load DD form variables: lat, lon, label
		var lat = document.latlon_input.lat_d.value;
		var lon = document.latlon_input.lon_d.value;	
		}
	
	
	if (lon != '' && lat != '')
		{
		document.getElementById("message_output").style.color = 'green' ;
		document.getElementById("message_output").innerHTML = 'Looking up matching survey data ...' ;
		
		// now we have a lon, lat pair, proceed to looking up matching survey information
		var coordinates = new Array(-lon, lat);
		
		lookup_survey_at_coordinates(coordinates);
		
		}
	
	// something is wrong with the coordinates
	else
		{
		// some user feedback
		document.getElementById("message_output").style.color = 'red' ;
		document.getElementById("message_output").innerHTML = 'Invalid Coordinates!' ;
		}
	
	}//end function zoom_to_point()







