// Variabili globali Javascript
// ATTENZIONE, anche nel main.php ne sono definite altre


var  TrkDataObjects = new Array(); 
var  EventMarkerObjects = new Array(); 
var  EventDevs = new Array(); 
var  geoXml = null;

// Gestione overlay meteo
// 0=Nessun meteo, 1=Vento a 10m(wind_10m), 2=altezza/direzione onda(swh), 3=periodo/direzione onda (mwp), 4=raffiche vento (windgust)
var MeteoOverlayType = 0; 
var MeteoDateTimeIndex = 0; // 0-40
var mp;

// JavaScript Document
//------------------------------------------------------------------------------------------------
function TrkDataObject(id,num,customer,event_name,user_name,user_image,user_data,user_data2,user_data3,user_data4,user_data5,dev_id,dev_sn,dev_name,msg_epoch,msg_datetime,msg_type,msg_text,lat,lon,cog,sog,icon,visible)
{
	this.id=id; 
    this.num=num;
	this.customer=customer;
	this.event_name=event_name;
	this.user_name=user_name;
	this.user_image=user_image;
	this.user_data=user_data;
	this.user_data2=user_data2;
	this.user_data3=user_data3;
	this.user_data4=user_data4;
	this.user_data5=user_data5;
	this.dev_id=dev_id;
	this.dev_sn=dev_sn;
	this.dev_name=dev_name;
	this.msg_epoch=msg_epoch;
	this.msg_datetime=msg_datetime; // Sarà oggetto Date() in javascript
	this.msg_type=msg_type;
	this.msg_text=msg_text;
	this.lat=lat;
	this.lon=lon;
	this.cog=cog;
	this.sog=sog;
    this.icon=icon;
	this.visible=visible;
}
//------------------------------------------------------------------------------------------------
function EventMarkerObject(id,customer,event_name,name,group,num,data1,data2,data3,data4,data5,lat,lon,icon,visible)
{
	this.id=id; 
	this.customer=customer;
	this.event_name=event_name;
	this.name=name;
	this.group=group;
	this.num=num;
	this.data1=data1;
	this.data2=data2;
	this.data3=data3;
	this.data4=data4;
	this.data5=data5;
	this.lat=lat;
	this.lon=lon;
    this.icon=icon;
	this.visible=visible;
}
//------------------------------------------------------------------------------------------------
function EventDev(id,dev_sn,dev_name,dev_desc,customer,event_name,user_name,user_image,user_data,user_data2,user_data3,user_data4,user_data5,icon,visible,begin,end,
				  lastMsgEpoch,lastMsgLat,lastMsgLon,lastMsgCog,lastMsgSog,MsgCount)
{
	this.id=id; // viene per adesso assegnato a id_trkdata
	this.dev_sn=dev_sn;
	this.dev_name=dev_name;
	this.dev_desc=dev_desc;
	this.customer=customer;
	this.event_name=event_name;
	this.user_name=user_name;
	this.user_image=user_image;
	this.user_data=user_data;
	this.user_data2=user_data2;
	this.user_data3=user_data3;
	this.user_data4=user_data4;
	this.user_data5=user_data5;
    this.icon=icon;
	this.visible=visible;
	this.begin=begin;
	this.end=end;
	// Queste ultime due proprietà non sono presenti nella tabella EventDevs
	// e sono aggiornate da MapLoadMarkerObjects() leggendo i messaggi ricevuti
	this.lastMsgEpoch=lastMsgEpoch; // Data ricezione ultimo messaggio
	this.lastMsgLat=lastMsgLat; 
	this.lastMsgLon=lastMsgLon; 
	this.lastMsgCog=lastMsgCog; 
	this.lastMsgSog=lastMsgSog; 
	this.MsgCount=MsgCount; // Numero di messaggi ricevuti
	
}

//------------------------------------------------------------------------------------------------
function initialize()
{
    
	// Funzione che inizializza l'applicazione. Nota che devono essere definite delle
	// variabili globali (attualmente in uno script del main)
	// map,customer,centerLatitude,centerLongitude,startZoom
	
	//Esempio google map
	/*
	var map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(37.4419, -122.1419), 13);
    map.setUIToDefault();
	alert("Debug4");
	return;
	*/
	if (GBrowserIsCompatible())
	{
	  
   	  // Attivo lo splashscreen, voglio posizionarlo al centro dello schermo
	  //document.getElementById("splashscreen").style.display="block";
	  //document.getElementById('splashscreen').innerHTML=AjaxCall("map_create_splashscreen.php"); // carico la struttura HTML da uno script PHP
	  
	  //alert ("screen.availHeight=" + screen.availHeight);
	  //alert ("screen.availWidth=" + screen.availWidth);
	  //document.getElementById("splashscreen").style.width="600px";
	  //document.getElementById("splashscreen").style.height="480px";
	  /*
	  document.getElementById("splashscreen").style.width="640px";
	  document.getElementById("splashscreen").style.height="480px";
	  document.getElementById("splashscreen").style.display="block";
	  alert("screen.availHeight="+screen.availHeight);
	  alert("screen.availWidth="+screen.availWidth);	  
	  alert("window.Height="+screen.availHeight);
	  alert("window.Width="+screen.availWidth);	  
	  var splash_top = (screen.availHeight-parseInt(document.getElementById("splashscreen").style.height))/2;
	  alert ("splash_top=" + splash_top);
	  var splash_left = (screen.availWidth-parseInt(document.getElementById("splashscreen").style.width))/2;
	  alert ("splash_left=" + splash_left);
	  document.getElementById("splashscreen").style.top=splash_top +"px";
	  document.getElementById("splashscreen").style.left=splash_left+"px";
	  document.getElementById("splashscreen").style.display="block";
	  //alert(document.getElementById("splashscreen").top);
	  //alert(document.getElementById("splashscreen").left);
	  */
	  
	  /*
	  alert("top=" + document.getElementById("splashscreen").top);
	  document.getElementById("splashscreen").style.top=((screen.availHeight-document.getElementById("splashscreen").style.height)/2)+ "px";
	  alert(document.getElementById("splashscreen").style.top);
	  document.getElementById("splashscreen").style.left="150px";
	  document.getElementById("splashscreen").style.display="block"; // Attivo splash screen
	  document.getElementById('splashscreen').innerHTML=AjaxCall("map_create_splashscreen.php"); // carico la struttura HTML da uno script PHP
	  */
	  
	  map = new GMap2(document.getElementById("map"));
	  var location = new GLatLng(centerLatitude,centerLongitude);
	  map.setCenter(location,startZoom);
      map.setUIToDefault();
	  
	  mp = new MeteoPanel();
	  map.addControl(mp);// Controllo meteo
	  //alert(mp.panel.style.width);
	  //map.addControl(new MeteoPanel()); // Controllo meteo

	  var progressbarOptions = {width:150,loadstring:'Please wait...'};
	  progressBar = new ProgressbarControl(map,progressbarOptions);	  
	  //progressBar.start(100);progressBar.updateLoader(10);progressBar.remove();

	  // Aggiungo evento per movimento mouse
	  GEvent.addListener(map,"mousemove",function(latlng)
	  {
		  document.getElementById('cursorbar').innerHTML=GPSPositionToString(latlng.lat(),latlng.lng(),3);
		  // Solo per sicurezza, ogni tanto non prende il mouseout dal sidebar!
		  if (document.getElementById("infobar").style.display=="block")
		    document.getElementById("infobar").style.display="none";
	  });
	  

	  // Inizializzo la progressBar, carico le informazioni sui dispositivi 
	  // ma rimando la parte più lunga, cioè il caricamento dei dati dopo 200ms
	  // in modo da poter veder apparire nel browser la pagina.
	  //progressBar.start(100);
	  MapDrawPolylineDeviceList="";
	  MapDrawMarkerDeviceList="";
	  document.getElementById("ckxDevAll").checked=true;	  
	  timelineEpoch=trackingEnd; // TODO da cambiare, si dovra impostare il valore massimo?
	  MapLoadEventDevs(); // carico in memoria gli EventDevs[]
	  createSidebar();	// Disegno il pannelo laterale con informazioni EventDevs[]
	  
	  // La chiamo dentro MapLoadMarkerObjects changeTimeLine(0); // Refresh della timeline con valore attuale		  
	  setTimeout(function(){MapLoadMarkerObjects()},500);	// Eseguirò tra 500ms 
	  
	}
	else
	{
		alert("Javascript not supported");
		exit;
	}
}
//------------------------------------------------------------------------------------------------
function GPSPositionToString(GPSLat,GPSLon)
{
	// Converte una posizione in formato GPS (con decimali) in una stringa di posizione nel formato gg/mm/ss
	// ATTENZIONE !!! Aggiunge  Lat / Lon
	var DegLatPrefix;
	var DegLonPrefix;
	var LatDeg;
	var LatMin;
	var LatSec;
	var LonDeg;
	var LonMin;
	var LonSec;	
	var result;
	
	if (GPSLat > 0)
	  DegLatPrefix="N";
	else
	{
	  DegLatPrefix="S";
	  GPSLat = - GPSLat; // Corretto il segno lascio valori positivi
	}
    LatDeg = Math.floor(GPSLat);
	LatMin = Math.floor((GPSLat-LatDeg)*60.0);
	LatSec = ((GPSLat-LatDeg)*60-LatMin)*60.0; 
	LatSec = Math.floor(LatSec);

	if (GPSLon > 0)
	  DegLonPrefix="E";
	else
	{
	  DegLonPrefix="W";
	  GPSLon=-GPSLon; // Corretto il segno lascio valori positivi	  
	}
    LonDeg = Math.floor(GPSLon);
	LonMin = Math.floor((GPSLon-LonDeg)*60.0);;
	LonSec = ((GPSLon-LonDeg)*60-LonMin)*60.0; 
	LonSec= Math.floor(LonSec);

	result = "Lat: "+DegLatPrefix + " " +LatDeg + " " +LatMin + " " + LatSec;
	result = result + "&nbsp&nbsp&nbsp Lon: " + DegLonPrefix + " " +LonDeg + " " +LonMin + " " + LonSec;
	//alert(result);
	return(result);
}
//------------------------------------------------------------------------------------------------
function AjaxCall(PHPFileName)
{
	// Funzione che restituisce la risposta allo script PHPFileName eseguita in Ajax Sincrono
	// Nota che se usassi la chiamata asincrona non potrei restituire risultato...
	var http = false;
	if(navigator.appName == "Microsoft Internet Explorer") 
		http = new ActiveXObject("Microsoft.XMLHTTP");
	else 
		http = new XMLHttpRequest();

    http.open("GET", PHPFileName,false); // Richiesta sincrona!
    http.send(null);
    var responseText = http.responseText;
	return(responseText);
	
}
//------------------------------------------------------------------------------------------------
function MapLoadEventDevs()
{
    // ATTENZIONE, questa funziona usa le variabili globali event_name, customer
	// Per adesso ignoro trkdev_list,  trackingBegin e trackingEnd

	// Legge dala tabella eventdevs tutti i dispositivi che appartengono ad un determinato cliente
	// ed evento. Nota che uso event_name e non indice per maggiore flessibilità.
	var getVars;
	if (customer=="")
	  alert("MapLoadEventDevs without customer");
	else
	  getVars ="?customer=" + customer;
	if (event_name=="")
	  alert("MapLoadEventDevs without event");
	else
	  getVars = getVars +"&event=" + event_name;
	//alert(getVars);
		
	var EventDevsTxt = AjaxCall("map_load_eventdevs.php"+getVars).split(","); // Creo un array con un elemento per ogni campo 
	//alert(EventDevsTxt);

	// Il metodo Clear non funziona..length sembra lasciare in memoria
	// l'occupazione massima raggiunta fino a questo momento..
	// ATTENZIONE!!! Trova una soluzione!
	EventDevs.length=0;
	
	// Il numero di record è variabile e dipende dalla query 
	var ObjectCount = EventDevsTxt[0];
	var FieldCount = EventDevsTxt[1];
	//var TrkdevId=-1;
	//var ObjectId=-1;
	// Indipendentemente da selection creo un TrkDataObject per ogni trackdata 
	//alert("EventDevs N="+ObjectCount);
	for (var i=0;i<ObjectCount;i++)
	{
	  var ObjOffset=2+(i*FieldCount);
	  EventDevs[i] = new EventDev();
	  EventDevs[i].id=EventDevsTxt[ObjOffset+0]; 	
	  EventDevs[i].dev_sn=EventDevsTxt[ObjOffset+5];  
	  EventDevs[i].dev_name=EventDevsTxt[ObjOffset+6];
	  EventDevs[i].dev_desc=EventDevsTxt[ObjOffset+7];
	  EventDevs[i].customer=EventDevsTxt[ObjOffset+8];
	  EventDevs[i].event_name=EventDevsTxt[ObjOffset+9];
	  EventDevs[i].user_name=EventDevsTxt[ObjOffset+10];
	  EventDevs[i].user_image=EventDevsTxt[ObjOffset+11];
	  EventDevs[i].user_data=EventDevsTxt[ObjOffset+12];
	  EventDevs[i].user_data2=EventDevsTxt[ObjOffset+13];
	  EventDevs[i].user_data3=EventDevsTxt[ObjOffset+14];
	  EventDevs[i].user_data4=EventDevsTxt[ObjOffset+15];
	  EventDevs[i].user_data5=EventDevsTxt[ObjOffset+16];
	  EventDevs[i].icon=EventDevsTxt[ObjOffset+17];
	  EventDevs[i].visible=EventDevsTxt[ObjOffset+18];
	  EventDevs[i].begin=EventDevsTxt[ObjOffset+19];
	  EventDevs[i].end=EventDevsTxt[ObjOffset+20];
	}
	
}
//------------------------------------------------------------------------------------------------
function MapLoadMarkerObjects()
{
    // ATTENZIONE, questa funziona usa le variabili globali event_name e  customer.
	// Per adesso ignoro trkdev_list, trackingBegin e trackingEnd
	
	// Crea gli array che diventeranno marker sulla mappa, cioè : TrkDataObjects, EventMarkerObjects

	// Legge dalla tabella trkdata tutti i record con event_name e  customer
	// e crea con questi record la lista di oggetti javascript TrackingData 
	// Nota che tutti i record selezionati sono caricati in TrackingData[] 
	// ATTENZIONE!!! Se cambi la struttura della tabella trkdata devi cambiare anche la funzione!!!
	var getVars;
	if (customer=="")
	  alert("MapLoadTrackingData without customer");
	else
	  getVars ="?customer=" + customer;
	if (event_name=="")
	  alert("MapLoadTrackingData without event");
	else
	  getVars = getVars +"&event=" + event_name;
	// ATTENZIONE, per adesso ignoro volutamente trkdev_list anche se lo script
	// php lo gestirebbe!
	/*
	if (trkdev_list=="")
	  getVars = getVars;
	else
	  getVars = getVars +"&trkdev="+ trkdev_list;
	*/
	getVars = getVars +"&interval="+trackingInterval;
	//alert("getVars="+getVars);
	
	//var responseText= AjaxCall("map_load_tracks.php"+getVars);
	var TrkDataObjectsTxt = AjaxCall("map_load_tracks.php"+getVars).split(","); // Creo un array con un elemento per ogni campo separato da virgole
	//alert("TrkDataObjectsTxt = "+TrkDataObjectsTxt);
	
	// Resetto i valori dell'array device che dipendono da TrkDataObjects
	// Se non lo facessi mi potrei troverei dei valori errati da caricamenti precedenti
	for (var i=0;i<EventDevs.length;i++)
	{
		EventDevs[i].LastMsgEpoch=0; 
		EventDevs[i].lastMsgEpoch=0; // Data ricezione ultimo messaggio
		EventDevs[i].lastMsgLat=0; 
		EventDevs[i].lastMsgLon=0; 
		EventDevs[i].lastMsgCog=0; 
		EventDevs[i].lastMsgSog=0; 
		EventDevs[i].MsgCount=0; // Numero di messaggi ricevuti
	}
	
	// Il metodo Clear non funziona..length sembra lasciare in memoria
	// l'occupazione massima raggiunta fino a questo momento..
	// ATTENZIONE!!! 
	TrkDataObjects.length=0;
	
	// Il numero di record è variabile e dipende dalla query 
	var ObjectCount = TrkDataObjectsTxt[0];
	var FieldCount = TrkDataObjectsTxt[1];
	var TrkdevId=-1;
	var ObjectId=-1;
	var MsgPerDeviceCount=0;

	// Indipendentemente da selection creo un TrkDataObject per ogni trackdata 
	//alert("TrkDataObjects N="+ObjectCount);
	for (var i=0;i<ObjectCount;i++)
	{
	  
	  //alert("Adding TrkDataObject N "+ (i+1));
	  MsgPerDeviceCount++;
	  var ObjOffset=2+(i*FieldCount);
	  TrkDataObjects[i] = new TrkDataObject();
	  TrkDataObjects[i].id=TrkDataObjectsTxt[ObjOffset+0]; 	
	  TrkDataObjects[i].num=TrkDataObjectsTxt[ObjOffset+6];  
	  TrkDataObjects[i].customer=TrkDataObjectsTxt[ObjOffset+7];     
	  TrkDataObjects[i].event_name=TrkDataObjectsTxt[ObjOffset+8];   
	  TrkDataObjects[i].user_name=TrkDataObjectsTxt[ObjOffset+9];  
	  TrkDataObjects[i].user_image=TrkDataObjectsTxt[ObjOffset+10];   
	  TrkDataObjects[i].user_data=TrkDataObjectsTxt[ObjOffset+11]; 
	  TrkDataObjects[i].user_data2=TrkDataObjectsTxt[ObjOffset+12]; 
	  TrkDataObjects[i].user_data3=TrkDataObjectsTxt[ObjOffset+13]; 
	  TrkDataObjects[i].user_data4=TrkDataObjectsTxt[ObjOffset+14]; 
	  TrkDataObjects[i].user_data5=TrkDataObjectsTxt[ObjOffset+15]; 
	  TrkDataObjects[i].dev_id=TrkDataObjectsTxt[ObjOffset+16];   
	  TrkDataObjects[i].dev_sn=TrkDataObjectsTxt[ObjOffset+17];   
	  TrkDataObjects[i].dev_name=TrkDataObjectsTxt[ObjOffset+18];   
	  // TODO ATTENZIONE
	  // SPOT sembrava avere una risoluzione di epoch (<timeInGMTSecond>) di 12 ore nei messaggi simulati
	  // Comunque decido di creare un oggetto data javascript partendo da epoch e non usare la data/ora in formato testo del database
	  TrkDataObjects[i].msg_epoch=TrkDataObjectsTxt[ObjOffset+26];      // msg_epoch	, corrisponde a <timeInGMTSecond> SPOT
	  var MsgDateTime = new Date();
	  MsgDateTime.setTime((TrkDataObjectsTxt[ObjOffset+26])*1000); // Nota che Javascript lavora in millisecondi e non secondi..
	  TrkDataObjects[i].msg_datetime=DateTimeToString(MsgDateTime);
	  TrkDataObjects[i].msg_type=TrkDataObjectsTxt[ObjOffset+30];   
	  TrkDataObjects[i].msg_text=TrkDataObjectsTxt[ObjOffset+34];   
	  TrkDataObjects[i].lat=TrkDataObjectsTxt[ObjOffset+35];   
	  TrkDataObjects[i].lon=TrkDataObjectsTxt[ObjOffset+36];   
	  TrkDataObjects[i].cog=TrkDataObjectsTxt[ObjOffset+37];   
	  TrkDataObjects[i].sog=TrkDataObjectsTxt[ObjOffset+38];   
	  TrkDataObjects[i].icon=TrkDataObjectsTxt[ObjOffset+39];   
	  TrkDataObjects[i].visible=TrkDataObjectsTxt[ObjOffset+40];   
	}
	
	MsgPerDeviceCount=0;
	var ObjCount = TrkDataObjects.length;
	for (var i=0;i < ObjCount; i++)
	{
		if (i<(ObjCount-1))
		{
			MsgPerDeviceCount++;
			// Se il prossimo punto è di un altro dispositivo o non è più all'interno della timeLine
			// devo disegnare la polilinea
			if ((TrkDataObjects[i+1].dev_sn!=TrkDataObjects[i].dev_sn)||(TrkDataObjects[i+1].epoch > timelineEpoch))
			{
				// Aggiorna dati EventDevs
				for (var j=0; j<EventDevs.length ; j++)
				{
					if (EventDevs[j].dev_sn == TrkDataObjects[i].dev_sn)
					{
						// Queste ultime proprietà non sono presenti nella tabella EventDevs
						EventDevs[j].lastMsgEpoch=TrkDataObjects[i].msg_epoch; ; 
						//alert(EventDevs[j].LastMsgEpoch);
						EventDevs[j].MsgCount=MsgPerDeviceCount;
						EventDevs[j].lastMsgLat=TrkDataObjects[i].lat; 
						EventDevs[j].lastMsgLon=TrkDataObjects[i].lon; 
						EventDevs[j].lastMsgCog=TrkDataObjects[i].cog; 
						EventDevs[j].lastMsgSog=TrkDataObjects[i].sog; 
						MsgPerDeviceCount=0;
						//alert("EventDevs="+j+"  "+ EventDevs[j].dev_sn +" = " + EventDevs[j].MsgCount +" Epoch:"+EventDevs[j].lastMsgEpoch+" Lat:"+EventDevs[j].lastMsgLat);
					}
				 } // for (var j=0; j<EventDevs.length ; j++)
			}
		}
		else // Sono all'ultimo punto della polilinea
		{
			// Aggiorna dati EventDevs
			MsgPerDeviceCount++;
			for (var j=0; j<EventDevs.length ; j++)
			{
				if (EventDevs[j].dev_sn == TrkDataObjects[i].dev_sn)
				{
					// Queste ultime proprietà non sono presenti nella tabella EventDevs
					EventDevs[j].lastMsgEpoch=TrkDataObjects[i].msg_epoch; ; 
					//alert(EventDevs[j].LastMsgEpoch);
					EventDevs[j].MsgCount=MsgPerDeviceCount;
					EventDevs[j].lastMsgLat=TrkDataObjects[i].lat; 
					EventDevs[j].lastMsgLon=TrkDataObjects[i].lon; 
					EventDevs[j].lastMsgCog=TrkDataObjects[i].cog; 
					EventDevs[j].lastMsgSog=TrkDataObjects[i].sog; 
					MsgPerDeviceCount=0;
					//alert("EventDevs="+j+"  "+ EventDevs[j].dev_sn +" = " + EventDevs[j].MsgCount);
				}
			 } // for (var j=0; j<EventDevs.length ; j++)
		}
	}

	// Adesso, per ultimo, leggo dalla tabella eventmarkers eventuali marker per l'evento
	// e li carico nell'array EventMarkerObject
	var getVars;
	if (customer=="")
	  alert("MapLoadEventMarkers without customer");
	else
	  getVars ="?customer=" + customer;
	if (event_name=="")
	  alert("MapLoadEventMarkers without event");
	else
	  getVars = getVars +"&event=" + event_name;
	//alert("getVars="+getVars);

	var EventMarkerObjectsTxt = AjaxCall("map_load_eventmarkers.php"+getVars).split(","); 
	
	// Il metodo Clear non funziona..length sembra lasciare in memoria
	// l'occupazione massima raggiunta fino a questo momento..
	// ATTENZIONE!!! 
	EventMarkerObjects.length=0;
	
	// Il numero di record è variabile e dipende dalla query 
	var ObjectCount = EventMarkerObjectsTxt[0];
	var FieldCount = EventMarkerObjectsTxt[1];
	var groupnum=0;
	var num=0;
	// Creo un EventMarkerObject per ogni record 
	//alert("EventMarkerObjects N="+ObjectCount);
	for (var i=0;i<ObjectCount;i++)
	{
	  //alert("Adding EventMarkerObject N "+ (i+1));
	  var ObjOffset=2+(i*FieldCount);
	  EventMarkerObjects[i] = new EventMarkerObject();
	  EventMarkerObjects[i].id=EventMarkerObjectsTxt[ObjOffset+0]; 	
	  EventMarkerObjects[i].customer=EventMarkerObjectsTxt[ObjOffset+2];     
	  EventMarkerObjects[i].event_name=EventMarkerObjectsTxt[ObjOffset+3];   
	  EventMarkerObjects[i].name=EventMarkerObjectsTxt[ObjOffset+4];   
	  EventMarkerObjects[i].groupnum=EventMarkerObjectsTxt[ObjOffset+5];   
	  EventMarkerObjects[i].num=EventMarkerObjectsTxt[ObjOffset+6];   
	  EventMarkerObjects[i].data1=EventMarkerObjectsTxt[ObjOffset+7]; 
	  EventMarkerObjects[i].data2=EventMarkerObjectsTxt[ObjOffset+8]; 
	  EventMarkerObjects[i].data3=EventMarkerObjectsTxt[ObjOffset+9]; 
	  EventMarkerObjects[i].data4=EventMarkerObjectsTxt[ObjOffset+10]; 
	  EventMarkerObjects[i].data5=EventMarkerObjectsTxt[ObjOffset+11]; 
	  EventMarkerObjects[i].lat=EventMarkerObjectsTxt[ObjOffset+12];   
	  EventMarkerObjects[i].lon=EventMarkerObjectsTxt[ObjOffset+13];   
	  EventMarkerObjects[i].icon=EventMarkerObjectsTxt[ObjOffset+14];   
	  EventMarkerObjects[i].visible=EventMarkerObjectsTxt[ObjOffset+15];   
	}


    // Dopo aver rigenerato i punti track devo ridisegnare la polilinea che li unisce
	// ATTENZIONE, TODO, questo è necessario perchè questa funzione viene chiamata in differita
	// dopo inizializzazione finestra con setTimeout
	changeTimeLine(0);
	map.clearOverlays();
	MapDrawMarkers();
	MapDrawPolyline();
    
	// Disabilito finestra splashscreen
	// document.getElementById("splashscreen").style.display="none"; // Disattivo splash screen


	/*
	var geoXml = new GGeoXml('http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/swh_google_1.kml'); // mwp_google_1
    map.removeOverlay(geoXml)
    map.addOverlay(geoXml);
	*/
}
//------------------------------------------------------------------------------------------------
function addMarker(lat,lon,Tooltip,InfoHtml,iconImage,cog)
{
	// ATTENZIONE ATTENZIONE
	// Non cercare di eliminare "unroll" questa funzione ed inserire il codice direttamente
	// perchè non funzionerebbero gli eventi di click, o meglio resterebbe attivo solo
	// l'ultimo inserito.
	
	// Questa funzione utilizza il nome assegnato all'icona per sapere anche
	// il numero del device e la dimensione dell'icona....non è il massimo ma...
	
	// Se l'icona non è definita uso "images/iconstd.png"
	var MarkerIcon = new GIcon(G_DEFAULT_ICON);
	
	if (iconImage!='')
	{
		var iconImageString = String(iconImage); 
		//alert (iconImageString.search("vessel_"));
		if (iconImageString.search("vessel_")!=-1)
		{
			// Icona standard imbarcazione , images/icons/vessel_XX
			// dove XX è il numero scritto nell'icona
			MarkerIcon.iconSize= new GSize(24,24);
			MarkerIcon.shadow="";
			MarkerIcon.iconAnchor = new GPoint(12, 12);
			MarkerIcon.infoWindowAnchor = new GPoint(12, 12);
			var round_cog = Math.round(cog/10.0)*10;			
			MarkerIcon.image=iconImageString + "_" + round_cog + ".png";
			//alert(MarkerIcon.image);
		}
		else
		{
			MarkerIcon.iconSize= new GSize(32,32);
			MarkerIcon.shadow="";
			MarkerIcon.iconAnchor = new GPoint(16, 31);
			MarkerIcon.infoWindowAnchor = new GPoint(16, 31);
			MarkerIcon.image=iconImage;
		}
		
	}
	else
	{
		MarkerIcon.iconAnchor = new GPoint(16, 31);
		MarkerIcon.infoWindowAnchor = new GPoint(16, 31);
	    MarkerIcon.image = "images/icons/iconstd.png";
		
	}
	
	//alert(MarkerIcon.image);
	var markerOptions = { icon:MarkerIcon, title:Tooltip };
	var marker = new GMarker(new GLatLng(lat,lon),markerOptions);
	//var marker = new GMarker(new GLatLng(lat,lon));
	GEvent.addListener(marker,'click',function(){marker.openInfoWindowHtml(InfoHtml);});
	map.addOverlay(marker);
}
//------------------------------------------------------------------------------------------------
function DateTimeToString(DateTimeObject)
{
	var date = new Date(DateTimeObject);
	var d  = date.getDate();
	var day = (d < 10) ? '0' + d : d;
	var m = date.getMonth() + 1;
	var month = (m < 10) ? '0' + m : m;
	var yy = date.getYear();
	var year = (yy < 1000) ? yy + 1900 : yy;
	
	var h = date.getHours();
	var hour = (h < 10) ? '0' + h : h;
	var mm = date.getMinutes();
	var minutes = (mm < 10) ? '0' + mm : mm;
	var s = date.getSeconds();
	var seconds = (s < 10) ? '0' + s : s;
	return(day + "/" + month +"/" + year + " " + hour + ":" + minutes + ":"+ seconds); 
}
//------------------------------------------------------------------------------------------------
function createSidebar()
{
   // Creo il pannello laterale contenente l'elenco imbarcazione/equipaggio 
   // per la regata selezionata
   // ATTENZIONE NON UTILIZZO id_eventycht  ma id_map_race_object che è l'indice
   // dell'array MapRaceObjects
   // Questa funzione lancia un XMLHttpRequest allo script map_create_infobar
   // che restituisce codice html pronto ad essere inserito in innerHTML.	
   
   	//var sidebarHTML = AjaxCall("map_create_sidebar.php"); 
    //document.getElementById('sidebar').innerHTML=sidebarHTML; // carico la struttura HTML da uno script PHP
    //document.getElementById("ckxDevAll").checked=true; // Pulsante visualizza tutti i device attivato di default
	//alert (EventDevs.length);
	for (var i=1;i <= EventDevs.length; i++)
	{
		
		document.getElementById("sidebarDiv"+i).style.display='block';
		// Voglio scrivere solo fino alla parentesi "(" e ridurre la dimensione massima a 19 caratteri
		var CaptionMaxLength= EventDevs[i-1].user_name.indexOf("(");
		/*
		if (CaptionMaxLength!=-1)
			CaptionMaxLength = Math.min(CaptionMaxLength,20);
		else	
			CaptionMaxLength = 20;
		*/
		// 16/06/2010 Limito a 20 comunque
		CaptionMaxLength = 22;
		document.getElementById("sidebarDivCaption"+i).innerHTML=EventDevs[i-1].user_name.substring(0,CaptionMaxLength);
	}
}
//------------------------------------------------------------------------------------------------
function OnDeviceCheckBoxMouseDown(id)
{
	
	// Questa funzione viene chiamata quando premo il checkbox di selezione EventDev nella sideBar
	// Disabilito visualizzazione di tutti i tracks
	document.getElementById("ckxDevAll").checked=false;
	// Per prima cosa resetto tutti i checkbox
	for (var i=1;i<35;i++)
	  document.getElementById("ckxDev"+i).checked=false;
	
	if (id==0)
	{
		MapDrawPolylineDeviceList="";
		MapDrawMarkerDeviceList="";
	}
	else
	{
		MapDrawPolylineDeviceList=EventDevs[id-1].dev_sn;
		MapDrawMarkerDeviceList=EventDevs[id-1].dev_sn;
		
	}
	map.clearOverlays();
	MapDrawMarkers();
	MapDrawPolyline();
	
    ChangeMeteoOverlay(MeteoOverlayType,MeteoDateTimeIndex);

	/*
	var geoXml = new GGeoXml('http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/mwp_google_1.kml');
    map.removeOverlay(geoXml)
    map.addOverlay(geoXml);
	*/
}
//------------------------------------------------------------------------------------------------
function MapDrawMarkers()
{
	
	// Voglio disegnare i marker secondo la variabile MapDrawMarkersDeviceList
	// Se è vuota disegno gli ultimi marker di ogni dispositivo, altrimenti
	// disegno TUTTI i marker dei dispositivi i cui dev_sn sono inseriti nella lista
	// separati da virgole.
	// Aggiungo i marker dell'evento secondo EventMarkerObjects

	var ObjCount= TrkDataObjects.length;
	if (ObjCount>0)
	{
		//alert(MapDrawMarkerDeviceList);
		if (MapDrawMarkerDeviceList=="")
		{	
			// Disegno solo i marker finali di tutti i device
			for (var i=0;i < ObjCount; i++)
			{
				if (TrkDataObjects[i].msg_epoch <= timelineEpoch)
				{
					// ATTENZIONE, spero la valutazione dell'if da parte di javascript esca alla prima
					// condizione vera, altrimenti potre avere un bound error se prova ad accedere all'elemento
					// successivo quando si trova all'uktimo della lista
					if (i==(ObjCount-1)||(TrkDataObjects[i].dev_sn != TrkDataObjects[i+1].dev_sn))
					{
						/*
						var PopupHTML=TrkDataObjects[i].user_name + "<br>";
						PopupHTML = PopupHTML + TrkDataObjects[i].user_data+"<br>";
						PopupHTML = PopupHTML + TrkDataObjects[i].msg_datetime+"<br>"; // MM/dd/yyyy HH:mm:ss
						var marker_tooltip = TrkDataObjects[i].user_name+ "(" + TrkDataObjects[i].msg_datetime+ ")";
						*/
						var PopupHTML=TrkDataObjects[i].user_name + "<br>";
						PopupHTML = PopupHTML + TrkDataObjects[i].user_data+"<br>";
						PopupHTML = PopupHTML + TrkDataObjects[i].msg_datetime+"<br>"; // MM/dd/yyyy HH:mm:ss
						//PopupHTML = PopupHTML + TrkDataObjects[i].cog+ "° / " + TrkDataObjects[i].sog+" knots<br>"; // MM/dd/yyyy HH:mm:ss
						var cogNumber = new Number(TrkDataObjects[i].sog);
						PopupHTML = PopupHTML + TrkDataObjects[i].cog+ "° / " + cogNumber.toFixed(1)+" knots<br>"; // MM/dd/yyyy 						var marker_tooltip = TrkDataObjects[i].user_name+ "(" + TrkDataObjects[i].msg_datetime+ ")";
						var marker_tooltip = TrkDataObjects[i].user_name+ "(" + TrkDataObjects[i].msg_datetime+ ")";
						//alert(PopupHTML);
					
						// ATTENZIONE, NON eliminare questa funzione, se cerchi di creare il marker direttamente qui
						// tutti gli eventi dei marker prendono le coordinate dell'ultimo
						addMarker(TrkDataObjects[i].lat,TrkDataObjects[i].lon,marker_tooltip,PopupHTML,TrkDataObjects[i].icon,TrkDataObjects[i].cog);
					}
				}
			}
		}
		else
		{
			// Disegno tutti i marker dei device contenuti in MapDrawMarkersDeviceList
			for (var i=0;i < ObjCount; i++)
			{
				if ((MapDrawMarkerDeviceList.indexOf(TrkDataObjects[i].dev_sn)>=0)&&(TrkDataObjects[i].msg_epoch <= timelineEpoch))
				{
					//alert("Drawing marker " +TrkDataObjects[i].dev_sn +" UserName:"+TrkDataObjects[i].dev_sn+" Lat:"+TrkDataObjects[i].lat +" Lon:"+TrkDataObjects[i].lon +" Icon:" +TrkDataObjects[i].icon);
					var PopupHTML=TrkDataObjects[i].user_name + "<br>";
					PopupHTML = PopupHTML + TrkDataObjects[i].user_data+"<br>";
					PopupHTML = PopupHTML + TrkDataObjects[i].msg_datetime+"<br>"; // MM/dd/yyyy HH:mm:ss
					//PopupHTML = PopupHTML + TrkDataObjects[i].cog+ "° / " + TrkDataObjects[i].sog+" knots<br>"; // MM/dd/yyyy HH:mm:ss
					var cogNumber = new Number(TrkDataObjects[i].sog);
					PopupHTML = PopupHTML + TrkDataObjects[i].cog+ "° / " + cogNumber.toFixed(1)+" knots<br>"; // MM/dd/yyyy HH:mm:ss
					var marker_tooltip = TrkDataObjects[i].user_name+ "(" + TrkDataObjects[i].msg_datetime+ ")";
					// ATTENZIONE, NON eliminare questa funzione, se cerchi di creare il marker direttamente qui
					// tutti gli eventi dei marker prendono le coordinate dell'ultimo
					//alert(PopupHTML);
					addMarker(TrkDataObjects[i].lat,TrkDataObjects[i].lon,marker_tooltip,PopupHTML,TrkDataObjects[i].icon,TrkDataObjects[i].cog);
				}
			}
		}
	}

	// Aggiungo i marker dell'evento contenuti in  EventMarkerObjects
	//alert ("EventMarkerObjects.length=" + EventMarkerObjects.length);
	var ObjCount= EventMarkerObjects.length;
	if (ObjCount>0)
	{
		// Disegno tutti i marker dei device contenuti in MapDrawMarkersDeviceList
		for (var i=0;i < ObjCount; i++)
		{
			//alert("Drawing EventMarker " +EventMarkerObjects[i].name +" Lat:"+EventMarkerObjects[i].lat +" Lon:"+EventMarkerObjects[i].lon +" Icon:" +EventMarkerObjects[i].icon);
			var PopupHTML=EventMarkerObjects[i].name + "<br>";
			PopupHTML = PopupHTML + EventMarkerObjects[i].data1+"<br>";
			PopupHTML = PopupHTML + EventMarkerObjects[i].data2+"<br>"; // MM/dd/yyyy HH:mm:ss
			var marker_tooltip = EventMarkerObjects[i].name;
			// ATTENZIONE, NON eliminare questa funzione, se cerchi di creare il marker direttamente qui
			// tutti gli eventi dei marker prendono le coordinate dell'ultimo
			addMarker(EventMarkerObjects[i].lat,EventMarkerObjects[i].lon,marker_tooltip,PopupHTML,EventMarkerObjects[i].icon,0);
		}
	}

}
//------------------------------------------------------------------------------------------------
function MapDrawPolyline()
{
    // Crea una polininea "encoded" utilizzando i punti TrkDataObjects[] che sono presenti
	// nella lista MapDrawPolylineDeviceList e entro il tempo timelineEpoch

	// ATTENZIONE!! ATTENZIONE ! L'array TrkDataObjects[i] deve essere ordinato cioè deve contenere
	// i record contigui.
	
	//alert(trkdev_list);
	//alert(trackingBegin + "<->"+trackingEnd);
	
	var pointsCount = 0;
	var polylinepoints = [];
	var polylineCount = 0; // Numero di polilinee create	
	var polyline_width = 2;
	var polyline_opacity = 0.7;
	var polyline_closed=false;
	var polyline_color= HtmlColors[0]; // Array HtmlColors[10] è globale e contiene 10 colori standard da usare nell'applicazione	
	
	var ObjCount= TrkDataObjects.length;
	//alert("ObjectCount="+ObjCount);
	if (ObjCount<=0)
	  return;
	for (var i=0;i < ObjCount; i++)
	{

		// Aggiungo il punto comunque il punto corrente. Nota che il controllo ceh il punto sia l'ultimo della
		// imbarcazione corrente è già stato eseguito
		if ((MapDrawPolylineDeviceList.indexOf(TrkDataObjects[i].dev_sn)>=0)&&(TrkDataObjects[i].msg_epoch <= timelineEpoch))
		//if ((MapDrawPolylineDeviceList.indexOf(TrkDataObjects[i].dev_sn)>=0))
		{
			polylinepoints.push(new GLatLng(TrkDataObjects[i].lat,TrkDataObjects[i].lon)); // Aggiungo il punto alla polilinea
			pointsCount++;
		}
		// Controllo se devo disegnare la polilinea perchè il prossimo punto è di un'altra imbarcazione (polilinea)
		// alla fine di tutti i punti
		if (i<(ObjCount-1)) 
		{
			// Aggiungo il punto
			//alert("polylinepoints.push");
			/*
			if ((MapDrawPolylineDeviceList.indexOf(TrkDataObjects[i].dev_sn)>=0)&&(TrkDataObjects[i].msg_epoch <= timelineEpoch))
			//if ((MapDrawPolylineDeviceList.indexOf(TrkDataObjects[i].dev_sn)>=0))
			{
				polylinepoints.push(new GLatLng(TrkDataObjects[i].lat,TrkDataObjects[i].lon)); // Aggiungo il punto alla polilinea
				pointsCount++;
			}
			*/
			// Se il prossimo punto è di un altro dispositivo o non è più all'interno della timeLine
			// devo disegnare la polilinea
			if ((TrkDataObjects[i+1].dev_sn!=TrkDataObjects[i].dev_sn)||(TrkDataObjects[i+1].epoch > timelineEpoch))
			{
				//alert("Drawing polyline");
				if (pointsCount>2)
				{
					//alert("Encoding polyline");
					var polylineEncoder = new PolylineEncoder();
					polylineCount++;
					polyline_color= HtmlColors[polylineCount % 10]; // 
					var polyline = polylineEncoder.dpEncodeToGPolyline(polylinepoints,polyline_color,polyline_width,polyline_opacity,polyline_closed);
					map.addOverlay(polyline);
					//alert("Polyline overlay added with " + pointsCount +" points for " + TrkDataObjects[i].dev_sn);
				}
				polylinepoints = []; 
				pointsCount=0;
			}
		}
		else // Sono all'ultimo punto della polilinea
		{
			// Sono all'ultimo punto, devo scrivere comunque 
			if (pointsCount>2)
			{
				//alert("Encoding polyline");
				var polylineEncoder = new PolylineEncoder();
				polylineCount++;
				polyline_color= HtmlColors[polylineCount % 10]; // 
				var polyline = polylineEncoder.dpEncodeToGPolyline(polylinepoints,polyline_color,polyline_width,polyline_opacity,polyline_closed);
				map.addOverlay(polyline);
				//alert("Last Polyline overlay added with " + pointsCount +" points for " + TrkDataObjects[i].dev_sn);
			}
		}
	}
	
}
//------------------------------------------------------------------------------------------------
function sidebarMouseOver(id)
{
	
	// Deseleziono tutti i pannelli
	document.getElementById("sidebarDivLastPosition").style.backgroundColor="#FFFFFF";
	for (var i=1; i <= EventDevs.length ; i++)
    {
	  //document.getElementById("sidebarDiv"+i).style.display='block';
	  // FUNZIONA document.getElementById("sidebarDiv"+i).style.backgroundColor="#FFFFFF";
	  document.getElementById("sidebarRow"+i).style.backgroundColor="#FFFFFF";
	  //bgcolor="#CCCCCC" $bgcolor="#FFFFFF"
	  //alert(MapEventYachts[i].yacht_name);
	  //alert(i);
    }
	// Adesso mostro di colore scuro il pannelo della con il cursoe sopra 
	if (id==0)
	{
  	   document.getElementById("sidebarDivLastPosition").style.backgroundColor="#CCCCCC";
       document.getElementById('infobar').style.display='none';
	}
	else
	{

	   createInfobar(id);
	   document.getElementById("sidebarRow"+id).style.backgroundColor="#CCCCCC";
       document.getElementById('infobar').style.display='block';
	}
}
//------------------------------------------------------------------------------------------------
function sidebarMouseOut(id_MapEventYacht)
{
	// Fa diventare invisibile la finestra "infobar" 
	// Nota che la fienstra è unica, quindi non mi serve sapere chi ha
	// chiamato la funzione ed il parametro id è inutile
	//alert("mouse out"+id);
    document.getElementById('infobar').style.display='none';
}
//------------------------------------------------------------------------------------------------
function createInfobar(id)
{
   // Creo il pannello informazioni relative all'imbarcazione/equipaggio
   // che deve comparire quando si passa con il mouse sopra un'imbarcazione
	
	// Ho notato che entra nell'evento anche per le celle vuote adiacenti, quindi limito
	// l'elaborazione ai soli eventdevs esistenti
	if (id > EventDevs.length)
		return;
		
   	//var objectsTxt  = AjaxCall("map_create_infobar.php"); // Da rimuovere ????
		
    //alert(objectsTxt);
	document.getElementById('infobar').innerHTML=AjaxCall("map_create_infobar.php"); // carico la struttura HTML da uno script PHP
	
	//alert(EventDevs[id-1].user_name);

	//alert(EventDevs[id_MapEventYacht-1].yacht_picture);
	document.getElementById('ib_yacht_name').innerHTML=EventDevs[id-1].user_name;
	document.getElementById('ib_sailn').innerHTML=EventDevs[id-1].user_data;
	document.getElementById('ib_country').innerHTML=EventDevs[id-1].user_data5;
	document.getElementById('ib_user1').innerHTML=EventDevs[id-1].user_data3;
	document.getElementById('ib_user2').innerHTML=EventDevs[id-1].user_data4;
	document.getElementById('ib_yacht_picture').setAttribute('src', EventDevs[id-1].user_image);
	
	
	//alert(EventDevs[id-1].lastMsgEpoch);
	if (EventDevs[id-1].lastMsgEpoch<=0)
	  document.getElementById('ib_datetime').innerHTML="---------------";
	else  
	{
		var MsgDateTime = new Date();
		MsgDateTime.setTime((EventDevs[id-1].lastMsgEpoch)*1000); // Nota che Javascript lavora in millisecondi e non secondi..
		document.getElementById('ib_datetime').innerHTML=DateTimeToString(MsgDateTime);			
	}
	
	if (EventDevs[id-1].lastMsgLat==0)
		document.getElementById('ib_lat').innerHTML="--------";
	else	
		document.getElementById('ib_lat').innerHTML=GPSLatToString(EventDevs[id-1].lastMsgLat);//GPSLatToString(42.00);
	if (EventDevs[id-1].lastMsgLon==0)
		document.getElementById('ib_lon').innerHTML="--------";
	else
		document.getElementById('ib_lon').innerHTML=GPSLonToString(EventDevs[id-1].lastMsgLon);//11.00);
	  
	// ATTENZIONE, sog e cg da controllare
	if (EventDevs[id-1].lastMsgCog=="")
    	document.getElementById('ib_cog').innerHTML="--------";
	else
    	document.getElementById('ib_cog').innerHTML=EventDevs[id-1].lastMsgCog;
	if (EventDevs[id-1].lastMsgSog=="")
	//if (1==1)
		document.getElementById('ib_sog').innerHTML="--------";
	else
	{
			document.getElementById('ib_sog').innerHTML=EventDevs[id-1].lastMsgSog;
			/*
			var sogNum = new Number(10.123);
			alert(sogNum.ToFixed(1));
			document.getElementById('ib_sog').innerHTML = EventDevs[id-1].lastMsgSog;
			*/
	}
	
    //alert(EventDevs[id-1].lastMsgEpoch);
	if (EventDevs[id-1].MsgCount>0)
	{
		document.getElementById('ib_trknum').innerHTML=EventDevs[id-1].MsgCount;			
	}
	else
		document.getElementById('ib_trknum').innerHTML="--------";			
	
	//document.getElementById('ib_trknum').innerHTML=EventDevs[id-1].MsgCount;//EventDevs[id-1].dev_name;
	document.getElementById('infobar').style.display='block';
	
	
}
//------------------------------------------------------------------------------------------------
function GPSLatToString(GPSLat)
{

	// ATTENZIONE !!! NON Aggiunge  Lat 
	// Converte una posizione in formato GPS (con decimali)
	// in una stringa di posizione nel formato gg/mm/ss
	var DegLatPrefix;
	var LatDeg;
	var LatMin;
	var LatSec;
	var result;
	
	if (GPSLat > 0)
	  DegLatPrefix="N";
	else
	{
	  GPSLat = - GPSLat; // Valore positivo !
	  DegLatPrefix="S";
	}
	LatDeg = Math.floor(GPSLat);
	LatMin = Math.floor((GPSLat-LatDeg)*60.0);
	LatSec = ((GPSLat-LatDeg)*60-LatMin)*60.0; 
	LatSec = Math.floor(LatSec);

	result = DegLatPrefix + " " +LatDeg + " " +LatMin + " " + LatSec;
	//alert(result);
	return(result);
}
//------------------------------------------------------------------------------------------------
function GPSLonToString(GPSLon)
{
	// ATTENZIONE !!! NON Aggiunge  Lon
	// Converte una posizione in formato GPS (con decimali)
	// in una stringa di posizione nel formato gg/mm/ss
	var DegLonPrefix;
	var LonDeg;
	var LonMin;
	var LonSec;	
	var result;
	
	if (GPSLon > 0)
	  DegLonPrefix="E";
	else
	{
  	  GPSLon = - GPSLon; // Valore positivo !
	  DegLonPrefix="W";
	}
	LonDeg = Math.floor(GPSLon);
	LonMin = Math.floor((GPSLon-LonDeg)*60.0);;
	LonSec = ((GPSLon-LonDeg)*60-LonMin)*60.0; 
	LonSec= Math.floor(LonSec);

	result = DegLonPrefix + " " +LonDeg + " " +LonMin + " " + LonSec;
	//alert(result);
	return(result);
}
//------------------------------------------------------------------------------------------------
function changeTimeLine(timeLineChangeInSeconds)
{
	//alert(timeLineChangeInSeconds);
	trackingEnd = trackingEnd + timeLineChangeInSeconds;
	//alert(trackingEnd);
	map.clearOverlays();
	MapDrawPolyline();
	MapDrawMarkers();

	/*
	var geoXml = new GGeoXml('http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/mwp_google_1.kml');
    map.removeOverlay(geoXml)
    map.addOverlay(geoXml);
	*/
	var timeLineDateValue = new Date(trackingEnd*1000);
	document.getElementById('timelinebarvalue').innerHTML = DateTimeToString(timeLineDateValue); //data.toString();

}
//------------------------------------------------------------------------------------------------
function toRad(deg) 
{
 return deg * Math.PI/180;
}
//------------------------------------------------------------------------------------------------
function distanceBetweenLatLon(lat1,lon1,lat2,lon2)
{
	// Restituisce la distanza in KM tra due punti utilizzando
	// formula approssimata (max 0.3% errore)
	var R = 6371; // km
	var dLat = toRad(lat2-lat1);
	var dLon = toRad(lon2-lon1); 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
			Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
			Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	//alert(d);
	return (d); 
	/* Oroginale
	var R = 6371; // km
	var dLat = (lat2-lat1).toRad();
	var dLon = (lon2-lon1).toRad(); 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
			Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
			Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	return (d);
	*/
}
//------------------------------------------------------------------------------------------------
function debugEventDevs(n)
{
	//images/icons/iconstd_08.png 	
	// 0-7512897
	
	if (n==0)
	{
		for (var i=0; i<EventDevs.length;i++)
		{
			alert("Device n."+(i+1)+": user_name="+EventDevs[i].user_name+" , dev_sn="+EventDevs[i].dev_sn+" , MsgCount="+EventDevs[i].MsgCount);
		}
	}
	else
	{
		// Informazioni più dettagliate sul tracking del dispositivo
		for (var i=0; i<TrkDataObjects.length;i++)
		{
			if (TrkDataObjects[i].dev_sn==EventDevs[n-1].dev_sn)
			  //alert("Device n."+n+":"+Date(TrkDataObjects[i].msg_date_time));
			  alert("Device n."+n+ " " +EventDevs[n-1].dev_sn+ "("+EventDevs[n-1].user_name+"):"+TrkDataObjects[i].msg_epoch);
		}
		
	}
}
//------------------------------------------------------------------------------------------------
function DrawPolyline()
{

	var polyline_width = 2;
	var polyline_opacity = 0.7;
	var polyline_closed=false;
	var polyline_color= HtmlColors[0]; // Array HtmlColors[10] è globale e contiene 10 colori standard da usare nell'applicazione	


}
//------------------------------------------------------------------------------------------------
function ChangeMeteoOverlay(NewMeteoOverlayType,NewMeteoDateTimeIndex)
{
	// Aggiorno variabili globali
	MeteoOverlayType = NewMeteoOverlayType;
	MeteoDateTimeIndex = NewMeteoDateTimeIndex;
	var MeteoOverlayFileURL; 
	
	// Rimuovo overlay precedente se esiste
	if (geoXml != null)
	  map.removeOverlay(geoXml)
	
	if (MeteoOverlayType==0)
	{
		document.getElementById("MeteoInfo").style.display="none";
		mp.panel.style.height="10px"; 
		//document.getElementById('x').style.visibility='hidden';
		//document.getElementById("meteopanel").style.height="20px";
		//document.getElementById("Menu").style.display="block";
	}
	else
	{
		document.getElementById("MeteoInfo").style.display="block";
		mp.panel.style.height="65px"; 
	  //document.getElementById("meteopanel").style.height="65px";
	}
	//alert(mp.panel.style.height);
	//alert(document.getElementById("MeteoInfo").id);
	//alert(document.getElementById("MeteoInfo").style.display);
	//map.checkResize();
	
	//echo ("<tr><td><img src=\"images/meteo_legend.png\" align=\"top\"/></td></tr>"); // Spazio divisore tra selezione tipo meteo e
	switch(MeteoOverlayType)
	{
		case 0 :
			document.getElementById("MeteoLegendImage").src="images/meteo_legend_wind.png";
			return;
		break;
		case 1 :  
			// Vento 10m		
			MeteoOverlayFileURL ='http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/wind_google_';  
			document.getElementById("MeteoLegendImage").src="images/meteo_legend_wind.png";
		break;
		case 2 :  
			// Altezza e direzione onda
			MeteoOverlayFileURL ='http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/swh_google_';
			document.getElementById("MeteoLegendImage").src="images/meteo_legend_wave.png";

		break;		 
		case 3 :  
			// Periodo e direzione onda
			MeteoOverlayFileURL ='http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/mwp_google_';
			document.getElementById("MeteoLegendImage").src="images/meteo_legend_twave.png";

		break;		 
		case 4 :  
			// Raffiche vento
			MeteoOverlayFileURL ='http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/windgust_google_';
			document.getElementById("MeteoLegendImage").src="images/meteo_legend_wind.png";
		break; 
	}
	
	MeteoOverlayFileURL = MeteoOverlayFileURL + (MeteoDateTimeIndex+1) + '.kml';
	//alert(MeteoOverlayFileURL);
	//alert(document.getElementById("MeteoLegendImage").src);
	//MeteoOverlayFileURL = 'http://www.lamma.rete.toscana.it/previ/ita/googlemaps/file_kml/swh_google_1.kml';
	//alert(MeteoOverlayFileURL);
	geoXml = new GGeoXml(MeteoOverlayFileURL); 
	map.addOverlay(geoXml);
		

}
//------------------------------------------------------------------------------------------------
function PreviousMeteoDateTime()
{
	if (document.getElementById('MeteoDatetime').selectedIndex>=1)
	{
	  document.getElementById('MeteoDatetime').selectedIndex-=1;	
	  ChangeMeteoOverlay(MeteoOverlayType,document.getElementById('MeteoDatetime').selectedIndex);
	}
}
//------------------------------------------------------------------------------------------------
function NextMeteoDateTime()
{
	if (document.getElementById('MeteoDatetime').selectedIndex < (document.getElementById('MeteoDatetime').length-1)) 	
	{	
	  document.getElementById('MeteoDatetime').selectedIndex+=1;	
	  ChangeMeteoOverlay(MeteoOverlayType,document.getElementById('MeteoDatetime').selectedIndex);
	}
	  
}
//------------------------------------------------------------------------------------------------
// Codice per istanziare il pannello meteo come controllo gmap
// Il codice html del controllo viene effettivamente inserito tramite il file map_create_meteobar.php
function MeteoPanel() {}
MeteoPanel.prototype = new GControl;
MeteoPanel.prototype.initialize = function(map) 
{
  var me = this;
  me.panel = document.createElement("div");
  me.panel.id="meteopanel"; // AGGIUNTA PER PROVA!!
  me.panel.style.width = "198px";
  me.panel.style.height = "10px" ; // Parto con dimensione ridotta "65px";
  me.panel.style.border = "1px solid gray";
  me.panel.style.background = "white";
  //me.panel.innerHTML = "Meteo Panel";
  me.panel.innerHTML = AjaxCall("map_create_meteobar.php");
  map.getContainer().appendChild(me.panel);
  return me.panel;
};
MeteoPanel.prototype.getDefaultPosition = function() 
{
  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 26));
};
MeteoPanel.prototype.getPanel = function() 
{
  return me.panel;
}
//------------------------------------------------------------------------------------------------
// Codice per istanziare il pannello splashscreen o info come controllo gmap
// Il codice html del controllo viene effettivamente inserito tramite il file map_create_meteobar.php
function InfoPanel() {}
InfoPanel.prototype = new GControl;
InfoPanel.prototype.initialize = function(map) 
{
  var me = this;
  me.panel = document.createElement("div");
  me.panel.id="InfoPanel"; // AGGIUNTA PER PROVA!!
  me.panel.style.width = "198px";
  me.panel.style.height = "10px" ; // Parto con dimensione ridotta "65px";
  me.panel.style.border = "1px solid gray";
  me.panel.style.background = "white";
  //me.panel.innerHTML = "Meteo Panel";
  me.panel.innerHTML = AjaxCall("map_create_meteobar.php");
  map.getContainer().appendChild(me.panel);
  return me.panel;
};
MeteoPanel.prototype.getDefaultPosition = function() 
{
  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 26));
};
MeteoPanel.prototype.getPanel = function() 
{
  return me.panel;
}
//------------------------------------------------------------------------------------------------

