gCenterOfItaly = new google.maps.LatLng(41.8719400, 12.5673800);
gMarkers = [];

// Funzione JS che restituisce il punto LatLng in base al parametro passato
function myGetPoint(aElement) {
    //alert(aElement);
    return new google.maps.LatLng(aElement.lat, aElement.lng);
}

// Funzione per comporre l'html del fumetto della provincia
function myHtmlInfoWindowZone(aZone) {
    var textArray = [];
    textArray.push('<div class="myInfoWindow"><h3>Provincia di ');
    textArray.push(aZone.provincia);
    textArray.push('</h3><p>In questa provincia sono presenti ');
    textArray.push(aZone.count);
    textArray.push(' ');
    textArray.push((bFlagGreen1) ? sPointsFullNameGreen : sPointsFullName);
    textArray.push('.</p><p class="enter"><a href="?z=');
    textArray.push(aZone.id);
    textArray.push('">Entra e visualizza ');
    textArray.push(sPointsName);
    textArray.push('</a></p></div>');
    textArray.push();
    textArray.push();
    return textArray.join('');
}

function myHtmlInfoWindowSegnalazioneNuovo(aPoint) {
    var textArray = [];
    textArray.push('<div class="myInfoWindow"><h3>Posizione del ');
    textArray.push(sPointName);
    textArray.push('</h3>');
    textArray.push('<p>Indirizzo trovato:</p><p style="font-style:italic; padding-left:15px">');
    textArray.push(aPoint.geoAdr);
    textArray.push('</p><p>Trascina questo segnaposto per segnalare una posizione più precisa.</p>');
    textArray.push('</div>');
    return textArray.join('');
}

function myHtmlInfoWindowSegnalazioneModifica(aPoint) {
    var textArray = [];
    textArray.push('<div class="myInfoWindow"><h3>Posizione del ');
    textArray.push(sPointName);
    textArray.push('</h3>');
    textArray.push('<p>Questa è la posizione attuale del '+sPointName+'</p><p>Trascina questo segnaposto per segnalare una posizione più precisa.</p>');
    textArray.push('</div>');
    return textArray.join('');
}

// Funzione JS che aggiunge un overlay marker alla mappa gMap in base al parametro passato e lo restituisce
function myAddMarker(aElement) {
    var title, marker;
    var markerOptions = {}, infoWindowOptions = {};
    
    // Create the marker
    markerOptions.title = (iPageMode == iPageModeNation) ? 'Provincia di '+aElement.provincia : null;
    markerOptions.position = myGetPoint(aElement);
    markerOptions.map = gMap;
    markerOptions.icon = myGetMarkerImage(aElement);
    markerOptions.shadow = myGetMarkerImage(aElement, true);
    marker = new google.maps.Marker(markerOptions);
    
    /* -- Marker events -- */
   
    google.maps.event.addListener(marker, 'click', function() {
        /*
        infowin.open(gMap, marker);
        */
        gInfoWindow.setContent((iPageMode == iPageModeNation) ? myHtmlInfoWindowZone(aElement) : myHtmlInfoWindowPoint(aElement));
        gInfoWindow.open(gMap, marker);
    });
    
    return marker;
}

// Funzione per aggiungere marker draggabile
function myAddDraggableMarker(aElement) {
	
    var point = myGetPoint(aElement);
	
    var marker = new google.maps.Marker({
        position: point, 
        map: gMap, 
        icon: myGetMarkerImage(aElement),
        shadow: myGetMarkerImage(aElement, true),
        draggable:true
    });
    
    gInfoWindow.setContent((iEditType == iEditTypeInsert) ? myHtmlInfoWindowSegnalazioneNuovo(aElement) : myHtmlInfoWindowSegnalazioneModifica(aElement));
    gInfoWindow.open(gMap, marker);
    
    /* -- Marker events -- */
    
    google.maps.event.addListener(marker, "dragend", function() {
        mySetCoordsInFields(marker);
    });
    
    google.maps.event.addListener(marker, "dragstart", function() {
        gInfoWindow.close();
    });
    
    google.maps.event.addListener(marker, 'click', function() {
        gInfoWindow.open(gMap, marker);
    });
    
    gMarkers.push(marker);
    
    return marker;
}

// Funzione JS che aggiunge TUTTI gli overlay marker alla mappa in base al RS passato e centra/zoomma la mappa
function myAddAllMarkers(aArgElements) {
    
    var bounds = myGetBounds(aArgElements);
    initializeMapIfShould({center: bounds.getCenter()});
    
    var iLen = aArgElements.length;
    var element;
    for (iInd = 0; iInd < iLen; iInd++) {
        element = aArgElements[iInd];
        if (iPageMode == iPageModeNation) {
            if (element.count > 0) {
                myAddMarker(element);
            }
        }
        else {
            myAddMarker(element);
        }
    }
    if (iLen > 0) {
        myAutoZoom(aArgElements);
    } else {
        myZoomHome();
        myNothingOn();
    }
}

function myGetBounds(aArgElements) {
    var bounds = new google.maps.LatLngBounds();
    var iLen = aArgElements.length;
    var aIthElement;
    for (iInd=0; iInd < iLen; iInd++) {
        aIthElement = aArgElements[iInd];
        bounds.extend (myGetPoint(aIthElement));
    }
    return bounds;
}

function myAutoZoom(aArgElements) {
    if (aArgElements.length > 1) {
        // Faccio stare tutti i punti nella mappa
        gMap.fitBounds(myGetBounds(aArgElements));
    }
    else {
        // Centro il punto nella mappa e setto lo zoom a 16
        var center = myGetPoint(aArgElements[0]);
        gMap.setCenter(center);
        gMap.setZoom(16);
    }
}

// Funzione JS che inizializza la mappa e la centra in Italia
function initialize(options) {
    
    this.options = {
      zoom: 6,
      center: gCenterOfItaly,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    
    $.extend(this.options, options);
    
    gMap = new google.maps.Map(document.getElementById("map_canvas"), this.options);
    gInfoWindow = new google.maps.InfoWindow({maxWidth:300});
}

function aGetElementByDbId(iArgId, aArgElements) {
    iLen = aArgElements.length;
    for (iInd=0; iInd < iLen; iInd++) {
        //alert('iind='+iInd+' ilen='+iLen+' aArgElements[iInd][0]=' + aArgElements[iInd][0] + ' iArgId='+iArgId);
        if (aArgElements[iInd][0] == iArgId) return aArgElements[iInd];
    }
    return null;
}

function myShowZoomLink(iId, sDirection) {
    var eHide;
    var eShow;
    if (sDirection == 'out') {
        eHide = document.getElementById('in'+iId);
        eShow = document.getElementById('out'+iId);
    } else {
        eHide = document.getElementById('out'+iId);
        eShow = document.getElementById('in'+iId);
    }
    eShow.style.display = 'inline';
    eHide.style.display = 'none';
}

function myNothingOn() {
    var myWindow = gMap.openInfoWindowHtml(gMap.getCenter(), "<h3>Non ci sono "+sPointsName+" in questa provincia.</h3><p>In questa provincia non sono presenti "+sPointsFullName+".<br />Selezionare un'altra provincia dal men&ugrave; a lato.</p>", myInfoWindowOptions);
}

function myZoomHome() {
    gMap.setCenter(gCenterOfItaly);
    gMap.setZoom(6);
}

function myGetMarkerImage(aPoint, isShadow) {
    var url, size, anchor;
    if (iPageMode == iPageModeNation) {
        url = (!!isShadow) ? sUrlToPointMarkerShadow : sUrlToPointMarker;
    }
    else {
        if (aPoint.gr1 == 1) {
            url = (!!isShadow) ? sUrlToGreenPointMarkerShadow : sUrlToGreenPointMarker;
        }
        else {
            url = (!!isShadow) ? sUrlToPointMarkerShadow : sUrlToPointMarker;
        }
    }
    size = (!!isShadow) ? new google.maps.Size(34, 34) : new google.maps.Size(20, 34);
    anchor = new google.maps.Point(10, 33);
    return new google.maps.MarkerImage(url, size, null, anchor);
}

function myAjaxAddMarkers() 
{	  
    iPageMode = arguments[0];
	
    if (iPageMode == iPageModeNation) {
        bFlagGreen1 = arguments[1];
        var postUrl = 'services/maps.php?op=get&m=' + iPageMode + '&g1=' + bFlagGreen1;
    }
    else if (iPageMode == iPageModeZone) {
        sZone = arguments[1];
        bFlagGreen1 = arguments[2];
        var postUrl = 'services/maps.php?op=get&m=' + iPageMode + '&z=' + sZone + '&g1=' + bFlagGreen1;
    }
    else if (iPageMode == iPageModeDetail) {
        iIdPuntoDettaglio = arguments[1];
        var postUrl = 'services/maps.php?op=get&m=' + iPageMode + '&d=' + iIdPuntoDettaglio;
    }
    else if (iPageMode == iPageModeSearch) {
        bFlagGreen1 = arguments[1];
        iRaggio = arguments[2];
        sLocalita = arguments[3];
        dLat = arguments[4];
        dLng = arguments[5];
        var postUrl = 'services/maps.php?op=get&m=' + iPageMode + '&g1=' + bFlagGreen1 + '&raggio=' + iRaggio + '&localita=' + sLocalita + '&lat=' + dLat + '&lng=' + dLng;
    }
	
    // Fa la chiamata JSON
    $.getJSON(postUrl, function(data) {
        if (data.length) {
            myClearMarkers();
            myAddAllMarkers(data);
        }
        else
            alert(sEmptyPointListError);
    });
}

function mySetCoordsInFields(marker) {
    var theLatLng = marker.getPosition();
    $('#lat').val(theLatLng.lat());
    $('#lng').val(theLatLng.lng());
}

function myResetCoordsInFields() {
    $('#lat').val('');
    $('#lng').val('');
}

function initializeMapIfShould(options) {
    if (typeof(gMap)==='undefined') {
        initialize(options);
    }
}

function myCreateGeocoderIfShould() {
    if (typeof(gGeocoder)==='undefined') {
        gGeocoder = new google.maps.Geocoder();
    }
}

// Funzione che visualizza l'indirizzo sulla Mappa. Riceve una stringa indirizzo.
function myGeocodeAndAddDraggableMarker() {
	
    // Esegue il geocode dell'indirizzo (deve arrivare ben formattato)
    // Riceve come parametro un indirizzo (da geocodare) e una funzione di callback che viene chiamata con un parametro LatLng.
    myCreateGeocoderIfShould();
    gGeocoder.geocode ({address:sAddressToGeocode, region:'it'}, function(results, status) {
		
        if (status == google.maps.GeocoderStatus.OK) {
            var place = results[0].geometry.location;
            var address = results[0].address_components;
            var nazione, regione, provincia, comune, indirizzo, civico, cap;
            
            initializeMapIfShould({center: place, zoom: 4});
            myClearMarkers();
			
            // Inserisce i dati del geocode negli hidden
            $('#lat').val(place.lat());
            $('#lng').val(place.lng());
            
            // Inserisce i dati dell'indirizzo negli hidden
            for(var i=0; i<address.length; i++) {
                switch(address[i].types[0]) {
                    case 'street_number': {
                        civico = address[i].long_name
                        $('#ret_civico').val(civico); 
                        break;
                    }
                    case 'route': {
                        indirizzo = address[i].long_name;
                        $('#ret_indirizzo').val(indirizzo); 
                        break;
                    }
                    case 'locality': {
                        comune = address[i].long_name;
                        $('#ret_comune').val(comune); 
                        break;
                    }
                    case 'administrative_area_level_2': {
                        provincia = address[i].short_name
                        $('#ret_provincia').val(provincia); 
                        break;
                    }
                    case 'administrative_area_level_1': {
                        regione = address[i].long_name;
                        $('#ret_regione').val(regione); 
                        break;
                    }
                    case 'country': {
                        nazione = address[i].long_name;
                        $('#ret_nazione').val(nazione); 
                        break;
                    }
                    case 'postal_code': {
                        cap = address[i].long_name;
                        $('#ret_cap').val(cap); 
                        break;
                    }
                }
            }
            
            var myPoint = {
                id:0,
                lat:place.lat(),
                lng:place.lng(),
                geoAdr:getFormattedAddress(nazione, regione, provincia, comune, indirizzo, civico, cap)
            };
			
            myAddDraggableMarker(myPoint);
            myAutoZoom([myPoint]);
            
        } else {
            // Mostra alert
            alert("Spiacenti, non siamo riusciti a trovare l'indirizzo specificato.");
        }
    });
}

function getFormattedAddress(nazione, regione, provincia, comune, indirizzo, civico, cap) {
    var output = [];
    // Indirizzo
    if (civico) {
        output.push(indirizzo+', '+civico);
    } else {
        output.push(indirizzo);
    }
    output.push(cap+' - '+comune+' ('+provincia+')');
    return output.join('<br/>');
}

function myClearMarkers() {
    for (i in gMarkers) {
        gMarkers[i].setMap(null);
    }
}
