// We define the function first 
function ProfiliControl() { 
} 
 
// To "subclass" the GControl, we set the prototype object to 
// an instance of the GControl object 
ProfiliControl.prototype = new GControl(); 
 
// Creates a one DIV for each of the buttons and places them in a container 
// DIV which is returned as our control element. We add the control to 
// to the map container and return the element for the map class to 
// position properly.
 
ProfiliControl.prototype.initialize = function(mapContainer) { 
  var container = document.createElement("div"); 
  container.id = "containerToolProfili";
  
  
  var divProfili = document.createElement("div"); 
  this.setButtonStyle_(divProfili); 
  container.appendChild(divProfili);
   
  divProfili.appendChild(document.createTextNode(LANGUAGE.GeneraProfili));
   
  GEvent.addDomListener(divProfili, "click", function() {
    
    //controlli prima di creare un profilo
    //***************************************************************
    if (cameretteProfilo.length != 2)
    {
       alert(LANGUAGE.SelezionareDueCamerette);
       return;
    }
    
    //controllo che il profilo non sia tra quelli già generati
    var hasGenerateProfilo = false;
    for (var i = 0; i < cameretteHistoryProfilo.length; i++)
    {
        if (((cameretteHistoryProfilo[i][0] == cameretteProfilo[0]) && (cameretteHistoryProfilo[i][1] == cameretteProfilo[1])) 
        || ((cameretteHistoryProfilo[i][0] == cameretteProfilo[1]) && (cameretteHistoryProfilo[i][1] == cameretteProfilo[0])))
        {
          hasGenerateProfilo = true;
          break;
        }
    }
    
    if (hasGenerateProfilo) return;
    //***************************************************************
    
    $('#divElaborazioneProfili').css({ display:'block'});
    
    
    cameretteHistoryProfilo.push([cameretteProfilo[0],cameretteProfilo[1]]);    
    //alert("http://" + nomeWebSito + "/" + pathUrlSchedaCameretta + "/StampaProfiliService.svc/ArcSewer/Profili?oidCameretta1=" + cameretteProfilo[0] + "&oidCameretta2=" + cameretteProfilo[1] + "&auto=true&serviceName=" + encodeURIComponent(nomeServizioSOE));
    $.ajax({
        type        : "GET", //GET or POST or PUT or DELETE verb
        url         : "http://" + nomeWebSito + "/" + pathUrlSchedaCameretta + "/StampaProfiliService.svc/ArcSewer/Profili?oidCameretta1=" + cameretteProfilo[0] + "&oidCameretta2=" + cameretteProfilo[1] + "&auto=true&serviceName=" + encodeURIComponent(nomeServizioSOE), // Location of the server
        contentType : "application/json; charset=utf-8", // content type sent to server
        dataType    : "json", //Expected data format from server
        processdata : false, //True or False
        success     : ServiceProfili,
        error: ServiceFailedProfili  // When Service call fails
    });
    
        
  });
  
  var divProfiliClear = document.createElement("div"); 
  this.setButtonStyle_(divProfiliClear); 
  container.appendChild(divProfiliClear);
   
  divProfiliClear.appendChild(document.createTextNode(LANGUAGE.RimuoviProfili)); 
  GEvent.addDomListener(divProfiliClear, "click", function() {
        
       //elimina i profili
       for (var i = 0; i < gListaProfili.length; i++)
       { 
          mapExtension.removeFromMap(gListaProfili[i]);
       }
       gListaProfili=[];
       
       //elimina le camerette per i profili
       for (var i = 0; i < cameretteProfiloMarker.length; i++)
       { 
          map.removeOverlay(cameretteProfiloMarker[i]);
       }
             
       cameretteProfiloMarker=[];       
       cameretteProfilo=[];
       cameretteHistoryProfilo=[];
       
       
       $('#divListaProfili').css({ display:'none'});       

  });
  
  
   
 
 
  var divListaProfili = document.createElement("div");
  divListaProfili.id = "divListaProfili";
  divListaProfili.style.display ="none";  
  container.appendChild(divListaProfili);
  
  var divElaborazioneProfili = document.createElement("div");
  divElaborazioneProfili.id = "divElaborazioneProfili";
  divElaborazioneProfili.style.display ="none";
  divElaborazioneProfili.appendChild(document.createTextNode(LANGUAGE.ElaborazioneInCorso));
  container.appendChild(divElaborazioneProfili); 
   
  mapContainer.getContainer().appendChild(container); 
  return container; 
  
}


var nomeProfili; // lista profili
var profiliO = null;
var linkMultiProfiliGenerati = null;

var urlProfilo;
var nomeProfilo;

//var listaCondotti; //per multi
var gListaProfili = []; //lista profili generati sulla mappa


function ServiceProfili(result,status)
{
     
     
     if (result.HasError)
     {
        alert(LANGUAGE.ErroreProfilo);
        $('#divElaborazioneProfili').css({ display:'none'});
     }
     else
     {
        
        //esiste Name
        if (result.Name)
        {
           
           urlProfilo = result.URL;
           nomeProfilo = result.Name;
          
           queryProfilo = new esri.arcgis.gmaps.Query();
           queryProfilo.returnGeometry = true;
           queryProfilo.where = OIDMaster + " in (" + result.OIDs + ")";
           
           qtaskProfilo.execute(queryProfilo, false, createProfile);
           
        }
        else
        {
           // contenitore lista profili
           $('#divListaProfili').css({display : 'block'}).empty();
           
           var quotaBaseProfili = result.QuoteBases;
           var altezzaProfili = result.Altezzas;
           var guidProfili = result.Guid;
           
           // lista profili
           nomeProfili = result.Names;
           
           // lista condotti
           var listaOids = result.OIDs;
           
           
           
           //var b = iterator(nomeProfili);
           
           var profiliG = [];
           var qtaskP = [];
           var queryP = [];
           var profiliF = [];
           
           //creo un array di task, query e funzioni callback
           for (var i = 0; i < nomeProfili.length; i++)
           {
               
               qtaskP.push(new esri.arcgis.gmaps.QueryTask(urlRestCondotti));
               queryP.push(new esri.arcgis.gmaps.Query());               
               profiliF.push(
                  function(fset){ 
                     profiliG.push(fset);
                     $('#divElaborazioneProfili').css({ display:'none'});
                  }
               );
                  
           }
           
           profiliO = [];
                   
           //inizializza variabili dei profili già creati
           linkMultiProfiliGenerati = [];
           
           
           //aggiunge polyline sulla mappa
           var addPolyline = function(item){ 
			       return function() {
			          profiliO[item] = mapExtension.addToMap(profiliG[item],{
			          strokeColor:"#FF0000",
			          strokeWeight:3,
			          strokeOpacity:0.75
			          });
			         return; 
			       }; 
                             };

           
           var linkMultiProfilo;
           for (var i = 0; i < (nomeProfili.length); i++)
           {
               
               //linkMultiProfilo = document.createElement("a");
               //linkMultiProfilo.setAttribute("href","javascript:getMultiProfili('" + guidProfili + "'," + i.toString() + ",'" + quotaBaseProfili[i] + "','" + altezzaProfili[i] + "');");
               
               linkMultiProfilo = $("<a>").attr('href',"javascript:getMultiProfili('" + guidProfili + "'," + i.toString() + ",'" + quotaBaseProfili[i] + "','" + altezzaProfili[i] + "');");
               
               linkMultiProfilo.mouseover(addPolyline(i));
               //rimuove le polyline (multi profili) sulla mappa 
               linkMultiProfilo.mouseout(function() {
                 for (var k = 0; k < nomeProfili.length; k++)
                 { 
                    mapExtension.removeFromMap(profiliO[k]);
                 }
               });
               linkMultiProfilo.html(nomeProfili[i]);
               $('#divListaProfili').append(linkMultiProfilo);
               
               if (i < (nomeProfili.length -1))
                 $('#divListaProfili').append('<br>');
               
               
           }
           
                      
           //creazione degli eventi per ogni task per avviare il successivo 
           var c = iterator(1); //parto da 1 perchè il primo (0) lascia il secondo (1) ecc.
           for (var i = 0; i < (nomeProfili.length -1); i++)
           {
              GEvent.addListener(qtaskP[i], "executecomplete", function() {
                     var j = c();   
               	     qtaskP[j].execute(queryP[j], false, profiliF[j]);
              }); 
           }
           
           //costruzione dei where di ogni query
           for (var i = 0; i < nomeProfili.length; i++)
           {
               queryP[i].returnGeometry = true;
               queryP[i].where = OIDMaster + " in (" + listaOids[i] + ")";   
           }
           
           // richiamo il primo task (profilo) quando ha finito di eseguire la query richiama il secondo e così via
           qtaskP[0].execute(queryP[0], false, profiliF[0]);
           
        }
        
     }
}

function getMultiProfili(guid,idProfilo,quotaBase,altezzaProfilo)
{
    
    if(linkMultiProfiliGenerati.has(idProfilo))return;
    linkMultiProfiliGenerati.push(idProfilo);
    
    
    $('#divElaborazioneProfili').css({ display:'block'});
    
    
    
    $.ajax({
        type        : "GET", //GET or POST or PUT or DELETE verb
        url         : "http://" + nomeWebSito + "/" + pathUrlSchedaCameretta + "/StampaProfiliService.svc/ArcSewer/Profilo?guid=" + guid + "&idProfilo=" + idProfilo.toString() + "&quotaBase=" + quotaBase + "&altezzaProfilo=" + altezzaProfilo + "&serviceName=" + encodeURIComponent(nomeServizioSOE), // Location of the server
        contentType : "application/json; charset=utf-8", // content type sent to server
        dataType    : "json", //Expected data format from server
        processdata : false, //True or False
        success     : ServiceProfiliMulti,
        error: ServiceFailedProfili  // When Service call fails
    });
    
}


function ServiceProfiliMulti(result,status)
{
     if (result.HasError)
     {
           alert(LANGUAGE.ErroreProfilo);
           $('#divElaborazioneProfili').css({ display:'none'});
     }
     else
     {           
           for (var i = 0; i < nomeProfili.length; i++)
           { 
              mapExtension.removeFromMap(profiliO[i]);
           }
           
           urlProfilo = result.URL;
           nomeProfilo = result.Name;
           //listaCondotti = listaOids;
           
           queryProfilo = new esri.arcgis.gmaps.Query();
           
           queryProfilo.returnGeometry = true;
           queryProfilo.where = OIDMaster + " in (" + result.OIDs + ")";
           
           qtaskProfilo.execute(queryProfilo, false, createProfile);
     }
}

function ServiceFailedProfili(XMLHttpRequest, textStatus, errorThrown)
{
     alert(LANGUAGE.ErroreProfilo);
     $('#divElaborazioneProfili').css({ display:'none'});         
}

//callback del queryTask per crea profili
function createProfile(fset) {
         
        
        var overlayOptions = {
          strokeColor: "#FF0000", //random_color('hex'), //"#FF0000",
          strokeWeight:3,
          strokeOpacity:0.75
        };
         
        var infoWindowOptions = {
           content:'<div style="text-align: center;"><br><a href='+ (isLocale?urlProfilo:urlProfilo.replace(nomeWebLocale,nomeWebInternet)) + ' target=_blank title="' + nomeProfilo + '">' + LANGUAGE.visualizzaProfilo + '</a></div>'
	};
        
        gListaProfili.push(mapExtension.addToMap(fset,overlayOptions,infoWindowOptions));
        $('#divElaborazioneProfili').css({ display:'none'});        
}






 
 
// By default, the control will appear in the top left corner of the 
// map with 7 pixels of padding. 
ProfiliControl.prototype.getDefaultPosition = function() { 
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7)); 
} 
 
// Sets the proper CSS for the given button element. 
ProfiliControl.prototype.setButtonStyle_ = function(button) { 
  button.style.textDecoration = "underline"; 
  button.style.color = "#0000cc"; 
  button.style.backgroundColor = "white"; 
  button.style.font = "small Arial"; 
  button.style.border = "1px solid black"; 
  button.style.padding = "2px"; 
  button.style.marginBottom = "3px"; 
  button.style.textAlign = "center"; 
  button.style.width = "8em"; 
  button.style.cursor = "pointer"; 
}
