/*
 Author:
    Dott. Domenico De Felice <d.defelice@arpacampania.it>
    Servizio Sistemi Informativi, ARPAC
*/

var Provinces = [ { name: 'Caserta', lat: 41.023427, lng: 14.043274, zoom: 10, toLoad: true },
                  { name: 'Napoli', lat: 40.737893, lng: 14.186096, zoom: 10, toLoad: true },
                  { name: 'Salerno', lat: 40.361195, lng: 15.100708, zoom:  9, toLoad: true } ];

var map;           // The global google.maps.Map object
var markersIcons = {};
var markerClusterer;

var markerClustererStyle = [
    {
        url: './img/magnifier.png',
        height: 48,
        width: 48,
        opt_anchor: [21, 0],
        opt_textColor: '#FFFFFF'
    },
    {
        url: './img/magnifier.png',
        height: 48,
        width: 48,
        opt_anchor: [21, 0],
        opt_textColor: '#FFFFFF'
    },
    {
        url: './img/magnifier.png',
        height: 48,
        width: 48,
        opt_anchor: [21, 0],
        opt_textColor: '#FFFFFF'
    }
];



function initialize() {
    var redrawMap = function() {
        map.checkResize();
    };

    $('body').layout({
        west__size:					 350,
        west__spacing_closed:		 20,
        west__togglerLength_closed:	 150,
        west__togglerAlign_closed:	 "top",
        west__togglerContent_closed: "M<BR>E<BR>N<BR>U",
        west__togglerTip_closed:	 "Clicca per riaprire il menu laterale",
        west__sliderTip:			 "Mostra il menu",
        west__slideTrigger_open:	 "mouseover",
        onresize: redrawMap,
        onclose:  redrawMap,
        onopen:   redrawMap,
        onhide:   redrawMap,
        onshow:   redrawMap
    });


    if ( GBrowserIsCompatible() ) {
        initializeMap();
    } else {
        // TODO
    }

    $('#elenco-province').accordion( {
        collapsible: true,
        active:      false,
        autoHeight:  false,
        clearStyle:  true,
        change:      function(event, ui) {
            var provinceName = ui.newHeader.text();

            // If collapsed do nothing
            if ( provinceName == "" ) {
                return;
            }

            var province = getProvinceByName(provinceName);

            window.setTimeout( function() {
                map.setCenter( new GLatLng( province.lat, province.lng ), province.zoom );
            }, 0);

            if ( province.toLoad ) {
                var menuContainer = ui.newContent;
                loadFlagsByProvince( province, menuContainer );
            }
        }
    } );

    $( '#chiudi-analisi' ).click( function() {
        $( '#analisi' ).hide( 'scale', null, 'fast' );
    } );

    $('#loading').hide('scale', null, 'slow', function() {
        $('#menupunti').show('pulsate', null, 'fast').show('highlight', null, 'slow');
    });
}

function initializeMap() {
    setupMarkersIcons();

    map = new GMap2($('#map')[0]);

    map.setCenter( new GLatLng(40.6000, 14.8200) );
    map.setZoom(9);
    map.enableDoubleClickZoom();
    map.enableScrollWheelZoom();
    map.addMapType(G_PHYSICAL_MAP);
    map.setMapType(G_PHYSICAL_MAP);

    map.addControl(new GLargeMapControl3D());
    map.addControl(new GNavLabelControl());

    var mapTypeControlPosition = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 30));
    map.addControl( new GMenuMapTypeControl(), mapTypeControlPosition );

    var scaleControlPosition = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(2, 20));
    map.addControl( new GScaleControl(), scaleControlPosition );

    $.each( map.getMapTypes(), function(index, mapType) {
      mapType.getMinimumResolution = function() { return 9; };
    } );

    GEvent.addListener(map, "click", function(marker, coord) {
        if (marker && marker.infoWindow) {
            map.openInfoWindow( marker.getLatLng(), marker.infoWindow );
        }
    });

    markerClusterer = new MarkerClusterer(map, [], {
        styles: markerClustererStyle,
        maxZoom: 11,
        gridSize: 80
    } );

    // var ggeoxml = new GGeoXml("http://www.arpacampania.it/balneazione/dati/kml/aree.xml");
    // map.addOverlay(ggeoxml);
}

function setupMarkersIcons() {
    var blueFlagIcon = new GIcon(G_DEFAULT_ICON, "img/band_blu.gif");
    blueFlagIcon.iconSize         = new GSize(12, 13);
    blueFlagIcon.shadow           = null;
    blueFlagIcon.iconAnchor       = new GPoint(12, 13); // La punta della bandiera, in basso a destra
    blueFlagIcon.infoWindowAnchor = new GPoint(12,0);

    var infoIcon = new GIcon(G_DEFAULT_ICON, "img/information.png");
    infoIcon.iconSize         = new GSize(16, 16);
    infoIcon.shadow           = null;
    infoIcon.iconAnchor       = new GPoint(16, 16);
    infoIcon.infoWindowAnchor = new GPoint(16, 16);

    var starIcon = new GIcon(blueFlagIcon, "img/stellina.gif");
    starIcon.iconSize         = new GSize(15, 15);
    starIcon.iconAnchor       = new GPoint(7, 7);
    starIcon.infoWindowAnchor = new GPoint(7, 7);

    markersIcons["blue-flag"]   = blueFlagIcon;
    markersIcons["red-flag"]    = new GIcon(blueFlagIcon, "img/band_rossa.gif");
    markersIcons["white-flag"]  = new GIcon(blueFlagIcon, "img/band_bianca.gif");
    markersIcons["orange-flag"] = new GIcon(blueFlagIcon, "img/band_arancione.gif");
    markersIcons["info"]        = infoIcon;
    markersIcons["star"]        = starIcon;
}


function getProvinceByName( provinceName ) {
    var i, n = Provinces.length;

    for ( i = 0; i < n; i++ ) {
        if ( Provinces[i].name == provinceName ) {
            return Provinces[i];
        }
    }

    return null;
}

function getImageFromPoint(point) {
    if ( point.b ) {
        return "img/band_blu.gif";
    }
    return "img/band_rossa.gif";
}

function loadFlagsByProvince(province, menuContainer) {
    var provinceName = province.name;
    var municipalitiesAccordion = $('<div/>');
    var markers = [];

    $.getJSON( 'dati/punti.asp?' + provinceName, function( municipalities ) {

        $.each( municipalities, function( index, municipality ) {

            var pointsList = $( '<ul/>' );

            var bounds = new GLatLngBounds();
            $.each( municipality.p, function( index, point ) {
                bounds.extend( new GLatLng( point.lat, point.lng ) );

                var marker = makePointMarker({
                    pointName: point.n,
                    pointExCode: point.e,
                    pointId: point.i,
                    pointClas: point.c,
                    pointArt7: point.art7,
                    pointNinq: point.ninq,
                    pointLat: point.lat,
                    pointLng: point.lng,
                    balneabile: point.b,
                    dataBal: point.d,
                    municipalityName: municipality.n,
                    provinceName: provinceName
                });

                markers.push( marker );

                var pointLink = $( '<a href="#" class="pointlink"><img src="' + getImageFromPoint(point) + '"/> ' + point.n + '</a>' ).click( function() {
                    var zoom = map.getBoundsZoomLevel(bounds);

                    if ( map.getZoom() < zoom ) {
                        map.setZoom(zoom);
                    }

                    map.panTo( marker.getLatLng() );

                    window.setTimeout( function() { GEvent.trigger(marker, "click"); }, 0 );
                } );

                pointsList.append( pointLink );
                pointLink.wrap('<li/>');
            } );

            var boundsCenter = bounds.getCenter();
            var boundsZoom   = map.getBoundsZoomLevel(bounds);

            var accordionHeader = $( '<h3><a href="#">' + municipality.n + '</a></h3>' ).click( function() {
                window.setTimeout( function() { map.setCenter( boundsCenter, boundsZoom ); }, 0 );
            } );

            municipalitiesAccordion.append( accordionHeader ).append( pointsList );
            pointsList.wrap('<div/>');
        } );
        province.toLoad = false;
        menuContainer.html( municipalitiesAccordion.accordion( {
            collapsible: true,
            active:      false,
            autoHeight:  false
        } ) );

        markerClusterer.addMarkers( markers );
    } );

} // Fine di loadFlagsByProvince()


function makePointMarker(args) {
    var html = "<div><b>" + args.pointName + "</b> (" + args.municipalityName + ", " + args.provinceName + ")";
    html += "<br/><br/><b>Codice</b>: " + args.pointId.substr(0, 5) + "<b>" + args.pointId.substr(5) + "</b> (ex " + args.pointExCode + ")";
    html += "<br/><br/><br/><b>";

    if (args.pointClas == "N.C. (D.M. 30.3.2010 art.2 c.7)") {
	html += "In fase di nuova classificazione</b> (D.M. 30.3.2010 art.2 c.7)";
    } else {
	html += "Classificazione</b> (2007-2008-2009-2010): " + args.pointClas;
    }

    if (args.pointArt7) {
	html += ", art.7";
    }
    html += "<br/><br/><b>Balneabilit&agrave;</b> (";

    if (args.dataBal) {
	html += "al " + args.dataBal;
    } else {
	html += "2011";
    }

    html += "): ";

    var icon;
    if (args.balneabile) {
      html += "<span style='color: navy'>s&igrave;</span>";
      icon = markersIcons["blue-flag"];
    } else {
      html += "<span style='color: red'>no</span>";
      icon = markersIcons["red-flag"];
    }

    html += "<br/>";

    if (args.pointNinq) {
	html += "(vedi <a target=\"_blank\" href=\"norm/Bagnoli_Ordinanza_Sindacale_395_11.03.11.pdf\">O.S. n.395 del 11.03.2011</a>)<br/>";
    }

    html += "<br/><b>Dati storici: </b></div>";

    var infoWindow = $(html);

    var storico2007 = $( '<a href="#">2007</a>' ).click( function() {
        openPopup( '/balneazione/storico_2007.asp?numind=' + args.pointId );
    } );
    var storico2008 = $( '<span> - </span><a href="#">2008</a>' ).click( function() {
        openPopup( '/balneazione/storico_2008.asp?numind=' + args.pointId );
    } );
    var storico2009 = $( '<span> - </span><a href="#">2009</a>' ).click( function() {
        openPopup( '/balneazione/storico_2009.asp?numind=' + args.pointId );
    } );
    var storico2010 = $( '<span> - </span><a href="#">2010</a>' ).click( function() {
        openPopup( '/balneazione/storico_2010.asp?numind=' + args.pointId );
    } );

    infoWindow.append(storico2007);
    infoWindow.append(storico2008);
    infoWindow.append(storico2009);
    infoWindow.append(storico2010);

    infoWindow.append("<br/><br/><hr/><br/>");

    var analisiLink = $( '<a href="#">Mostra i dati delle analisi</a>' ).click( function() {
        openPopup( 'dati/analisi.asp?' + args.pointId );
    } );

    infoWindow.append( analisiLink );

    var profLink = $( '<span> - </span><a target="_blank" href="prof/S_' + args.pointId + '.pdf">Mostra il profilo sintetico</a><br/>' );
    infoWindow.append(profLink);


    var coord = new GLatLng( args.pointLat, args.pointLng );
    var marker = new GMarker(coord, icon);

    marker.infoWindow = infoWindow[0];

    return marker;
}


function resizeAndCenterPopup() {
    var windowWidth = document.documentElement.clientWidth;
    var windowHeight = document.documentElement.clientHeight;
    var margin = 20; // px

    $("#analisi").css({
        top:    margin + "px",
        left:   margin + "px",
        width:  windowWidth - 2*margin,
        height: windowHeight - 2*margin
    }).children( 'iframe' ).css({
        width: "100%",
        height: windowHeight - 2*margin - 20
    });
}

function openPopup(url) {
    resizeAndCenterPopup();
    var analisi = $( '#analisi' );
    var iframe = analisi.children( 'iframe' ).hide();
    analisi.show( 'scale', null, 'slow', function() {
        iframe.show();
    } );
    iframe.attr('src', url);
}


