WMSMenu = Class.create();

WMSMenu.prototype =
{
    initialize : function(element,layers,overlay,overviewOverlay,options)
    {
       this.element = element;    
       this.imagePlus = 'images/plus.gif';
       this.imageMinus = 'images/minus.gif';
       this.imageInfo = 'images/goto.gif';
       this.checkHook = null;
       this.infoHook = null;
       this.waitDiv = null;
       this.layers = layers;
       this.overlay = overlay;
       this.queryMode = false;
       this.overviewOverlay = overviewOverlay;
        
       if(options)
       {
           if(options['imagePlus'])
           {
               this.imagePlus = options['imagePlus'];
           }
           if(options['imageMinus'])
           {
               this.imageMinus = options['imageMinus'];
           }
           if(options['queryMode'] != null)
           {
               this.queryMode = options['queryMode'];
           }
           if(options['waitDiv'])
           {
               this.waitDiv = options['waitDiv'];
           }
		   if(options['sublayerVisible'])
		   {
			   this.subLayersVisible = options['sublayerVisible'];
		   }
		   if(options['activeLayers'])
	       {
			   this.activeLayers = options['activeLayers'];
		   }
       }
	   this.started = true;
       
       if(typeof(this.element) == 'string')
       {
           this.element = $(this.element);
       } 
       var div = document.createElement("div");
       this.element.appendChild(div);
       this.element = div;
       
       this.repaint();
    },
    
    repaint: function()
    {   
        this.element.innerHTML = '';
        
        this.paintTree(this.layers);
    },
    
    paintTree : function(layer)
    {
        var lineDiv = document.createElement("div");
        
        for(var i = 0;i < layer.level;i++)   
        {
            lineDiv.appendChild(document.createTextNode('\u00a0\u00a0'));
        }
        
        if(layer.layers.length > 0)
        {
            var img = document.createElement('IMG');
                    
            var src = document.createAttribute('src');
            
            if(layer.subLayersVisible || this.subLayersVisible)
            {
                src.nodeValue = this.imageMinus;
                img.setAttributeNode(src);
				layer.subLayersVisible = true;
				this.subLayersVisible = false;
                Event.observe(img,'click',this.collapse.bindAsEventListener(this,layer));
            }
            else
            {
                src.nodeValue = this.imagePlus;
                img.setAttributeNode(src);
                Event.observe(img,'click',this.expand.bindAsEventListener(this,layer));
            }
            lineDiv.appendChild(img);
        }  
        else
        {
            lineDiv.appendChild(document.createTextNode('\u00a0\u00a0\u00a0'));
        }      
        
        var checkbox = document.createElement('input');
        checkbox.setAttribute("type","checkbox");
        lineDiv.appendChild(checkbox);     
        checkbox.checked = layer.active;
        checkbox.title = "Layer '" + unescape(layer.title) + "' ein-/ausblenden";
        Event.observe(checkbox,'click',this.clickHandlerCB.bindAsEventListener(this,layer));
      
        if(this.queryMode)
        {
            if(layer.queryable)
            {
                var checkbox1 = document.createElement('input');
                checkbox1.setAttribute("type","checkbox");
                lineDiv.appendChild(checkbox1);
                checkbox1.checked = layer.selectedForQuery;
                checkbox1.title = "Layer f\u00fcr Abfrage markieren";     
                Event.observe(checkbox1,'click',this.clickHandlerQueryCB.bindAsEventListener(this,layer));                
            }
            else
            {
                var checkbox2 = document.createElement('input');
                checkbox2.setAttribute("type","checkbox");
                lineDiv.appendChild(checkbox2);
                checkbox2.checked = false;
                checkbox2.disabled = "disabled";
            }
        }
        lineDiv.title = unescape(layer.title);
		
        lineDiv.appendChild(document.createTextNode('\u00a0' + unescape(layer.title).truncate(15, ' [...]') ));
        
        if(layer.level == 0)
        {
            if(parseFloat(layer.miny) <= 180.0 && parseFloat(layer.minx) <= 180.0 && parseFloat(layer.maxy) <= 180.0 && parseFloat(layer.maxx) <= 180.0)
            {
               var img = new Image();
               img.src = this.imageInfo;
               img.title = "Auf Ebene zoomen";
               lineDiv.appendChild(document.createTextNode('\u00a0'));
               lineDiv.appendChild(img);
               Event.observe(img,'click',this.clickHandlerInfo.bindAsEventListener(this,layer));     
            }
        }
        this.element.appendChild(lineDiv);
        
        for(var j = 0;j < layer.layers.length;j++)
        {
            if(layer.subLayersVisible || this.subLayersVisible)
            {
                this.paintTree(layer.layers[j]);
            }
        }
	/*	if ((layer.title == this.activeLayers) && (this.started == true)) {
			var evt = document.createEvent("MouseEvents");
			evt.initEvent("click", true, true);
			alert("Hier passiert's");
			//checkbox.dispatchEvent(evt);
			clickHandlerCB(evt,layer);
			alert("Event dran");
			this.started = false;
		}*/

        
        // Workaround fuer IE < v7 ...
        checkbox.checked = layer.active;
    },
    
    collapse : function(event,layer)
    {
	   layer.subLayersVisible = false;
	   this.repaint();
    },
    
    expand : function(event,layer)
    {
	   layer.subLayersVisible = true;
	   this.repaint();
    },
    
    clickHandlerCB : function(event,layer)
    {   
        var cb = Event.element(event);

        layer.active = cb.checked;

        // Wenn Layer aktiviert wird, dann alle Sublayer aktivieren
        if(layer.active)
        {
            this.toggleLayers(layer,true);
        }
        else
        {
            // erst alle Sublayer dieses Layers deaktivieren
            this.toggleLayers(layer,false);
            
            var parentLayer = this.getParentLayer(layer,this.layers);
            
            if(parentLayer)
            {
                var oneSelected = false;
                
                for(var i=0; i<parentLayer.layers.length; i++) 
                {
                	if(parentLayer.layers[i].active)
                	{
                	    oneSelected = true;
                	    break;
                	}
                }
                
                if(!oneSelected) parentLayer.active = false;
            }
        }

        this.repaint();

        if(this.checkHook)
        {
            this.checkHook(this.getLayerString(this.layers),layer,this.overlay,this.overviewOverlay);
        }
        
    },
    
    clickHandlerQueryCB : function(event,layer)
    {
        var cb = Event.element(event);
        layer.selectedForQuery = cb.checked;
    },
    
    clickHandlerInfo : function(event,layer)
    {
        if(this.infoHook)
        {   
            this.infoHook(layer);
        }
    },
    
    toggleLayers : function(layer,visible)
    {
        for(var i = 0;i < layer.layers.length;i++)
        {
            layer.layers[i].active = visible;
            this.toggleLayers(layer.layers[i],visible);
        }
    },
    
    subLayersActive : function(layer)
    {
        if(layer.layers.length == 0)
        {
            return layer.active;   
        }
        
        var ret;
        
        for(var i = 0;i < layer.layers.length;i++)
        {
            if(layer.layers[i].active) return true;
            ret = this.subLayersActive(layer.layers[i]);
        }
        
        return ret;
    },
    
    getParentLayer : function(layer,mylayers)
    {
        var ret = null;
        
        if(!mylayers) return ret;
        
        if(layer.level -1 == mylayers.level)
        {
            for(var i=0; i<mylayers.layers.length; i++) 
            {
            	if(mylayers.layers[i] == layer)
            	{
            	    ret = mylayers;
            	    break;
            	}
            }    
        }
        else
        {
            for(var j=0; j<mylayers.layers.length; j++) 
            {
            	ret = this.getParentLayer(mylayers.layers[j]);
            	
            	if(ret != null)
            	{
            	    break;
            	}
            }
        }
        
        return ret;
    },
    
    getLayerString : function(layer)
    {
        if(!this.subLayersActive(layer)) 
        {
            return "";
        }
        
        var result = "";
        var subLayerActive = false;  
        
        for(var i = 0;i < layer.layers.length;i++)
        {
            if(layer.layers[i].active)
            {
                subLayerActive = true;
                break;
            }
        }
        
        if(subLayerActive)
        {
            for(var i = 0;i < layer.layers.length;i++)
            {      
                var tmp = this.getLayerString(layer.layers[i]);
                if(tmp != "")
                {
                    if(result != "") result += ",";
                    result += tmp; 
                }
            }
        }
        else
        {
            if(result != "") result += ",";
            result += layer.name;
        }
        
        return result;
    },
    
    getEncodedLayers : function()
    {
        var ret = "";
        
        if(this.layers.active || this.subLayersActive(this.layers))
        {
            ret += "[" + this._getEncodedLayers(this.layers) + "]";
        }
        
        return ret;
    },
    
    _getEncodedLayers : function(layer)
    {
         var ret = "";
         
         if(layer.active)
         {
             ret += '"' + layer.name + '"';
         }

         for(var j = 0; j < layer.layers.length;j++)
         {
             if(layer.layers[j].active)
             {   
                 if(ret != "") ret += ",";
                 ret += this._getEncodedLayers(layer.layers[j]);
             }
         }
        
         return ret;
    },
    
    setEncodedLayers : function(encodedArray)
    {          
        this._setEncodedLayers(encodedArray,this.layers);
         
        this.repaint();
        
        if(this.checkHook)
        {
            this.checkHook(this.getLayerString(this.layers),this.layers,this.overlay,this.overviewOverlay);
        }
    },
    
    _setEncodedLayers : function(encodedArray,layer)
    {
        if(encodedArray.indexOf(layer.name) > -1)
        {
             layer.active = true; 
        }
        
        for(var i = 0;i < layer.layers.length;i++)
        {
            this._setEncodedLayers(encodedArray,layer.layers[i]);
        }
    },
    
    getFeatureInfoString : function(layer)
    {
        var result = "";
        
        if(layer.selectedForQuery)
        {
            result = layer.name;
        }
        
        if(layer.layers)
        {
            for(var i = 0;i < layer.layers.length;i++)
            {      
                var tmp = this.getFeatureInfoString(layer.layers[i]);
                if(tmp != "")
                {
                    if(result != "") result += ",";
                    result += tmp; 
                }
            }
        }
        
        return result;
    },
    
    registerCheckboxHook : function(pointer)
    {
        this.checkHook = pointer;
    },
    
    unregisterCheckboxHook : function()
    {
        this.checkHook = null;
    },
    
    registerInfoHook : function(pointer)
    {
        this.infoHook = pointer;
    },
    
    unregisterInfoHook : function()
    {
        this.infoHook = null;
    },
    
    showWaitDiv : function()
    {
        if(this.waitDiv)
        {
            Element.show(this.waitDiv);
        }
    },
    
    hideWaitDiv : function()
    {
        if(this.waitDiv)
        {
            Element.hide(this.waitDiv);
        }
    }

}

