﻿var map = null;
var pinID = 1;

// Devo mettere anche le coordinate come variabile globale,
// perché poi la uso nella funzione di zoom continuo automatico
var PinLL = null;

function GetMap()
{
    //
    // ATTENZIONE CHE QUESTA E' L'APERTURA DELLA MAPPA SUL SITO
    // QUELLA PER IL CELLULARE E' DOPO!!!
    //
    map = new VEMap('myMap');
    PinLL = new VELatLong(44.895068, 11.606855);
    map.LoadMap(PinLL, 2 , 'h', false);
    map.SetMapStyle(VEMapStyle.Hybrid);
    map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);

    // Simulo poi un avvicinamento "a caduta" sulle nostre zone
    // Devo impostare dei timeout che poi scattano da soli perché se vario lo zoom all'interno di questa funzione
    // fa il refresh della mappa solo alla fine, con l'ultimo zoom impostato
    // Inoltre devo impostare almeno un secondo tra uno zoom e l'altro oppure non ha abbastanza tempo perì aggiornare la mappa
    setTimeout("ZoomMap(2)", 1500);
    setTimeout("ZoomMap(3)", 3000);
    setTimeout("ZoomMap(4)", 4500);
    setTimeout("ZoomMap(5)", 6000);
    setTimeout("ZoomMap(6)", 7500);
    setTimeout("ZoomMap(7)", 9000);
    setTimeout("ZoomMap(8)", 10500);
    // setTimeout("ZoomMap(9)", 12000);
    // setTimeout("ZoomMap(10)", 13500);
    // setTimeout("ZoomMap(11)", 15000);
    // setTimeout("ZoomMap(12)", 16500);
    // setTimeout("ZoomMap(13)", 18000);
    // setTimeout("ZoomMap(14)", 19500);
    // setTimeout("ZoomMap(15)", 21000);

    // Dimensiono poi la mappa in base alla cella della tabella che la contiene,
    // che a sua volta si autodimensiona al 100% in base alla pagina disponibile
    // Lo faccio alla fine, così se ci sono dei problemi non blocca lo script
    map.Resize($get('tdMap').clientWidth, $get('tdMap').clientHeight);
}

function GetMapCell()
{
    // Per l'accesso da cellulare carico una mappa semplificata
    map = new VEMap('myMap');
    map.HideDashboard();
    map.LoadMap(new VELatLong(44.895068, 11.606855), 2, 'h' , false);
    map.SetMapStyle(VEMapStyle.Hybrid);
    map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);

    // Volendo si può controllare la mappa con il mouse,
    // che per potrebbe essere comodo per il cellulare
    // map.AttachEvent("onclick", MouseHandler);
    // map.AttachEvent("ondoubleclick", MouseHandler);
    // map.AttachEvent("onmousedown", MouseHandler);
    // map.AttachEvent("onmouseup", MouseHandler);
    // map.AttachEvent("onmousewheel", MouseHandler);
}

function FindBoth()
{
    // Mistero ma qui prende direttamente il txtWhat
    // anzichè ctl00_ContentPlaceHolder1_txtWhat
    // Forse è per il tipo di controllo... comunque va!
    var cCosa = $get('txtWhat').value;
    var cDove = $get('txtWhere').value;

    /*
    if (cCosa == 'Cosa o chi?')
        cCosa = '';
    if (cDove == 'Dove?')
        cDove = '';
    */

    if (cCosa == '' && cDove == '')
        alert('Specificare nelle caselle "Cosa o chi?" cercare e/o "Dove?"');
    else {
        // Nota: Lasciato il codice ma non serve più impostare lo zoom,
        // perché nella ricerca adesso nascondiamo i dati dei cellulari e non fa più il refresh
        // Inoltre attenzione se la rimettiamo: ADESSO CI SONO DUE RadioButtonZoom!
        //
        // Se i criteri di ricerca sono validi metto anche lo zoom manuale,
        // altrimenti al primo Timer mi riporta sul pin...
        // (il children[0] è l'auto, il children[1] è la successiva label e così via...)
        // document.getElementById('RadioButtonZoom').children[2].checked = true;
        //
        // Prima "pulisco" la mappa poi lancio la ricerca
        map.Clear();
        map.Find(cCosa, cDove);
    }
}

function MouseHandler(e)
{
     var msg;
     if (e.eventName == "onclick")
     {
        if (e.leftMouseButton)
           msg = "onclick (left mouse button)  event";
        else if (e.rightMouseButton)
           msg = "onclick (right mouse button)  event";
        else if (e.middleMouseButton)
           msg = "onclick (middle mouse button)  event";
     }
     else
     {
        msg = e.eventName + " event.";
     }
     alert(msg);
}

function SetBirdseye()
{
    map.SetBirdseyeScene();
}

function getInfo()
{
    if (map.IsBirdseyeAvailable())
    {
        var be = map.GetBirdseyeScene();
        var info = "ID: " + be.GetID() + "\n";
        info += "thumbnail: " + be.GetThumbnailFilename()+ "\n";
        info += "orientation: " + be.GetOrientation()+ "\n";
        info += "height: " + be.GetHeight() + "\n";
        info += "width: " + be.GetWidth() + "\n";
        alert(info);
    }
    else
    {
        alert("Le immagini a volo d'uccello non sono disponibili per questa zona e con lo zoom impostato...");
    }
}

function PushPin(lat, lon)
{
    // Provo se le coordinate passate identificano una posizione, altrimenti lo segnalo
    // Devo intercettare i possibili "tipi" di lat e lon che gli passo prima della VELatLong,
    // perché se no segnala l'errore per conto suo prima di riuscire a intercettarlo
    if (isNaN(lat) || isNaN(lon) || (typeof(lat) == 'String') || (typeof(lon) == 'String'))
    {
        // Provato con messaggio, ma rallenta troppo, perché l'utente deve poi dare l'OK
        // alert('Il cellulare è in una zona dove non rileva la posizione...') ;
    }
    else
    {
        PinLL = new VELatLong(lat, lon);

        // Per cancellare i pins uso il Clear perché ce ne sono di diversi tipi (es. quelli della ricerca)
        // e il DeleteAllPush mi cancella solo quelli che metto io a mano
        map.Clear();
        var pin = new VEPushpin(pinID, PinLL, null, '', '');
        map.AddPushpin(pin);
        map.PanToLatLong(PinLL);

        // Se non c'è un particolare zoom già scelto, simulo l'avvicinamento "a caduta"
        // Attenzione che il GetZoomLevel restituisce una string, non un numero...
        if (parseInt(map.GetZoomLevel()) <= 2)
        {
            // Devo impostare dei timeout che poi scattano da soli,
            // perché se vario lo zoom all'interno di questa funzione,
            // fa il refresh della mappa solo alla fine, con l'ultimo zoom impostato
            // Inoltre devo impostare almeno un secondo tra uno zoom e l'altro,
            // oppure non ha abbastanza tempo per aggiornare la mappa
            setTimeout("ZoomMap(3)", 1000);
            setTimeout("ZoomMap(4)", 2000);
            setTimeout("ZoomMap(5)", 3000);
            setTimeout("ZoomMap(6)", 4000);
            setTimeout("ZoomMap(7)", 5000);
            setTimeout("ZoomMap(8)", 6000);
            setTimeout("ZoomMap(9)", 7000);
            setTimeout("ZoomMap(10)", 8000);
            setTimeout("ZoomMap(11)", 9000);
            setTimeout("ZoomMap(12)", 10000);
            setTimeout("ZoomMap(13)", 11000);
            setTimeout("ZoomMap(14)", 12000);
            setTimeout("ZoomMap(15)", 13000);
            setTimeout("ZoomMap(16)", 14000);
            setTimeout("ZoomMap(17)", 15000);
            // Meglio non scendere sotto al 17, perché in molte zone poi non c'è l'immagine dal satellite
        }
        pinID++;
    }
}

function ZoomMap(nZoom)
{
    map.SetCenterAndZoom(PinLL, nZoom);
}

function pin(AutoZoom, ArrayPins)
{
    // Passo un array con il nome e le coordinate dei pin da mettere sulla mappa
    // Comincio cancellando la precedente rilevazione
    map.Clear();

    // Scorro l'array dei Pins e li punto sulla mappa, memorizzando le coordinate per dopo
    var locs = new Array;
    for (i = 0; i < ArrayPins.length; i++)
    {
        if (isNaN(ArrayPins[i][1]) || isNaN(ArrayPins[i][2]) || (typeof(ArrayPins[i][1]) == 'String') || (typeof(ArrayPins[i][2]) == 'String'))
        {
            // Filtro le coordinate in formato non valido (in pratica che non sono numeri),
            // anche se ci pensa già la pagina web
        }
        else
        {
            // Se invece sono valide le memorizzo e punto il pin
            var loc = new VELatLong(ArrayPins[i][1], ArrayPins[i][2]);
            locs.push(loc);

            var pin = new VEPushpin(i, locs[i], null, ArrayPins[i][0], '');
           map.AddPushpin(pin);
        }
    }

    if (AutoZoom)
    {
        // Se poi c'è l'AutoZoom ho due casi:
        if (locs.length == 1)
        {
            // Se c'è un solo pin lo "seguo" lungo la strada che fa centrandolo nella mappa
            map.PanToLatLong(locs[0]);
        }
        else
        {
            // Se invece ho più pin li inquadro tutti nella mappa con l'apposita funzione
            map.SetMapView(locs);
            // In questo caso cambia lui lo zoom
            // però se è troppo dettagliato non rende bene e spesso non c'è l'immagine dal satellite
            if (map.GetZoomLevel() > 17)
                map.SetZoomLevel(17);
        }
    }
    // Se non c'è l'AutoZoom lascio semplicemente l'impostazione attuale e ci pensa l'utente
}

function ListPin() {
    // Funzione creata apposta per mettere sulla mappa il pin scelto dalla select list
    // estraggo i dati dall'elemento selezionato della lista
    // ATTENZIONE: Usando una pagina master negli ID devo usare tutto il riferimento al "contenitore"
    //             Provato anche ad impostare la proprietà 'Name' ma non cambia...
    var nSelID = document.getElementById('ctl00_ContentPlaceHolder1_SelectLocaDay').selectedIndex;
    var strLL = document.getElementById('ctl00_ContentPlaceHolder1_SelectLocaDay')[nSelID].value.split(',');
    // Il parseFloat converte già le stringhe in float e gestisce NaN e vuote
    var nLat = parseFloat(strLL[1]);
    var nLon = parseFloat(strLL[2]);

    if (isNaN(nLat) || isNaN(nLon))
    {
        // Se le coordinate non sono valide ho già finito...
        // Meglio infatti lasciare il Pin nella posizione precedente
    }
    else
    {
        // Se invece sono valide punto il nuovo Pin e in questo caso elimino i precedenti
        map.Clear();
        var ListLL = new VELatLong(nLat, nLon);
        var ListPin = new VEPushpin(1, ListLL, null, '', '');
        map.AddPushpin(ListPin);
        // Se poi c'è l'AutoZoom impostato scorro automaticamente la mappa
        // Ci sono due RadioButtonZoom a seconda della visualizzazione,
        // ma questa funzione è chiamata solo dalla Lista delle coordinate archiviate,
        // perciò non devo neanche controllare e per forza si tratta del RadioButtonZoom2
        if (document.getElementById('ctl00_ContentPlaceHolder1_RadioButtonZoom2_0').checked)
            map.PanToLatLong(ListLL);
    }

    // Visualizzo comunque il dettaglio dei dati selezionati
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioOraLabel').innerText = strLL[0];
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioLatLabel').innerText = strLL[1];
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioLongLabel').innerText = strLL[2];
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioHLabel').innerText = strLL[3];
    // La velocità la 'accorcio' per evitare troppi decimali
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioSpeedLabel').innerText = parseFloat(strLL[4]).toFixed(2).toString();
    document.getElementById('ctl00_ContentPlaceHolder1_cDettaglioNoteLabel').innerText = strLL[5];
}

function Delay()
{
    var oldDate = new Date();
    var newDate = null;
    do {
        newDate = new Date();
    } while(newDate - oldDate < 500);
}

// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();