var gGeocoder = null;
var gMarker = null;

var gmap, identifyTask, layers, overlays;
var findTask = null;
var mapExtension = null;
var gOverlays = null;

var urlFiduciali = "http://ags.globogis.it/ArcGIS/rest/services/fiduciali/fiduciali/MapServer";
var urlCatasto = "http://ags.globogis.it/ArcGIS/rest/services/fiduciali/catasto/MapServer";

var pCatasto = undefined;

function initialize() {
    // Sistemazione altezza mappa
    var height = getPageHeight() - 20;
    document.getElementById("gmap").style.height = height + "px";

    gmap = new GMap2(document.getElementById("gmap"));
    gmap.enableScrollWheelZoom();
    var centerat = new GLatLng(42, 12);

    gmap.addControl(new GLargeMapControl());
    gmap.addControl(new GMapTypeControl());
    gmap.setCenter(centerat, 6);
    gmap.addControl(new GMapTypeControl());
    gmap.addControl(new GLargeMapControl());
    //gmap.setMapType(G_SATELLITE_MAP);

    // Inizializzazione della ricerca indirizzi
    gGeocoder = new GClientGeocoder();
    mapExtension = new esri.arcgis.gmaps.MapExtension(gmap);

    // Find Task
    findTask = new esri.arcgis.gmaps.FindTask(urlFiduciali);


    // Acquisisco l'utente dalla querystring
    var q = getArgs();
    var utente = q.utente || "";
    var check = q.check || "";

    // Se l'utente è impostato mostro il catasto e la maschera altrimenti per default il layer è spento
    if (utente != "" && check != "") {
        // Controllo il check
        if (parseCheck(check, utente)) {
            // Aggiunta del layer dynamic di ArcGIS Server
            pCatasto = new esri.arcgis.gmaps.DynamicMapServiceLayer(
		        urlCatasto,
		        null,
		        1.0,
		        function(mapservicelayer) {
		            gmap.addOverlay(mapservicelayer);

		            // Creo una query task per vedere se l'utente ha una mask
		            var qtask = new esri.arcgis.gmaps.QueryTask(urlCatasto + "/" + findLayer(mapservicelayer, "Maschera"));
		            var query = new esri.arcgis.gmaps.Query();
		            query.returnGeometry = false;
		            query.where = "utente = '" + utente + "'";
		            qtask.execute(query, false, function(fset) {
		                var filter = "utente = '" + utente + "'";
		                if (fset.features.length == 0) {
		                    filter = "utente IS NULL";
		                }
		                // Se ce l'ha la applico come setDefinition, altrimenti imposto la mask di default
		                var arrDefinition = mapservicelayer.getLayerDefinitions()
		                arrDefinition[findLayer(mapservicelayer, "Maschera")] = filter;
		                mapservicelayer.setLayerDefinitions(arrDefinition);

		                document.getElementById("divMostraCatasto").style.display = "";
		                document.getElementById("chkMostraCatasto").checked = true;
		            });
		        }
	        );
        }
    }

    // Aggiunta del layer dynamic di ArcGIS Server
    var pFiduciali = new esri.arcgis.gmaps.DynamicMapServiceLayer(
		urlFiduciali,
		null,
		1.0,
		function(mapservicelayer) {
		    gmap.addOverlay(mapservicelayer);
		}
	);
    // create an identify task
    identifyTask = new esri.arcgis.gmaps.IdentifyTask(urlFiduciali);

    // register click event listener for the map
    GEvent.addListener(gmap, "click", identify);

}

function findLayer(service, name) {
    name = name.toLowerCase();
    var infos = service.layerInfos;
    for (var i = 0; i < infos.length; i++) {
        var info = infos[i];
        if (info.name.toLowerCase() == name) return info.id;
    }

    return -1;
}

function parseCheck(check, utente) {
    try {
        utente = utente + "globo";

        var c1 = utente.charCodeAt(0);
        var c2 = utente.charCodeAt(1);
        var c3 = utente.charCodeAt(2);
        var c4 = utente.charCodeAt(3);
        var c5 = utente.charCodeAt(4);

        /*		c1=5;
        c2=4;
        c3=3;
        c4=6;
        c5=7;
        */
        var arr = check.split("-");
        var y = arr[3] / c1;
        var m = arr[1] / c2;
        var d = arr[4] / c3;
        var h = arr[2] / c4;
        var n = arr[0] / c5;

        var dCheck1 = new Date(y, m - 1, d, h, n - 30);
        var dCheck2 = new Date(y, m - 1, d, h, n + 30);
        var now = new Date();

        return ((now < dCheck2) && (now > dCheck1));
    } catch (err) {
        return false;
    }
}

function callbackGeocoder(point) {
    clearResults();
    if (point) {
        gOverlays = new GMarker(point, { draggable: false });
        gmap.addOverlay(gOverlays);
        gmap.setCenter(point);
        gmap.setZoom(15);
    } else {
        alert("Indirizzo non trovato");
    }
}

function disableEnterKey(e, func) {
    var key;
    if (window.event)
        key = window.event.keyCode; //IE
    else
        key = e.which; //firefox

    if (key == 13) eval(func);

    return (key != 13);
}


function identify(overlay, latLng) {
    if (overlay) return;
    clearResults();

    // set the identify parameters
    var identifyParameters = new esri.arcgis.gmaps.IdentifyParameters();
    identifyParameters.geometry = latLng; // location where the user clicked on the map
    identifyParameters.tolerance = 5;
    identifyParameters.layerOption = "all";
    identifyParameters.bounds = gmap.getBounds();
    var mapSize = gmap.getSize();
    identifyParameters.width = mapSize.width;
    identifyParameters.height = mapSize.height;

    if (gmap.getZoom() >= 16) {
        identifyParameters.layerIds = [0, 1]
    } else {
        identifyParameters.layerIds = [0]
    }

    // execute the identify operation
    identifyTask.execute(identifyParameters, function(response, error) { // function to be called when the result is available
        // display error message (if any) and return
        if (hasErrorOccurred(error)) return;

        // note that the location where the user clicked on the map (latLng) is visible in this function through closure
        addResultToMap(response);
    });
}

function getArgs() {
    var args = new Object();
    var query = location.search.substring(1);
    var pairs = query.split("&");
    for (var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');
        if (pos == -1) continue;
        var argname = pairs[i].substring(0, pos);
        var value = pairs[i].substring(pos + 1);
        args[argname] = unescape(value);
    }
    return args;
}

function getInfoTemplateFiduciali() {

    var infoTemplate = { content: "<table style='width:100%'>" +
            "<tr><th>Comune</th><td>{Comune}</td></tr>" +
            "<tr><th>Sezione</th><td>{Sezione}</td></tr>" +
            "<tr><th>Foglio</th><td>{Foglio}</td></tr>" +
            "<tr><th>Allegato</th><td>{Allegato}</td></tr>" +
            "<tr><th>Fiduciale</th><td>{Fiduciale}</td></tr>" +
            "<tr><th>Particella</th><td>{Particella}</td></tr>" +
            "<tr><th>Fiduciale</th><td>{ETICHETTA}</td></tr>" +
            "<tr><th>Attendibilita</th><td>{ATTENDIBILITA}</td></tr>" +
            "<tr><th>Monografia Planimetrica</th><td>{MONOGRAFIAPLANIMETRICA}</td></tr>" +
            "<tr><th>Nord</th><td>{Nord}</td></tr>" +
            "<tr><th>Est</th><td>{Est}</td></tr>" +
            "<tr><th>Foglio origine</th><td>{FOGLIOORIGINE}</td></tr>" +
            "<tr><th>Allegato origine</th><td>{ALLEGATOORIGINE}</td></tr>" +
            "<tr><th>Fiduciale origine</th><td>{FIDUCIALEORIGINE}</td></tr>" +
            "<tr><th>Data aggiornamento</th><td>{DATAAGGIORNAMENTO}</td></tr>" +
            "<tr><th>Causale aggiornamento</th><td>{CAUSALEAGGIORNAMENTO}</td></tr>" +
            "<tr><th>Monografia altimetrica</th><td>{MONOGRAFIAALTIMETRICA}</td></tr>" +
            "<tr><th>Attendibilita altimetrica</th><td>{ATTENDIBILITAALTIMETRICA}</td></tr>" +
            "<tr><th>Quota</th><td>{QUOTA}</td></tr>" +
            "<tr><th>Interno comune</th><td>{INTERNOCOMUNE}</td></tr>" +
            "<tr><th>Nord Gauss-Boaga</th><td>{NORDGB_M}</td></tr>" +
            "<tr><th>Est Gauss-Boaga</th><td>{ESTGB_M}</td></tr>" +
            "<tr><th>Nord UTM</th><td>{NORDUTM_M}</td></tr>" +
            "<tr><th>Est UTM</th><td>{ESTUTM_M}</td></tr>" +
            "<tr><th>Fuso UTM</th><td>{FUSOUTM}</td></tr>" +
            "<tr><th>Latitudine Genova (DD)</th><td>{FI_WGS84_DD}</td></tr>" +
            "<tr><th>Longitudine Genova (DD)</th><td>{LA_WGS84_DD}</td></tr>" +
            "<tr><th>Id Origine</th><td>{IDORIGINE}</td></tr>" +
            "<tr><th>Nome Origine</th><td><a href='javascript:findOrigine(\"{NOMEORIGINE}\")'>{NOMEORIGINE}</a></td></tr>" +
            "<tr><th>Agenzia Territorio</th><td>{URL_AGENZIA}</td></tr>" +
        "</table>"
    }
    return infoTemplate;
}

function getInfoTemplateOrigini() {
    var infoTemplate = { content: "<table style='width:100%'>" +
            "<tr><th>Id</th><td>{IDORIGINE}</td></tr>" +
            "<tr><th>Tipo origine</th><td>{TIPOORIGINE}</td></tr>" +
            "<tr><th>Nome</th><td>{NOMEORIGINE}</td></tr>" +
            "<tr><th>Descrizione</th><td>{DESCRIZIONE}</td></tr>" +
            "<tr><th>Ordine trigonometrico IGM</th><td>{ORDINETRIGONOMETRICOIGM}</td></tr>" +
            "<tr><th>Tipo coordinata input</th><td>{TIPOCOORDINATAINPUT}</td></tr>" +
            "<tr><th>Latitudine Genova (DD)</th><td>{FI_GE_DD}</td></tr>" +
            "<tr><th>Longitudine Genova (DD)</th><td>{LA_GE_DD}</td></tr>" +
            "<tr><th>Latitudine Roma40 (DD)</th><td>{FI_RM40_DD}</td></tr>" +
            "<tr><th>Longitudine Roma40 (DD)</th><td>{LA_RM40_DD}</td></tr>" +
            "<tr><th>Nord Gauss-Boaga</th><td>{NORDGB_M}</td></tr>" +
            "<tr><th>Est Gauss-Boaga</th><td>{ESTGB_M}</td></tr>" +
            "<tr><th>Nord UTM</th><td>{NORDUTM_M}</td></tr>" +
            "<tr><th>Est UTM</th><td>{ESTUTM_M}</td></tr>" +
            "<tr><th>Fuso UTM</th><td>{FUSOUTM}</td></tr>" +
        //            "<tr><th>SEZIONE25</th><td>{SEZIONE25}</td></tr>" +
        //            "<tr><th>FOGLIO50</th><td>{FOGLIO50}</td></tr>" +
            "<tr><th>Annotazioni</th><td>{ANNOTAZIONI}</td></tr>" +
        //    "<tr><th>SHAPE</th><td>{SHAPE}</td></tr>" +
            "<tr><th>Latitudine WGS84 (DD)</th><td>{FI_WGS84_DD}</td></tr>" +
            "<tr><th>Longitudine WGS84 (DD)</th><td>{LA_WGS84_DD}</td></tr>" +
        //            "<tr><th>DESCRIZIONE25</th><td>{DESCRIZIONE25}</td></tr>" +
        //            "<tr><th>DESCRIZIONE50</th><td>{DESCRIZIONE50}</td></tr>" + 
        "</table>"
    }
    return infoTemplate;


}

function addResultToMap(response) {

    var layerId = -1;
    if (response.identifyResults != undefined) {
        if (response.identifyResults.length > 0) layerId = response.identifyResults[0].layerId;
    } else if (response.findResults != undefined) {
        if (response.findResults.length > 0) layerId = response.findResults[0].layerId;
    }

    var infoTemplate = undefined;
    if (layerId == 0) {
        infoTemplate = getInfoTemplateOrigini();
    } else if (layerId == 1) {
        infoTemplate = getInfoTemplateFiduciali();
    }

    var myIcon = new GIcon();
    myIcon.image = "images/iconPF.png";
    myIcon.iconSize = new GSize(32, 32);
    myIcon.iconAnchor = new GPoint(16, 32);
    myIcon.infoWindowAnchor = new GPoint(16, 32);
    
    var overlayOptions = {
        markerOptions: {
            icon: myIcon
        }
    };

    gOverlays = mapExtension.addToMap(response, overlayOptions, infoTemplate);
}


function clearResults() {
    // clear map overlays and event listeners using MapExtension removeFromMap
    mapExtension.removeFromMap(gOverlays);
}

function hasErrorOccurred(error) {
    if (error) {
        alert("Error " + error.code + ": " + (error.message || (error.details && error.details.join(" ")) || "Unknown error"));
        return true;
    }
    return false;
}

function getPageHeight() {
    var height = window.innerHeight;
    if (height == null) {
        if (document.documentElement && document.documentElement.clientHeight)
            height = document.documentElement.clientHeight;
        else
            height = document.body.clientHeight;
    }
    return height;

}

function doFind(tipo) {
    var fiduciale = document.getElementById("txtFiduciale").value;
    var origine = document.getElementById("txtOrigine").value;

    if (tipo == 1) {
        findFiduciale(fiduciale);
    } else {
        findOrigine(origine);
    }
    
}

function doFindIndirizzo() {
    gGeocoder.getLatLng(document.getElementById('txtAddress').value, callbackGeocoder);
}

function findFiduciale(searchText) {
    // clear map overlays
    clearResults()

    // set find parameters
    var params = new esri.arcgis.gmaps.FindParameters();
    params.layerIds = [1];
    params.searchFields = ["Etichetta"];
    params.searchText = searchText;

    // execute find task
    document.getElementById("loading").style.display = "";
    findTask.execute(params, findCompleteCallback);

}

function findOrigine(searchText) {
    // clear map overlays
    clearResults()

    // set find parameters
    // Find Parameters
    var params = new esri.arcgis.gmaps.FindParameters();
    params.layerIds = [0];
    params.searchFields = ["NOME"];
    params.searchText = searchText;

    // execute find task
    document.getElementById("loading").style.display = "";
    findTask.execute(params, findCompleteCallback);

}

function findCompleteCallback(response) {
    // add the findresutls to google map without any style
    document.getElementById("loading").style.display = "none";
    addResultToMap(response)

    if (response.findResults.length > 0) {
        gmap.setCenter(gOverlays[0][0].getLatLng(), 16);
    } else {
        alert("Nessun risultato trovato");
    }
}

function mostraCatasto(show) {
    if (show) {
        pCatasto.show();
    } else {
        pCatasto.hide();
    }
}
