
// ---------------------- Global variables

var google_iconBase;
var google_iconset	= new Array();
var google_markers	= new Array();

var google_mapseqn	= 0;
var google_mapnames = new Array();
var google_mapzoom  = new Array();
var google_mapdivs	= new Array();
var google_mapobj	= new Array();
var google_mapnodes = new Array();
var google_alt_mapnodes = new Array();

var google_routeseqn= 0;
var google_routedivs= new Array();
var google_endpoints= new Array();
var google_primsteps= new Array();
var google_altnsteps= new Array();
var google_routedivs= new Array();

var google_pictdivs= new Array();
var google_statdivs= new Array();

var pelau_point_coords = new Array();
var pelau_point_params = new Array();

var google_polyline = new Array();
var google_altn_polyline;
var google_altnroute= false;

var pelau_route_functions= new Array("pelau_trip_route","pelau_area_route");
var pelau_route_distance = new Array();
var pelau_route_duration = new Array();
var pelau_altn_distance  = 0;
var pelau_altn_duration  = 0;

var route_vertices = new Array();
route_vertices[0]  = new Array();
route_vertices[1]  = new Array();
var pelau_vertices = new Array();
var route_vertexsize = new Array(0,0);
var pelau_vertexsize = 0;

var altn_route_vertices		= new Array();
var altn_route_vertexsize	= 0;

var route_directions = new Array();
var route_prologue	= '<table border=0 cellpadding=2 cellspacing=0 class="standard small noborder" '+
						'width="100%"><tbody>';
var route_epilogue	= '</tbody></table>';
var step_prologue	= '<tr style="border-top: thin solid black; '+
						'background-color: rgb(238, 238, 238); border-collapse: collapse; '+
						'color: rgb(0, 0, 0);">';




// ********************************************************************	//
//																		//
//						Icon Functions									//
//																		//
// ********************************************************************	//

function create_google_icon(type,icon,ic_w,ic_h,shadow,sh_w,sh_h,a_l,a_t,w_l,w_t) {

	if (google_compatibility) {
		var myicon				= new  GIcon();
		myicon.shadow			= shadow;
		myicon.iconSize			= new GSize(ic_w, ic_h);
		myicon.shadowSize		= new GSize(sh_w, sh_h);
		myicon.iconAnchor		= new GPoint(a_l, a_t);
		myicon.infoWindowAnchor = new GPoint(w_l, w_t);
		}

	else {
		var myicon = new Object();
		myicon.iconSize = new Pelau_GSize(ic_w, ic_h);
		}

	if (type == "node")		google_iconBase=icon;	
	else					myicon.image = icon;

	google_iconset[type] = myicon;
}

// ---------------------------------------------------------------------------------------


function Pelau_GSize(wdt,hgt) {
	this.width = wdt;
	this.height= hgt;
}

// ---------------------------------------------------------------------------------------


function create_google_lettericon(letter) {

	var icon_file = google_iconBase+letter +".png";
	var icon_base = google_iconset["node"];

	if (google_compatibility) var myicon	= new  GIcon(icon_base,icon_file);

	else {
		var myicon = new Object();
		myicon.image = icon_file;
		myicon.iconSize = new Pelau_GSize(icon_base.iconSize.width, icon_base.iconSize.height);
		}

	return myicon;
}



// ********************************************************************	//
//																		//
//						Point computations								//
//																		//
// ********************************************************************	//


function init_google_marker(spot, name, lat, lon, icon, lett, info, pict) {

	init_google_point(spot, lat, lon);

	var type=icon;
	pelau_point_params[spot]=Array();
	pelau_point_params[spot]["name"]=name;
	pelau_point_params[spot]["infowin"]=info;
	pelau_point_params[spot]["pictwin"]=pict;
	if (icon == "node") {
		google_iconset[lett]=create_google_lettericon(lett);
		type=lett;
		}
	pelau_point_params[spot]["icon"]=google_iconset[type].image;
	pelau_point_params[spot]["iconw"]=google_iconset[type].iconSize.width;
	pelau_point_params[spot]["iconh"]=google_iconset[type].iconSize.height;
	pelau_point_params[spot]["marker"]=type;
}

// ---------------------------------------------------------------------------------------


function init_google_point(spot, lat, lng) {

	if (google_compatibility) pelau_point_coords[spot] = new GLatLng(lat,lng);

	else {
		pelau_point_coords[spot]=Array();
		pelau_point_coords[spot]["x"]=lng;
		pelau_point_coords[spot]["y"]=lat;
		}
}



// ********************************************************************	//
//																		//
//							Google maps									//
//																		//
// ********************************************************************	//

// ------------------ Function invoked by the body load function  -----------------------
function Pelau_Do_googlemaps() {

	Pelau_Init_googlemaps();	// Defined by the server script
	pelau_google_map(0);
	pelau_google_map(1);
	pelau_google_route(0);
	pelau_google_route(1);
}

// ---------------------------------------------------------------------------------------


function init_google_map (map_name, area_div, route_div, pict_div) {

	google_mapnames[google_mapseqn] = map_name;
	google_mapdivs[map_name] = NU_getelement(area_div);
	google_routedivs[map_name] = NU_getelement(route_div);
	google_pictdivs[google_mapseqn] = NU_getelement(pict_div);
	google_mapseqn++;

}

// ---------------------------------------------------------------------------------------


function pelau_google_map(map_id) {

	var mapname=google_mapnames[map_id];
	var mapDOM =google_mapdivs[mapname];
	var routeDOM =google_routedivs[mapname];

	if (google_compatibility) {
		var myMAP = new GMap2(mapDOM);
		google_mapobj[mapname]=myMAP;

		myMAP.setCenter(pelau_point_coords["center_"+map_id],7);
		if	(map_id == 0)	myMAP.setMapType(G_NORMAL_MAP);
		else				myMAP.setMapType(G_SATELLITE_MAP);

		var myRange=new GLatLngBounds(pelau_point_coords["botleft_"+map_id],pelau_point_coords["topright_"+map_id]);
		var myZoom=myMAP.getBoundsZoomLevel(myRange);
		myMAP.setZoom(myZoom);
		google_mapzoom[mapname]=myZoom;
		myMAP.savePosition();

		add_google_marker(google_endpoints[mapname][0], myMAP);
		add_google_marker(google_endpoints[mapname][1], myMAP);
		for (jj=0; jj<google_mapnodes[mapname].length; jj++) {
			add_google_marker(google_mapnodes[mapname][jj], myMAP);
			}

		myMAP.addControl(new GSmallMapControl());
		myMAP.addControl(new GMapTypeControl());
		routeDOM.innerHTML="loaded with zoom level = "+myZoom;
		}

//	else mapDOM.innerHTML="<strong>Google maps API not available</strong>";

}

// ---------------------------------------------------------------------------------------


function add_google_marker(spot, mapobj) {

	var point=pelau_point_coords[spot];

	var icon = pelau_point_params[spot]["marker"];
	var myMarker = new GMarker(point, { "icon": google_iconset[icon] });

	var html = pelau_point_params[spot]["infowin"];
	GEvent.addListener(myMarker, "click", function() {
		if (html != NU_NULL) myMarker.openInfoWindowHtml(html);
		});

	mapobj.addOverlay(myMarker);

}

// ---------------------------------------------------------------------------------------


function reset_google_map(map_id) {

	if (!google_compatibility) return;

	var mapname	= google_mapnames[map_id];
	var myMAP 	= google_mapobj[mapname];

	myMAP.returnToSavedPosition();

}

// ---------------------------------------------------------------------------------------


function magnify_google_step(map_id,from,to) {

	if (!google_compatibility) return;

	var mapname	= google_mapnames[map_id];
	var myMAP 	= google_mapobj[mapname];
	var myZoom  = myMAP.getZoom();

	var lat1=pelau_point_coords[from].lat();
	var lng1=pelau_point_coords[from].lng();
	var lat2=pelau_point_coords[to].lat();
	var lng2=pelau_point_coords[to].lng();

	var cntr	= new GLatLng((lat1+lat2)/2.,(lng1+lng2)/2.);
	var west	= Math.min(lng1,lng2);
	var south	= Math.min(lat1,lat2);
	var east	= Math.max(lng1,lng2);
	var north	= Math.max(lat1,lat2);
	var bbox	= new GLatLngBounds(new GLatLng(south,west),new GLatLng(north,east));
	var toZoom	= myMAP.getBoundsZoomLevel(bbox);

	myMAP.panTo(cntr);
	if (myZoom < toZoom) {
		for (var zoom=myZoom; zoom<toZoom; zoom++) {
			var t = window.setTimeout(function(){
				myMAP.zoomIn();
				}, 1000);
			}
		}
	else if (myZoom > toZoom) {
		for (var zoom=toZoom; zoom<myZoom; zoom++) {
			var t = window.setTimeout(function(){
				myMAP.zoomOut();
				}, 1000);
			}
		}

}



// ********************************************************************	//
//																		//
//							Google routes								//
//																		//
// ********************************************************************	//


function pelau_google_route(map_id) {

	var mapname=google_mapnames[map_id];
	var routeDOM =google_routedivs[mapname];

	var str=route_prologue+"<tr><td align='center' valign='baseline'><table><tr><td>"+
				'<a href="javascript:'+pelau_route_functions[map_id]+'(0);" class="btnThreeD">';

	if			(Pelau_lang == "EN")	str+="Load the directions";
	else if	(Pelau_lang == "FR")	str+="Chargez les indications";
	else								str+="Carica le istruzioni";
	
	routeDOM.innerHTML=str+'</a></td></tr></table></td></tr>'+route_epilogue;
}




// ********************************************************************	//


function pelau_trip_route(step_id) {
	pelau_route_process(0,step_id);
}
function pelau_area_route(step_id) {
	pelau_route_process(1,step_id);
}


// ********************************************************************	//


function pelau_route_process(map_id,step_id) {

	var mapname=google_mapnames[map_id];
	var routeDOM =google_routedivs[mapname];
	var nbsteps=google_primsteps[mapname].length-1;
	var nbnodes=google_mapnodes[mapname].length;
	var myMAP =google_mapobj[mapname];

	if (step_id == 0) {
		var str="";
		var step_from=google_endpoints[mapname][0];
		pelau_route_distance[map_id] = 0;
		pelau_route_duration[map_id] = 0;
		}
	else {
		var str=route_directions[map_id];
		var step_from=google_mapnodes[mapname][step_id-1];
		reset_google_map(map_id);
		if (google_compatibility) myMAP.removeOverlay(google_polyline[mapname]);
		}
	if (step_id < nbsteps)	var step_to=google_mapnodes[mapname][step_id];
	else 					var step_to=google_endpoints[mapname][1];

	str += pelau_init_step(map_id,step_from,step_to);

// build instructions and polyline for this step
	var stepfun=google_primsteps[mapname][step_id]+"_directions();";
	eval(stepfun);
	str+='<tr><td align="center" valign="middle">';
	if (google_compatibility) str+=pelau_step_magnifier(map_id,step_from,step_to);
	else					  str+='&nbsp;';
	str+='</td><td align="left" valign="middle" colspan=2 class="tiny">'+
			step_directions+
			'</td></tr>';
	str+='<tr><td colspan=3>'+pelau_show_stepLength(map_id)+'</td></tr>';

	route_directions[map_id]=str;
	str += pelau_next_step(map_id,step_id);


	var jvert = route_vertexsize[map_id];
	if (jvert > 0) jvert--;
	for (var jj=0; jj<step_vertex_size; jj++) {
		route_vertices[map_id][jvert]=step_vertices[jj];
		jvert++;
		}
	route_vertexsize[map_id]=jvert;
	pelau_show_routeSegment(map_id,route_vertices[map_id]);

	routeDOM.innerHTML=route_prologue+str+route_epilogue;
}


// ********************************************************************	//


function pelau_init_step(map_id,from,to) {

	var name=pelau_point_params[from]["name"];
	var icon=pelau_point_params[from]["icon"];
	var icon_w=Math.round(pelau_point_params[from]["iconw"]/2);
	var icon_h=Math.round(pelau_point_params[from]["iconh"]/2);

	var str = step_prologue+'<th align="left" valign="baseline">'+
				NU_ucfirst(NU_trim(Pelau_thesaurus["from_join"]))+':</th>'+
				'<td align="left" valign="baseline">'+
				NU_ucfirst(name)+'</td>'+
				'<td align="center" valign="middle">'+
				'<a href="javascript:pelau_show_routeNode(\''+from+'\','+map_id+');">'+
				'<img src="'+icon+'" alt="marker" title="'+name+'" width='+icon_w+' height='+icon_h+'></a></td></tr>';

	var name=pelau_point_params[to]["name"];
	var icon=pelau_point_params[to]["icon"];
	var icon_w=Math.round(pelau_point_params[to]["iconw"]/2);
	var icon_h=Math.round(pelau_point_params[to]["iconh"]/2);
	str += step_prologue+'<th align="left" valign="baseline">'+
				NU_ucfirst(NU_trim(Pelau_thesaurus["to_join"]))+':</th>'+
				'<td align="left" valign="baseline">'+
				NU_ucfirst(name)+'</td>'+
				'<td align="center" valign="middle">'+
				'<a class="imglink" href="javascript:pelau_show_routeNode(\''+to+'\','+map_id+');">'+
				'<img src="'+icon+'" alt="marker" title="'+name+'" width='+icon_w+' height='+icon_h+'></a></td></tr>';

	return str;

}


// ********************************************************************	//


function pelau_next_step(map_id,this_step) {

	var mapname=google_mapnames[map_id];
	if (google_altnroute)	var nbsteps=google_altnsteps[mapname].length;
	else					var nbsteps=google_primsteps[mapname].length;
	var nbaltns=google_altnsteps[mapname].length;
	var next_step=this_step+1;

	if (next_step < nbsteps) {
		var str='<tr><td align="center" valign="middle" colspan=3>';
		if (google_altnroute)	var jfun='pelau_altnroute_process('+map_id+','+next_step+');"';
		else					var jfun=pelau_route_functions[map_id]+'('+next_step+');"';
		if			(Pelau_lang == "EN")	var jtxt="Next step";
		else if	(Pelau_lang == "FR")	var jtxt="&Eacute;tape suivante";
		else								var jtxt="Tappa successiva";
		}

	else {
		res = pelau_last_step(map_id,nbaltns);
		var str =res["string"];
		var jfun=res["jsfunc"];
		var jtxt=res["jstext"];
		}

	str += '<a href="javascript:'+jfun+'" class="btnThreeD">'+jtxt+'</a></td></tr>';

	return str;
}


// ********************************************************************	//


function pelau_last_step(map_id,nbaltns) {

	var mapname=google_mapnames[map_id];
	var retdata=new Array();

	if (google_altnroute) {
		var tot_distance=pelau_altn_distance;
		var tot_duration=pelau_altn_duration;
		var nbaltnn=google_alt_mapnodes[mapname].length;
		var str = '<tr><td colspan=3 class="tiny">'+
					eval(mapname+"_altn_close('"+google_alt_mapnodes[mapname][nbaltnn-1]+"')")+
					'</td></tr>';
		}
	else {
		var tot_distance=pelau_route_distance[map_id];
		var tot_duration=pelau_route_duration[map_id];
		var str = ''
		}
	str+=step_prologue+
			'<td align="center" valign="middle" colspan=3>'+
			'<table class="neutral" style="border-top: thin solid black; border-bottom: thin solid black"'+
			' width="100%"><tbody>'+
			'<tr><th class="onehalf" align="center" valign="center">';
	if			(Pelau_lang == "EN")	str+="Distance";
	else if	(Pelau_lang == "FR")	str+="Distance";
	else								str+="Distanza";
	str+=':&nbsp;'+pelau_distance_text(tot_distance)+'</th>'+
			'<th class="onehalf" align="center" valign="center">';
	if			(Pelau_lang == "EN")	str+="Duration";
	else if	(Pelau_lang == "FR")	str+="Dur&eacute;e";
	else								str+="Durata";
	str+=':&nbsp;'+pelau_duration_text(tot_duration)+'</th></tr>'+
			'</tbody></table></td></tr>';
	route_directions[map_id]+=str;
	str+='<tr><td align="center" valign="middle" colspan=3>';
	if ((google_altnroute) || (nbaltns < 1)) {
		if (google_compatibility) {
			var jfun='reset_google_map('+map_id+');"';
			if			(Pelau_lang == "EN")	var jtxt="Reset the map";
			else if	(Pelau_lang == "FR")	var jtxt="Rechargez le plan";
			else								var jtxt="Ripristina la mappa";
			}
		else {
			var jfun='void(0);"';
			if			(Pelau_lang == "EN")	var jtxt="End of the route";
			else if	(Pelau_lang == "FR")	var jtxt="Fin du trajet";
			else								var jtxt="Fine dell&acute;itinerario";
			}
		}
	else {
		var jfun='init_altn_route('+map_id+');"';
		if			(Pelau_lang == "EN")	var jtxt="Alternative route";
		else if	(Pelau_lang == "FR")	var jtxt="Itin&eacute;raire alternatif";
		else								var jtxt="Itinerario alternativo";
		}

	retdata["string"]=str;
	retdata["jsfunc"]=jfun;
	retdata["jstext"]=jtxt;

	return retdata;
}


// ********************************************************************	//


function init_altn_route(map_id) {

	var mapname=google_mapnames[map_id];
	var mapobj =google_mapobj[mapname];
	var routeDOM =google_routedivs[mapname];

	var nbaltnn=google_alt_mapnodes[mapname].length;
	var nbaltns=google_altnsteps[mapname].length;

	reset_google_map(map_id);
	google_altnroute=true;

// Locations along the alternate route
	if (google_compatibility) {
		for (var jj=1; jj<nbaltnn-1; jj++) {
			add_google_marker(google_alt_mapnodes[mapname][jj],mapobj);
			}
		}

// Initialize distance & time
	pelau_altn_distance  = 0;
	pelau_altn_duration  = 0;
// Before alternate route
	var altn_from=google_alt_mapnodes[mapname][0];
	for (jj=0; jj<google_mapnodes[mapname].length; jj++) {
		var step=google_primsteps[mapname][jj]+"_polyline()";
		eval(step);
		pelau_altn_distance+=step_distance["numb"];
		pelau_altn_duration+=step_duration["numb"];
		if (altn_from == google_mapnodes[mapname][jj]) break;
		}

// After alternate route
	var altn_to=google_alt_mapnodes[mapname][nbaltnn-1];
	for (var jto=0; jto<google_mapnodes[mapname].length; jto++) {
		if (altn_to == google_mapnodes[mapname][jto]) break;
		}
	for (jj=jto+1; jj<google_primsteps[mapname].length; jj++) {
		var step=google_primsteps[mapname][jj]+"_polyline()";
		eval(step);
		pelau_altn_distance+=step_distance["numb"];
		pelau_altn_duration+=step_duration["numb"];
		}

// Introductory text
	var str=	'<tr><th valign="middle" align="center" colspan=3>';
	if			(Pelau_lang == "EN")	str+="Alternative route";
	else if	(Pelau_lang == "FR")	str+="Itin&eacute;raire alternatif";
	else								str+="Itinerario alternativo";
	str+=	'</th></tr>'+
			'<tr><td colspan=3 class="tiny">'+
			eval(mapname+"_altn_intro('"+altn_from+"')")+
			'</td></tr>';
	route_directions[map_id]+=str;

// Process first alternate step
	pelau_altnroute_process(map_id,0);
	
}


// ********************************************************************	//


function pelau_altnroute_process(map_id,step_id) {

	google_altnroute=true;

	var mapname=google_mapnames[map_id];
	var routeDOM =google_routedivs[mapname];
	var nbsteps=google_altnsteps[mapname].length-1;
	var nbnodes=google_alt_mapnodes[mapname].length;
	var myMAP =google_mapobj[mapname];

	var str=route_directions[map_id];
	var step_from=google_alt_mapnodes[mapname][step_id];
	reset_google_map(map_id);
	if ((google_compatibility) && (step_id > 0)) myMAP.removeOverlay(google_altn_polyline);
	var step_to=google_alt_mapnodes[mapname][step_id+1];

	str += pelau_init_step(map_id,step_from,step_to);

// build instructions and polyline for this step
	var stepfun=google_altnsteps[mapname][step_id]+"_directions();";
	eval(stepfun);
	str+='<tr><td align="center" valign="middle">';
	if (google_compatibility) str+=pelau_step_magnifier(map_id,step_from,step_to);
	else					  str+='&nbsp;';
	str+='</td><td align="left" valign="middle" colspan=2 class="tiny">'+
			step_directions+
			'</td></tr>';
	str+='<tr><td colspan=3>'+pelau_show_stepLength(map_id)+'</td></tr>';

	route_directions[map_id]=str;
	str += pelau_next_step(map_id,step_id);


	var jvert = altn_route_vertexsize;
	if (jvert > 0) jvert--;
	for (var jj=0; jj<step_vertex_size; jj++) {
		altn_route_vertices[jvert]=step_vertices[jj];
		jvert++;
		}
	altn_route_vertexsize=jvert;
	pelau_show_routeSegment(map_id,altn_route_vertices);

	routeDOM.innerHTML=route_prologue+str+route_epilogue;
	google_altnroute=false;
}


// ********************************************************************	//


function pelau_show_routeNode(spot,map_id) {

	var pictDOM =google_pictdivs[map_id];
	
	pictDOM.innerHTML='<table border=0 cellpadding=2 cellspacing=0 class="small bg-silver">'+
						'<tr><td valign="top" align="right" >'+
						'<a href="javascript:NU_close_blockdiv(google_pictdivs['+map_id+']);" '+
						'class="btnclose">&nbsp;</a></td></tr><tr><td valign="top" align="center" >'+
						pelau_point_params[spot]["pictwin"]+
						'</td></tr></table>';
	NU_open_blockdiv(pictDOM);
}


// ********************************************************************	//


function pelau_show_routeSegment(map_id,vertices) {

	if (!google_compatibility) return 0;

	if (google_altnroute)	var color="#00ff00";
	else					var color="#ff0000";
	var mapname=google_mapnames[map_id];
	var mapobj =google_mapobj[mapname];
	var poly = new GPolyline(vertices,color,4,0.5);
	mapobj.addOverlay(poly);
	if (google_altnroute)	google_altn_polyline=poly;
	else					google_polyline[mapname]=poly;
}


// ********************************************************************	//


function pelau_show_stepLength(map_id) {

	if (google_altnroute) {
		pelau_altn_distance+=step_distance["numb"];
		pelau_altn_duration+=step_duration["numb"];
		}
	else {
		pelau_route_distance[map_id] += step_distance["numb"];
		pelau_route_duration[map_id] += step_duration["numb"];
		}

	var str='<table width="100%"><tbody><tr><td class="onehalf" align="center" valign="center"><i>';

	if			(Pelau_lang == "EN")	str+="Distance";
	else if	(Pelau_lang == "FR")	str+="Distance";
	else								str+="Distanza";
	str+=':&nbsp;'+step_distance["code"]+'</i></td><td class="onehalf" align="center" valign="center"><i>';

	if			(Pelau_lang == "EN")	str+="Duration";
	else if	(Pelau_lang == "FR")	str+="Dur&eacute;e";
	else								str+="Durata";
	str+=':&nbsp;'+step_duration["code"]+'</i></td></tr></tbody></table>';

	return str;
}


// ********************************************************************	//


function pelau_step_magnifier(id,step_from,step_to) {

	var str='<a class="btndetail" href="javascript:magnify_google_step('+
				id+",'"+step_from+"','"+step_to+"');"+
				'">&nbsp;</a>';
	return str;
}


// ********************************************************************	//


function pelau_distance_text(meters) {

	var km=Math.floor(meters/1000);
	var m =meters-1000*km;
	if (km > 10) {
		km+=Math.floor(m/500);
		m=0;
		}
	else km+=Math.round(m/100)/10;

	var str="";
	if (km > 0) str+=km+"&nbsp;Km";
	else str+=m+"&nbsp;m";

	return str;
}


// ********************************************************************	//


function pelau_duration_text(seconds) {

	var h = Math.floor(seconds/3600);
	var s = seconds-3600*h;
	var m = Math.floor(s/60);
	s = s-60*m;

	if (h > 1) {
		m+=Math.floor(s/30);
		s=0;
		if (m>50)  {
			h++;
			m=0;
			}
		}
	else if (m > 5) {
		m+=Math.floor(s/30);
		s=0;
		if (m>59)  {
			h++;
			m=0;
			}
		}

	var str="";
	if (h > 0) str+=h+"&nbsp;h";
	if (m > 0) {
		if (h > 0) str+='&nbsp;';
		str+=m+"&nbsp;min";
		}
	if (s > 0) {
		if (m > 0) str+='&nbsp;';
		str+=s+"&nbsp;sec";
		}

	return str;
}

