﻿function LayersManager(mapOfLayers) {
    var map = mapOfLayers;
    var layers = [];

    this.addLayer = function(uniqueKeyOfLayer, layerToAdd) {
        layers[uniqueKeyOfLayer] = layerToAdd;
        if (!arrayContains(map.layers, layerToAdd))
            map.addLayer(layerToAdd);
    }

    this.addLayers = function(layerArrayToAdd) {
        for (var key in layerArrayToAdd) {
            this.addLayer(key, layerArrayToAdd[key]);
        }
    }

    this.removeLayer = function(layerToRemove) {
        removeFromArray(layers, layerToRemove);
        clearPopups(layerToRemove);
        map.removeLayer(layerToRemove);
        clearPopups(layerToRemove);
        layerToRemove.destroy();
    }

    this.hideLayer = function(layer) {
        clearPopups(layer);
        map.removeLayer(layer);
        clearPopups(layer);
    }

    this.hideLayerByKey = function(layerKey) {
        var layer = this.getLayer(layerKey);
        this.hideLayer(layer);
    }

    this.showLayerByKey = function(layerKey) {
        var layer = this.getLayer(layerKey);
        map.addLayer(layer);
    }

    this.removeLayerByKey = function(uniqueKeyOfLayer) {
        var layerToRemove = this.getLayer(uniqueKeyOfLayer);
        this.removeLayer(layerToRemove);
    }

    this.getLayer = function(uniqueKeyOfLayer) {
        for (var layerKey in layers) {
            if (layerKey == uniqueKeyOfLayer)
                return layers[layerKey]
        }
        return null;
    }

    this.getFeature = function(id, keyOfOwnerLayer) {
        var ownerLayer = this.getLayer(keyOfOwnerLayer)

        for (var index in ownerLayer.features) {
            if (ownerLayer.features[index].attributes[initializator.layerPrimaryKeys[keyOfOwnerLayer]].toString() == id)
                return ownerLayer.features[index];
        }
        return null;
    }

    this.setLayerVisibility = function(layerKey, display) {
        var layer = this.getLayer(layerKey);
        if (layer) {
            displays[layerKey] = display;
            layer.display(display);
        }
    }

    this.addFeature = function(feature, keyOfOwnerLayer) {
        this.getLayer(keyOfOwnerLayer).addFeatures(feature);
    }

    this.removeFeature = function(feature, keyOfOwnerLayer) {

        if (feature != null) {
            this.getLayer(keyOfOwnerLayer).removeFeatures(feature);
            if (feature.popup != null)
                map.removePopup(feature.popup);
        }
    }

    this.removeFeatureById = function(id, keyOfOwnerLayer) {
        this.removeFeature(this.getFeature(id, keyOfOwnerLayer), keyOfOwnerLayer);
    }

    this.containsFeature = function(feature, keyOfOwnerLayer) {
        return arrayContains(this.getLayer(keyOfOwnerLayer).features, feature);
    }

    this.registerEvent = function(eventName, keyOfLayer, functionDelegate) {
        this.getLayer(keyOfLayer).events.register(eventName, this.getLayer(keyOfLayer), functionDelegate);
    }

    this.unRegisterEvent = function(eventName, keyOfLayer, functionDelegate) {
        this.getLayer(keyOfLayer).events.unregister(eventName, this.getLayer(keyOfLayer), functionDelegate);
    }

    this.getFeatureCount = function(layerKey) {
        return this.getLayer(layerKey).features.length;
    }

    this.clearLayer = function(layerKey) {
        var layer = this.getLayer(layerKey);
        layer.removeFeatures(layer.features);
        clearPopups(layer);
    }

    function clearPopups(layerToClear) {
        for (var index in layerToClear.features) {
            if (layerToClear.features[index].popup != null)
                map.removePopup(layerToClear.features[index].popup);
        }
    }

    this.contains = function(keyOfLayer) {
        return this.getLayer(keyOfLayer) != null && this.getLayer(keyOfLayer) != undefined && arrayContains(map.layers, this.getLayer(keyOfLayer));
    }

    function getLayerKey(layer) {
        for (var index in layers) {
            if (layers[index] == layer)
                return index;
        }
    }
    
    
}
