var SEARCH_SCRIPT="/timetable/search.php";

var HIDE_STARTEND_PED=true;

var xmlDoc;

var req_time=false;


var SolSET=new SolutionsSet();

var REQ_ID=false;

var UPDATING=false;

var req_fields={
	fromcity:false,
	fromstreet:false,
	fromhouseno:false,
	fromxcoord:false,
	fromycoord:false,
	
	tocity:false,
	tostreet:false,
	tohouseno:false,
	toxcoord:false,
	toycoord:false
}

var d_m=new Array();
d_m[1]=31;
d_m[2]=28;
d_m[3]=31;
d_m[4]=30;
d_m[5]=31;
d_m[6]=30;
d_m[7]=31;
d_m[8]=31;
d_m[9]=30;
d_m[10]=31;
d_m[11]=30;
d_m[12]=31;

function get_waiting_cost(i_sol,i_pedestrian_part){
	var time1,time2;
	if(i_pedestrian_part==0 && SolSET.solutions[i_sol].parts[i_pedestrian_part].type=="P") return false;
	if((SolSET.solutions[i_sol].parts.length-1)<=i_pedestrian_part) {
		//alert("i>l solution: "+i_sol+" i_part="+i_pedestrian_part+ "(length="+SolSET.solutions[i_sol].parts.length+")");
		return false;
	}
	
	if(SolSET.solutions[i_sol].parts[i_pedestrian_part].type=="B" && SolSET.solutions[i_sol].parts[i_pedestrian_part+1].type=="P") {
		//alert("BP solution: "+i_sol+" i_part="+i_pedestrian_part+ "(length="+SolSET.solutions[i_sol].parts.length+")");
		return false;
	}
	time1=SolSET.solutions[i_sol].parts[i_pedestrian_part].stop_time;
	time2=SolSET.solutions[i_sol].parts[i_pedestrian_part+1].start_time;
	return (time2min(time2)-time2min(time1));
}

function show_solution(i_sol,obj){
	var all_objs=document.getElementById('solutions_list');
	var solution_container=document.getElementById('solution');
	var i,startinfo,stopinfo;
	var show_alert_waiting,wCost;
	all_objs=all_objs.getElementsByTagName('li');
	for(i=0;i<all_objs.length;i++){
		all_objs[i].className='';
	}
	
	all_objs[i_sol].className='solution_selected';
	document.getElementById('solution_title').innerHTML='Dettagli soluzione '+(i_sol+1);

	solution_container.innerHTML='';
	
	fill_from(SolSET.solutions[i_sol].start_location);
	fill_to(SolSET.solutions[i_sol].stop_location);

	var zoom_args="";
	show_alert_waiting=false;
	for(i=0;i<SolSET.solutions[i_sol].parts.length;i++){
		startinfo=SolSET.solutions[i_sol].parts[i].start_time+"&nbsp;&nbsp;&nbsp;"+SolSET.solutions[i_sol].parts[i].start_location;
		stopinfo=SolSET.solutions[i_sol].parts[i].stop_time+"&nbsp;&nbsp;&nbsp;"+SolSET.solutions[i_sol].parts[i].stop_location;
		
		zoom_args=new Array();
		zoom_args[0]=i_sol
		zoom_args[1]=i;

		switch(SolSET.solutions[i_sol].parts[i].type){
			case "B":
			//percorso con BUS
			solution_container.appendChild(new_bus_element(SolSET.solutions[i_sol].parts[i].linename,SolSET.solutions[i_sol].parts[i].operatorname,startinfo,stopinfo,zoom_args));
			break;
			
			case "T":
			//percorso con TRENO
			solution_container.appendChild(new_train_element(SolSET.solutions[i_sol].parts[i].linename,SolSET.solutions[i_sol].parts[i].operatorname,startinfo,stopinfo,zoom_args));
			break;
			
			case "P":
			//percorso PEDONALE
			var tmpEL=solution_container.appendChild(new_pedestrian_element(SolSET.solutions[i_sol].parts[i].stop_location,SolSET.solutions[i_sol].parts[i].duration,zoom_args));
		
			if(HIDE_STARTEND_PED && (i==0 || i==(SolSET.solutions[i_sol].parts.length-1))) tmpEL.style.display="none";
			break;
		}

		wCost=get_waiting_cost(i_sol,i);
		if(wCost!==false) solution_container.appendChild(new_waiting_element(wCost));
	}
	SolSET.select(i_sol);
	
	show_fares(i_sol);
	if(show_alert_waiting) alert("ATTENZIONE la coincidenza dei mezzi nella soluzione corrente � molto ravvicinata.");
}

function show_fares(i_sol){
	var urban_fares_box=document.getElementById("urbanfares");
	var noturban_fares_box=document.getElementById("noturbanfares");
	var fares_title=getElementsByClassName("fares_title");
	var fares=SolSET.solutions[i_sol].fares;
	var sections,i;
	var first;
	
	
	urban_fares_box.innerHTML="";
	sections=fares.urban;
	fares_title[0].style.display="none";
	urban_fares_box.style.display="none";
	first=true;
	for(i=0;i<sections.length;i++){
		if(sections[i].fareTypes.length>0){
			if(!first) urban_fares_box.appendChild(new_faresections_plus());
			urban_fares_box.appendChild(new_faresection(sections[i]));
			first=false;
		}
	}
	if(!first) {
		urban_fares_box.style.display="block";
		fares_title[0].style.display="block";
	}
	
	
	noturban_fares_box.innerHTML="";
	sections=fares.noturban;
	fares_title[1].style.display="none";
	noturban_fares_box.style.display="none";
	first=true;
	for(i=0;i<sections.length;i++){
		if(sections[i].fareTypes.length>0){
			if(!first) noturban_fares_box.appendChild(new_faresections_plus());
			noturban_fares_box.appendChild(new_faresection(sections[i]));
			first=false;
		}
	}
	if(!first) {
		noturban_fares_box.style.display="block";
		fares_title[1].style.display="block";
	}
	
	
}

function new_faresections_plus(){
	var div=document.createElement("div");
	div.className="sections_plus";
	div.innerHTML="+";
	return div;
}

function new_faresection(faresectionData){
	var table=createTable(2,4);
	var box=document.createElement("div");
	var select,option;
	var i,selected_i;
	
	box.className="section_box";

	table.rows[0].cells[0].innerHTML="<b>DA</b>";
	table.rows[1].cells[0].innerHTML="<b>A</b>";
	
	table.rows[0].cells[1].className="col_stoppoint";
	table.rows[0].cells[1].innerHTML=faresectionData.fromStoppointName;
	table.rows[1].cells[1].innerHTML=faresectionData.toStoppointName;
	
	table.rows[0].cells[2].colSpan=2;
	table.rows[1].cells[2].innerHTML="<b>Tariffa</b>";
	
	select=document.createElement("select");
	selected_i=0;
	for(i=0;i<faresectionData.fareTypes.length;i++){
		option=document.createElement("option");
		option.value=faresectionData.fareTypes[i].price;
		option.text=faresectionData.fareTypes[i].description;
		if((option.text).toLowerCase()==URBAN_REF_PRICE_DESCRIPTION.toLowerCase()) {
			option.selected=true;
			selected_i=i;
		}
		try{select.add(option,null);}catch(e){select.add(option);/*IE*/}
	}
	setEvent(select,"change",change_price);
	table.rows[0].cells[2].className="col_faretypes";
	table.rows[0].cells[2].appendChild(select);
	table.rows[1].cells[3].innerHTML=faresectionData.fareTypes[selected_i].price;
	
	box.appendChild(table);
	
	return box;
}

function change_price(obj){
	var table=getParentByTagName(obj,"table");
	table.rows[1].cells[3].innerHTML=obj.value;
}

function zoom_part(i_sol,i_part,obj){
	var border="2px dashed black";
	if(IPO!="") border="2px dashed yellow";
	var i,container;

	while(obj.className!="bus" && obj.className!="pedestrian" && obj ) obj=obj.parentNode;
	container=obj.parentNode;
	container=container.getElementsByTagName("div");
	for(i=0;i<container.length;i++) 
			if(container[i].className=="bus" ||container[i].className=="pedestrian") container[i].style.border="1px solid #dbdbdb";
	obj.style.border=border;
	
	if(IPO=="") SolSET.solutions[i_sol].parts[i_part].zoom();
	
	if(SolSET.solutions[i_sol].parts[i_part].type!="P")
				show_timeprofile(SolSET.solutions[i_sol].parts[i_part].start_nodeid,SolSET.solutions[i_sol].parts[i_part].stop_nodeid);
}

function parse_fares(solutionIndex){
	var fares=xmlDoc.getElementsByTagName('solution')[solutionIndex].getElementsByTagName("fares")[0];
	var urban=fares.getElementsByTagName("urban")[0];
	var noturban=fares.getElementsByTagName("noturban")[0];
	var Solution=SolSET.solutions[solutionIndex];
	var section,types,i,j;
	
	section=urban.getElementsByTagName("section");
	for(i=0;i<section.length;i++){
		Solution.fares.urban[i]=new FareSection();
		if(Solution.fares.urban[i].fromStoppointName=section[i].getElementsByTagName("fromstoppointname")[0].firstChild)
			Solution.fares.urban[i].fromStoppointName=section[i].getElementsByTagName("fromstoppointname")[0].firstChild.nodeValue;
		if(Solution.fares.urban[i].toStoppointName=section[i].getElementsByTagName("tostoppointname")[0].firstChild)
			Solution.fares.urban[i].toStoppointName=section[i].getElementsByTagName("tostoppointname")[0].firstChild.nodeValue;
		types=section[i].getElementsByTagName("faretype");
		for(j=0;j<types.length;j++){
			Solution.fares.urban[i].fareTypes[j]=new FareType();
			Solution.fares.urban[i].fareTypes[j].price=types[j].getElementsByTagName("price")[0].firstChild.nodeValue;
			Solution.fares.urban[i].fareTypes[j].description=types[j].getElementsByTagName("description")[0].firstChild.nodeValue;
		}
	}
	
	
	section=noturban.getElementsByTagName("section");
	for(i=0;i<section.length;i++){
		Solution.fares.noturban[i]=new FareSection();
		if(Solution.fares.noturban[i].fromStoppointName=section[i].getElementsByTagName("fromstoppointname")[0].firstChild)
			Solution.fares.noturban[i].fromStoppointName=section[i].getElementsByTagName("fromstoppointname")[0].firstChild.nodeValue;
		if(Solution.fares.noturban[i].toStoppointName=section[i].getElementsByTagName("tostoppointname")[0].firstChild)
			Solution.fares.noturban[i].toStoppointName=section[i].getElementsByTagName("tostoppointname")[0].firstChild.nodeValue;
		types=section[i].getElementsByTagName("faretype");
		for(j=0;j<types.length;j++){
			Solution.fares.noturban[i].fareTypes[j]=new FareType();
			Solution.fares.noturban[i].fareTypes[j].price=types[j].getElementsByTagName("price")[0].firstChild.nodeValue;
			Solution.fares.noturban[i].fareTypes[j].description=types[j].getElementsByTagName("description")[0].firstChild.nodeValue;
		}
	}
}

function parse_solution(n){
	var i_sol,i_part,i;
	var last_journeyid=0;
	var current_journeyid;
	var istransport;
	var linename,operatorname,linetype,startPoint,stopPoint;

	var solution=xmlDoc.getElementsByTagName('solution')[n];
	var nodes=solution.getElementsByTagName('node');
	
	i_sol=SolSET.append();
	
	/*
	start_node=xmlDoc.getElementsByTagName('start_node')[0];
	stop_node=xmlDoc.getElementsByTagName('stop_node')[0];

	SolSET.solutions[i_sol].start_part.start_location=start_node.getElementsByTagName("name")[0].firstChild.nodeValue;
	if(start_node.getElementsByTagName("address")[0].firstChild) 
			SolSET.solutions[i_sol].start_part.start_address=start_node.getElementsByTagName("address")[0].firstChild.nodeValue;
	SolSET.solutions[i_sol].start_part.cs.append(	start_node.getElementsByTagName('xcoord')[0].firstChild.nodeValue,
													start_node.getElementsByTagName('ycoord')[0].firstChild.nodeValue);

	SolSET.solutions[i_sol].stop_part.stop_location=stop_node.getElementsByTagName("name")[0].firstChild.nodeValue;
	if(stop_node.getElementsByTagName("address")[0].firstChild) 
			SolSET.solutions[i_sol].stop_part.stop_address=stop_node.getElementsByTagName("address")[0].firstChild.nodeValue;
	SolSET.solutions[i_sol].stop_part.cs.append(	stop_node.getElementsByTagName('xcoord')[0].firstChild.nodeValue,
													stop_node.getElementsByTagName('ycoord')[0].firstChild.nodeValue);
	*/

	SolSET.solutions[i_sol].start_part.start_location=req_fields.fromcity;
	if(req_fields.fromstreet) SolSET.solutions[i_sol].start_part.start_address=req_fields.fromstreet;
	if(req_fields.fromhouseno) SolSET.solutions[i_sol].start_part.start_address+=" "+req_fields.fromhouseno;
			
	SolSET.solutions[i_sol].start_part.cs.append(req_fields.fromxcoord,req_fields.fromycoord);


	SolSET.solutions[i_sol].stop_part.stop_location=req_fields.tocity;
	if(req_fields.tostreet)	SolSET.solutions[i_sol].stop_part.stop_address=req_fields.tostreet;
	if(req_fields.tohouseno)	SolSET.solutions[i_sol].stop_part.stop_address+=" "+req_fields.tohouseno;
	SolSET.solutions[i_sol].stop_part.cs.append(req_fields.toxcoord,req_fields.toycoord);

	
	var start_location=nodes[0].getElementsByTagName('name')[0].firstChild.nodeValue;
	var start_time=nodes[0].getElementsByTagName('time')[0].firstChild.nodeValue;
	var start_nodeid=nodes[0].getElementsByTagName('nodeid')[0].firstChild.nodeValue;
	
	startPoint=new point(nodes[0].getElementsByTagName('xcoord')[0].firstChild.nodeValue,
						nodes[0].getElementsByTagName('ycoord')[0].firstChild.nodeValue,"");
	var stop_location=nodes[nodes.length-1].getElementsByTagName('name')[0].firstChild.nodeValue;
	var stop_time=nodes[nodes.length-1].getElementsByTagName('time')[0].firstChild.nodeValue;
	var stop_nodeid=nodes[nodes.length-1].getElementsByTagName('nodeid')[0].firstChild.nodeValue;
	
	SolSET.solutions[i_sol].start_location=start_location;
	SolSET.solutions[i_sol].start_time=start_time;
	SolSET.solutions[i_sol].stop_location=stop_location;
	SolSET.solutions[i_sol].stop_time=stop_time;
	SolSET.solutions[i_sol].duration=time2min(stop_time)-time2min(start_time);
	
	var tr_index1,tr_index2,ped_index1,ped_index2;
	
	tr_index1=tr_index2=ped_index1=ped_index2=-1;
	
	for(i=0;i<nodes.length;i++){
		istransport=(parseInt(nodes[i].getElementsByTagName("istransport")[0].firstChild.nodeValue)==1)
		if(istransport){
			
			if(ped_index1!=-1) {
				i_part=new_part(nodes,ped_index1,ped_index2,i_sol,true);
				ped_index1=ped_index2=-1;
			}
			
			if(tr_index1==-1) tr_index1=i;
			tr_index2=i;
		}else{
			if(tr_index1!=-1) {
				i_part=new_part(nodes,tr_index1,tr_index2,i_sol);
				tr_index1=tr_index2=-1;
			}
			if(ped_index1==-1) ped_index1=i;
			ped_index2=i;
		}
		
	}
	
	if(tr_index1!=-1){
		i_part=new_part(nodes,tr_index1,tr_index2,i_sol);
		tr_index1=tr_index2=-1;
	}else if(ped_index1!=-1){
		i_part=new_part(nodes,ped_index1,ped_index2,i_sol,true);
		ped_index1=ped_index2=-1;
	}
	
	SolSET.solutions[i_sol].fill_startstop_parts();

	//min2time(145);
	return i_sol;
}

function getValue(xmlParent,index,nodeName){
	if(xmlParent[index].getElementsByTagName(nodeName)[0].firstChild){
		return xmlParent[index].getElementsByTagName(nodeName)[0].firstChild.nodeValue;
	}else{
		return "";
	}
}

function new_part(nodes,i_from,i_to,i_sol,pedonal){
	var linetype;
	var i_part;
	var P;
	var pedonal=false || pedonal;
	var nodeid=getValue(nodes,i_from,"nodeid");
	if(!pedonal){
		linetype=getValue(nodes,i_from,"transportsystemcode");
		i_part=SolSET.solutions[i_sol].append(linetype);
	}else{
		if(getValue(nodes,i_from,"stoppointid")==getValue(nodes,i_to,"stoppointid")) return false; 
		i_part=SolSET.solutions[i_sol].append("P");
		
	}
	SolSET.solutions[i_sol].parts[i_part].start_location=getValue(nodes,i_from,"name");
	SolSET.solutions[i_sol].parts[i_part].stop_location=getValue(nodes,i_to,"name");
	SolSET.solutions[i_sol].parts[i_part].start_time=getValue(nodes,i_from,"time");
	SolSET.solutions[i_sol].parts[i_part].stop_time=getValue(nodes,i_to,"time");
	SolSET.solutions[i_sol].parts[i_part].start_nodeid=getValue(nodes,i_from,"nodeid");
	SolSET.solutions[i_sol].parts[i_part].stop_nodeid=getValue(nodes,i_to,"nodeid");
	SolSET.solutions[i_sol].parts[i_part].linename=getValue(nodes,i_from,"linename");
	
	SolSET.solutions[i_sol].parts[i_part].operatorname=getValue(nodes,i_from,"operatorname");
	//if(SolSET.solutions[i_sol].parts[i_part].operatorname.search(/TRAIN/i))
	//SolSET.solutions[i_sol].parts[i_part].operatorname="SIENAMOBILITA";

	SolSET.solutions[i_sol].parts[i_part].duration=time2min(getValue(nodes,i_to,"time"))-time2min(getValue(nodes,i_from,"time"));

	P=new point(getValue(nodes,i_from,"xcoord"),getValue(nodes,i_from,"ycoord"),"");
	SolSET.solutions[i_sol].parts[i_part].cs.append(P);
	
	P=new point(getValue(nodes,i_to,"xcoord"),getValue(nodes,i_to,"ycoord"),"");
	SolSET.solutions[i_sol].parts[i_part].cs.append(P);
	return i_part;
}

function refresh_req_fields(xmlDoc){
	var FRM=document.frm_req;
	if(xmlDoc.getElementsByTagName("fromcity")[0].firstChild)
		req_fields.fromcity=xmlDoc.getElementsByTagName("fromcity")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("fromstreet")[0].firstChild)
		req_fields.fromstreet=xmlDoc.getElementsByTagName("fromstreet")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("fromhouseno")[0].firstChild)
		req_fields.fromhouseno=xmlDoc.getElementsByTagName("fromhouseno")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("fromxcoord")[0].firstChild)
		req_fields.fromxcoord=xmlDoc.getElementsByTagName("fromxcoord")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("fromycoord")[0].firstChild)
		req_fields.fromycoord=xmlDoc.getElementsByTagName("fromycoord")[0].firstChild.nodeValue;
	
	if(xmlDoc.getElementsByTagName("tocity")[0].firstChild)
		req_fields.tocity=xmlDoc.getElementsByTagName("tocity")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("tostreet")[0].firstChild)
		req_fields.tostreet=xmlDoc.getElementsByTagName("tostreet")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("tohouseno")[0].firstChild)
		req_fields.tohouseno=xmlDoc.getElementsByTagName("tohouseno")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("toxcoord")[0].firstChild)
		req_fields.toxcoord=xmlDoc.getElementsByTagName("toxcoord")[0].firstChild.nodeValue;
	if(xmlDoc.getElementsByTagName("toycoord")[0].firstChild)
		req_fields.toycoord=xmlDoc.getElementsByTagName("toycoord")[0].firstChild.nodeValue;
		
	req_fields.date=FRM.trip_date.value=xmlDoc.getElementsByTagName("date")[0].firstChild.nodeValue;
	req_fields.time=FRM.trip_time.value=xmlDoc.getElementsByTagName("time")[0].firstChild.nodeValue;
	
	if(req_fields.fromcity) FRM.from_location.value=req_fields.fromcity;
	if(req_fields.fromstreet) FRM.from_location.value+=", "+req_fields.fromstreet;
	if(req_fields.fromhouseno) FRM.from_location.value+=" "+req_fields.fromhouseno;
	if(req_fields.tocity) FRM.to_location.value=req_fields.tocity;
	if(req_fields.tostreet) FRM.to_location.value+=", "+req_fields.tostreet;
	if(req_fields.tohouseno) FRM.to_location.value+=" "+req_fields.tohouseno;
	
}


function fill_from(txt){
	document.getElementById('from').getElementsByTagName('b')[0].innerHTML=txt;
}

function fill_to(txt){
	document.getElementById('to').getElementsByTagName('b')[0].innerHTML=txt;	
}


function new_bus_element(lineinfo,operatorinfo,frominfo,toinfo,zoom_args){
	var div_element=document.createElement("div");
	div_element.className="bus";
	setEvent(div_element,"click",zoom_part,zoom_args)
	div_element.innerHTML=
				'<a href="javascript:void(0);">\n'+
				'<span><img src="/timetable/img/autobus'+IPO+'.gif" width="25"></span>\n'+
				'<div>\n'+
				'<ul>\n'+
				'<li>Prendi la <b class="linename">'+lineinfo+'</b></li>\n'+
				'<li>('+operatorinfo+')</li>\n'+
				'<li></li>\n'+
				'<li>'+frominfo+'</li>\n'+
				'<li><img src="/timetable/img/freccetta_red_20.gif"></li>\n'+
				'<li>'+toinfo+'</li>\n'+
				'</ul>\n'+
				'</div>\n'+
				'<hr class="spessore">\n'+
				'</a>';

	return div_element;
}

function new_train_element(lineinfo,operatorinfo,frominfo,toinfo,zoom_args){
	var div_element=document.createElement("div");
	div_element.className="bus";
	setEvent(div_element,"click",zoom_part,zoom_args)
	div_element.innerHTML=
				'<a href="javascript:void(0);">\n'+
				'<span><img src="/timetable/img/treno.gif"></span>\n'+
				'<div>\n'+
				'<ul>\n'+
				'<li>Prendi la <b class="linename">'+lineinfo+'</b></li>\n'+
				'<li>('+operatorinfo+')</li>\n'+
				'<li></li>\n'+
				'<li>'+frominfo+'</li>\n'+
				'<li><img src="/timetable/img/freccetta_blue_20.gif"></li>\n'+
				'<li>'+toinfo+'</li>\n'+
				'</ul>\n'+
				'</div>\n'+
				'<hr class="spessore">\n'+
				'</a>';
	return div_element;
}

function new_pedestrian_element(toinfo,cost,zoom_args){
	var div_element=document.createElement("div");
	div_element.className="pedestrian";
	setEvent(div_element,"click",zoom_part,zoom_args)
	var tmp="sono necessari circa "+cost+" min";
	if(cost==0) tmp="la fermata è a qualche metro di distanza";
	div_element.innerHTML=
				'<a href="javascript:void(0);">\n'+
				'<span><img src="/timetable/img/piedonzi.gif" width="25"></span>\n'+
				'<div>Vai a piedi a <b>'+toinfo+'</b><br>('+tmp+')</div>\n'+
				'<hr class="spessore">\n'+
				'</a>';
	return div_element;
}

function new_waiting_element(cost){
	var div_element=document.createElement("div");
	div_element.className="waiting";
	var tmp="Attendi "+cost+" min alla fermata";
	var img="wait1.gif";
	if(cost<=5) {
		img="wait.png";
		tmp="<b style=\"color:red\">Tempi per la coincidenza molto limitati</b>";
	}	
		
	div_element.innerHTML=
				'<a href="javascript:void(0);">\n'+
				'<span><img src="/timetable/img/'+img+'" width="20"></span>\n'+
				'<div>'+tmp+'</div>\n'+
				'<hr class="spessore">\n'+
				'</a>';
	return div_element;
}


function response_error(){
	hideMsg();
	showMsg("Si è verificato un errore","red");
	return false;
}

function parse_XML(xml_data){
//	alert(xml_data)

	xmlDoc=xml_data;
	
	
	var response;

	try{
		response=xmlDoc.getElementsByTagName('response')[0].firstChild.nodeValue;
	}catch(e){
		response_error();
		return false;
	}
	
	if(!response){
		response_error();
		return false;
	} 
	
	var ndes,i_sol;
	var solution_info;
	var start_time,stop_time;
	var linename=new Array();
	var last_journeyid;
	var solutions=xmlDoc.getElementsByTagName('solution');
	var i,j,k,tmp=false;
	var solution_list=document.getElementById('solutions_list');
	var sol=false;
	var msg;
	
	
	if(response=="error"){
		document.getElementById('main').style.display='none';
		var err_messages=xmlDoc.getElementsByTagName("message");
		if(err_messages.length<2){
			switch(err_messages[0].firstChild.nodeValue){
				case "from_not_located":
					showMsg('Località di partenza non valida.',"red");
					break;
					
				case "to_not_located":
					showMsg('Località di arrivo non valida.',"red");
					break;
					
				case "invalid_date":
					showMsg('Data di partenza non valida.',"red");
					break;
					
				case "invalid_time":
					showMsg('Ora di partenza non valida.',"red");
					break;
					
				case "error_atis_srv":
					showMsg("Server Error","red");
					alert(MSG_SERVER_ATIS_ERR);
				break;
			}
		}else{
			showMsg('Località di partenza e di arrivo non valide.',"red");
		}
	}
	/*
	switch(response){
		case "error":
		document.getElementById('main').style.display='none';
		var err_messages=xmlDoc.getElementsByTagName("message");
		if(err_messages.length<2){
			switch(err_messages[0].firstChild.nodeValue){
				case "from_not_located":
					showMsg('Località di partenza non valida.',"red");
					break;
					
				case "to_not_located":
					showMsg('Località di arrivo non valida.',"red");
					break;
					
				case "invalid_date":
					showMsg('Data di partenza non valida.',"red");
					break;
					
				case "invalid_time":
					showMsg('Ora di partenza non valida.',"red");
					break;
					
				case "error_atis_srv":
					showMsg("Server Error","red");
					alert(MSG_SERVER_ATIS_ERR);
				break;
			}
		}else{
			showMsg('Località di partenza e di arrivo non valide.',"red");
		}
		
		return 0;
		break;
		
		case "error_atis_srv":
		showMsg("Server Error","red");
		alert(MSG_SERVER_ATIS_ERR);
		return 0;
		break;
	}
	*/
	
	if(REQ_ID!=parseInt(xmlDoc.getElementsByTagName("REQID")[0].firstChild.nodeValue)) return false;
	
	
	req_time=REQ_ID;
	
	REQ_ID=false;
	SolSET.clear();
	
	refresh_req_fields(xml_data);
	
	solution_list.innerHTML='';
	
	var times;
	
	var ul=document.createElement('ul');
	for(i=0;i<solutions.length;i++){
		if(solutions[i].getElementsByTagName("node").length>0){
			nodes=solutions[i].getElementsByTagName('node');
			times=get_solution_start_end_time(solutions[i]);
			if(!times) continue;
			sol=true; 
			start_time=times.start_time;
			stop_time=times.end_time;
			
			last_journeyid="";
			for(j=0;j<nodes.length;j++){
				if(nodes[j].getElementsByTagName('journeyid')[0].firstChild)
					if(last_journeyid!=nodes[j].getElementsByTagName('journeyid')[0].firstChild.nodeValue){
						linename.push(nodes[j].getElementsByTagName('linename')[0].firstChild.nodeValue);
						last_journeyid=nodes[j].getElementsByTagName('journeyid')[0].firstChild.nodeValue;
					}
			}
		
			if(linename.length>1){
				solution_info=linename.length+' linee in coincidenza';
			}else{
				solution_info='via '+linename.join(', ');
			}
			linename=new Array();
			
			i_sol=parse_solution(i);
			parse_fares(i);
			if(!tmp) {
				ul.appendChild(tmp=new_solution_item(i_sol,start_time,stop_time,solution_info));
			}else{
				ul.appendChild(new_solution_item(i_sol,start_time,stop_time,solution_info));
			}
		}
	}
	//if(confirm("process_all ?")) 
	SolSET.process_all();
	
	if(!sol){
		document.getElementById('main').style.display='none';
		showMsg('Spiacente non ci sono soluzioni',"red");
		return 0;
	}
	tmp=tmp.getElementsByTagName('a')[0];
	solution_list.appendChild(ul);
	hideMsg();
		
	document.getElementById('main').style.display='block';
	show_solution(0,tmp);
	
	var ts=new Date();
	ts=ts.getTime();
	req_time=ts-req_time;
}

function get_solution_start_end_time(xmlSol){
	var i;
	var start,end;

	var nodes=xmlSol.getElementsByTagName("node");
	i=0;
	while(i<nodes.length && (parseInt(nodes[i].getElementsByTagName("istransport")[0].firstChild.nodeValue)==0)) {i++;}
	if(i==nodes.length) return false;
	if(parseInt(nodes[i].getElementsByTagName("istransport")[0].firstChild.nodeValue)==1) 
									start=nodes[i].getElementsByTagName("time")[0].firstChild.nodeValue;
	
	i=nodes.length-1;
	while(i>0 && (parseInt(nodes[i].getElementsByTagName("istransport")[0].firstChild.nodeValue)==0)) i--;
	if(parseInt(nodes[i].getElementsByTagName("istransport")[0].firstChild.nodeValue)==1) 
									end=nodes[i].getElementsByTagName("time")[0].firstChild.nodeValue;
	
	return {start_time:start,end_time:end}
}

function new_solution_item(i,start_time,stop_time,info){
	var li_res=document.createElement('li');
	var a=document.createElement('a');
	var duration,tmp;
	span='<span>Soluzione '+(i+1)+':</span> ';
	
	a.href='javascript:void(0);';
	duration=time2min(stop_time)-time2min(start_time);
	//a.setAttribute('onclick','javascript:show_solution(this,'+i+');');
	tmp=new Array();
	tmp[0]=i;
	setEvent(a,'click',show_solution,tmp);
	a.innerHTML=span+'&nbsp;&nbsp;&nbsp;&nbsp;'+start_time+' -> '+stop_time+"&nbsp;("+duration+" min)&nbsp;&nbsp;&nbsp;&nbsp;"+info;
	
	li_res.appendChild(a);
	
	return li_res;
}

function reqSolutions(){
	var ts=new Date();
	ts=ts.getTime();
	//setTimeout("reqTimeout();",5000);
	/*
	if(!check_date(document.frm_req.trip_date.value)){
		showMsg('Data della partenza non valida.',"red");
		return 0;
	}
	*/
	REQ_ID=ts;

	var strData=getFormValues('frm_req');
	strData+='xml=1'+"&no_route="+no_route;
	strData+="&reqid="+REQ_ID;
	
	processRequestAsync(SEARCH_SCRIPT,parse_XML,"POST",true,strData);
	//processRequestAsync("/timetable/provaxml.php",parse_XML,"POST",true,strData);
	showMsg('Ricerca soluzioni in corso...',"green",true);
	
}

function reqTimeout(){
	
}

function check_date(text){
	var tmp;
	var day,month;
	tmp=text.split('/');
	day=Number(tmp[0]);
	month=Number(tmp[1]);
	if((day == NaN) || (month==NaN)) return false;
	if(month>12 || month<1) return false;
	if(day>31 || day<1) return false;
	if(day>d_m[month])	return false;
	return true;
}


function showMsg(msg,color,loading){
	var loading=false || loading;
	
	if(loading){
		document.getElementById("msg_loading").style.visibility="visible";
	}else{
		document.getElementById("msg_loading").style.visibility="hidden";
	}
	document.getElementById('msg').innerHTML=msg;
	document.getElementById('msg').style.visibility='visible';
	document.getElementById('msg').style.backgroundColor=color;
}

function hideMsg(){
	document.getElementById("msg_loading").style.visibility="hidden";
	document.getElementById('msg').style.visibility='hidden';
	document.getElementById('msg').innerHTML='';
}


function time2min(str_time){
	var res;
	if(!str_time) return 0;
	res=str_time.split(':');
	return ((Number(res[0])*60)+Number(res[1]));
}

function min2time(mins){
	mins=Number(mins);
	var h,m;
	h=(mins/60).toFixed();
	m=mins-h*60;
	return h.toString()+":"+m.toString();
}

function reverse_search(){
	var tmp;
	tmp=document.frm_req.from_location.value;
	document.frm_req.from_location.value=document.frm_req.to_location.value;
	document.frm_req.to_location.value=tmp;
	
	reqSolutions();
}

function next_day(){
	var tmp;
	var day,month,y;
	tmp=(document.frm_req.trip_date.value).split('/');
	tmp=new Date(Number(tmp[2]),Number(tmp[1])-1,Number(tmp[0])+1,0,0,0,0);
	day=(tmp.getDate()).toString();
	month=(tmp.getMonth()+1).toString();
	y=(tmp.getFullYear()).toString();
	
	document.frm_req.trip_date.value=str_pad(day,2,"0","L")+'/'+str_pad(month,2,"0","L")+"/"+y;
	reqSolutions();
}


function check_submit(e){
	var keynum;
	if(window.event){
		// IE
		keynum = e.keyCode;
	}else if(e.which){
		// Netscape/Firefox/Opera
		keynum = e.which;
	}

	if(keynum==13) reqSolutions();
}


function setEvent(obj,event_name,func,args){
	var tmp_str="func(";
	var i;
	if(args) for(i=0;i<args.length;i++) tmp_str+=args[i]+",";
	if(obj.addEventListener){ //gestione eventi DOM Level 2 (Mozilla)
		tmp_str+="e.target);";
		obj.addEventListener(event_name,function (e){eval(tmp_str)},true);
	}else if(obj.attachEvent){ //gestione eventi IE5+
		event_name='on'+event_name;
		tmp_str+="e.srcElement);";
		obj.attachEvent(event_name,function (){e=window.event;eval(tmp_str)});
	}
}

function show_timeprofile(nodeid1,nodeid2){
	var add_param="";
	if(IPO!="") add_param="&ipo=on";
	window.open("timeprofile_details.php?nodeid1="+nodeid1+"&nodeid2="+nodeid2+add_param,"Journey_Details","resizable=yes,scrollbars=yes,status=no,width="+POPUP_WIDTH+",height=800");
}

function focusInputBox(input){
	if(!input.emptyValue) {input.empty=true;input.emptyValue=input.value;}
	if(!input.empty) return false;
	input.empty=false;
	
	input.value="";
}

function blurInputBox(input){
	input.empty=(input.value=="");
	if(input.empty) input.value=input.emptyValue;
}

function init_TT(){
	var help_box=document.getElementById("help_clickable");
	var FRM=document.frm_req;
	var now=new Date();
	var d,m,y,h,i;
	FRM.from_location.value="Partenza/Departure";
	FRM.to_location.value="Arrivo/Arrival";
	
	d=now.getDate().toString();
	m=(now.getMonth()+1).toString();
	y=now.getFullYear().toString();
	h=now.getHours().toString();
	i=now.getMinutes().toString();

	FRM.trip_date.value=str_pad(d,2,"0","L")+"/"+str_pad(m,2,"0","L")+"/"+str_pad(y,2,"0","L");
	FRM.trip_time.value=str_pad(h,2,"0","L")+":"+str_pad(i,2,"0","L");
	setEvent(help_box,"click",show_help_location);
	set_mouseOver();
	
	if(UPDATING) set_updating();
}


function show_help_location(obj){
	var h=document.getElementById("help_location");
	var pos=get_position(obj);
	pos.X+=obj.offsetWidth/2;
	pos.Y+=obj.offsetHeight/2;
	
	h.style.left=pos.X+"px";
	h.style.top=pos.Y+"px";
	
	h.style.display="block";
}

function hide_help_location(obj,evt){
	var h=document.getElementById("help_location");
	h.style.display="none";
}



function set_updating(){
	var frm=document.frm_req;
	var loading=document.createElement("div");
	var i;
	for(i=0;i<frm.elements.length;i++) frm.elements[i].disabled=true;
	loading.appendChild(document.createTextNode(LBL_SERVICE_UPDATING));
	loading.id="updating";
	document.body.appendChild(loading);
}


setEvent(window,"load",init_TT);

