﻿
if (!terra.map.layers) terra.map.layers = {};
var Categories = 
["Σημεία ενδιαφέροντος","","","","","","","",
"Αντικειμενικές αξίες","",
"Μεταφορές","",
"Καθαριότητα","","","",
"Οδικό δίκτυο"
];
terra.map.layers = {

    layerDiv: 'layersDiv',
    layerURL: 'http://gis.kallithea.gr/arcgis/rest/services/OdhgosPolis/MapServer',
    layerQuerySERVICE: null,
    layerQueryQueue: [],
    layerSERVICE: null,
    layerData: null,
    layerIdentifyData: null,
    layerIdentifyResults: null,
    layerIdentifyFeature: null,
    identifyTask: null,
    layerClient: 'kalithea',
    isDemo: false,

    getLayersService: function() {

      // var currentLayer = map.getLayer('katastimata');

      if (!this.layerSERVICE) {
            terra.map.layers.layerSERVICE = new esri.layers.ArcGISDynamicMapServiceLayer(terra.map.layers.layerURL, { id: 'katastimata' });
            terra.map.layers.layerSERVICE.setOpacity(0.7);
            terra.map.layers.layerSERVICE.setDisableClientCaching(true);
            terra.map.layers.layerSERVICE.setVisibleLayers([]);
            terra.map.layers.layerSERVICE.hide();
        }

        return this.layerSERVICE;

    },

    getLayersHtml: function() {
	
	var html = '';
        var layerList = { 1000: "" };

        for (var i = 0; i < this.layerData.length; i++) {

            var currentDIV = '#' + this.layerDiv + "_" + this.layerData[i].TerraLayersServiceLevel;

            var t = this.layerData[i].TerraLayersServiceLevel;

            var extistOBJECT = $(currentDIV);

            if (extistOBJECT.length < 1) {
                t = 1000;
            }

            html = '';
            html += '<input  style="margin-left:18px;" id="layer_' + i + '" type="checkbox" onclick="terra.map.layers.refreshLayers(' + i + ')"/>';
            html += '<label id="layer_' + i + '_label" for="layer_' + i + '">' + this.layerData[i].TerraLayersServiceLevelName + '</label>';
                      
            var toDIV = '#' + this.layerDiv + "_" + t;

            if (layerList[t] == null) {
                layerList[t] = '';
            }

            layerList[t] += html;

            var newHTML = layerList[t];

            $(toDIV).html(newHTML);


        }
        
	//var html = '';

        //for (var i = 0; i < this.layerData.length; i++) {
	//				if (Categories[i]!="")
	//			html += "<br/><b>"+Categories[i]+"</b><br/>";
        //    html += '<input id="layer_' + i + '" type="checkbox" onclick="terra.map.layers.refreshLayers(' + i + ')"/>';
        //    html += '<label for="layer_' + i + '">' + this.layerData[i].TerraLayersServiceLevelName + '</label><br/>';

        //}

        //$('#' + this.layerDiv).html(html);

    },

    doIdentify: function(evt) {

        var visibleLayers = this.getVisibleLayers();

        if (visibleLayers.length == 0) {
            // reverseGeocode(evt);
            return;
        }

        if (this.identifyTask == null)
            this.identifyTask = new esri.tasks.IdentifyTask(this.layerURL);

        var identifyParams = new esri.tasks.IdentifyParameters();
        identifyParams.tolerance = 3;
        identifyParams.returnGeometry = true;

        var visibleLayers = this.getVisibleLayers();
        identifyParams.layerIds = visibleLayers;

        identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
        identifyParams.geometry = evt.mapPoint;
        identifyParams.mapExtent = map.extent;

        this.identifyTask.execute(identifyParams, function(idResults) { terra.map.layers.identifyResults(idResults, evt); });

        map.infoWindow.resize(300, 180);
        map.infoWindow.setContent(this.getIdentifyHtml());
        map.infoWindow.setTitle("Πληροφορίες");

        identifySymbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 6, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 255, 0]), 1), new dojo.Color([0, 255, 0, 0.3]));
        map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));

        //map.centerAt(evt.mapPoint);
        //map.setLevel(14);

    },

    getIdentifyHtml: function() {
        return "<div id='identifyDiv'> <img alt='Παρακαλώ περιμένετε' title='Παρακαλώ περιμένετε' src='img/ajax-loader.gif' /> </div>";
    },

    initQuerySERVICE: function(geometry) {

        $("#dialogQueryResults").dialog(
		{
		    autoOpen: false,
		    bgiframe: true,
		    resizable: false,
		    height: 200,
		    width: 400,
		    modal: true,
		    overlay: {
		        backgroundColor: '#000',
		        opacity: 0.5
		    },
		    buttons: {

		        'Ok': function() {
		            $(this).dialog('close');
		        }
		    }

		});

        if (this.isDemo) {
            $("#dialogQueryResults_results").html('Τα στατιστικά στοιχειά που αφορούν τον πληθυσμό, τα σημεία ενδιαφέροντος κτλ. είναι απενεργοποιημένα στην DEMO έκδοση της εφαρμογής.');
            $("#dialogQueryResults").dialog('open');
            return;
        }

        $("#dialogQueryResults_results").html(getLoaderHtml());
        $("#dialogQueryResults").dialog('open');

        for (var i = 0; i < this.layerData.length; i++) {

            if (this.layerData[i].TerraLayersServiceQuery == true) {

                var query = new esri.tasks.Query();
                query.returnGeometry = true;

                var outFields = [];

                for (var j = 0; j < this.layerIdentifyData.length; j++) {
                    if (this.layerIdentifyData[j].TerraIdentifyLayerId == this.layerData[i].TerraLayersServiceId) {
                        if (this.layerIdentifyData[j].TerraIdentityQuery == true) {
                            outFields.push(this.layerIdentifyData[j].TerraIdentifyFieldName);
                        }
                    }
                }

                query.outFields = outFields;  //["NOIK", "HOUSES", "PER_MEN", "PER_WOM", "PER_POP"];
                query.geometry = geometry;

                query.myUrl = this.layerURL + "/" + this.layerData[i].TerraLayersServiceLevel;
                query.myLayerId = i;

                this.layerQueryQueue.push(query);

            }

        }

        this.executeNextQuery();

    },

    executeNextQuery: function() {

        if (this.layerQueryQueue.length == 0) {
            this.layerQuerySERVICE = null;
            this.allQueryTasksCompleted();
            return;
        }

        var currentQuery = this.layerQueryQueue[0];

        this.layerQuerySERVICE = new esri.tasks.QueryTask(currentQuery.myUrl);
        this.layerQuerySERVICE.execute(currentQuery, terra.map.layers.queryTaskCompleted);

    },

    queryTaskCompleted: function(featureSet) {

        var currentQuery = terra.map.layers.layerQueryQueue[0];
        terra.map.layers.layerData[currentQuery.myLayerId].features = featureSet.features;
        terra.map.layers.layerQueryQueue.splice(0, 1);
        terra.map.layers.executeNextQuery();

    },

    allQueryTasksCompleted: function() {

        var buildHtml = '<table>';

        for (var i = 0; i < this.layerData.length; i++) {

            if (this.layerData[i].TerraLayersServiceQuery == true) {

                buildHtml += "<tr>";
                buildHtml += "<td colspan='2' style='width:100%'>";
                buildHtml += "<div class='ui-state-default ui-corner-all'><b>" + this.layerData[i].TerraLayersServiceLevelName + " - " + this.layerData[i].features.length + "</b></div>";
                buildHtml += "</td>";
                buildHtml += "</tr>";

                for (var j = 0; j < this.layerIdentifyData.length; j++) {
                    if (this.layerIdentifyData[j].TerraIdentifyLayerId == this.layerData[i].TerraLayersServiceId) {
                        if (this.layerIdentifyData[j].TerraIdentityQuery == true) {

                            //calculate SUM
                            var fieldSUM = 0;
                            for (var k = 0; k < this.layerData[i].features.length; k++) {
                                fieldSUM += this.layerData[i].features[k].attributes[this.layerIdentifyData[j].TerraIdentifyFieldName];
                            }

                            buildHtml += "<tr>";
                            buildHtml += "<td style='width:100%'>";
                            buildHtml += " " + this.layerIdentifyData[j].TerraIdentifyFieldDescription;
                            buildHtml += "</td>";
                            buildHtml += "<td style='text-align:right;'><b>";
                            buildHtml += fieldSUM;
                            buildHtml += "</b></td>";
                            buildHtml += "</tr>";


                        }
                    }
                }


            }

        }

        buildHtml += "</table>";
        $("#dialogQueryResults_results").html(buildHtml);

    },

    identifyResults: function(idResults, evt) {

        this.layerIdentifyResults = idResults;

        if (this.layerIdentifyResults.length == 0) {
            $("#identifyDiv").html('Δεν υπάρχει πληροφορία για αυτό το σημείο');
            return;
        }

        $("#identifyDiv").html(this.identifyTabContents());

        this.refreshSubCombo($('#identifyComboLayer').val());

    },

    identifyTabContents: function() {

        var content = "";

        var foundLayers = [];

        for (var i = 0, il = this.layerIdentifyResults.length; i < il; i++) {
            if (!foundLayers[this.layerIdentifyResults[i].layerId]) {
                foundLayers[this.layerIdentifyResults[i].layerId] = this.layerIdentifyResults[i].layerId;
            }
        }

        content += "<select id='identifyComboLayer' onchange='terra.map.layers.refreshSubCombo($(this).val());'>";
        for (var j = 0; j < this.layerData.length; j++) {
            if (foundLayers[this.layerData[j].TerraLayersServiceLevel] == this.layerData[j].TerraLayersServiceLevel && this.layerData[j].isSelected == true) {
                content += "<option value=" + this.layerData[j].TerraLayersServiceLevel + ">" + this.layerData[j].TerraLayersServiceLevelName + "</option>";
            }
        }

        content += "</select>";
        content += "<div id='identifyComboSubLayer'></div>";
        content += "<div id='identifySelection'></div>";

        return content;

    },

    refreshSubCombo: function(level) {

        var content = '';
        content += "<select id='identifyComboDetails' onchange='terra.map.layers.showSelectedIdentify($(this).val());'>";

		var hasRows= true;
		
        var init = null;
        for (var i = 0, il = this.layerIdentifyResults.length; i < il; i++) {

            if (this.layerIdentifyResults[i].layerId == level) {

                var found = true;
                var layerDataIndex = this.getLayerIndex(level);

                if (this.layerData[layerDataIndex].TerraLayersServiceAttribute != null) {
                    if (this.layerIdentifyResults[i].feature.attributes[this.layerData[layerDataIndex].TerraLayersServiceAttribute] != this.layerData[layerDataIndex].TerraLayersServiceAttributeValue) {
                        found = false;
                    }
                }

                if (found == true) {
                    //TerraIdentifyDefault
                    var defaultField = this.getIdentifyDefaultField(layerDataIndex);
                    content += "<option value = " + i + ">" + this.layerIdentifyResults[i].feature.attributes[defaultField] + "</option>";

					if (this.layerIdentifyResults[i].feature.attributes[defaultField] == null){
						hasRows =false;
					}
					
                    if (init == null) {
                        init = i;
                    }

                }

            }

        }

        content += "</select>";
		
		if (hasRows==false){ content ='';}
		
        $('#identifyComboSubLayer').html(content);
        this.showSelectedIdentify(init);

    },

    getIdentifyDefaultField: function(layerDataIndex) {

        var defaultField;

        for (var j = 0; j < this.layerIdentifyData.length; j++) {
            if (this.layerIdentifyData[j].TerraIdentifyLayerId == this.layerData[layerDataIndex].TerraLayersServiceId && this.layerIdentifyData[j].TerraIdentifyDefault == true) {

                defaultField = this.layerIdentifyData[j].TerraIdentifyFieldName;
                break;


            }
        }

        return defaultField;

    },

    showSelectedIdentify: function(i) {

        var content = "";

        //["NANME_GR", "COMBOTYPE", "ADDR_GR", "ADD_NUMB", "MUN_GR", "PHONE", "TK", "MAINCAT", "SUBCAT"];

        var text1 = 'Null';
        var defaultField;
        var title = null;

        for (var j = 0; j < this.layerIdentifyData.length; j++) {

            var layerDataIndex = this.getLayerIndex(this.layerIdentifyResults[i].layerId);

            if (this.layerIdentifyData[j].TerraIdentifyLayerId == this.layerData[layerDataIndex].TerraLayersServiceId) {

                thisField = this.layerIdentifyData[j].TerraIdentifyFieldName;
                descField = this.layerIdentifyData[j].TerraIdentifyFieldDescription;

                if (title == null) {
                    title = this.layerIdentifyResults[i].feature.attributes[thisField];
                }

                text1 = null;
                text1 = this.layerIdentifyResults[i].feature.attributes[thisField];
                if ((text1 != 'Null') && (text1 != '')) {
                    content += "<br/>" + descField + ": <b> " + text1 + " </b> ";
                }

            }

        }

        this.layerIdentifyResults[i].myGeometry = this.layerIdentifyResults[i].feature.geometry;
        this.layerIdentifyResults[i].myDesc = content;
        this.layerIdentifyResults[i].myTitle = title;

        //content += "<br/><br/> <a style='margin-left:10px;' class='ui-state-default ui-corner-all' onclick='terra.map.layers.addGrFromIdentify(" + i + ");' href='#'>Μετατροπή σε γεωμετρία</a>";
        $('#identifySelection').html(content);

        this.hilightFeature(this.layerIdentifyResults[i].feature);

    },

    addGrFromIdentify: function(i) {

        var pointType;

        switch (this.layerIdentifyResults[i].myGeometry.type) {
            case "point":
                pointType = 1;
                break;
            case "polyline":
                pointType = 3;
                break;
            case "polygon":
                pointType = 2;
                break;
            case "extent":
                pointType = 2;
                break;
            case "multipoint":
                pointType = 1;
                break;
        }

        terra.map.graphManager.addNewGr(false, guid(), pointType, this.layerIdentifyResults[i].myTitle, this.layerIdentifyResults[i].myDesc, this.layerIdentifyResults[i].myGeometry);

    },

    hilightFeature: function(feature) {

        var symbol;

        switch (feature.geometry.type) {

            case "point":
                symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1), new dojo.Color([0, 255, 0, 0.25]));
                break;
            case "polyline":
                symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 1);
                break;
            case "polygon":
                symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_NONE, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0, 0.25]), 2), new dojo.Color([0, 0, 255, 0.25]));
                break;
            case "extent":
                symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_NONE, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0, 0.25]), 2), new dojo.Color([0, 0, 255, 0.25]));
                break;
            case "multipoint":
                symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND, 20, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 0.25]), 1), new dojo.Color([0, 0, 255, 0.25]));
                break;

        }

        if (this.layerIdentifyFeature != null) {
            map.graphics.remove(this.layerIdentifyFeature);
        }

        this.layerIdentifyFeature = feature;
        this.layerIdentifyFeature.setSymbol(symbol);
        map.graphics.add(this.layerIdentifyFeature);

    },

    getLayers: function() {

        $.ajax({
            type: "GET",
            url: "webservice.asmx/getLayers",
            dataType: "xml",
            data: {
                "client": this.layerClient
            },
            success: function(xml) {

                var data = $.evalJSON($(xml).find("string").text());

                terra.map.layers.layerData = data;
                terra.map.layers.getLayersHtml();
                terra.map.layers.getIdentifyFields();

//                var currentLayer = map.getLayer('katastimata');

//                if (!currentLayer) {

//                    terra.map.layers.layerSERVICE = new esri.layers.ArcGISDynamicMapServiceLayer(terra.map.layers.layerURL, { id: 'katastimata' });
//                    terra.map.layers.layerSERVICE.setOpacity(0.7);
//                    terra.map.layers.layerSERVICE.setDisableClientCaching(true);
//                    terra.map.layers.layerSERVICE.setOpacity(0.7);

//                    terra.map.layers.layerSERVICE.setVisibleLayers([]);
//                    terra.map.layers.layerSERVICE.hide();

//                    map.addLayer(terra.map.layers.layerSERVICE);

//                }

            }

        });

    },

    getIdentifyFields: function() {

        $.ajax({
            type: "GET",
            url: "webservice.asmx/getIdentifyFields",
            dataType: "xml",
            data: {
                "client": this.layerClient
            },
            success: function(xml) {

                var data = $.evalJSON($(xml).find("string").text());
                terra.map.layers.layerIdentifyData = data;

            }

        });

    },
    selectLayer: function(i, select) {
        // for (var i = 0; i < this.layerData.length; i++) {
        //     if (this.layerData[i].TerraLayersServiceLevel == level) {
        this.layerData[i].isSelected = select;
        //     } 
        // }
    },
    refreshLayers: function(i) {

        var selected = $('#layer_' + i).attr('checked');
        this.selectLayer(i, selected);

        var visibleLayers = this.getVisibleLayers();

        if (visibleLayers.length == 0) {
            this.layerSERVICE.hide();
            this.layerSERVICE.setVisibleLayers([]);
            return; //does not show any layer;
        }

        this.layerSERVICE.setLayerDefinitions(this.getLayerDefinitions(visibleLayers));
        this.layerSERVICE.setVisibleLayers(visibleLayers);
        this.layerSERVICE.show();

    },

    getLayerDefinitions: function(visibleLayers) {

        var layerDefinitions = [];

        var vL = visibleLayers;

        for (var i = 0; i < vL.length; i++) {
            layerDefinitions[vL[i]] = this.getLayerQuery(vL[i]);
        }

        return layerDefinitions;

    },
    getLayerIndex: function(level) {

        var idx;

        for (var i = 0; i < this.layerData.length; i++) {
            if (this.layerData[i].isSelected == true && this.layerData[i].TerraLayersServiceLevel == level) {
                idx = i;
                break;
            }
        }

        return idx;

    },
    getVisibleLayers: function() {

        var visible = [];
        var j = 0;
        var previusLevel = -1;
        for (var i = 0; i < this.layerData.length; i++) {
            if (this.layerData[i].isSelected && this.layerData[i].TerraLayersServiceLevel != previusLevel) {
                visible[j] = this.layerData[i].TerraLayersServiceLevel;
                previusLevel = this.layerData[i].TerraLayersServiceLevel;
                j++;
            }
        }

        return visible;

    },
    getLayerQuery: function(level) {

        var ret = '';
        var j = 0;

        for (var i = 0; i < this.layerData.length; i++) {
            if (
                    this.layerData[i].isSelected == 1 &&
                    this.layerData[i].TerraLayersServiceLevel == level &&
                    this.layerData[i].TerraLayersServiceAttribute != null
               ) {
                if (j > 0) { ret += ' OR '; }
                ret += this.layerData[i].TerraLayersServiceAttribute + "=" + this.layerData[i].TerraLayersServiceAttributeValue + " ";
                j++;
            }
        }

        return ret;

    }

}
    