
/*+-------------+----------------------------------------------------------*
 *|        /\   |   University of Bonn                                     *
 *|       |  |  |     Department of Geography                              *
 *|      _|  |_ |     Chair of Cartography                                 *
 *|    _/      \|                                                          *
 *|___|         |                                                          *
 *|             |     Meckenheimer Allee 172                               *
 *|             |     D-53115 Bonn, Germany                                *
 *+-------------+----------------------------------------------------------*/
/**
 * <p><b>Title: OpenLS RS </b></p>
 * <p><b>Description:</b> Functions Route 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 RS wichtig ist

//**********************************************************
var route_preference = "";
var route_language = "";

var route_smoothness = "";
var route_incline = "";

var route_calculating = false;
var button_calculate_pressed = false;

var lonlatRoute = "";
		function determineRouteLink(pref,lang){
			
			route_calculating = true;
			
			route_preference = pref;
			route_language = lang;
			
			//disable Calculate Button
			document.getElementById("Calculate").disabled=false;
			//document.getElementById("switchStartEnd").disabled=false;
			
			//get start and end geom
			var startFeat = getStartOrEndFeature('Start');
			var endFeat = getStartOrEndFeature('End');
			var start = new OpenLayers.LonLat(startFeat.lonlat.lon,startFeat.lonlat.lat);
			var startLonlat = start.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			var end = new OpenLayers.LonLat(endFeat.lonlat.lon,endFeat.lonlat.lat);
			var endLonlat = end.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			var Start_X = startLonlat.lon.toFixed(7);//vectorLayerStart.features[0].geometry.x;
			var Start_Y = startLonlat.lat.toFixed(7);//vectorLayerStart.features[0].geometry.y;
			var End_X = endLonlat.lon.toFixed(7);//vectorLayerEnd.features[0].geometry.x;
			var End_Y = endLonlat.lat.toFixed(7);//vectorLayerEnd.features[0].geometry.y;
			
			
			
			
			//xml for Viapoints !!! no EPSG-Code provided (<gml:Point srsName=\"EPSG:4326\">)
			
			var via_xml = '';
//			viaStorage = sortVias(viaStorage);
//			for(var i = 0; i < viaStorage.length; i++)
//			{
//				var via = new OpenLayers.LonLat(viaStorage[i].lonlat.lon, viaStorage[i].lonlat.lat);
//				var viaLonlat =  via.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
//				var Via_X = viaLonlat.lon.toFixed(7);
//				var Via_Y = viaLonlat.lat.toFixed(7);
//				via_xml = via_xml + '<xls:ViaPoint><xls:Position><gml:Point><gml:pos>'+Via_X+' '+Via_Y+'</gml:pos></gml:Point></xls:Position></xls:ViaPoint>';
//			}
			
			//Get No Motorways
//			var noMotorways = false;
//			if(document.getElementById("cbMotorway").checked == true)
//				noMotorways = true;
//			//Get No Tollways
//			var noTollways = false;
//			if(document.getElementById("cbTollway").checked == true)
//				noTollways = true;
			
			//Set Infos ...
			document.getElementById('informations').style.visibility = 'visible';
			document.getElementById('informations').innerHTML =  '<span class="infos">Bitte warten Sie einen Moment! Die Berechnung ben�tigt ein paar Sekunden...<br> Wenn innerhalb von 10 Sekunden keine Route angezeigt wird, probieren Sie es bitte sp�ter noch einmal!</span>';
			//document.getElementById('problems').innerHTML = '<span class="infos"></span>';
			
//			var data = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+'&Via='+ via_xml + '&lang='+lang+'&distunit=KM&routepref='+pref
//				+'&avoidAreas=&useTMC=&&noMotorways='+noMotorways+'&noTollways='+noTollways + '&instructions=true';
//			var url = 'php/OpenLSRS_DetermineRoute.php';
			
			var smoothness = 'unknown'; var surface = 'unknown'; var incline = '0'; var sloped_curb = 'unknown';
			
			sloped_curb = document.getElementById("sloped_curb")[document.getElementById("sloped_curb").selectedIndex].value;
			
			incline = document.getElementById("incline")[document.getElementById("incline").selectedIndex].value;
			
			smoothness = document.getElementById("smoothness")[document.getElementById("smoothness").selectedIndex].value;
			
			if (smoothness == 'good'){
				surface = 'asphalt';
			}
			else if (smoothness == 'intermediate'){
				surface = 'paving_stones';
			}
			else if (smoothness == 'bad'){
				surface = 'cobblestone';
			}
			else if (smoothness == 'unknown'){
				surface = 'unknown';
			}
			
		
			
			var url = OpenLayers.ProxyHost + 'http://129.206.229.156/rolli/determineroute'+
			 '?start%3D'+Start_X+','+Start_Y+'%26end%3D'+End_X+','+End_Y+
			 '%26preference%3Dwheelchair%26language%3Dde'+
			 '%26smoothness%3D'+smoothness+'%26surface%3D'+surface+'%26incline%3D'+incline+'%26sloped_curb%3D'+sloped_curb;

		/*
	new OpenLayers.Ajax.Request(url, { method: "get", onComplete: showRoute } );
*/
			
				OpenLayers.Request.issue({
									method: 'POST',
									url: url,
									data: data,
									headers: {
										'Content-Type': 'application/x-www-form-urlencoded'
									},
									callback: showRoute
								});	
			
			
		}
		
		
		
		
		function pause(numberMillis)
		{
			var now = new Date();
			var exitTime = now.getTime() + numberMillis;
			while (true)
			{
				now = new Date();
				if (now.getTime() > exitTime)
				return;
			}
		}
		
		
		function determineRoute(button_pressed){
			
			button_calculate_pressed = button_pressed;
			route_calculating = true;
			
			if((getStartOrEndFeature('Start')== undefined)&&(getStartOrEndFeature('End')== undefined)){
				alert("Please set 'Start' and 'End' point first! \nEnter your addresses in the textfields and press 'Set' \nor use rightclick to set the points on the map.");
				return;
			}
			if(getStartOrEndFeature('Start')==undefined){
				alert("Please set 'Start' point! \nEnter your address in the textfield and press 'Set' \nor use rightclick to set the point on the map.");
				return;
			}
			if(getStartOrEndFeature('End')==undefined){
				alert("Please set 'End' point! \nEnter your address in the textfield and press 'Set' \nor use rightclick to set the point on the map.");
				return;
			}
			
			//Get AvoidAreas, if exsist!!
			var avoidAreas = "";

//			if(vectorLayerAvoid != null){
//				for(var i=0 ; i<vectorLayerAvoid.features.length ; i++){
//					if(vectorLayerAvoid.features[i].geometry instanceof OpenLayers.Geometry.Polygon){
//						var polygon = '<xls:AOI>\n <gml:Polygon>\n  <gml:exterior>\n   <gml:LinearRing>\n    ';
//						var feature = vectorLayerAvoid.features[i];
//						for (var j = 0 ; j < feature.geometry.components[0].components.length ; j++) {
//							var x = feature.geometry.components[0].components[j].x;
//							var y = feature.geometry.components[0].components[j].y;
//							var lonlat = new OpenLayers.LonLat(x,y);
//							lonlat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
//							polygon += '     <gml:pos>'+lonlat.lon+' '+lonlat.lat+'</gml:pos>\n';
//						}
//						polygon += '   </gml:LinearRing>\n  </gml:exterior>\n </gml:Polygon>\n</xls:AOI>';
//						avoidAreas += polygon;
//					}
//				}
//			}
		
			//Get Language and DistanceUnit
			//var language = document.getElementById("selectLanguage")[document.getElementById("selectLanguage").selectedIndex].value;
			//var distanceUnit = document.getElementById("selectDistanceUnit")[document.getElementById("selectDistanceUnit").selectedIndex].value;
			var routepref = 'wheelchair';//document.getElementById("selectRoutePref")[document.getElementById("selectRoutePref").selectedIndex].value;
			//feste Eingabe der Routepraefernz. sonst koennte auch pkw, fussgaenger...etc gewaehlt werden
			route_preference = routepref;
			//route_language = language;
			
			//Get Use Real Time Traffic
//			var useTMC = false;
//			if(document.getElementById("cbTMC").checked == true)
//				useTMC = true;
//			
//			//Get No Motorways
//			var noMotorways = false;
//			if(document.getElementById("cbMotorway").checked == true)
//				noMotorways = true;
//			//Get No Tollways
//			var noTollways = false;
//			if(document.getElementById("cbTollway").checked == true)
//				noTollways = true;

			//disable Calculate Button
			//document.getElementById("Calculate").disabled=true;
			//document.getElementById("switchStartEnd").disabled=true;

			//get start, via and end geom
			
			var startFeat = getStartOrEndFeature('Start');
			var endFeat = getStartOrEndFeature('End');
			var start = new OpenLayers.LonLat(startFeat.lonlat.lon,startFeat.lonlat.lat);
			var startLonlat = start.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			var end = new OpenLayers.LonLat(endFeat.lonlat.lon,endFeat.lonlat.lat);
			var endLonlat = end.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			var Start_X = startLonlat.lon.toFixed(7);//vectorLayerStart.features[0].geometry.x;
			var Start_Y = startLonlat.lat.toFixed(7);//vectorLayerStart.features[0].geometry.y;
			var End_X = endLonlat.lon.toFixed(7);//vectorLayerEnd.features[0].geometry.x;
			var End_Y = endLonlat.lat.toFixed(7);//vectorLayerEnd.features[0].geometry.y;
			
			//xml for Viapoints !!! no EPSG-Code provided (<gml:Point srsName=\"EPSG:4326\">)
			var via_xml = '';
			//viaStorage = sortVias(viaStorage);
			/*for (var i=0; i<viaStorage.length; i++){
				alert(viaStorage[i].myId);
			}*/
			/*for(var i = 0; i < viaStorage.length; i++)
			{
				var via = new OpenLayers.LonLat(viaStorage[i].lonlat.lon, viaStorage[i].lonlat.lat);
				var viaLonlat =  via.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
				var Via_X = viaLonlat.lon.toFixed(7);
				var Via_Y = viaLonlat.lat.toFixed(7);
				via_xml = via_xml + '<xls:ViaPoint><xls:Position><gml:Point><gml:pos>'+Via_X+' '+Via_Y+'</gml:pos></gml:Point></xls:Position></xls:ViaPoint>';
			}*/
			
			//var url = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+'&lang='+language+'&distunit='+distanceUnit;
			//OpenLayers.loadURL("php/OpenLSRS_DetermineRoute.php?"+url, '', null, showRoute);
			
			//Set Infos ...
			
			
//			document.getElementById('informations').style.visibility = 'visible';
//			document.getElementById('informations').innerHTML =  '<span class="infos">Bitte warten Sie einen Moment! Die Berechnung ben�tigt ein paar Sekunden...<br> Wenn innerhalb von 10 Sekunden keine Route angezeigt wird, probieren Sie es bitte sp�ter noch einmal!</span>';
//			document.getElementById('problems').innerHTML = '<span class="infos"></span>';
//			
//			var data = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+'&Via='+ via_xml +'&lang=de'+'&distunit=KM'
//				+'&routepref='+routepref+'&avoidAreas='+avoidAreas+'&useTMC=false'
//				+'&noMotorways=false'+'&noTollways=false'+'&instructions=true';
//			var url = 'php/OpenLSRS_DetermineRoute.php';
			var smoothness = 'unknown'; var surface = 'unknown'; var incline = '0'; sloped_curb = 'unknown';
			
			sloped_curb = document.getElementById("sloped_curb")[document.getElementById("sloped_curb").selectedIndex].value;
			
			incline = document.getElementById("incline")[document.getElementById("incline").selectedIndex].value;
			
			smoothness = document.getElementById("smoothness")[document.getElementById("smoothness").selectedIndex].value;
			
			if (smoothness == 'good'){
				surface = 'asphalt';
			}
			else if (smoothness == 'intermediate'){
				surface = 'paving_stones';
			}
			else if (smoothness == 'bad'){
				surface = 'cobblestone';
			}
			else if (smoothness == 'unknown'){
				surface = 'unknown';
			}
			
			route_smoothness = smoothness;
			route_incline = incline;
			route_sloped_curb = sloped_curb;
			
			var pref;
			var consumption = '';
			if (document.getElementById('elektro').checked) {
				pref = 'eVehicle';
				if (!isNaN(parseFloat(document.getElementById('consumption').value)) && isFinite(document.getElementById('consumption').value)) {
					consumption = '%26regularConsumption%3D'+document.getElementById('consumption').value;
				}
			} else {
				pref = 'wheelchair';
			}
			
			if (document.getElementById('elektro').checked && consumption != '') {
				showMessage('Bitte warten Sie einen Moment! Die Berechnung benötigt ein paar Sekunden...<br> Wenn innerhalb von 10 Sekunden keine Route angezeigt wird, probieren Sie es bitte später noch einmal!');
				var url = OpenLayers.ProxyHost + 'http://129.206.229.156/rolli/determineroute' +
				'?start%3D' +
				Start_X +
				',' +
				Start_Y +
				'%26end%3D' +
				End_X +
				',' +
				End_Y +
				'%26preference%3D' +
				pref +
				'%26language%3Dde' +
				'%26smoothness%3D' +
				smoothness +
				'%26surface%3D' +
				surface +
				'%26incline%3D' +
				incline +
				'%26sloped_curb%3D' +
				sloped_curb +
				consumption;
				
				/*
	 new OpenLayers.Ajax.Request(url, { method: "get", onComplete: showRoute } );
	 */
				OpenLayers.loadURL(url, '', null, showRoute);
			} else if (document.getElementById('elektro').checked && consumption == '') {
				alert('Bitte geben sie einen numerischen Wert in das Feld Verbrauch ein.');
			} else {
				var url = OpenLayers.ProxyHost + 'http://129.206.229.156/rolli/determineroute' +
				'?start%3D' +
				Start_X +
				',' +
				Start_Y +
				'%26end%3D' +
				End_X +
				',' +
				End_Y +
				'%26preference%3D' +
				pref +
				'%26language%3Dde' +
				'%26smoothness%3D' +
				smoothness +
				'%26surface%3D' +
				surface +
				'%26incline%3D' +
				incline +
				'%26sloped_curb%3D' +
				sloped_curb;
				OpenLayers.loadURL(url, '', null, showRoute);
			}
//			OpenLayers.loadURL({
//									method: 'POST',
//									url: url,
//									
//									headers: {
//										'Content-Type': 'application/x-www-form-urlencoded'
//									},
//									callback: showRoute
//								});			
		
			// assuming you already know how to create your handler
			//var request = OpenLayers.Request.POST({url: url,data: data,callback: showRoute});

//			new OpenLayers.Ajax.Request(url,
//                         {   method: 'post',
//                             parameters: data,
//                             onComplete: showRoute
//                          }
//						  );
		}
		
		
		function determineRouteFast(){
			route_calculating = true;

			//Get Language and DistanceUnit
			var routepref = document.getElementById("selectRoutePref")[document.getElementById("selectRoutePref").selectedIndex].value;

			//Get No Motorways
			var noMotorways = false;
//			if(document.getElementById("cbMotorway").checked == true)
//				noMotorways = true;

			//get start and end geom  
			var startFeat = getStartOrEndFeature('Start');
			var endFeat = getStartOrEndFeature('End');
			var start = new OpenLayers.LonLat(startFeat.lonlat.lon,startFeat.lonlat.lat);
			var startLonlat = start.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			
			var end = new OpenLayers.LonLat(endFeat.lonlat.lon,endFeat.lonlat.lat);
			var endLonlat = end.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
			var Start_X = startLonlat.lon.toFixed(7);//vectorLayerStart.features[0].geometry.x;
			var Start_Y = startLonlat.lat.toFixed(7);//vectorLayerStart.features[0].geometry.y;
			var End_X = endLonlat.lon.toFixed(7);//vectorLayerEnd.features[0].geometry.x;
			var End_Y = endLonlat.lat.toFixed(7);//vectorLayerEnd.features[0].geometry.y;
			
			//var url = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+'&lang='+language+'&distunit='+distanceUnit;
			//OpenLayers.loadURL("php/OpenLSRS_DetermineRoute.php?"+url, '', null, showRoute);
			
			//xml for Viapoints !!! no EPSG-Code provided (<gml:Point srsName=\"EPSG:4326\">)
			
			var via_xml = '';
			/*for(var i = 0; i < viaStorage.length; i++)
			{
				var via = new OpenLayers.LonLat(viaStorage[i].lonlat.lon, viaStorage[i].lonlat.lat);
				var viaLonlat =  via.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
				var Via_X = viaLonlat.lon.toFixed(7);
				var Via_Y = viaLonlat.lat.toFixed(7);
				via_xml = via_xml + '<xls:ViaPoint><xls:Position><gml:Point><gml:pos>'+Via_X+' '+Via_Y+'</gml:pos></gml:Point></xls:Position></xls:ViaPoint>';
			}*/
			
			var data = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+ '&Via='+ via_xml +'&lang=de&distunit=KM&routepref='
				+routepref+'&avoidAreas=&useTMC=false&noMotorways='+noMotorways+'&instructions=false';
			var url = 'php/OpenLSRS_DetermineRoute.php';

			//new RouteSummary not calculated yet
			document.getElementById('informations').innerHTML = '<table><tr><td><span class="route_summary_heading">Route changed ...</span></td></tr><tr><td><span class="infos">Please press <b>"Calculate"</b> to show the new RouteSummary!'+
					'<br><br><b>Notice:</b> AvoidAreas are not work in the Location-Dragging-Mode <br> and it is NOT possible to drag ViaPoints yet!</span></td></tr></table>';

			// assuming you already know how to create your handler
			//var request = OpenLayers.Request.POST({url: url,data: data,callback: showRoute});


//			new OpenLayers.Ajax.Request(url,
//                         {   method: 'post',
//                             parameters: data,
//                             onComplete: showRouteGeom
//                          }
//						  );

			OpenLayers.loadURL(url, '', null, showRouteGeom);

						  
	
		}

		function showRoute(response) {
		
			//alert(response.responseText);
			if (response) {
				
				// remove route, start and end
				//vectorLayerStart.destroyFeatures();
				//vectorLayerEnd.destroyFeatures();
				vectorLayerRoute.removeFeatures(vectorLayerRoute.features);
				
				//alert(response.responseText);
				var xmlresponse = response.responseXML;

				var errorList = xmlresponse.getElementsByTagName('ErrorList');
				if(errorList.length == 0)//IEHack
						errorList = xmlresponse.getElementsByTagName('xls:ErrorList');

				if(errorList.length > 0){
					var error = errorList[0].getElementsByTagName('Error');
					if(error.length == 0)//IEHack
						error = xmlresponse.getElementsByTagName('xls:Error');
					
					var message = error[0].getAttribute('message')

//					alert('Meldung: '+message+'\nHinweis: Die Route kann nicht berechnet werden!');
					//alert('\nHinweis: Die Route kann nicht berechnet werden! Bitte setzen Sie die Pr�ferenzen f�r Ihre Routenberechnung herab. Der Start- oder Zielpunkt liegt m�glicherweise in einem Bereich, der durch Ihre Auswahl ausgeschlossen wurde!');
					showError('Die Route kann nicht berechnet werden! Bitte setzen Sie die Pr�ferenzen für Ihre Routenberechnung herab. Der Start- oder Zielpunkt liegt möglicherweise in einem Bereich, der durch Ihre Auswahl ausgeschlossen wurde!');
					//document.getElementById('problems').innerHTML = '<span class="problems">'+message+'</span>';
					//document.getElementById('informations').innerHTML = "";
					
					$('#message').remove();
				}
				else{
					// parse RouteGeometry
					var routeGeometry = xmlresponse.getElementsByTagName('RouteGeometry');
					if(routeGeometry.length == 0)//IE Hack
						routeGeometry = xmlresponse.getElementsByTagName('xls:RouteGeometry');

					//alert('Positions: '+positions.length);
					
					var positions = routeGeometry[0].getElementsByTagName('pos');
					if(positions.length == 0)//IEHack
						positions = routeGeometry[0].getElementsByTagName('gml:pos');

						var startPos, endPos;
						var line_points = [];
						var lonlat4gpx = '';
						lonlatRoute = '';
						
						for (var i = 0; i < positions.length; i++) {
							var pos;
							if(typeof positions[i].textContent != 'undefined')
								pos = positions[i].textContent.split(' ');
							else
								pos = positions[i].text.split(' ');
								
							lonlat4gpx += '					<trkpt lon="'+pos[0]+'" lat="'+pos[1]+'"/>\n';
							//7.10807 50.735097,7.108069921645446 50.73509695251465,7.1079199 50.7353445,7.10
							if(lonlatRoute.length > 0)
								lonlatRoute +=','+pos[0]+' '+pos[1];
							else
								lonlatRoute +=pos[0]+' '+pos[1];
								
							line_points.push(new OpenLayers.Geometry.Point(pos[0],pos[1]).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")) );
							
							if(i % 100 == 0 && i>0 || i==positions.length-1){
								vectorLayerRoute.addFeatures([new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(line_points))]);
								line_points = [];
								line_points.push(new OpenLayers.Geometry.Point(pos[0],pos[1]).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")) );
							}

							if(i==0)
								startPos = pos;
							if(i==positions.length-1)
								endPos = pos;
						}
						//var featureStart = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(startpos[0],startpos[1]), null, start_style);
						//vectorLayerRoute.addFeatures([featureStart]);
						//var featureEnd = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(endpos[0],endpos[1]), null, end_style);
						//vectorLayerRoute.addFeatures([featureEnd]);

					//parse RouteSummary
					var routeSummary = xmlresponse.getElementsByTagName('RouteSummary');
					if(routeSummary.length == 0)
						routeSummary = xmlresponse.getElementsByTagName('xls:RouteSummary');

					var totalTime = routeSummary[0].getElementsByTagName('TotalTime');
					if(totalTime.length == 0)
						totalTime = routeSummary[0].getElementsByTagName('xls:TotalTime');
					
					var time;
					if(typeof totalTime[0].textContent != 'undefined')
						time = totalTime[0].textContent;
					else
						time = totalTime[0].text;
						
					var totalDistance = routeSummary[0].getElementsByTagName('TotalDistance');
					if(totalDistance.length == 0)
						totalDistance = routeSummary[0].getElementsByTagName('xls:TotalDistance');
						
					var efficiency = routeSummary[0].getElementsByTagName('Relevance');
					if(efficiency.length == 0)
						efficiency = routeSummary[0].getElementsByTagName('xls:Relevance');
						
						
					var energyConsumption = routeSummary[0].getElementsByTagName('EnergyConsumption');
					if(energyConsumption.length == 0)
						energyConsumption = routeSummary[0].getElementsByTagName('xls:EnergyConsumption');

					//parse RouteInstructions
					var routeInstructions = xmlresponse.getElementsByTagName('RouteInstructionsList');
					if(routeInstructions.length == 0)
						routeInstructions = xmlresponse.getElementsByTagName('xls:RouteInstructionsList');

					var instructions = routeInstructions[0].getElementsByTagName('Instruction');
					if(instructions.length == 0)
						instructions = routeInstructions[0].getElementsByTagName('xls:Instruction');
						
					var distances = routeInstructions[0].getElementsByTagName('distance');
					if(distances.length == 0)
						distances = routeInstructions[0].getElementsByTagName('xls:distance');
					
					//parse RouteInstructionGeometry
					var routeInstructionsGeometry = routeInstructions[0].getElementsByTagName('RouteInstructionGeometry');
					if(routeInstructionsGeometry.length == 0)
						routeInstructionsGeometry = routeInstructions[0].getElementsByTagName('xls:RouteInstructionGeometry');

					document.getElementById('informations').style.visibility = 'visible';

					//create Result
					var routeinstructionsResult;
					//routeinstructionsResult ='<table><tr><td width="25"><span class="route_instruction_heading">Nr.</span></td>\n'+
					//			'<td width="250"><span class="route_instruction_heading">Fahranweisung</span></td>'+
					//			'<td><span class="route_instruction_heading">Distanz</span></td></tr> \n';
					
					routeinstructionsResult = '<div class="routeResults"><table class="routingResults"><tr>' 
						+ '<th>Nr.</th>' 
						+ '<th>Fahranweisung</th>' 
						+ '<th>Distanz</th></tr>';
								
					var j=1;
					
						for (var i = 0; i < instructions.length; i++) {
							//InstructionText
							var text;
							if(typeof instructions[i].textContent != 'undefined')
								text = instructions[i].textContent;
							else
								text = instructions[i].text;
								
							//distances
							var distance = distances[i].getAttribute('value')+' '+distances[i].getAttribute('uom').toLowerCase()

							//InstructionGeometry
							var position = routeInstructionsGeometry[i].getElementsByTagName('pos');
							if(position.length == 0)
								position = routeInstructionsGeometry[i].getElementsByTagName('gml:pos');

							var pos;
							if(typeof position[0].textContent != 'undefined')
								pos = position[0].textContent.split(' ');
							else
								pos = position[0].text.split(' ');
							
							if(i==0)
								pos = startPos;
							if(i==1){//damit die zweite instruction immer auf den zweiten Punkt der Geometrie geht!
								if(typeof position[1].textContent != 'undefined')
									pos = position[1].textContent.split(' ');
								else
									pos = position[1].text.split(' ');
							}
							if(i==instructions.length-1)
								pos = endPos;

							//create instruction for display
							if ((j % 2) == 1) {
								routeinstructionsResult += '<tr class="odd">';
							} else {
								routeinstructionsResult += '<tr>';
							}
							
							routeinstructionsResult += '<td class="num"><a href="#" onClick="javascript:lonlatzoom(new OpenLayers.LonLat('+pos[0]+','+pos[1]+'), null);" '+
								'title="To the instrucion ...">'+j+'.</a></td>'
								 + '<td>'+text+'</td>'
								 + '<td class="dist">'+distance+'</td></tr>';
							
//							routeinstructionsResult += '<tr><td width="15"><span class="route_instruction">'+
//								'<a href="#" onClick="javascript:lonlatzoom(new OpenLayers.LonLat('+pos[0]+','+pos[1]+'), null);" '+
//								'title="To the instrucion ...">'+j+'.</a></span></td>\n'+
//								'<td width="250"><span class="route_instruction">'+text+'</span></td>'+
//								'<td><span class="route_instruction">'+distance+'</span></td></tr> \n';
							j++;
						}
					routeinstructionsResult += '</table></div>';

					var gpxFile = '<?xml version="1.0" encoding="UTF-8"?>\n'+
								'<gpx \n'+
								'	xmlns="http://www.topografix.com/GPX/1/1" \n'+
								'	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \n'+
								'	xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" \n'+
								'	creator="www.OpenRouteService.org" version="1.1">\n'+
								'	<trk>\n'+
								'		<name>Route</name>\n'+
								'		<trkseg>\n'+
									lonlat4gpx+
								'		</trkseg>\n'+
								'	</trk>\n'+
								'</gpx>';

					var gpxHTML = '<form method="POST" action="php/getGPXFile.php">'+
						//'<input id="getGPX" name="getGPX" type="submit" value="GPX"/>'+
						'<button class="linkBtn" id="getGPX" name="getGPX" type="submit">GPX-Track herunter laden</button>'+
						'<textarea id="gpx" name="gpx" style="display:none">'+gpxFile+'</textarea>'+
						'<input type="hidden" id="hidden" name="hidden" value="test">'+
						'</form>';
						
					var xmlHTML = '<form id="getXML" method="POST" action="php/getXMLFile.php">'+
						//'<input id="getXML" name="getXML" type="submit" value="XML"/>'+
						'<button class="linkBtn" id="getXML" name="getXML" type="submit">XML herunter laden</button>'+ 
						'<textarea id="xml" name="xml" style="display:none">'+response.responseText+'</textarea>'+
						'<input type="hidden" id="hidden" name="hidden" value="test">'+
						'</form>';	
						
//						var gpxHTML = '<form method="POST" action="php/getGPXFile.php">'+
//						'<input id="getGPX" name="getGPX" type="submit" value="GPX"/>'+
//						'<textarea id="gpx" name="gpx" style="display:none">'+gpxFile+'</textarea>'+
//						'<input type="hidden" id="hidden" name="hidden" value="test">'+
//						'</form>';
//						
//					var xmlHTML = '<form method="POST" action="php/getXMLFile.php">'+
//						'<input id="getXML" name="getXML" type="submit" value="XML"/>'+
//						'<textarea id="xml" name="xml" style="display:none">'+response.responseText+'</textarea>'+
//						'<input type="hidden" id="hidden" name="hidden" value="test">'+
//						'</form>';	
					
					var via_parts='';
					
					/*if((viaStorage.length != 0)&&(viaStorage.length <= countVia)){
						via_parts='&via=';
						for(var i = 0; i < viaStorage.length; i++)
						{
							var via = new OpenLayers.LonLat(viaStorage[i].lonlat.lon, viaStorage[i].lonlat.lat);
							var viaLonlat =  via.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
							var Via_X = viaLonlat.lon.toFixed(7);
							var Via_Y = viaLonlat.lat.toFixed(7);
							
							if(i == viaStorage.length){
								via_parts = via_parts + Via_X +','+Via_Y ;
							}else{	
								via_parts = via_parts + Via_X +','+Via_Y + ' ';
							}
						}
					}*/

//					//Get No Motorways
//					var noMotorways = false;
//					if(document.getElementById("cbMotorway").checked == true)
//						noMotorways = true;
//					//Get No Tollways
//					var noTollways = false;
//					if(document.getElementById("cbTollway").checked == true)
//						noTollways = true;
					
//					hinter &smoothness='+route_smoothness+'...etc muss noch &sloped_curb='+route_sloped_curb+'
					
					var ResultRouteSummary ='<table>'+
												'<tr><td><span class="route_summary_heading"></span></td>'+
												    '<td width="10">&nbsp;</td>'+
												    '<td colspan="3"><span class="route_summary_heading">Extras: <a href="index.php?start='+startPos[0]+','+startPos[1]+'&end='+endPos[0]+','+endPos[1]+ via_parts  
													//+'&pref='+route_preference+'&lang='+route_language+'" class="link_text_middle" title="Link for the Route!">RouteLink</a></span></td>'+
													+'&pref='+route_preference+'&lang=de'+'&smoothness='+route_smoothness+'&incline='+route_incline+'&sloped_curb='+route_sloped_curb+'" class="link_text_middle" target="_blank" title="Link for the Route!">RouteLink</a>'+
													' <input type="button" name="Profile" id="Profile" value="Profile" onClick="displayProfile(); return false;"></span></td>'+
													//' <a href="" onClick="displayProfile(); return false;" class="link_text_middle" title="Get Profile of the Route!">Profile</a></span></td>'+
													'<td></td></tr>'+
												'<tr nowrap><td class="route_summary" align="left" valign="top">Gesamtzeit bei 4km/h: ~ '+getTimeString(time)+
														'<br>Gesamtstrecke: ~ '+totalDistance[0].getAttribute('value')+' '+totalDistance[0].getAttribute('uom').toLowerCase()+'</td>'+
													'<td>&nbsp;</td>'+
													'<td align="left" valign="top"><span class="route_summary_heading">Download:</span></td>'+
													'<td>'+gpxHTML+'</td><td>'+xmlHTML+'</td></tr></table>';
													
					var ResultRouteSummary = '<h2>Route nach <span class="destination">' + $('input#tfEndSearch').val() + '</span></h2><a href="#" onclick="$(\'div#informations\').hide(); $(\'form.planRoute\').show();">Route Bearbeiten</a>' 
						+ '<h3>Informationen zur Strecke</h3><ul class="info"><li>Strecke: ~ '+totalDistance[0].getAttribute('value')+' '+totalDistance[0].getAttribute('uom').toLowerCase()+'</li><li>Gesamtzeit: ' + getTimeString(time) + ' (bei 4km/h)</li>';
					
					if (efficiency.length > 0) {
						ResultRouteSummary += '<li class="effizienz_res">Relevanz: ' + efficiency[0].textContent + '</li>';
					}
					if (energyConsumption.length > 0) {
						ResultRouteSummary += '<li>Verbrauch (Ah): ' + parseFloat(energyConsumption[0].textContent).toFixed(2).replace('.', ',') + '</li>';
					}
					
					ResultRouteSummary += '</ul>';
					
					var ExtraLinks = '<h3>Downloads</h3>' 
						//+ '<ul><li><a href="#">Download GPX-Track</a></li><li><a href="#">Dowload XML</a></li></ul>'
						+ '<ul><li>' + gpxHTML + '</li><li>' + xmlHTML + '</li></ul>'
						+ '<h3>Extras</h3>' 
//						+ '<ul><li><a href="index.php?start='+startPos[0]+','+startPos[1]+'&end='+endPos[0]+','+endPos[1]+ via_parts +'&pref='+route_preference+'&lang=de'+'&smoothness='+route_smoothness+'&incline='+route_incline+'&sloped_curb='+route_sloped_curb+'"">Permalink zu dieser Route</a></li>' 
						+ '<ul><li><a href="#" onClick="displayProfile(); return false;">Höhenprofil zu dieser Route anzeigen</a></li></ul>';
					
					$('#message').remove();
					$('.planRoute').hide();
					$('#informations').show();
					document.getElementById('informations').innerHTML = ResultRouteSummary + routeinstructionsResult + ExtraLinks;
					
					//document.getElementById('problems').innerHTML = '<span class="infos"></span>';
				}
				//enable Calculate Button
				document.getElementById("Calculate").disabled=false;
				//document.getElementById("switchStartEnd").disabled=false;
				
				if(button_calculate_pressed){
					button_calculate_pressed = false;
					//document.getElementById("rbMap").checked=true;
					//toggleControl(document.getElementById("rbMap"));
				}
			}
			route_calculating = false;
			//console.log(totalDistance[0].getAttribute('uom'));
			//console.log(parseFloat(totalDistance[0].getAttribute('value')));
			if((totalDistance[0].getAttribute('uom')=='KM')&&(parseFloat(totalDistance[0].getAttribute('value')) >= 150)){
				map.zoomTo(map.zoom-1);
			}else if((totalDistance[0].getAttribute('uom')=='M')&&(parseFloat(totalDistance[0].getAttribute('value')) >= 150000)){
				map.zoomTo(map.zoom-1);
			}
			else if((totalDistance[0].getAttribute('uom')=='MI')&&(parseFloat(totalDistance[0].getAttribute('value')) >= 95)){
				map.zoomTo(map.zoom-1);
			}
			else if((totalDistance[0].getAttribute('uom')=='YD')&&(parseFloat(totalDistance[0].getAttribute('value')) >= 166000)){
				map.zoomTo(map.zoom-1);
			}
		}
		
		function showRouteGeom(response) {
		
			//alert(response.responseText);
			if (response) {
				
				// remove route, start and end
				//vectorLayerStart.destroyFeatures();
				//vectorLayerEnd.destroyFeatures();
				vectorLayerRoute.removeFeatures(vectorLayerRoute.features);
				
				//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('Meldung: '+message+'\nHinweis: Die Route kann nicht berechnet werden!');
					showError(message);
					//document.getElementById('problems').innerHTML = '<span class="problems">'+message+'</span>';
					document.getElementById('informations').innerHTML = "";
				}
				else{
					// parse RouteGeometry
					var routeGeometry = xmlresponse.getElementsByTagName('RouteGeometry');
					if(routeGeometry.length == 0)
						routeGeometry = xmlresponse.getElementsByTagName('xls:RouteGeometry');

					//alert('Positions: '+positions.length);
					
					var positions = routeGeometry[0].getElementsByTagName('pos');
					if(positions.length == 0)
						positions = routeGeometry[0].getElementsByTagName('gml:pos');

						var startPos, endPos;
						var line_points = [];

						for (var i = 0; i < positions.length; i++) {
							var pos;
							if(typeof positions[i].textContent != 'undefined')
								pos = positions[i].textContent.split(' ');
							else
								pos = positions[i].text.split(' ');
								

							line_points.push(new OpenLayers.Geometry.Point(pos[0],pos[1]).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")) );
							
							if(i % 100 == 0 && i>0 || i==positions.length-1){
								vectorLayerRoute.addFeatures([new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(line_points))]);
								line_points = [];
								line_points.push(new OpenLayers.Geometry.Point(pos[0],pos[1]).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")) );
							}

							if(i==0)
								startPos = pos;
							if(i==positions.length-1)
								endPos = pos;
						}

					document.getElementById('problems').innerHTML = '<span class="infos"></span>';
				}
			}
			route_calculating = false;
			
		}
		
		//<period>PT5Y2M10D15H18M43S</period>
		//The example above indicates a period of five years, two months, 10 days, 15 hours, a8 minutes and 43 seconds
		function getTimeString(duration){

			//Sekunden anschneiden!
			duration = duration.substring(0,duration.indexOf('M')+1);

			duration = duration.replace('PT','');
			duration = duration.replace('D', ' Tage ');
			duration = duration.replace('H', ' Stunden ');
			duration = duration.replace('M', ' Minuten ');
			//duration = duration.replace('S', ' second(s)');
			
			
			return duration;
		}
//********************************************************** 
