OpenLayers.Control.LayerSwitcher.prototype.maximizeControl = function(e) {
    //HACK HACK HACK - find a way to auto-size this layerswitcher
    this.div.style.width = "20em";
    this.div.style.height = "";

    this.showControls(false);
    
    this.layerStates = [];
    this.redraw();

    if (e != null) {
        OpenLayers.Event.stop(e);                                            
    }
}


/*
 * This is a redefinition of the OpenLayers LayerSwitcher redraw function
 * to support calling an external function when adding layers to the 
 * layerswitcher. This is used in AfricaMap.js to add the opacity sliders
 * to the LayerSwitcher.
 */
OpenLayers.Control.LayerSwitcher.prototype.redraw = function () {
    //if the state hasn't changed since last redraw, no need 
    // to do anything. Just return the existing div.
    if (!this.checkRedraw()) { 
        return this.div; 
    } 

    //clear out previous layers 
    this.clearLayersArray("base");
    this.clearLayersArray("data");
    
    var containsOverlays = false;
    var containsBaseLayers = false;
    
    // Save state -- for checking layer if the map state changed.
    // We save this before redrawing, because in the process of redrawing
    // we will trigger more visibility changes, and we want to not redraw
    // and enter an infinite loop.
    this.layerStates = new Array(this.map.layers.length);
    for (var i = 0; i < this.map.layers.length; i++) {
        var layer = this.map.layers[i];
        this.layerStates[i] = {
            'name': layer.name, 
            'visibility': layer.visibility,
            'inRange': layer.inRange,
            'id': layer.id
        };
    }    

    var layers = this.map.layers.slice();
    if (!this.ascending) { layers.reverse(); }
    for( var i = 0; i < layers.length; i++) {
        var layer = layers[i];
        var baseLayer = layer.isBaseLayer;

        if (layer.displayInLayerSwitcher) {

            if (baseLayer) {
                containsBaseLayers = true;
            } else {
                containsOverlays = true;
            }    

            // only check a baselayer if it is *the* baselayer, check data
            //  layers if they are visible
            var checked = (baseLayer) ? (layer == this.map.baseLayer)
                                      : layer.getVisibility();

            var layerDiv = document.createElement("div"); 
            layerDiv.id = this.id+"_layerDiv_"+layer.id;
            layerDiv.className = "olControlLayerSwitcherLayerDiv";

            // create input element
            var inputElem = document.createElement("input");
            inputElem.id = "input_" + layer.name;
            inputElem.name = (baseLayer) ? "baseLayers" : layer.name;
            inputElem.type = (baseLayer) ? "radio" : "checkbox";
            inputElem.value = layer.name;
            inputElem.checked = checked;
            inputElem.defaultChecked = checked;

            if (!baseLayer && !layer.inRange) {
                inputElem.disabled = true;
            }
            var context = {
                'inputElem': inputElem,
                'layer': layer,
                'layerSwitcher': this
            };
            OpenLayers.Event.observe(inputElem, "mouseup", 
                OpenLayers.Function.bindAsEventListener(this.onInputClick,
                                                        context)
            );
            
            // create span
            var labelSpan = document.createElement("span");
            if (!baseLayer && !layer.inRange) {
                labelSpan.style.color = "gray";
            }
            labelSpan.innerHTML = layer.name;
            labelSpan.style.verticalAlign = (baseLayer) ? "bottom" 
                                                        : "baseline";
            OpenLayers.Event.observe(labelSpan, "click", 
                OpenLayers.Function.bindAsEventListener(this.onInputClick,
                                                        context)
            );
            
            var groupArray = (baseLayer) ? this.baseLayers
                                         : this.dataLayers;
            groupArray.push({
                'layer': layer,
                'inputElem': inputElem,
                'labelSpan': labelSpan
            });
                                                 
     
            var groupDiv = (baseLayer) ? this.baseLayersDiv
                                       : this.dataLayersDiv;
            
            layerDiv.appendChild(inputElem);
            layerDiv.appendChild(labelSpan);
            groupDiv.appendChild(layerDiv);
            
            this.layerRenderAdditional(layerDiv, layer); 
        }
    }

    // if no overlays, dont display the overlay label
    this.dataLbl.style.display = (containsOverlays) ? "" : "none";        
    
    // if no baselayers, dont display the baselayer label
    this.baseLbl.style.display = (containsBaseLayers) ? "" : "none";        

    
    return this.div;
};

