function displayCategoryPath(containername, topspacing) {
        var path=new Array();
        recursiveCategorySearch(currentcategory, categories, path);
        path.reverse();
        var container=document.getElementById(containername);
        container.className="categorypath";
        removeAllChilds(container);
        inCategoryList=0;
        var i;
        var subcategories=categories;
        var category_ul=document.createElement("ul");
        category_ul.className="pathul";
        for(i=0;i<path.length;i++) {
                var category_li=document.createElement("li");
                category_li.className="pathli";
                category_li.id=getStringFromCategoryPath(path, i);
                var category_href=document.createElement("a");
                if(subcategories[path[i]][1]>=categoryajaxfrom && subcategories[path[i]][1]<=categoryajaxto) {
                        category_href.href="javascript:switchCategory("+subcategories[path[i]][1]+")";
                } else {
                        category_href.href=subcategories[path[i]][2];
                }
                category_href.appendChild(document.createTextNode(subcategories[path[i]][0]));
                setupCategoryDropdown(category_href, containername, category_li.id, path, i, true, topspacing);
                category_li.appendChild(category_href);
                category_li.appendChild(document.createTextNode(" "));
                if(i<path.length-1) {
                        var category_img=document.createElement("img");
                        category_img.src="images/arrow2.gif";
                        category_img.border=0;
                        category_li.appendChild(category_img);
                        category_li.appendChild(document.createTextNode(" "));
                }
                subcategories=subcategories[path[i]][3];
                category_ul.appendChild(category_li);
        }
        container.appendChild(category_ul);
}

function setupCategoryDropdown(element, containername, parentname, path, depth, isFirst, topspacing) {
        if(typeof element == "string") element=document.getElementById(element);
        if(element==null) return;
        var hide="";
        if(isFirst) hide="hideAllCategoryLists();";
        else hide="hideCategoryLists(0,\""+containername+"\");";
        element.onmouseover=new Function("enteredCategoryList(\""+containername+"\"); "+hide+" displayCategoryList(["+path.join(",")+"],"+depth+",\""+parentname+"\",0,0,0,\""+containername+"\","+topspacing+");");
        element.onmouseout=new Function("leftCategoryList(\""+containername+"\");");
}

function displayCategoryList(path, level, parent, depth, yoffset, totalyoffset, container, topspacing) {
        if(typeof parent == "string") parent=document.getElementById(parent);
        if(!parent) return;
        var i;
        var subcategories=categories;
        var newpath=new Array();
        for(i=0;i<level;i++) {
                subcategories=subcategories[path[i]][3];
                newpath.push(path[i]);
        }
        var windowHeight;
        if(browserIsIE) windowHeight=document.documentElement.clientHeight+document.documentElement.scrollTop;
        else windowHeight=window.innerHeight+window.pageYOffset;
        var startNewList=true;
        var isFirstEntry=true;
        var subListCount=0;
        var elementZero=0;
        var xoffset=0;
        var parentoffset=0;
        if(depth>0) parentoffset=parent.yoffset;
        var nextParent=null;
        for(i=0;i<subcategories.length;i++) {
                if(startNewList==true) {
                        var startoffset=parentoffset;
                        if(i>0) startoffset=list.yoffset;
                        var list=document.createElement("ul");
                        list.className="categorylist";
                        list.yoffset=startoffset;
                        if(depth>0 || isFirstEntry==false) {
                                list.className=list.className+" subcategory";
                                if(nextParent!=null) xoffset+=nextParent.clientWidth+2;
                                list.style.left=(parent.clientWidth+xoffset)+"px";
                                list.style.top=(list.yoffset+(yoffset-2)-parentoffset)+"px";
                        }
                        list.id="l"+getStringFromCategoryPath(path,level,subListCount);
                        list.depth=depth;
                        list.onmouseover=enteredCategoryList;
                        list.onmouseout=new Function("leftCategoryList(\""+container+"\");");
                        list.yoffset=parentoffset;
                        nextParent=list;
                        elementZero=i;
                        subListCount++;
                }
                isFirstEntry=false;
                newpath.push(i);
                var listitem=document.createElement("li");
                listitem.id="s"+getStringFromCategoryPath(newpath, (newpath.length-1));
                var listitem_a=document.createElement("a");
                if(subcategories[i][1]>=categoryajaxfrom && subcategories[i][1]<=categoryajaxto) {
                        listitem_a.href="javascript:switchCategory("+subcategories[i][1]+")";
                } else {
                        listitem_a.href="http://www.mobmap.de/"+subcategories[i][2];
                }
                var height=24;
                listitem_a.onmouseover=new Function("hideCategoryLists("+(depth+1)+",\""+container+"\"); displayCategoryList(["+newpath.join(",")+"],"+(newpath.length)+",\""+list.id+"\","+(depth+1)+","+(height*(i-elementZero)+1)+","+(totalyoffset+(height*(i-elementZero))+1)+",\""+container+"\","+topspacing+");");
                listitem_a.appendChild(document.createTextNode(subcategories[i][0]));
                listitem.appendChild(listitem_a);
                if(subcategories[i][3].length>0) {
                        listitem.className="hassubcategories";
                }
                list.appendChild(listitem);
                newpath.pop();
                if(topspacing+(totalyoffset+list.yoffset)+(height*(i-elementZero+1))+30>windowHeight) {
                        if(totalyoffset+list.yoffset+topspacing-height>15) {
                                list.yoffset-=height;
                                list.style.top=(list.yoffset+(yoffset-2)-parentoffset)+"px";
                                if(depth==0 && list.style.left==0) {
                                        list.style.left=parent.clientWidth+"px";
                                }
                        } else {
                                parent.appendChild(list);
                                startNewList=true;
                        }
                } else startNewList=false;
        }
        if(startNewList==false) parent.appendChild(list);
        operaRedrawPage();
}

function switchCategory(targetcategory, noapply) {
        currentcategory=targetcategory;
        hideAllCategoryLists();
        displayCategoryPath("categorypath");
        resultListStartAt=0;
        if(typeof(window.updateSpellFilterVisibility)=="function") updateSpellFilterVisibility();
        if(noapply!=true) applyFilter();
}

function recursiveCategorySearch(categoryid, subcategories, patharray) {
        var i;
        for(i=0;i<subcategories.length;i++) {
                if(subcategories[i][1]==categoryid) {
                        patharray.push(i);
                        return true;
                } else {
                        if(recursiveCategorySearch(categoryid, subcategories[i][3], patharray)==true) {
                                patharray.push(i);
                                return true;
                        }
                }
        }
        return false;
}

function getStringFromCategoryPath(path, depth, sublist) {
        var i;
        var str="";
        for(i=0;i<=depth;i++) {
                str=str+path[i]+".";
        }
        str+="-"+sublist;
        return str;
}

var inCategoryList=0;
var categoryListActions=0;
var categoryContainers=[];

function hideCategoryLists(depth, containername) {
        if(depth!=-1 || inCategoryList==0) {
                var container=document.getElementById(containername);
                var list=container.getElementsByTagName("ul");
                var i;
                var remove=new Array();
                for(i=0;i<list.length;i++) {
                        if(list[i].depth>=depth) {
                                remove.push(list[i]);
                        }
                }
                for(i=0;i<remove.length;i++) {
                        remove[i].parentNode.removeChild(remove[i]);
                }
        }
}

function autoHideCategoryLists(actions, container) {
        if(categoryListActions==actions) hideCategoryLists(-1, container);
        operaRedrawPage();
}

function hideAllCategoryLists() {
        for(i=0;i<categoryContainers.length;i++) {
                hideCategoryLists(0,categoryContainers[i]);
        }
        operaRedrawPage();
}

function leftCategoryList(container) {
        inCategoryList--;
        categoryListActions++;
        if(inCategoryList==0) window.setTimeout("autoHideCategoryLists("+categoryListActions+",\""+container+"\")", 500);
}

function enteredCategoryList(container) {
        inCategoryList++;
        categoryListActions++;
        if(typeof container == "string") addCategoryContainer(container);
}

function addCategoryContainer(containername) {
        var i;
        for(i=0;i<categoryContainers.length;i++) {
                if(categoryContainers[i]==containername) return;
        }
        categoryContainers[i]=containername;
}