/*+-------------+----------------------------------------------------------*
 *|        /\   |   University of Bonn                                     *
 *|       |  |  |     Department of Geography                              *
 *|      _|  |_ |     Chair of Cartography                                 *
 *|    _/      \|                                                          *
 *|___|         |                                                          *
 *|             |     Meckenheimer Allee 172                               *
 *|             |     D-53115 Bonn, Germany                                *
 *+-------------+----------------------------------------------------------*/
/**
 * <p><b>Title: Search</b></p>
 * <p><b>Description:</b> Functions for Textfiel Search </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
 */

	//*** Überprüft Eingabe bei Search Textfeld ***
	//entscheidet weiterhin ob die Eingabe eine Position oder eine Adresse nach er gesucht werden muss ist
	 function setSearch(){
		
		var msg;
		var inputVal = document.getElementById('tfSearch').value;
		
		//analyse input string using regular expressions 	
		
		if (inputVal.match(/.+°.+'.+''.+°.+'.+''/) != null){		
			//Altgrad
			//separate coords after first occurence of ''
			String(inputVal);
			var splitAt = inputVal.indexOf("''") +2;
			var x = inputVal.substr(0, splitAt);
			var y = inputVal.substr(splitAt+1);
			yStart = y.search(/\d/);
			y = y.substr(yStart);
			
			msg = x +" und "+ y  +" in Altgrad"; 			
		}
		
		else if (inputVal.match(/^\d+\b.+\d+$/) != null) {	
			//Neugrad
			//separate chords after blank or ,
			String(inputVal);
			indexComma = inputVal.search(/,/);
			indexSpace = inputVal.search(/\s/);			
					 
			splitAt = Math.min(indexComma, indexSpace);
			if (splitAt == -1)
				splitAt = Math.max(indexComma, indexSpace);
			
			var x = inputVal.substr(0, splitAt);
			var y = inputVal.substr(splitAt+1);
			yStart = y.search(/\d/);
			y = y.substr(yStart);
			//msg = x +" und "+ y + " in Neugrad";
			
			lonlatzoom(new OpenLayers.LonLat(x,y), 10);
		}
			
		else {
			//Adresse
			var plz = "nicht angegeben";		
			spaceArray = new Array(); 
			
			String(inputVal);
			geocode(inputVal);
		}	
	}

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

	//Funktion um Start- oder Endpunkt über Adresse zu setzen ...
	function setRoutePosition(positionName){
		var freeform;
		var tmp = positionName.split('h');
		var tmp_id = tmp[1];
		
		if(positionName == 'start'){
			freeform = document.getElementById('tfStartSearch').value;
			//document.getElementById("rbStart").checked=true;
			//toggleControl(document.getElementById("rbStart"));
			setStatus('Start');
			//disable Search TextField & Button
//document.getElementById("tfStartSearch").disabled=true;
		}
		else if(positionName == 'end'){
			freeform = document.getElementById('tfEndSearch').value;
			//document.getElementById("rbEnd").checked=true;
			//toggleControl(document.getElementById("rbEnd"));
			setStatus('End');
			//disable Search TextField & Button
//document.getElementById("tfEndSearch").disabled=true;
		}
		else{
			freeform = document.getElementById(positionName).value;
			//document.getElementById("rbVia"+tmp_id).checked=true;
			//toggleControl(document.getElementById("rbVia"+tmp_id));
			setStatus('Via');
		}	
		
			

		if(positionName == 'start'){
			freeform = document.getElementById('tfStartSearch').value;
			
			if(freeform.match('Pos@:')){
				var coords = freeform.substring(6,freeform.length);
				var pos = coords.split(' ');
				var lonlat = new OpenLayers.LonLat(pos[0],pos[1]);
				markerzoom('start', lonlat, map.zoom);
				//enable Search TextField & Button
//document.getElementById("tfStartSearch").disabled=false;
				document.getElementById('tfStartSearch').value = freeform;
				return;
			}
		}
		if(positionName == 'end'){
			freeform = document.getElementById('tfEndSearch').value;
			
			if(freeform.match('Pos@:')){
				var coords = freeform.substring(6,freeform.length);
				var pos = coords.split(' ');
				var lonlat = new OpenLayers.LonLat(pos[0],pos[1]);
				markerzoom('end', lonlat, map.zoom);
				//enable Search TextField & Button
//document.getElementById("tfEndSearch").disabled=false;
				document.getElementById('tfEndSearch').value = freeform;
				return;
			}
		}
		for (var i=0; i<=countVia; i++){
			if(positionName == 'tfViaSearch'+tmp_id){
				freeform = document.getElementById('tfViaSearch'+tmp_id).value;
			
				if(freeform.match('Pos@:')){
					var coords = freeform.substring(6,freeform.length);
					var pos = coords.split(' ');
					var lonlat = new OpenLayers.LonLat(pos[0],pos[1]);
					markerzoom('tfViaSearch'+tmp_id, lonlat, map.zoom);
					//enable Search TextField & Button
					//document.getElementById("tfEndSearch").disabled=false;
					document.getElementById('tfViaSearch'+tmp_id).value = freeform;
					return;
				}//end if
			}//end if	
		}//end for

		//Set Infos ...
		document.getElementById('informations').style.visibility = 'visible';
		document.getElementById('informations').innerHTML =  '<span class="infos">Please wait a moment! This could take a little moment ...</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: showGeocodedRouteAddress});
	}


	function showGeocodedRouteAddress(response) {
			//alert(response.responseText);
			if (response) {
				//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;
						var freeFormGeocode = 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 = '';
							
							/*var markerName;
							if(document.getElementById("rbStart").checked == true){
								markerName = 'start';
							}
							else if(document.getElementById("rbEnd").checked == true){
								markerName = 'end';
							}
							else{
								for(var i = 1; i<=countVia; i++){
									if(document.getElementById("rbVia"+i).checked == true){
										markerName = 'via'+i;
									}	
								}	
							}*/
							var markername;
							if(getStatus()=='Start'){
								markerName = 'start';
							}
							else if(getStatus()=='End'){
								markerName = 'end';
							}
							else if(getStatus()=='Via'){
										markerName = 'via'+getActivViaId();
							}	
							
							
							if(freeFormGeocode == null)
								freeFormGeocode = municipality+' '+streetname;
								
							result += '<tr nowrap><td width="10" class="route_instruction">'+(i+1)+'. </td>'
									+'<td width="310"><span class="route_instruction">'
									+'<a href="#" onclick="javascript:markerzoom(\''+markerName+'\', new OpenLayers.LonLat('+lonlat+'), '+map.zoom+', \''+municipality+' '+streetname+'\');" '
									+'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>';
						
						if(getStatus()=='Start'){
							markerzoom('start', lonlatGeocode, map.zoom, freeFormGeocode);
						}
						else if(getStatus()=='End'){
							markerzoom('end', lonlatGeocode, map.zoom, freeFormGeocode);
						}
						else if(getStatus()=='Via'){
									markerzoom('via'+getActivViaId(), lonlatGeocode, map.zoom, freeFormGeocode);
						}
	
						document.getElementById('informations').innerHTML = result;
						//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';
					}
				}
			}
			
			//enable TextField & Search Button
			//if(document.getElementById("rbStart").checked == true){
//document.getElementById("tfStartSearch").disabled=false;
			//}
			//else if(document.getElementById("rbEnd").checked == true){
//document.getElementById("tfEndSearch").disabled=false;
			//}
			
			isSetStartEnd();
		}
		
		function changeStartEnd(){
			var tmp = document.getElementById('tfStartSearch').value;
			document.getElementById('tfStartSearch').value = document.getElementById('tfEndSearch').value;
			document.getElementById('tfEndSearch').value = tmp;
			var oldstartPoint = getStartOrEndFeature('Start');
			var oldendPoint = getStartOrEndFeature('End');
			lyMarkers.clearMarkers();
			lyRouteFeatures.removeFeatures([oldstartPoint]);
			lyRouteFeatures.removeFeatures([oldendPoint]);	
			
			if(startPoint != undefined && endPoint != undefined){
				var startEdge = getEdgeLonLat(oldstartPoint);
				var endEdge = getEdgeLonLat(oldendPoint);
				
				bounds = new OpenLayers.Bounds(oldendPoint.lonlat.lon,oldendPoint.lonlat.lat,endEdge.lon,endEdge.lat);
				startPoint = new OpenLayers.Feature.Vector(bounds.toGeometry(),{icon:markerIconStart});
				startPoint.bounds = bounds;
				startPoint.lonlat = new OpenLayers.LonLat(oldendPoint.lonlat.lon,endPoint.lonlat.lat);
				startPoint.marker = new OpenLayers.Marker(oldendPoint.lonlat, startPoint.data.icon.clone());
				lyMarkers.addMarker(startPoint.marker);
				startPoint.style = startPointStyle;
				startPoint.name = 'Start';
				startPoint.myId ='';
				lyRouteFeatures.addFeatures([startPoint]);
				startExists = true;
					
				bounds = new OpenLayers.Bounds(oldstartPoint.lonlat.lon,oldstartPoint.lonlat.lat,startEdge.lon,startEdge.lat);
				endPoint = new OpenLayers.Feature.Vector(bounds.toGeometry(),{icon:markerIconEnd});
				endPoint.bounds = bounds;
				endPoint.lonlat = new OpenLayers.LonLat(oldstartPoint.lonlat.lon,oldstartPoint.lonlat.lat);
				endPoint.marker = new OpenLayers.Marker(oldstartPoint.lonlat, endPoint.data.icon.clone());
				lyMarkers.addMarker(endPoint.marker);
				endPoint.style = endPointStyle;
				endPoint.name = 'End';
				endPoint.myId ='';
				lyRouteFeatures.addFeatures([endPoint]);
				endExists = true;
			
				determineRoute(this);
			}
		}