/*+-------------+----------------------------------------------------------*
 *|        /\   |   University of Bonn                                     *
 *|       |  |  |     Department of Geography                              *
 *|      _|  |_ |     Chair of Cartography                                 *
 *|    _/      \|                                                          *
 *|___|         |                                                          *
 *|             |     Meckenheimer Allee 172                               *
 *|             |     D-53115 Bonn, Germany                                *
 *+-------------+----------------------------------------------------------*/
/**
 * <p><b>Title: OpenLS LUS</b></p>
 * <p><b>Description:</b> Functions Location Utility Service </p>
 *
 * <p><b>Copyright:</b> Copyright (c) 2008</p>
 * <p><b>Institution:</b> University of Bonn, Department of Geography</p>
 * @author Pascal Neis, neis@geographie.uni-bonn.de
 * @version 1.0 2008-07-11
 */
 
//Alles was für OpenLS LUS wichtig ist

//**********************************************************

		function geocode(freeform){

			//disable Search TextField & Button
//document.getElementById("tfSearch").disabled=true;
			document.getElementById("Search").disabled=true;

			//Set Infos ...
			document.getElementById('informations').style.visibility = 'visible';
			document.getElementById('informations').innerHTML =  '<span class="infos">Please wait a moment! This could take a second ...</span>';
			//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';
			
			var data = 'FreeFormAdress='+freeform+'&MaxResponse=25';
			var url = 'php/OpenLSLUS_Geocode.php';

			new OpenLayers.Ajax.Request(url, {  method: 'post',
												parameters: data,
												onComplete: showGeocodedAddress});
		}

		function reversegeocode(){
			//GetMapCenterPosition
			var center = new OpenLayers.LonLat(map.center.lon,map.center.lat);
			center.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));

			//disable Search TextField & Button
//document.getElementById("tfSearch").disabled=true;
			document.getElementById("Search").disabled=true;

			//Set Infos ...
			document.getElementById('informations').style.visibility = 'visible';
			document.getElementById('informations').innerHTML =  '<span class="infos">Please wait a moment! This could take a second ...</span>';
			//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';
			
			var data = 'Lon='+center.lon+'&Lat='+center.lat+'&MaxResponse=10';
			var url = 'php/OpenLSLUS_Geocode.php';

			new OpenLayers.Ajax.Request(url, {  method: 'post',
												parameters: data,
												onComplete: showReverseGeocodedLocation});
			//Set marker on search position
			lonlatzoom(center,map.zoom);
		}

		function showGeocodedAddress(response) {
			
			//alert(response.responseText);
			if (response) {
				
				// remove markers
				markerPosition.clearMarkers();
				
				//alert(response.responseText);
				var xmlresponse = response.responseXML;
				var errorList = xmlresponse.getElementsByTagName('ErrorList');
				
				if(errorList.length == 0)
						errorList = xmlresponse.getElementsByTagName('xls:ErrorList');
						
				if(errorList.length > 0){
					var error = errorList[0].getElementsByTagName('Error');
					if(error.length == 0)
						error = xmlresponse.getElementsByTagName('xls:Error');
					var message = error[0].getAttribute('message')
					alert("Problem with OpenLS Location Utility Service \nMessage: "+message);
					//document.getElementById('problems').innerHTML = '<span class="problems">'+message+'</span>';
					document.getElementById('informations').innerHTML = "";
				}
				else{
					// parse GeocodedAddress
					var geocodedAddress = xmlresponse.getElementsByTagName('GeocodedAddress');
					
					if(geocodedAddress.length == 0)
						geocodedAddress = xmlresponse.getElementsByTagName('xls:GeocodedAddress');
					
					if(geocodedAddress.length == 0){
						document.getElementById('informations').innerHTML = "No Results for Europe ... Please check your entry!";
					}
					else{
						var header = xmlresponse.getElementsByTagName('GeocodeResponseList');
						if(header.length == 0)
								header = xmlresponse.getElementsByTagName('xls:GeocodeResponseList');
						var numberofResponses = header[0].getAttribute('numberOfGeocodedAddresses');
						
						var result;
						result = '<span class="route_instruction_heading">Number of Results: '+numberofResponses+'</span> (maximum is 25)<br>';
						
						if(numberofResponses>1)
							result +='<span class="problems">Did you mean: </span><br>';
						
						result +='<table>';

						var lonlatGeocode = null;
						
						for (var i = 0; i < geocodedAddress.length; i++) {
							//<xls:Address countryCode="de">
							var countryCode;
							var address = geocodedAddress[i].getElementsByTagName('Address');
							if(address.length == 0)
								address = geocodedAddress[i].getElementsByTagName('xls:Address');
							countryCode = "("+address[0].getAttribute('countryCode').toUpperCase()+") ";
						
							//position
							var pos;
							var position = geocodedAddress[i].getElementsByTagName('pos');
							if(position.length == 0)
								position = geocodedAddress[i].getElementsByTagName('gml:pos');

							if(typeof position[0].textContent != 'undefined')
								pos = position[0].textContent.split(' ');
							else
								pos = position[0].text.split(' ');
								
							var lonlat = new OpenLayers.LonLat(pos[0],pos[1]);
							
							if(lonlatGeocode == null)
								lonlatGeocode = lonlat;
						
							//postalcode
							var postalcode = geocodedAddress[i].getElementsByTagName('PostalCode');
							if(postalcode.length == 0)
								postalcode = geocodedAddress[i].getElementsByTagName('xls:PostalCode');

							if(postalcode.length > 0){
								if(typeof postalcode[0].textContent != 'undefined')
									postalcode = postalcode[0].textContent;
								else
									postalcode = postalcode[0].text;
							}
							else
								postalcode = '';

							//place
							var place = geocodedAddress[i].getElementsByTagName('Place');
							if(place.length == 0)
								place = geocodedAddress[i].getElementsByTagName('xls:Place');
							
							var countrySubdivision = '';
							var municipality = '';
							for(var j=0; j < place.length; j++){
								var tmp;
								if(typeof place[j].textContent != 'undefined')
									tmp = place[j].textContent;
								else
									tmp = place[j].text;
								
								var type = place[j].getAttribute('type');
								if(type == 'CountrySubdivision')
									countrySubdivision = '<br>('+tmp+')';
								else if(type == 'Municipality')
									municipality = tmp;
							}

							//streetname
							var street = geocodedAddress[i].getElementsByTagName('Street');
							if(street.length == 0)
								street = geocodedAddress[i].getElementsByTagName('xls:Street');

							var streetname;
							if(street[0] == null)
								streetname = '';
							else if(street[0] != null || street[0] != 'undefined' || street[0].getAttribute('officialName') != 'undefined')
								streetname = street[0].getAttribute('officialName');
							if(streetname == null)
								streetname = '';
								
							//<xls:Building xsi:type="xls:BuildingLocatorType" number="24-46"/>
							//Building
							var building = geocodedAddress[i].getElementsByTagName('Building');
							if(building.length == 0)
								building = geocodedAddress[i].getElementsByTagName('xls:Building');
							
							var buildingnumber;
							if(building[0] == null)
								buildingnumber = '';
							else if(building[0] != null || building[0] != 'undefined' || building[0].getAttribute('number') != 'undefined')
								buildingnumber = building[0].getAttribute('number');
							if(buildingnumber == null)
								buildingnumber = '';
							
							result += '<tr nowrap><td width="10" class="route_instruction">'+(i+1)+'. </td>'
									+'<td width="310"><span class="route_instruction">'
									+'<a href="#" onclick="javascript:lonlatzoom(new OpenLayers.LonLat('+lonlat+'), '+map.zoom+');" '
									+'title="'+countryCode+postalcode+municipality+' '+streetname+' '+buildingnumber+' '+countrySubdivision+'">'
									+countryCode+postalcode+' '+municipality+' '+streetname+' '+buildingnumber+' '+countrySubdivision+'</a></span></td>\n</tr> \n';
									//+countrySubdivision+' - Position: '+lonlat.lon.toFixed(6)+'° '+lonlat.lat.toFixed(6)+'°</a></span></td>\n</tr> \n';
						}
						result += '</table>';
						
						lonlatzoom(lonlatGeocode, map.zoom);
	
						document.getElementById('informations').innerHTML = result;
						//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';
					}
				}
			}
			//enable TextField & Search Button
//document.getElementById("tfSearch").disabled=false;
			document.getElementById("Search").disabled=false;
		}

	
		function showReverseGeocodedLocation(response) {
			
			//alert(response.responseText);
			if (response) {

				var xmlresponse = response.responseXML;
				var errorList = xmlresponse.getElementsByTagName('ErrorList');
				
				if(errorList.length == 0)
						errorList = xmlresponse.getElementsByTagName('xls:ErrorList');
						
				if(errorList.length > 0){
					var error = errorList[0].getElementsByTagName('Error');
					if(error.length == 0)
						error = xmlresponse.getElementsByTagName('xls:Error');
					var message = error[0].getAttribute('message')
					alert("Problem with OpenLS Location Utility Service \nMessage: "+message);
					//document.getElementById('problems').innerHTML = '<span class="problems">'+message+'</span>';
					document.getElementById('informations').innerHTML = "";
				}
				else{
					// parse ReverseGeocodedLocation
					var reverseGeocodedLocation = xmlresponse.getElementsByTagName('ReverseGeocodedLocation');
					
					if(reverseGeocodedLocation.length == 0)
						reverseGeocodedLocation = xmlresponse.getElementsByTagName('xls:ReverseGeocodedLocation');
					
					if(reverseGeocodedLocation.length == 0){
						document.getElementById('informations').innerHTML = "No Results ...";
					}
					else{
						var header = xmlresponse.getElementsByTagName('Response');
						if(header.length == 0)
								header = xmlresponse.getElementsByTagName('xls:Response');
						var numberofResponses = header[0].getAttribute('numberOfResponses');
						
						var result;
						result = '<span class="route_instruction_heading">Number of Results: '+numberofResponses+'</span> (maximum is 10)<br>';
						result +='<table>';
						
						for (var i = 0; i < reverseGeocodedLocation.length; i++) {
							//<xls:Address countryCode="de">
							var countryCode;
							var address = reverseGeocodedLocation[i].getElementsByTagName('Address');
							if(address.length == 0)
								address = reverseGeocodedLocation[i].getElementsByTagName('xls:Address');
							countryCode = "("+address[0].getAttribute('countryCode').toUpperCase()+") ";
							
							//position
							var pos;
							var position = reverseGeocodedLocation[i].getElementsByTagName('pos');
							if(position.length == 0)
								position = reverseGeocodedLocation[i].getElementsByTagName('gml:pos');

							if(typeof position[0].textContent != 'undefined')
								pos = position[0].textContent.split(' ');
							else
								pos = position[0].text.split(' ');
								
							var lonlat = new OpenLayers.LonLat(pos[0],pos[1]);
						
							//postalcode
							var postalcode = reverseGeocodedLocation[i].getElementsByTagName('PostalCode');
							if(postalcode.length == 0)
								postalcode = reverseGeocodedLocation[i].getElementsByTagName('xls:PostalCode');
							
							if(postalcode.length > 0){
								if(typeof postalcode[0].textContent != 'undefined')
									postalcode = postalcode[0].textContent;
								else
									postalcode = postalcode[0].text;
							}
							else
								postalcode = "";

							//place
							var place = reverseGeocodedLocation[i].getElementsByTagName('Place');
							if(place.length == 0)
								place = reverseGeocodedLocation[i].getElementsByTagName('xls:Place');
							
							var countrySubdivision = '';
							var municipality = '';
							for(var j=0; j < place.length; j++){
								var tmp;
								if(typeof place[j].textContent != 'undefined')
									tmp = place[j].textContent;
								else
									tmp = place[j].text;
								
								var type = place[j].getAttribute('type');
								if(type == 'CountrySubdivision')
									countrySubdivision = '<br>('+tmp+')';
								else if(type == 'Municipality')
									municipality = tmp;
							}
								
							//streetname
							var street = reverseGeocodedLocation[i].getElementsByTagName('Street');
							if(street.length == 0)
								street = reverseGeocodedLocation[i].getElementsByTagName('xls:Street');
								
							var streetname;
							if(street[0] == null)
								streetname = '';
							else if(street[0] != null || street[0] != 'undefined' || street[0].getAttribute('officialName') != 'undefined')
								streetname = street[0].getAttribute('officialName');
							if(streetname == null)
								streetname = '';
								
							//<xls:Building xsi:type="xls:BuildingLocatorType" number="24-46"/>
							//Building
							var building = reverseGeocodedLocation[i].getElementsByTagName('Building');
							if(building.length == 0)
								building = reverseGeocodedLocation[i].getElementsByTagName('xls:Building');
							
							var buildingnumber;
							if(building[0] == null)
								buildingnumber = '';
							else if(building[0] != null || building[0] != 'undefined' || building[0].getAttribute('number') != 'undefined')
								buildingnumber = building[0].getAttribute('number');
							if(buildingnumber == null)
								buildingnumber = '';
								
							//distance
							var searchCentreDistance = reverseGeocodedLocation[i].getElementsByTagName('SearchCentreDistance');
							if(searchCentreDistance.length == 0)
								searchCentreDistance = reverseGeocodedLocation[i].getElementsByTagName('xls:SearchCentreDistance');
							var distance = searchCentreDistance[0].getAttribute('value');
							var distanceUnit = searchCentreDistance[0].getAttribute('uom');
							
							result += '<tr nowrap><td width="320"><span class="route_instruction">'
									+(i+1)+'. '+'<a href="#" onclick="javascript:lonlatzoom(new OpenLayers.LonLat('+lonlat+'), '+map.zoom+');" '
									+'title="'+countryCode+postalcode+' '+municipality+' '+streetname+' '+buildingnumber+' '+countrySubdivision+'">'
									+countryCode+postalcode+' '+municipality+' '+streetname+' '+buildingnumber+' (dist.: '+distance+' '+distanceUnit.toLowerCase()+')'
									+countrySubdivision+'</a></span></td>\n</tr> \n';
									//+countrySubdivision+' - Position: '+lonlat.lon.toFixed(6)+'° '+lonlat.lat.toFixed(6)+'°</a></span></td>\n</tr> \n';
						}
						result += '</table>';
	
						document.getElementById('informations').innerHTML = result;
						//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';
					}
				}
			}
			//enable TextField & Search Button
//document.getElementById("tfSearch").disabled=false;
			document.getElementById("Search").disabled=false;
		}
//**********************************************************