//Capa personalizada
function WVCustomLayer()
{
    var Id="";
    var oThis = this;
    var panel = null;
    var viewer = null;
    var visible = false;
    
    var autoClean = true;
    var allScaleVisible = true; //indica si la capa se verá a cualquier escala
    var maxScale = 1; //escala máxima a la que se verá la capa
    var queryRefresh;
    var numLayersBehind = 0; // número de capas que existen debajo de ésta
    var lstItems = new Array();//items agregados a la capa
    
    this.init = function(webviewer, idLayer)
    {
        viewer = webviewer;
        Id=idLayer;
        numLayersBehind = viewer.getSystemLayers().length;
        numLayersBehind = viewer.getCustomLayers().length > 0 ? numLayersBehind + viewer.getCustomLayers().length - 1 : numLayersBehind;
        setupPanel();
        viewer.subscribeEvent(WVEventType.CHANGE_SCALE, oThis.onChangeScale);
        queryRefresh=true;
        visible=true;
    }
    
    //Establece si se eliminará el contenido de la capa de forma automática (por cambio de escala, repintado, etc.)
    this.setAutoClean=function(auto)
    {
        autoClean = auto;
    }
    
    this.getID=function()
    {
        return Id;
    }
    
    this.setAllScaleVisible=function(ver)
    {
        allScaleVisible=ver;
    }
    
    this.setScaleMaxVisible=function(s)
    {
        maxScale = s;
    }
    
    this.setVisible=function(ver)
    {        
        visible = ver;
        if (!visible)
        {
            panel.style.visibility= "hidden";
        }
        else
        {
            queryRefresh=true;
        }
    }
    
    this.getVisible=function()
    {
        return visible;
    }
    
    this.getLayerType=function()
    {
        return WVLayerType.CUSTOM;
    }
    
    this.getContainer=function()
    {
        return panel;
    }
    
    //notificación de redimensionado
    this.onResize=function()
    {
        panel.style.width=viewer.getWidth();
        panel.style.height=viewer.getHeight();
        panel.style.left=0;
        panel.style.top=-viewer.getHeight()*numLayersBehind;
        queryRefresh=true;
    }
    
    //Refresca la vista
    this.refresh = function ()
    {
        queryRefresh=true;
    }
    
    //elimina todo el contenido de la capa
    this.clear=function()
    {
        //limpia elementos gráficos
        clearLayer();
        
        //elimina items de la lista
        var n = lstItems.length;
        for (var i=n;i>=0;i--)
        {
            lstItems.splice(i,1);
        }
    }
    
    //Libera recursos
    this.dispose = function ()
    {
        disposeAll();
    }
    
    this.getItems=function()
    {
        return lstItems;
    }
    
    this.setItems=function(lst)
    {
        lstItems=lst;
    }
    
    //agrega un nuevo item al panel
    this.addItem=function(obj, utmX, utmY)
    {
        if (obj.style.width=="" || obj.style.height=="")
        {
            obj.style.width=obj.width;
            obj.style.height=obj.height;
        }
        obj.setAttribute("utmX",utmX);
        obj.setAttribute("utmY",utmY);
        obj.style.position="absolute";
        lstItems.push(obj);
        queryRefresh=true;
    }    
    
    //Scrolling de Tiles en base a un vector de desplazamiento
    this.onUpdate = function (offset)
    {
        if (visible)
        {
            if (queryRefresh)
            {
                refreshAll();
                queryRefresh=false;
                return;
            }
            
            if (!allScaleVisible && viewer.getScale()>maxScale)
            {
                panel.style.visibility= "hidden";
                return;
            }
            else
            {
                panel.style.visibility= "visible";
            }
            
            if (offset.x!=0 || offset.y!=0)
            {
                //Scrolling de la capa
                panel.style.left = parseInt(panel.style.left) + offset.x;
                panel.style.top = parseInt(panel.style.top) + offset.y;
            }
        }
    }
    
    this.onRedock=function()
    {
        panel.style.visibility = "hidden";
        visible=true;
        queryRefresh=true;
    }
    
    this.onChangeScale = function()
    {        
        queryRefresh=true;
    }
    
    function refreshAll()
    {
        if (autoClean) clearLayer();
        
        //recoloca panel
        panel.style.top= - viewer.getHeight() * numLayersBehind;
        panel.style.left=0;
        
        var n = lstItems.length;
        for(var i=0;i<n;i++)
        {
            var utmX = lstItems[i].getAttribute("utmX");
            var utmY = lstItems[i].getAttribute("utmY");
            addItemToPanel(lstItems[i], utmX, utmY);
        }
    }
    
    function addItemToPanel(obj, utmX, utmY)
    {
        var pos = viewer.transformWorldToLocal(utmX,utmY);
        obj.style.top =pos.y - (parseInt(obj.style.height) >> 1);
        obj.style.left=pos.x - (parseInt(obj.style.width)  >> 1);
        panel.appendChild(obj);
    }
    
    function disposeAll()
    {
        viewer.unsubscribeEvent(WVEventType.CHANGE_SCALE, oThis.onChangeScale);
        clearLayer();
    }
    
    //limpia la capa y contenido asociado
    function clearLayer()
    {
        //elimina iconos del panel
        var n=panel.childNodes.length-1;
        for (var j=n;j>=0;j--)
        {
            var tile = panel.childNodes[j];
            panel.removeChild(tile);
        }
        panel.innerHTML="";
    }
    
    //Crea panel contenedor de iconos
    function setupPanel(width, height)
    {
        panel = document.createElement('DIV');
        panel.style.width=viewer.getWidth();
        panel.style.height=viewer.getHeight();
        panel.style.position="relative";
        panel.style.top=-viewer.getHeight()*numLayersBehind;
        panel.style.left=0;
        panel.style.display="block";
        panel.style.zIndex = viewer.getZIndexBase() + 20;
    }
}