
/**
 * @requires core/Control.js
 */

/**
 * Class: eGV.Control.BaseLayersSwitcher
 * Create a layer manager to change the visibility between base layers.
 *
 * Inherits from:
 *  - <eGV.Control>
 */
eGV.Control.BaseLayerSwitcherCustom = OpenLayers.Class(eGV.Control,{

    /**
     * APIProperty: Div object
     * {<String>}
     */
    div: null,

    /**
     * APIProperty: Base layers or layers groups
     * {[<eGV.Layers>] || [<eGV.LayersGroup]}
     */
    bases: null,


    /**
     * APIProperty: Active base layer or group layer by default
     * {<String>}
     */
    activeBase: null,


    /**
     * APIProperty: Button for none
     * {<String>}
     */
    none: false,

    /**
     * Constructor: eGV.Control.BaseLayerSwitcher
     */
    initialize: function(div, options){

        this.displayClass = this.CLASS_NAME.replace("eGV.", "egv").replace(/\./g, "");

        //Set container
        this.div = document.getElementById(div);
        if (!this.div) return false;

        OpenLayers.Element.addClass(this.div, this.displayClass);

        OpenLayers.Util.extend(this, options);

        eGV.Control.prototype.initialize.apply(this);

        //Set map
        this.setMap();

        if (!(this.bases) || !(this.bases.length > 0)) return false;

        this.div.style.zIndex = this.map.Z_INDEX_BASE['Control'] + this.map.controls.length + 1;

        this.draw();

        // we need to hear the redraw event for the connections of the base layers
        // in order to refresh the base layer accordingly
        this.hearConnections();

        return this.div;

    },

    /**
     * Method: destroy
     */
    destroy: function() {

        eGV.Control.prototype.destroy.apply(this, arguments);
    },

    /**
     * Method: setMap
     *
     * Properties:
     */
    setMap: function(map) {
        eGV.Control.prototype.setMap.apply(this, arguments);
    },

    /**
     * Method: hearConnections
     *
     * Choose the connection to hear, it calls one method depending
     * if bases is an array of Layers or LayersGroup.
     * After the connections are choosen, it hears the events.
     */
    hearConnections: function() {

        var connections = new Array();

        if (this.bases[0].CLASS_NAME == "eGV.Layer") {
            connections = this.hearLayersConnections();
        } else if (this.bases[0].CLASS_NAME == "eGV.LayersGroup") {
            connections = this.hearLayersGroupsConnections();
        }
        //hear all the chosen connections
        for(i=0, len=connections.length; i<len; i++) {
            connections[i].events.register("redrawn", this, this.refresh);
        }
    },


    /**
     * Method: hearLayersConnections
     *
     * Choose the connection to hear, it calls one method depending
     * if bases is an array of Layers or LayersGroup.
     * After the connections are choosen, it hears the events.
     */
    hearLayersConnections: function() {
        var i;
        var connectionsId = new Array();
        var connections = new Array();
        for (i = 0, len = this.bases.length; i < len; i++) {
            if (OpenLayers.Util.indexOf(connectionsId,this.bases[i].connection.id) == -1) {
                connectionsId.push(this.bases[i].connection.id);
                connections.push(this.bases[i].connection);
            }
        }
        return connections;

    },

    /**
     * Method: hearLayersGroupsConnections
     *
     * Choose the connection to hear, it calls one method depending
     * if bases is an array of Layers or LayersGroup.
     * After the connections are choosen, it hears the events.
     */
    hearLayersGroupsConnections: function() {
        var i,j;
        var connectionsId = new Array();
        var connections = new Array();
        for (i = 0, len = this.bases.length; i < len; i++) {
            for (j = 0, lenj = this.bases[i].layers.length; j < lenj; j++) {
                if (OpenLayers.Util.indexOf(connectionsId,this.bases[i].layers[j].connection.id) == -1) {
                    connectionsId.push(this.bases[i].layers[j].connection.id);
                    connections.push(this.bases[i].layers[j].connection);
                }
            }
        }
        return connections;
    },

    /**
     * Method: draw
     *
     * Draw the base layers or group of layers.
     */
    draw: function(){
        
        if (this.bases[0].CLASS_NAME == "eGV.Layer") {
            this.drawBaseLayers();
        } else if (this.bases[0].CLASS_NAME == "eGV.LayersGroup") {
            this.drawBaseGroupLayers();
        } else {
            return false;
        }
        if (this.none == true){
            var noneSwitcher = document.createElement("div");
            noneSwitcher.id = "egvControlBaseLayersSwitcherNone"
            noneSwitcher.className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherInactive";
            OpenLayers.Event.observe(noneSwitcher, "click", OpenLayers.Function.bindAsEventListener(this.clearBackground, this));
            var noneText = document.createTextNode("Cap");
            noneSwitcher.appendChild(noneText);
            this.div.appendChild(noneSwitcher);
        }
        return true;
    },

    /**
     * Method: clearBackground
     *
     * Clears background images.
     */
    clearBackground: function(){
        var map = this.map;
        map.getGroup("fonsOrto").changeDisplayed(false);
        map.getGroup("fonsTopo").changeDisplayed(false);

        this.refresh();
    },
    /**
     * Method: drawBaseGroupLayers
     *
     * Draw the base group of layers.
     */
    drawBaseGroupLayers: function() {
        var divSwitcher;
        this.divSwitchers = new Array();
        for (var i = 0; i < this.bases.length; i++) {

            var divSwitcher = document.createElement("div");
            if (this.activeBase.id == this.bases[i].id) {
                divSwitcher.className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherActive";
                this.bases[i].changeDisplayed(true);
            } else {
                divSwitcher.className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherInactive";
                this.bases[i].changeDisplayed(false);
            }
            divSwitcher.innerHTML = this.bases[i].title;
            this.divSwitchers.push(divSwitcher);

            OpenLayers.Event.observe(divSwitcher, "click", OpenLayers.Function.bindAsEventListener(this.switchBaseGroupLayers, {
                "base": this.bases[i],
                "divSwitcher":divSwitcher,
                "bases": this.bases,
                "divSwitchers":this.divSwitchers
            }) );
						
            //he afegit aquest if per problemes amb els grups de capes definits.
            if (this.div.childNodes.length < 2 ){
                this.div.appendChild(divSwitcher);
            }
        }
    },

    /**
     * Method: drawBaseLayers
     *
     * Draw the base layers.
     */
    drawBaseLayers: function() {

        var divSwitcher;
        this.divSwitchers = new Array();
        for (var i = 0; i < this.bases.length; i++) {

            divSwitcher = document.createElement("div");
            if (this.activeBase.id == this.bases[i].id) {
                divSwitcher.className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherActive";
                this.bases[i].changeDisplayed(true);
            } else {
                divSwitcher.className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherInactive";
                this.bases[i].changeDisplayed(false);
            }

            divSwitcher.innerHTML = this.bases[i].title;
            this.divSwitchers.push(divSwitcher);

            OpenLayers.Event.observe(divSwitcher, "click", OpenLayers.Function.bindAsEventListener(this.switchBaseLayers, {
                "base": this.bases[i],
                "divSwitcher":divSwitcher,
                "bases": this.bases,
                "divSwitchers":this.divSwitchers
            }) );

            this.div.appendChild(divSwitcher);

        }

    },

    /**
    * Method: switchBaseGroupLayers
    * Once the baseLayerSwitcher is clicked, this method changed the visibility
    * of the layersGroup
    *
    * Parameters:
    * e - {<OpenLayers.Event>} the event that triggers this function
    *
    */
    switchBaseGroupLayers: function(e) {
        for (var i = 0; i < this.bases.length; i++) {
            if (this.bases[i].id == this.base.id ) {
                this.base.changeDisplayed(true);
                this.base.layers[0].map.setBaseLayer(this.base.layers[0].connection.olLayer);
            } else {
                this.bases[i].changeDisplayed(false);
            }
        }

    },

    /**
    * Method: switchBaseLayers
    * Once the baseLayersSwitcher is clicked, this method changed the visibility
    * of the layers
    *
    * Parameters:
    * e - {<OpenLayers.Event>} the event that triggers this function
    *
    */
    switchBaseLayers: function(e) {
        for (var i = 0; i < this.bases.length; i++) {
            if (this.bases[i].id == this.base.id ) {
                this.base.changeDisplayed(true);
                this.base.connection.map.setBaseLayer(this.base.connection.olLayer);
            } else {
                this.bases[i].changeDisplayed(false);
            }
        }

    },


    /**
    * Method: refresh
    * When the visibility of one of the layers is changed (this method is previously
    * call because the control hears a change in the connection), it refresh the
    * control

    */
    refresh: function() {
        var noBackground = true;

        for (var i = 0; i < this.bases.length; i++) {
            if (this.bases[i].isVisible()) {
                this.divSwitchers[i].className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherActive";
                noBackground = false;
            } else {
                this.divSwitchers[i].className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherInactive";
            }
        }
        if (document.getElementById("egvControlBaseLayersSwitcherNone")){
            if (noBackground == true){
                document.getElementById("egvControlBaseLayersSwitcherNone").className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherActive";
            }else{
                document.getElementById("egvControlBaseLayersSwitcherNone").className = "egvControlBaseLayersSwitcherElems egvControlBaseLayersSwitcherInactive";
            }
        }

       

    },


    CLASS_NAME: "eGV.Control.User.BaseLayerSwitcher"
});
