//******* Funzioni per la gestione dei percorsi sulla mappa **********************

var map;
var percorsi = [];


// CLASSE POSIZIONE
function posizione(lat,lng,citta,indirizzo) {
  this.latitudine    = lat;
  this.longitudine   = lng;
  this.citta         = citta;
  this.indirizzo     = indirizzo;
  this.marker        = '';
}

// CLASSE PERCORSO
function percorso(percorso_id,latpartenza,lngpartenza,cittapartenza,indirizzopartenza,latarrivo,lngarrivo,cittaarrivo,indirizzoarrivo,ruoloutente,frequenza,orario,linkdettaglio,primario,icona_sesso,nickname) {
  this.partenza = new posizione(latpartenza,lngpartenza,cittapartenza,indirizzopartenza);
  this.arrivo   = new posizione(latarrivo,lngarrivo,cittaarrivo,indirizzoarrivo);

  this.percorso_id   = percorso_id;
  this.orario        = orario;
  this.frequenza     = frequenza;
  this.linkdettaglio = linkdettaglio;
  
  this.ruoloutente      = ruoloutente ;
  this.utente_icosesso  = icona_sesso;
  this.utente_nickname  = nickname;
  this.primario         = primario;
  this.polyline         = '';
  this.gdir             = '';
}


function GetBoundsPercorsi(array_percorsi) {

  for (var i = 0; i < array_percorsi.length ; i++) {
    if (i==0){
      if (array_percorsi[i].partenza.latitudine==null && array_percorsi[i].partenza.longitudine==null) {
        min_lat = array_percorsi[i].arrivo.latitudine;
        min_lng = array_percorsi[i].arrivo.longitudine;
        max_lat = array_percorsi[i].arrivo.latitudine;
        max_lng = array_percorsi[i].arrivo.longitudine;     
      }
      else {
        min_lat = array_percorsi[i].partenza.latitudine;
        min_lng = array_percorsi[i].partenza.longitudine;
        max_lat = array_percorsi[i].partenza.latitudine;
        max_lng = array_percorsi[i].partenza.longitudine;           
      }
    }

    SetMinLatLng(array_percorsi[i]);
    SetMaxLatLng(array_percorsi[i]);
  }

  return new GLatLngBounds(new GLatLng(min_lat-0.008, min_lng-0.008),new GLatLng(max_lat+0.008, max_lng+0.008));

}


function GetIconaMarkerMappa(indice, ruoloutente) {

  var ruolo, icona;
  var lettera = ["a","b","c","d","e","f","g","h","i","l","m","n","o","p","q","r","s","t","u","v","z"];

  switch (ruoloutente) {
    case 1:
      ruolo = "b";
    break;
    case 2:
      ruolo = "v";
    break;
    case 3:
      ruolo = "bv";
    break;   
  }  
  
  //icona = lettera[indice] + "_" + ruolo + ".png";
  
  icona = "a_" + ruolo + "_empty.png";
  
  return icona;
  
}


function SetMinLatLng(percorso) {

  if (percorso.partenza.latitudine!=null && min_lat > percorso.partenza.latitudine )
    min_lat = percorso.partenza.latitudine;
  if (percorso.arrivo.latitudine!=null && min_lat > percorso.arrivo.latitudine)
    min_lat = percorso.arrivo.latitudine;

  if (percorso.partenza.longitudine!=null && min_lng > percorso.partenza.longitudine)
    min_lng = percorso.partenza.longitudine;
  if (percorso.arrivo.longitudine!=null && min_lng > percorso.arrivo.longitudine)
    min_lng = percorso.arrivo.longitudine;

}


function SetMaxLatLng(percorso) {

    if (percorso.partenza.latitudine!=null && max_lat < percorso.partenza.latitudine)
      max_lat = percorso.partenza.latitudine;
    if (percorso.arrivo.latitudine!=null && max_lat < percorso.arrivo.latitudine)
      max_lat = percorso.arrivo.latitudine;

    if (percorso.partenza.longitudine!=null && max_lng < percorso.partenza.longitudine)
      max_lng = percorso.partenza.longitudine;
    if (percorso.arrivo.longitudine!=null && max_lng < percorso.arrivo.longitudine)
      max_lng = percorso.arrivo.longitudine;

}

function CentraMappa(indice) {

  var dacentrare = [];
  dacentrare.push (percorsi[indice]);

  for (var i = 0; i < percorsi.length ; i++) {
    if (percorsi[i].primario)
        dacentrare.push (percorsi[i]);
  }

  var bounds = GetBoundsPercorsi(dacentrare);
  var zoomlevel = map.getBoundsZoomLevel(bounds);
  map.setCenter(bounds.getCenter(), zoomlevel );

}


function MostraMarker(indice,lettera) {

  var icon = new GIcon();
  var WindowHtml;
  
  if (!percorsi[indice].primario) {
    icon.iconSize = new GSize(10, 10);
    icon.iconAnchor = new GPoint(5, 5);
    icon.infoWindowAnchor = new GPoint(8, 5);
    if (lettera==null) lettera=indice;
    icon.image="/img/marker/" + GetIconaMarkerMappa(lettera, percorsi[indice].ruoloutente);
    
    // infowindow
    WindowHtml = "<b>" + percorsi[indice].partenza.citta + "</b> "
                + percorsi[indice].partenza.indirizzo + "<br>"
                + "<b>" + percorsi[indice].arrivo.citta  + "</b> " 
                + percorsi[indice].arrivo.indirizzo  
                + "<br>"
                
                + "<div>"
                + "  <span style='display:block;float:left;margin-top:2px;'>"
                if (percorsi[indice].frequenza!="")
                  WindowHtml += percorsi[indice].frequenza + " <br/>"
                if (percorsi[indice].orario!="")
                  WindowHtml += percorsi[indice].orario
                + "</span>"
  
                if (percorsi[indice].ruoloutente>0)
                  WindowHtml += "  <span style='display:block;float:right;margin:0px;'><img class='png' height='21' "
  
                  if (percorsi[indice].ruoloutente==3) {
                    WindowHtml += " width='50'";
                  }
                  else {
                    WindowHtml +=  " width='21'";
                  }
  
                  WindowHtml += " src='/img/ruoloutente_" + percorsi[indice].ruoloutente + ".png'></span>"
                + "  <div class='clear'></div>"
                + "</div>"
                + "<div style='margin:2px 0'><img src='/img/" + percorsi[indice].utente_icosesso + "' width='17' height='22' style='padding:2px;margin-right:5px'><strong>" + percorsi[indice].utente_nickname + "</strong></div>";
                
                if (percorsi[indice].linkdettaglio)
                  WindowHtml += "<a href='#' onclick='Percorso_Dettagli(" + indice + "," + percorsi[indice].percorso_id + ");return(false);'>Dettagli</a>";    
  }
  else
  {
    //icon.iconSize = new GSize(36,24);
    icon.iconAnchor = new GPoint(0,25);
    icon.infoWindowAnchor = new GPoint(15,0);
    icon.image="/img/bandierina.png";
    
    WindowHtml = "<b>" + percorsi[indice].partenza.citta + " - " + percorsi[indice].arrivo.citta  + "</b>"
  }

                    
  if (percorsi[indice].partenza.latitudine!=null && percorsi[indice].partenza.longitudine!=null)
  {
    var markerpartenza = new GMarker(new GLatLng(percorsi[indice].partenza.latitudine,percorsi[indice].partenza.longitudine), icon);
    map.addOverlay(markerpartenza);
    percorsi[indice].partenza.marker = markerpartenza;

    GEvent.addListener(markerpartenza, "click", function() {
      Percorso_MostraSuMappa(indice,lettera);
      markerpartenza.openInfoWindowHtml(WindowHtml,{maxWidth:250});
    });
  }

  if (percorsi[indice].arrivo.latitudine!=null && percorsi[indice].arrivo.longitudine!=null)
  {
    var markerarrivo = new GMarker(new GLatLng(percorsi[indice].arrivo.latitudine,percorsi[indice].arrivo.longitudine), icon);
    map.addOverlay(markerarrivo);
    percorsi[indice].arrivo.marker = markerarrivo;
                  
    GEvent.addListener(markerarrivo, "click", function() {
      Percorso_MostraSuMappa(indice,lettera);
      markerarrivo.openInfoWindowHtml(WindowHtml,{maxWidth:250});
    });
  }

}


function MostraPolyline(indice) {

    var arrlocation = new Array(2);
    arrlocation[0] = new GLatLng( percorsi[indice].partenza.latitudine, percorsi[indice].partenza.longitudine );
    arrlocation[1] = new GLatLng( percorsi[indice].arrivo.latitudine, percorsi[indice].arrivo.longitudine );

    var gdir;
    gdir = new GDirections();
    GEvent.addListener(gdir, "load", function () { MostraPolylineLoad(indice) } );
    percorsi[indice].gdir = gdir;
    gdir.loadFromWaypoints(arrlocation, {getPolyline:true,getSteps:true});

}


function MostraPolylineLoad(indice) {

	var gdir = percorsi[indice].gdir;
  var polyline = gdir.getPolyline();

  var polylinecolor  = '';
  var polylineweight = 7;

  if (!percorsi[indice].primario)
    polylinecolor  = "#005AFF";
  else {
    polylinecolor = "#660099";
    polylineweight = 8;
  }

  var style = new Object();
  style.color = polylinecolor;
  style.opacity = 0.65;
  style.weight = polylineweight;

	polyline.setStrokeStyle(style);
	map.addOverlay(polyline);
  percorsi[indice].polyline = polyline;

}


function MostraPercorso(indice,lettera) {
  MostraMarker(indice,lettera);
  MostraPolyline(indice);
}


function RimuoviPercorso(indice) {

  if (percorsi[indice].polyline!=null)
    map.removeOverlay(percorsi[indice].polyline);
  RimuoviMarker(indice);
}


function RimuoviMarker(indice) {

  if (percorsi[indice].partenza.marker!=null){
    map.removeOverlay(percorsi[indice].partenza.marker);
  }

  if (percorsi[indice].arrivo.marker!=null)
    map.removeOverlay(percorsi[indice].arrivo.marker);

}

function Percorso_MostraSuMappa(indice, lettera) {

  for (var i = 0; i < percorsi.length ; i++) {
    if (!percorsi[i].primario)
      map.removeOverlay(percorsi[i].polyline);
  }

  RimuoviMarker(indice);  
  MostraPercorso(indice, lettera);
  //lettera null vuol dire che la chiamata arriva dalla lista
  if(lettera==null)
    CentraMappa(indice);
}


// === A method which returns a GLatLng of a point a given distance along the path ===
// === Returns null if the path is shorter than the specified distance ===
function GetPointAtDistance(poly,metres) {
  // some awkward special cases
  if (metres == 0) return poly.getVertex(0);
  if (metres < 0) return null;
  var dist=0;
  var olddist=0;
  for (var i=1; (i < poly.getVertexCount() && dist < metres); i++) {
    olddist = dist;
    dist += poly.getVertex(i).distanceFrom(poly.getVertex(i-1));
  }
  if (dist < metres) {return null;}
  var p1= poly.getVertex(i-2);
  var p2= poly.getVertex(i-1);
  var m = (metres-olddist)/(dist-olddist);
  return new GLatLng( p1.lat() + (p2.lat()-p1.lat())*m, p1.lng() + (p2.lng()-p1.lng())*m);
}


// === A method which returns the length of a path in metres ===
function Distance(poly) {
  var dist = 0;
  for (var i=1; i < poly.getVertexCount(); i++) {
    dist += poly.getVertex(i).distanceFrom(poly.getVertex(i-1));
  }
  return dist;
}