﻿var MapLayerNode = Class.create();
MapLayerNode.prototype =
{
    m_nodeType : null,
    m_identity : null,
    m_selected : null,
    m_metadata : null,

    initialize : function(t_identity, t_nodeType, t_selected, t_metadata)
    {
        this.m_nodeType = t_nodeType;
        this.m_identity = t_identity;
        this.m_selected = t_selected;
        this.m_metadata = t_metadata;
    },
    
    getNodeType : function(){return this.m_nodeType;},
    getIdentityString : function(){return this.m_identity;},
    getLayerMetaData : function(){return this.m_metadata;},
    isSelected : function(){return this.m_selected;}
}

var MapLayersController = Class.create();
MapLayersController.prototype =
{
    m_poiController: null,
    m_wmss: null,
    m_pois: null,
    m_kartController: null,
    m_eventManager: new EventHandlerManager(),
    m_onWMSLayerToggled: null,
    m_onLayersToggled: null,
    m_layerNamesIds: [],
    m_transparencyEnabled: null,
    m_metaData: null,
    m_treeView: null,

    initialize: function(
        t_treeView,
        t_metaData,
        t_kartController,
        t_tooltipId,
        t_transparencyEnabled,
        t_urlLayers,
        t_urlTransLayers,
        t_urlTrans) {

        this.m_treeView = t_treeView;
        if (this.m_treeView != null) { // Skal ikke ha treeview i Kartbestilling
            this.m_treeView.add_nodeChecked(this._nodeChecked.bind(this));
        }

        this.m_metaData = t_metaData;
        this.m_kartController = t_kartController;

        this.m_onWMSLayerToggled = this.m_eventManager.addEventType("onwmslayertoggled");
        this.m_onLayersToggled = this.m_eventManager.addEventType("onlayerstoggled");

        t_kartController.addMapElementEventListener(
                "annotation:mouseIn",
                function(e) {
                    var srcEl = e.srcelement ? e.srcelement : e.target;
                    srcEl.style.cursor = "pointer";
                });

        t_kartController.addMapElementEventListener(
                "annotation:mouseOut",
                function(e) {
                    var srcEl = e.srcelement ? e.srcelement : e.target;
                    srcEl.style.cursor = "";
                });

        if (t_tooltipId != "") {
            this.m_pois = $H(t_kartController.getPoiLayers());
            this.m_poiController = new POIController(this.m_pois,
                        t_tooltipId, true);
        }

        this.m_wmss = $H(t_kartController.getWmsResources());

        // Spesialhåndtering dersom oppstartslag er oppgitt med url-parametre
        if ($defined(t_urlLayers) && $defined(t_urlTransLayers)) {
            var t_trans = $defined(t_urlTrans) ? t_urlTrans : 8;

            var t_layers = t_urlLayers.split(",");
            var t_transLayers = t_urlTransLayers.split(",");

            var t_check = function(t_wmsLayer, t_wms) {
                var found = false;
                var i; t_length = t_layers.length;
                for (i = 0; i < t_length; i++) {
                    if (t_wmsLayer.name == t_layers[i]) {
                        t_wmsLayer.isSelected = true;
                        this._toggleWmsLayerBase(
                                t_wms,
                                t_wmsLayer);
                        found = true;
                        break;
                    }
                }

                if (!found) {
                    var j; t_length = t_transLayers.length;
                    for (j = 0; j < t_length; j++) {
                        if (t_wmsLayer.name == t_transLayers[j]) {
                            t_wmsLayer.isSelected = true;
                            this._toggleWmsLayerBase(
                                    t_wms,
                                    t_wmsLayer,
                                    t_trans);
                            break;
                        }
                    }
                }
            };

            var t_iterate = function(t_wms) {
                t_wms[1].layers.each(t_check.bindAsEventListener(this, t_wms[1]));
            };

            this.m_wmss.each(t_iterate, this);
        }
        // Default håndtering med oppstartslag definert i config
        else {
            var t_check = function(t_wmsLayer, t_wms) {
                if (t_wmsLayer.defaultSelected) {
                    t_wmsLayer.isSelected = true;
                    this._toggleWmsLayerBase(
                            t_wms,
                            t_wmsLayer);
                }
            };

            var t_iterate = function(t_wms) {
                t_wms[1].layers.each(t_check.bindAsEventListener(this, t_wms[1]));
            };

            this.m_wmss.each(t_iterate, this);
        }

        this.m_transparencyEnabled = t_transparencyEnabled;
    },

    ///Returns array of MapLayerNode-objects.
    getSelectedLayers: function(t_ofType) {
        t_ofType = $ifDefined(t_ofType, null);
        var t_toggledLayers = [];
        var t_selectedNodes = this.m_treeView.get_allNodes();
        var i, t_length = t_selectedNodes.length;
        for (i = 0; i < t_length; i++) {
            var t_node = t_selectedNodes[i]; //t_selectedNodes.getNode(i);
            var t_type = t_node.get_text();
            var t_id = t_node.get_value();
            var t_nodeMetaData = this.m_metaData[t_id];
            var t_selected = t_node.get_checked();

            if (t_selected &&
                (t_ofType == null ||
                t_ofType == t_type)) {
                t_toggledLayers.push(
                        new MapLayerNode(t_id, t_type, t_selected, t_nodeMetaData)
                    );
            }
        }
        return t_toggledLayers;
    },

    _nodeChecked: function(sender, eventArgs) {
        var t_toggledNode = eventArgs.get_node();
        var t_layerType = t_toggledNode.get_text();
        var t_toggledLayers = [];

        if (t_layerType == "category") {
            //Split string to get ids and get all metadata objects.

            var t_nodeCollection = t_toggledNode.get_nodes();
            var t_length = t_nodeCollection.get_count(), i;
            var t_pois = [];
            var t_wmss = [];
            for (i = 0; i < t_length; i++) {
                var t_node = t_nodeCollection.getNode(i);
                var t_type = t_node.get_text();
                var t_id = t_node.get_value();
                var t_nodeMetaData = this.m_metaData[t_id];
                if (t_type == "poi") {
                    t_pois.push(t_nodeMetaData.featureNumber);
                }
                else if (t_type == "wms") {
                    t_wmss.push(t_nodeMetaData.wmsName + ":" + t_nodeMetaData.id);
                }

                t_toggledLayers.push(
                        new MapLayerNode(t_id, t_type, t_node.get_checked(), t_nodeMetaData)
                    );
            }

            g_mapLayersController.toggleRadForCategory(t_pois.join(","), t_wmss.join(","), t_toggledNode.get_checked());
        }
        else {
            var t_nodeMetaData = this.m_metaData[t_toggledNode.get_value()];
            var t_type = t_toggledNode.get_text();
            var t_id = t_toggledNode.get_value();
            var t_checked = t_toggledNode.get_checked();

            if (t_layerType == "poi") {
                g_mapLayersController.toggleRadPOI(t_nodeMetaData.featureNumber, t_checked);
            }
            else if (t_layerType == "wms") {
                g_mapLayersController.toggleRadWmsLayer(t_nodeMetaData.wmsName, t_nodeMetaData.id, t_checked);
            }

            t_toggledLayers.push(
                    new MapLayerNode(t_id, t_type, t_checked, t_nodeMetaData)
                );
        }
        this.m_onLayersToggled.fire(t_toggledLayers);
    },

    addEventListener: function(/*string*/t_eventName, /*function*/t_listener) {
        this.m_eventManager.addEventListener(t_eventName, t_listener);
    },

    getPoiController: function() {
        return this.m_poiController;
    },

    getLayerNamesIds: function() {
        return this.m_layerNamesIds;
    },

    addLayerNameId: function(t_name, t_id) {
        this.m_layerNamesIds[this.m_layerNamesIds.length] = $H({ 'name': t_name, 'id': t_id })
    },

    resetMapLayers: function() {
        //reset Layer-ID-array
        this.m_layerNamesIds = [];
        var t_layers = this.m_kartController.getMap().getLayers();
        var t_layerids = [];
        //remove all layers of type "wms"
        var i, t_length = t_layers.length;
        for (i = 0; i < t_length; i++) {
            if (t_layers[i].type == "wms" || t_layers[i].type == "wmslayer") {
                t_layerids[t_layerids.length] = t_layers[i].id;
            }
        }

        var j, t_idlength = t_layerids.length;
        for (j = 0; j < t_idlength; j++) {
            this.m_kartController.getMap().removeLayer(t_layerids[j]);
        }
    },

    removeMapLayer: function(t_name) {
        var i, t_length = this.m_layerNamesIds.length;
        for (i = 0; i < t_length; i++) {
            if (this.m_layerNamesIds[i].get("name") == t_name) {
                this.m_kartController.getMap().removeLayer(this.m_layerNamesIds[i].get("id"));
                this.m_layerNamesIds.splice(i, 1);
                break;
            }
        }
    },

    getWmss: function() {
        return this.m_wmss;
    },

    getPois: function() {
        return this.m_pois;
    },

    getWmsFromLayerId: function(t_layerid) {
        var t_returnwms = null;

        var t_check = function(t_wmsLayer, t_wms) {
            if (t_wmsLayer.id == t_layerid) {
                t_returnwms = t_wms
            }
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check.bindAsEventListener(this, t_wms[1]));
        };

        this.m_wmss.each(t_iterate, this);

        return t_returnwms;
    },

    getWmsLayers: function() {
        var t_layers = new Array;

        var t_check = function(t_wmsLayer) {
            t_layers.push(t_wmsLayer);
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check, this);
        };

        this.m_wmss.each(t_iterate, this);
        return t_layers;
    },

    getCheckedWmsLayers: function() {
        var t_layers = new Array;

        var t_check = function(t_wmsLayer) {
            if (t_wmsLayer.isSelected) {
                t_layers.push(t_wmsLayer);
            }
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check, this);
        };

        this.m_wmss.each(t_iterate, this);
        return t_layers;
    },

    getCheckedWmsLayerIds: function() {
        var t_layers = new Array;

        var t_check = function(t_wmsLayer) {
            if (t_wmsLayer.isSelected) {
                t_layers.push(t_wmsLayer.id);
            }
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check, this);
        };

        this.m_wmss.each(t_iterate, this);
        return t_layers;
    },

    getCheckedWmsLayerNames: function() {
        var t_layers = new Array;

        var t_check = function(t_wmsLayer) {
            if (t_wmsLayer.isSelected) {
                t_layers.push(t_wmsLayer.name);
            }
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check, this);
        };

        this.m_wmss.each(t_iterate, this);
        return t_layers;
    },

    getWmsLayerNames: function() {
        var t_layers = new Array;

        var t_check = function(t_wmsLayer) {
            t_layers.push(t_wmsLayer.name);
        };

        var t_iterate = function(t_wms) {
            t_wms[1].layers.each(t_check, this);
        };

        this.m_wmss.each(t_iterate, this);
        return t_layers;
    },

    getInfoWMSLayers: function(t_wmsName) {
        var t_foundWms = null;
        var t_find = function(t_wms) {
            if (t_wms[1].name == t_wmsName) {
                t_foundWms = t_wms;
            }
        }

        this.m_wmss.each(t_find);
        var t_layers = [];

        if (t_foundWms != null) {
            var t_check = function(t_wmsLayer) {
                if (t_wmsLayer.isSelected || t_wmsLayer.gfiAlways) {
                    t_layers.push(t_wmsLayer.id);
                }
            };

            t_foundWms[1].layers.each(t_check);
        }
        return t_layers;
    },

    toggleRadForCategory: function(t_poicategories, t_wmslayers, t_checked) {
        // POI:        
        if (t_poicategories != "") {
            this.m_poiController.update(t_poicategories, t_checked);
        }

        // WMS:
        if (t_wmslayers != "") {
            var t_layers = t_wmslayers.split(",");
            var i, t_length = t_layers.length;
            for (i = 0; i < t_length; i++) {
                var t_ids = t_layers[i].split(":");
                g_mapLayersController.toggleRadWmsLayer(t_ids[0], t_ids[1], t_checked);
            }
        }
    },

    toggleRadPOI: function(t_category, t_checked) { //t_checkBoxID, t_type) {
        this.m_poiController.poiClicked(t_category, t_checked);
    },

    checkAndActivateWmsLayer: function(t_layerName) {
        if (!t_layerName == "") {
            var t_check = function(t_wmsLayer, t_wms) {
                if (!t_wmsLayer.isSelected && t_wmsLayer.name.indexOf(t_layerName) != -1) { //if (t_wmsLayer.name == t_layerName && !t_wmsLayer.isSelected) {
                    t_wmsLayer.isSelected = true;
                    this._toggleWmsLayerBase(
                            t_wms,
                            t_wmsLayer);
                    selectWmsNode(t_wmsLayer.id);
                }
            };

            var t_iterate = function(t_wms) {
                t_wms[1].layers.each(t_check.bindAsEventListener(this, t_wms[1]));
            };

            this.m_wmss.each(t_iterate, this);
        }
    },

    toggleRadWmsLayer: function(t_wmsName, t_layerId, t_checked) {
        var t_wms = this.m_wmss.get(t_wmsName);
        var t_layer;
        var i, t_length = t_wms.layers.length;
        for (i = 0; i < t_length; i++) {
            if (t_wms.layers[i].id == t_layerId) {
                t_layer = t_wms.layers[i];
            }
        }
        t_layer.isSelected = t_checked;
        this._toggleWmsLayerBase(
            t_wms,
            t_layer);
    },

    _toggleWmsLayerBase: function(t_wms, t_layerItem, t_trans) {
        var t_styles = "";

        if ($defined(t_trans)) {
            t_styles = "ALPHA:" + t_trans;
        }
        else if (g_transparencyController != null) {
            t_styles = "ALPHA:" + g_transparencyController.getSliderValue(t_layerItem.id);
        }

        var t_mapid;
        var i, t_nameidsLength = this.m_layerNamesIds.length;
        for (i = 0; i < t_nameidsLength; i++) {
            if (this.m_layerNamesIds[i].get("name") == t_layerItem.name) {
                t_mapid = this.m_layerNamesIds[i];
                break;
            }
        }
        if (t_layerItem.isSelected) {
            if (!$defined(t_mapid) || t_mapid == null) { //Create new layer.

                var t_request = new WMSRequest(
                    t_layerItem.tileRequests
                        ? this.m_kartController.getCacheUrl(t_wms, t_layerItem)
                        : t_wms.url,
                    t_layerItem.name,
                    null,
                    null,
                    t_styles,
                    t_layerItem.wmsVersion);
                var t_layer = new Layer(
                    {
                        'type': t_layerItem.tileRequests ? 'wms' : 'wmslayer',
                        'wmsrequest': t_request,
                        'visible': true,
                        'name': t_layerItem.title,
                        'zIndex': t_layerItem.zIndex,
                        'lowerBound': t_layerItem.lowerZoom,
                        'upperBound': t_layerItem.upperZoom
                    });
                var t_mapLayerId = this.m_kartController.getMap().addLayer(t_layer);
                this.addLayerNameId(t_layerItem.name, t_mapLayerId);
            }
            else //show layer.
            {
                this.m_kartController.getMap().showLayer(t_mapid.get("id"));
            }
        }
        else //hide layer.
        {
            this.m_kartController.getMap().hideLayer(t_mapid.get("id"));
        }
        this.m_onWMSLayerToggled.fire(t_wms, t_layerItem);
    }
}
