var markerLayers = [];

function setMarkerLayer(id, name, icon)
{
    markerLayers[markerLayers.length] = {
        id: id,
        name: name,
        icon: icon,
        inputElem: document.getElementById("layer_" + id),
        layer: null
    };
}

OpenLayers.Control.OrgLayers = OpenLayers.Class(OpenLayers.Control, {

    activeColor: "darkblue",

    layerStates: null,

    layersDiv: null,

    ascending: true,

    initialize: function(options)
    {
        OpenLayers.Control.prototype.initialize.apply(this, arguments);
        this.layerStates = [];
    },

    setMap: function(map)
    {
        OpenLayers.Control.prototype.setMap.apply(this, arguments);
        this.map.events.on({
            "addlayer": this.redraw,
            "changelayer": this.redraw,
            "removelayer": this.redraw,
            "changebaselayer": this.redraw,
            scope: this
        });
    },

    draw: function()
    {
        OpenLayers.Control.prototype.draw.apply(this);
        this.layersDiv = document.getElementById("layersDiv");
        this.redraw();
        return this.div;
    },

    checkRedraw: function()
    {
        var redraw = false;
        if (markerLayers.length != this.layerStates.length) {
            redraw = true;
        } else {
            for (var i=0; i < this.layerStates.length; i++) {
                if (! markerLayers[i].inputElem) {
                    continue;
                }
                if (this.layerStates[i] != markerLayers[i].inputElem.checked) {
                    redraw = true;
                    break;
                }
            }
        }
        return redraw;
    },

    redraw: function()
    {
        if (! this.checkRedraw()) {
            return this.div;
        }
        this.layerStates = new Array(markerLayers.length);
        for (var i = 0; i < markerLayers.length; i++) {
            if (markerLayers[i].inputElem) {
                this.layerStates[i] = markerLayers[i].inputElem.checked;
            }
        }
        this.updateMap();
        return this.div;
    },

    onInputClick: function(e)
    {
        this.updateMap();
        OpenLayers.Event.stop(e);
    },

    updateMap: function()
    {
        for(var i = 0; i < markerLayers.length; i++) {
            if (! markerLayers[i].inputElem) {
                if (null == markerLayers[i].layer) {
                    this.layerActivate(i);
                }
                continue;
            }
            if (markerLayers[i].inputElem.checked && null == markerLayers[i].layer) {
                this.layerActivate(i);
            }
            if (markerLayers[i].inputElem.checked) {
                markerLayers[i].layer.setVisibility(true);
            } else if (null != markerLayers[i].layer) {
                markerLayers[i].layer.setVisibility(false);
            }
        }
    },

    layerActivate: function(layerKey)
    {
        markerLayers[layerKey].layer = new OpenLayers.Layer.PointsLayer(
            markerLayers[layerKey].name,
            {
                popupSize: new OpenLayers.Size(150, 130),
                iconSize: new OpenLayers.Size(20, 20)
            }
        );
        JsHttpRequest.query(
            "/scripts/ajax/orgsPoints",
            {type_id: markerLayers[layerKey].id, layer_key: layerKey},
            function(result, errors)
            {
                if (result["points"]) {
                    var point;
                    for (var i = 0; i < result["points"].length; i++) {
                        point = result["points"][i];
                        markerLayers[result["key"]].layer.dataToMarker(
                            new OpenLayers.Geometry.Point(point["x"], point["y"]),
                            markerLayers[result["key"]].icon,
                            point["name"],
                            point["description"],
                            point["link"],
                            point["gallery"]
                        );
                    }
                }
                return false;
            },
            false
        );
        this.map.addLayer(markerLayers[layerKey].layer);
        this.map.setLayerIndex(markerLayers[layerKey].layer, layerKey);
    },

    CLASS_NAME: "OpenLayers.Control.OrgLayers"
});

var controlLayers = new OpenLayers.Control.OrgLayers();

function redrawLayers()
{
    if (map) {
        controlLayers.redraw();
    }
}
