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.style.zIndex=1000;
			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=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(/(\/spells)/.test(document.URL)) 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;
}
