
/*+-------------+----------------------------------------------------------*
 *|        /\   |   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_calculating = false;
var button_calculate_pressed = false;

var lonlatRoute = "";
var rbufferdata = "";

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">Please wait a moment! This could take several seconds ... <br> If no Route is displayed after 10 seconds, please try again later.</span>';
			//document.getElementById('problems').innerHTML = '<span class="infos">none</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';
			
			// assuming you already know how to create your handler
			new OpenLayers.Ajax.Request(url,
                         {   method: 'post',
                             parameters: data,
                             onComplete: 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, DistanceUnit and RoutePreference
			var language = document.getElementById("selectLanguage")[document.getElementById("selectLanguage").selectedIndex].value;
			var distanceUnit = document.getElementById("selectDistanceUnit")[document.getElementById("selectDistanceUnit").selectedIndex].value;
			var routepref = document.getElementById("selectRoutePref")[document.getElementById("selectRoutePref").selectedIndex].value;
			route_preference = routepref;
			
//			var routepref;
//			
//			 if (document.getElementsByName("r1")[0].value == 0)
//				 		{
//						routepref = "Fastest";
//						}
//						else 	{
//									if (document.getElementsByName("r1")[0].value == 1)
//										 {
//										 routepref = "Shortest";		
//										 }
//     								 else	{
//	  								 			if (document.getElementsByName("r1")[0].value == 2)
//														 {
//														 routepref = "Pedestrian";		
//														 }
//														 else	{
//														 			if (document.getElementsByName("r1")[0].value == 3)
//																	{
//																	routepref = "Bicycle";		
//																	}
//																	}
//													}
//
//						}
			
			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">Please wait a moment! This could take several seconds ... <br> If no Route is displayed after 10 seconds, please try again later.</span>';
			//document.getElementById('problems').innerHTML = '<span class="infos">none</span>';

///*	
			var data = 'Start='+Start_X+','+Start_Y+'&End='+End_X+','+End_Y+'&Via='+ via_xml +'&lang='+language+'&distunit='+distanceUnit
				+'&routepref='+routepref+'&avoidAreas='+avoidAreas+'&useTMC='+useTMC
				+'&noMotorways='+noMotorways+'&noTollways='+noTollways+'&instructions=true';
			var url = 'php/OpenLSRS_DetermineRoute.php';

			// 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 } );
//*/
/*
			var smoothness = 'unknown'; var surface = 'unknown'; var incline = '4'; var sloped_curb = '0.10';
			var url = OpenLayers.ProxyHost + 'http://localhost:8080/MoNa/determineroute'+
			//var url = OpenLayers.ProxyHost + 'http://131.220.111.117/openls-rolli/determineroute'+
				'?start%3D'+Start_X+','+Start_Y+'%26end%3D'+End_X+','+End_Y+
				'%26preference%3Dwheelchair%26language%3Dde'+
				//'%26preference%3DPedestrian%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 } );
*/
		}
		
		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
                          }
						  );
		}

		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('Message: '+message+'\nNotice: the Route Service is at this time only for Europe!');
					//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)//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 = '';
						lonlatBuffer = ''; // global variable for buffer calculation
											
						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];
								lonlatBuffer +=' '+pos[0]+' '+pos[1];
							}
							else{
								lonlatRoute +=pos[0]+' '+pos[1];
								lonlatBuffer +=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;
						}
						
						rbufferdata = 'RouteCoords='+lonlatBuffer;
						
//						var bufferurl = 'php/WPS_Buffer.php';
//						
////						alert(bufferdata);
//						new OpenLayers.Ajax.Request(bufferurl,
//		                         {   method: 'post',
//		                             parameters: rbufferdata,
//		                             onComplete: makeDSRequest
//		                          }
//								  );
						
				//ab hier versuche ich die BoundingBox innerhalb der XLS Datei vom RouteService auszulesen.
					var boundingbox = xmlresponse.getElementsByTagName('BoundingBox');
					if(boundingbox.length == 0) boundingbox = xmlresponse.getElementsByTagName('xls:BoundingBox');
					//jetzt die einzelnen Koordinaten auslesen
					var boundingpoints = boundingbox[0].getElementsByTagName('pos');
					if(boundingpoints.length == 0) boundingpoints = boundingbox[0].getElementsByTagName('gml:pos');
							var boundpos1;
							var boundpos2;
							if(typeof boundingpoints[0].textContent != 'undefined'){boundpos1 = boundingpoints[0].textContent.split(' ');}  //hier erhalte ich boundpos1[0] und boundpos1[1]
							else {boundpos1 = boundingpoints[0].text.split(' ');}
							if(typeof boundingpoints[1].textContent != 'undefined'){boundpos2 = boundingpoints[1].textContent.split(' ');}  //hier erhalte ich boundpos2[0] und boundpos2[1]
							else {boundpos2 = boundingpoints[1].text.split(' ');}
			var routebounds = new OpenLayers.Bounds(boundpos1[0],boundpos1[1],boundpos2[0],boundpos2[1]).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913"));
			map.zoomToExtent(routebounds);
					//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');

					//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">Route-Instruction</span></td>'+
								'<td><span class="route_instruction_heading">Distance (Total)</span></td></tr> \n';
					var j=1;
					
					var totaldistance = 0;
						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
							routeinstructionsResult += '<tr><td width="15"><span class="route_instruction">'+
								'<a href="#" onClick="javascript:lonlatzoom(new OpenLayers.LonLat('+pos[0]+','+pos[1]+'), 16);" '+
								'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+' ('+totaldistance.toFixed(1)+' '+distances[i].getAttribute('uom').toLowerCase()+')</span></td></tr> \n';

							//TotalDistance
							totaldistance = totaldistance+parseFloat(distances[i].getAttribute('value'));								
							
							j++;
						}
					routeinstructionsResult += '</table>';
					

					var now = new Date();
					var year = now.getFullYear();
					var month = now.getMonth()+1;
					var day = now.getDate();
					var hours = now.getHours();
					var minutes = now.getMinutes();

					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_'+year+'.'+month+'.'+day+'_'+hours+minutes+'</name>\n'+
								'		<trkseg>\n'+
									lonlat4gpx+
								'		</trkseg>\n'+
								'	</trk>\n'+
								'</gpx>';

					var gpxHTML = '<form method="POST" action="php/getGPXFile.php" class="noPrint">'+
					//'<button name="getGPX" value="GPX" type="submit"><img src="img/routelinkGPX.png" title="download route as GPX-File"></button>'+
					    '<input id="getGPX" name="getGPX" type="image" src="img/routelinkGPX.png" value="GPX" title="download route as GPX-File"/>'+
					//	'<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" class="noPrint">'+
					'<input id="getXML" name="getXML" type="image" src="img/routelinkXML.png" value="XML" title="download route as XML-File"/>'+
						//'<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=';
						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);
							
							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;
						
					var ResultRouteSummary ='<table>'+
					                         '<tr><td valign="top"><span class="route_summary_heading">Extras/Download:</td>'+
					                         '<td valign="top" class="noPrint"><a href="" onClick="displayProfile(); return false;" class="icons" ><img src="img/routeHeightProfile.png" title="create profile (elevation profile of route)" border="0" width="64" height="30"></a></td>'+
					                         '<td valign="top" class="noPrint"><a href="index.php?start='+startPos[0]+','+startPos[1]+'&end='+endPos[0]+','+endPos[1]+ via_parts
					                         +'&pref='+route_preference+'&lang='+route_language+'&noMotorways='+noMotorways+'&noTollways='+noTollways+'" class="icons" target="_blank" title="Link for the Route!"><img src="img/routelink.png" border="0" title="link for the route"></a></span></td>'+
					                         '<td>'+gpxHTML+'</td><td>'+xmlHTML+'</td></tr>'+
											 '<tr><td nowrap><span class="route_summary_heading">RouteSummary <a href="javascript: print()">(Print)</a></span></td></tr>'+
											 '<tr nowrap><td class="route_summary" align="left" valign="top">Total-Time: ~ '+getTimeString(time)+
									  	     '<br>Total-Distance: ~ '+totalDistance[0].getAttribute('value')+' '+totalDistance[0].getAttribute('uom').toLowerCase()+'</td></tr></table>';
					
					document.getElementById('informations').innerHTML = ResultRouteSummary + routeinstructionsResult;
					
					//document.getElementById('problems').innerHTML = '<span class="infos">none</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('Message: '+message+'\nNotice: the Route Service is at this time only for Europe!');
					//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">none</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', ' day(s) ');
			duration = duration.replace('H', ' hour(s) ');
			duration = duration.replace('M', ' minute(s) ');
			//duration = duration.replace('S', ' second(s)');
			
			
			return duration;
		}
//**********************************************************