Menu = Class.create();

Menu.prototype = 
{
    initialize: function(element, options)
    {
        this.element = element;
        this.categories = new Array();
        this.categoriesUrl = '';
        this.categoriesParams = '';
        this.imagePlus = 'images/plus.gif';
        this.imageMinus = 'images/minus.gif';
        this.imageInfo = 'images/auge16.gif';
        this.selectable = false;
        this.queryable = false;
        this.checkHook = null;
        this.infoHook = null;
        this.searchHook = null;
        this.loadedListener = null;
        this.paintListener = null;
        this.loadedCats = new Array();
        this.waitDiv = null;
        this.search = true;
        this.imageSearch = 'images/info_search.gif';
        this.guid = Math.round(10000 * Math.random());
        
        if (options['categoriesUrl']) 
        {
            this.categoriesUrl = options['categoriesUrl'];
        }
        
        if (options['categoriesParams']) 
        {
            this.categoriesParams = options['categoriesParams'];
        }
        
        if (options['imagePlus']) 
        {
            this.imagePlus = options['imagePlus'];
        }
        if (options['imageMinus']) 
        {
            this.imageMinus = options['imageMinus'];
        }
        if (options['selectable']) 
        {
            this.selectable = options['selectable'];
        }
        if (options['queryable']) 
        {
            this.queryable = options['queryable'];
        }
        if (options['imageInfo']) 
        {
            this.imageInfo = options['imageInfo'];
        }
        if (options['search']) 
        {
            this.search = options['search'];
        }
        if (options['tooltipObject']) 
        {
            this.tooltipObject = options['tooltipObject'];
        }
        
        
        if (typeof(this.element) == 'string') 
        {
            this.element = $(this.element);
        }
        
        this.updateCategories();
    },
    
    updateCategories: function()
    {
        var myAjax = new Ajax.Request(this.categoriesUrl, 
        {
            method: 'POST',
            parameters: this.categoriesParams,
            onSuccess: this.callbackUpdateCategories.bind(this),
            onLoading: this.showWaitDiv.bind(this),
            onLoaded: this.hideWaitDiv.bind(this),
            onFailure: this.hideWaitDiv.bind(this)
        });
    },
    
    callbackUpdateCategories: function(request)
    {
        if (debug) 
            GLog.write(request.responseText);
        this.categories = eval('(' + request.responseText + ')');
        
        this.repaint();
        
        if (this.loadedListener) 
        {
            this.loadedListener();
        }
    },
    
    repaint: function()
    {
        this.showWaitDiv();
        this.element.innerHTML = '';
        
        for (var i = 0; i < this.categories.length; i++) 
        {
            var cat = this.categories[i];
            
            var img = document.createElement('IMG');
            img.id = this.guid + "handleCat" + cat.catId;
            var src = document.createAttribute('src');
            src.nodeValue = this.imagePlus;
            img.setAttributeNode(src);
            img.id = this.guid + "colCat" + cat.catId;
            Event.observe(img, 'click', this.collapse.bindAsEventListener(this, cat));
            this.element.appendChild(img);
            
            var checkbox2 = document.createElement('input');
            checkbox2.setAttribute("id", this.guid + "cbCat" + cat.catId);
            var iType = document.createAttribute('type');
            iType.nodeValue = 'checkbox';
            checkbox2.setAttributeNode(iType);
            checkbox2.checked = cat.catSelected;
            
            Event.observe(checkbox2, 'click', this.selectAllByClick.bindAsEventListener(this, cat));
            
            this.element.appendChild(checkbox2);
            
            this.element.appendChild(document.createTextNode('\u00a0' + unescape(cat.catName)));
            
            this.element.appendChild(document.createElement('BR'));
            
            var subCatDiv = document.createElement('SPAN');
            subCatDiv.style.display = "none";
            subCatDiv.id = this.guid + "sCDiv" + cat.catId;
            
            for (var j = 0; j < cat.subCats.length; j++) 
            {
                var line = document.createElement("DIV");
                line.style.width = "400px";
                line.style.verticalAlign = "middle";
                line.style.marginTop = "1px";
                line.style.marginLeft = "22px";
                
                if (this.selectable) 
                {
                    var checkbox = document.createElement('input');
                    
                    var iType = document.createAttribute('type');
                    
                    iType.nodeValue = 'checkbox';
                    checkbox.setAttributeNode(iType);
                    
                    line.appendChild(checkbox);
                    checkbox.checked = cat.subCats[j].subCatSelected;
                    checkbox.id = this.guid + "handleSubCat" + cat.subCats[j].subCatId;
                    Event.observe(checkbox, 'click', this.clickHandlerCBByClick.bindAsEventListener(this, cat.subCats[j]), cat);
                }
                
                //Icon
                
                var img = document.createElement("IMG");
                
                if ((cat.subCats[j].subCatGTyp == 1) || (cat.subCats[j].subCatGTyp == 0)) 
                {
                    img.src = unescape(config.poi_server) + unescape(cat.subCats[j].subCatImage);
                }
				else  
                {
                    img.src = serverUrl + "php/" + unescape(cat.subCats[j].subCatImage);
                }
                img.width = 16;
                img.height = 16;
                line.appendChild(img);
                line.appendChild(document.createTextNode('\u00a0'));
                //}
                
                
                /*else if (cat.subCats[j].subCatGTyp == 2)
                 {
                 var span = document.createElement("SPAN");
                 line.appendChild(span);
                 
                 span.style.color = cat.subCats[j].subCatStroke;
                 span.style.fontWeight = "bold";
                 span.innerHTML = '/';
                 
                 line.appendChild(document.createTextNode('\u00a0'));
                 }
                 else if (cat.subCats[j].subCatGTyp == 3)
                 {
                 var div = document.createElement("SPAN");
                 if(cat.subCats[j].subCatStrokeWidth > 0)
                 {
                 div.style.border = "2px solid " + cat.subCats[j].subCatStroke;
                 }
                 else
                 {
                 div.style.border = "2px solid " + cat.subCats[j].subCatFill;
                 }
                 div.style.width = "10px";
                 div.style.height = "10px";
                 div.style.backgroundColor = cat.subCats[j].subCatFill;
                 div.innerHTML = '\u00a0\u00a0\u00a0';
                 div.style.fontSize = "9px";
                 div.style.marginBottom = "1px";
                 line.appendChild(div);
                 line.appendChild(document.createTextNode('\u00a0'));
                 }*/
                var nameTmp = unescape(cat.subCats[j].subCatName);
                var span = document.createElement("SPAN");
                
                if (this.tooltipObject) 
                {
                    this.tooltipObject.addElement(span, nameTmp);
                }
                else 
                {
                    var ti = document.createAttribute("TITLE");
                    ti.nodeValue = nameTmp;
                    span.setAttributeNode(ti);
                }
                
                /*if(nameTmp.length > 9)                    
                 {
                 nameTmp = nameTmp.substring(0,9) + "...";
                 }*/
                span.appendChild(document.createTextNode(nameTmp + ' (' + cat.subCats[j].subCatCount + ')'));
                
                line.appendChild(span);
                
                if (this.queryable) 
                {
                    line.appendChild(document.createTextNode('\u00a0'));
                    var img = document.createElement("IMG");
                    img.src = this.imageInfo;
                    
                    if (this.tooltipObject) 
                    {
                        this.tooltipObject.addElement(img, "in Informationsfenster anzeigen");
                    }
                    else 
                    {
                        img.title = "in Informationsfenster anzeigen";
                    }
                    
                    line.appendChild(img);
                    Event.observe(img, 'click', this.clickHandlerInfo.bindAsEventListener(this, cat.subCats[j]));
                }
                
                if (this.search && (cat.subCats[j].subCatCount >= 20)) 
                {
                    var img = document.createElement("IMG");
                    img.src = this.imageSearch;
                    
                    if (this.tooltipObject) 
                    {
                        this.tooltipObject.addElement(img, "innerhalb der Kategorie suchen");
                    }
                    else 
                    {
                        img.title = "innerhalb der Kategorie suchen";
                    }
                    
                    line.appendChild(img);
                    Event.observe(img, 'click', this.clickHandlerSearch.bindAsEventListener(this, cat.subCats[j]));
                }
                
                subCatDiv.appendChild(line);
                
            }
            this.element.appendChild(subCatDiv);
        }
        
        this.hideWaitDiv();
    },
    
    collapse: function(event, cat)
    {
        if (cat.subCatsVisible) 
        {
            cat.subCatsVisible = false;
            $(this.guid + "sCDiv" + cat.catId).style.display = "none";
            $(this.guid + "colCat" + cat.catId).src = this.imagePlus;
        }
        else 
        {
            cat.subCatsVisible = true;
            $(this.guid + "sCDiv" + cat.catId).style.display = "";
            $(this.guid + "colCat" + cat.catId).src = this.imageMinus;
        }
        
    },
    
    selectAllByClick: function(event, cat)
    {
        var cb = Event.element(event);
        
        this.selectAll(cb, cat);
    },
    
    selectAll: function(cb, cat)
    {
        if (debug) 
        {
            GLog.write("selectAll : " + cat.catId);
            GLog.write("selectAll subCat.length:" + cat.subCats.length);
        }
        cat.catSelected = cb.checked;
        
        for (var i = 0; i < cat.subCats.length; i++) 
        {
            if (debug) 
            {
                GLog.write("selectAll subCat:" + i);
            }
            cat.subCats[i].subCatSelected = cb.checked;
            $(this.guid + "handleSubCat" + cat.subCats[i].subCatId).checked = cb.checked;
            if (is_ie6up) 
            {
            
                if (debug) 
                {
                    GLog.write("delayed");
                }
                //window.setTimeout(this.clickHandlerCB(cb,cat.subCats[i],cat),1000);
                this.clickHandlerCB(cb, cat.subCats[i], cat);
            }
            else 
            {
                this.clickHandlerCB(cb, cat.subCats[i], cat);
            }
        }
        
        speedMarkers.redraw(true);
    },
    
    getAllSubCats: function()
    {
        var ret = new Array();
        
        for (var i = 0; i < this.categories.length; i++) 
        {
            for (var j = 0; j < this.categories[i].subCats.length; j++) 
            {
                var gtyp = this.categories[i].subCats[j].subCatGTyp;
                
                if ((gtyp == 0) || (gtyp == 1)) 
                {
                    ret[ret.length] = new IdWrapper(this.categories[i].subCats[j].subCatName, this.categories[i].subCats[j].subCatId);
                }
            }
        }
        
        return ret;
    },
    
    clickHandlerCBByClick: function(event, subCat, cat)
    {
        var cb = Event.element(event);
        
        this.clickHandlerCB(cb, subCat, cat);
        
        speedMarkers.redraw(true);
    },
    
    clickHandlerCB: function(cb, subCat, cat)
    {
        if (debug) 
        {
            GLog.write("clickHandlerCB");
        }
        if (this.checkHook) 
        {
            subCat.subCatSelected = cb.checked;
            this.checkHook(cb, subCat.subCatId, subCat.subCatGTyp, subCat);
        }
        speedMarkers.redraw(true);
    },
    
    clickHandlerInfo: function(event, subCat)
    {
        if (this.infoHook) 
        {
            this.infoHook(event, subCat.subCatId, subCat.subCatGTyp, this);
        }
    },
    
    clickHandlerSearch: function(event, subCat)
    {
        if (this.searchHook) 
        {
            this.searchHook(event, subCat, this);
        }
    },
    
    registerCheckboxHook: function(pointer)
    {
        this.checkHook = pointer;
    },
    
    unregisterCheckboxHook: function()
    {
        this.checkHook = null;
    },
    
    registerInfoHook: function(pointer)
    {
        this.infoHook = pointer;
    },
    
    unregisterInfoHook: function()
    {
        this.infoHook = null;
    },
    
    registerSearchHook: function(pointer)
    {
        this.searchHook = pointer;
    },
    
    unregisterSearchHook: function()
    {
        this.searchHook = null;
    },
    
    registerLoadedListener: function(pointer)
    {
        this.loadedListener = pointer;
    },
    
    unregisterLoadedListener: function()
    {
        this.loadedListener = null;
    },
    
    getEncodedSelection: function()
    {
        var ret = "";
        
        for (var i = 0; i < this.categories.length; i++) 
        {
            var cat = this.categories[i];
            
            if (cat.catSelected) 
            {
                if (ret != "") 
                    ret += ",";
                ret += "C" + cat.catId;
            }
            else 
            {
                for (var j = 0; j < cat.subCats.length; j++) 
                {
                    var subCat = cat.subCats[j];
                    
                    if (subCat.subCatSelected) 
                    {
                        if (ret != "") 
                            ret += ",";
                        ret += "S" + subCat.subCatId + "C" + cat.catId;
                    }
                }
            }
        }
        
        if (debug) 
            GLog.write("encodedSelection : " + ret);
        return ret;
    },
    
    setEncodedSelection: function(encodedSelection)
    {
        if (encodedSelection != "") 
        {
            var selArray = encodedSelection.split(",");
            
            for (var i = 0; i < selArray.length; i++) 
            {
                var sel = selArray[i];
                
                if (debug) 
                {
                    GLog.write("setEncodedSelection : " + sel);
                }
                
                var selCat = sel.match(/C\d+/);
                selCat = selCat[0].match(/\d+/);
                
                if (debug) 
                {
                    GLog.write("setEncodedSelection selCat: " + selCat);
                }
                
                var selSubCat = sel.match(/S\d+/g);
                
                if ((selSubCat) && (selSubCat.length > 0)) 
                {
                    selSubCat = selSubCat[0].match(/\d+/);
                }
                
                for (var j = 0; j < this.categories.length; j++) 
                {
                    if (this.categories[j].catId == selCat) 
                    {
                        this.categories[j].subCatSelected = true;
                        this.collapse(null, this.categories[j]);
                        
                        if (selSubCat == null) 
                        {
                            var cb = $(this.guid + "cbCat" + selCat);
                            cb.checked = true;
                            this.selectAll(cb, this.categories[j]);
                        }
                        else 
                        {
                            for (var x = 0; x < this.categories[j].subCats.length; x++) 
                            {
                                if (this.categories[j].subCats[x].subCatId == selSubCat) 
                                {
                                    var cb = $(this.guid + "handleSubCat" + selSubCat);
                                    cb.checked = true;
                                    this.clickHandlerCB(cb, this.categories[j].subCats[x], this.categories[j]);
                                    break;
                                }
                            }
                        }
                        
                        break;
                    }
                }
            }
        }
        
    },
    
    showWaitDiv: function()
    {
        if (this.waitDiv) 
        {
            Element.show(this.waitDiv);
        }
    },
    
    hideWaitDiv: function()
    {
        if (this.waitDiv) 
        {
            Element.hide(this.waitDiv);
        }
    }
}

