function toggleMenu(el)
{
	if (Browser.OP5||Browser.NS4)
		return;
	var l = Button.getLabel(el);
	if (l.isDepressed) {
		if (TreeParams.OPEN_MULTIPLE_MENUS || l.menu.container.activeMenu == l.menu) {
			l.menu.closeStart();
			l.menu.container.activeMenu=null;
		}
	} else {
		if (TreeParams.OPEN_MULTIPLE_MENUS || l.menu.container.activeMenu == null ) {
			l.menu.openStart();
			l.menu.container.activeMenu=l.menu;
		} else {
			l.menu.container.activeMenu.closeStart();
			if (!TreeParams.OPEN_WHILE_CLOSING) {
				if (l.menu.container.activeMenu!=l.menu) {
					l.menu.container.activeMenu.menuInCue=l.menu;
				} else {
					l.menu.menuInCue=null;
					l.menu.openStart();
				}
			} else {
				l.menu.openStart();
				l.menu.container.activeMenu=l.menu;
			}
		}
	}
}

function activateMenu(bId)
{
	if (!window.toggleMenu||Browser.OP5)
		return;
	var button = document.getElementById(bId);
	if (!button)
		return;
	var parentMenuEl=findAncestorWithClass(button,"menu");
	if (parentMenuEl!=null) {
		var bId=parentMenuEl.id.replace(/Menu$/,"");
		activateMenu(bId);
	}
	var l=Button.getLabel(getElementsWithClass(button,"*","buttonlabel")[0]);
	if (!l.isDepressed) {
		toggleMenu(l.el);
		l.isDepressed=true;
	}
}

function buttonOver(el)
{
	window.status=el.parentNode.id;
	if (hasToken(el.className,"labelHover"))
		return;
	el.className+=" labelHover";
	var l=Button.getLabel(el);
	var icon=l.icon;
	if (icon!=null)
		icon.src=l.isDepressed?TreeParams.OPEN_OVER_MENU_ICON:TreeParams.CLOSED_OVER_MENU_ICON;
}

function buttonOff(el)
{
	window.status=window.defaultStatus;
	removeClass(el,"labelHover");
	var l=Button.getLabel(el);
	var icon=l.icon;
	if (icon!=null)
		icon.src=l.isDepressed?TreeParams.OPEN_MENU_ICON:TreeParams.CLOSED_MENU_ICON;
}

if (typeof document.getElementsByTagName == "undefined"||Browser.OP5)
	buttonOver=buttonOff=function() {};


Button=function(el,category) {
	this.el=el;
	this.category=category;
	this.menu=new Menu(document.getElementById(this.category+"Menu"),this);
	//var icons=el.getElementsByTagName("img");
	//this.icon=(icons.length>0)?icons[0]:null;
	this.isIcon=false;
	/*if (el.tagName.toLowerCase() == "img") {
		this.isIcon=true;
		this.icon=el;
	}*/
	this.isDepressed=false;
};

Button.getLabel=function(el) {
	var buttonId=findAncestorWithClass(el,"button").id;
	var m=Menus[buttonId];
	return(m!=null)?m.ownerButton:new Button(el,buttonId);
};

Button.prototype.setClosedLabel=function() {
	if (this.isIcon)
		return void(this.icon.src=TreeParams.CLOSED_MENU_ICON);
	removeClass(this.el,"labelDown");
	if (this.icon!=null)
		this.icon.src=hasToken(this.el.className,"labelHover")?TreeParams.CLOSED_OVER_MENU_ICON:TreeParams.CLOSED_MENU_ICON;
};

Menu=function(el,l) {
	this.ownerButton=l;
	this.id=l.category;
	this.el=el;
	this.items=getChildNodesWithClass(el,"menuNode");
	this.items.unshift(el);
	this.allItems=getElementsWithClass(el,"*","menuNode");
	if (this.allItems.length == 0)
		this.allItems=getElementsWithClass(el,"div","menuNode");
	this.allItems.unshift(el);
	this.cur=0;
	this._root=null;
	this.container=this.getContainer();
	this.activeMenu=null;
	this.menuInCue=null;
	Menus[this.id]=this;
};

Menus={};

Menu.getInstance=function(id) {
	var menu=Menus[id];
	if (menu == null)
		menu=Button.getLabel(getElementsWithClass(document.getElementById(id),"*","buttonlabel")).menu;
	return menu;
};

Menu.prototype={
	openStart:function() {
		if (this.opening)
			return;
		if (this.ownerButton.icon!=null)
			this.ownerButton.icon.src=TreeParams.OPEN_MENU_ICON;
		if (this.closing) {
			this.closeEnd();
			if (this.itemsToClose) {
				this.itemsToOpen=this.itemsToClose.reverse();
				this.cur=this.itemsToClose.length-this.cur;
			}
		} else {
			this.cur=0;
			this.itemsToOpen=new Array();
			if (this.itemsToClose)
				this.itemsToOpen=this.itemsToClose.reverse();
			else
				this.itemsToOpen=this.items;
			if (!this.ownerButton.isIcon)
				this.ownerButton.el.className+=" labelDown";
		}
		this.closing=false;
		this.opening=true;
		if (this.itemsToOpen[0]!=this.el)
			this.itemsToOpen.reverse();
		this.pat=setInterval("Menus."+this.id+".open()",TreeParams.TIME_DELAY);
		this.ownerButton.isDepressed=true;
	},
	
	closeStart:function() {
		if (this.closing)
			return;
		if (this.opening) {
			this.openEnd();
		} else {
			this.opening=false;
			this.cur=0;
			this.itemsToClose=new Array();
			for (var i=this.allItems.length-1,counter=0; i>0; i--)
				if (this.allItems[i].style.display == "block")
					this.itemsToClose[counter++]=this.allItems[i];
		}
		this.itemsToClose[this.itemsToClose.length]=this.el;
		this.pat=setInterval("Menus."+this.id+".close()",TreeParams.TIME_DELAY);
		this.closing=true;
		this.ownerButton.isDepressed=false;
	},
	
	open:function() {
		this.itemsToOpen[this.cur].style.display="block";
		if (++this.cur == this.itemsToOpen.length)
			this.openEnd();
	},
	
	close:function() {
		this.itemsToClose[this.cur].style.display="none";
		if (++this.cur>=this.itemsToClose.length)
			this.closeEnd();
	},
	
	openEnd:function() {
		clearInterval(this.pat);
		this.opening=false;
		this.itemsToClose=this.itemsToOpen.reverse();
		this.cur=this.itemsToOpen.length-this.cur;
		if (!TreeParams.OPEN_MULTIPLE_MENUS&&this.container.activeMenu!=this)
			this.closeStart();
		this.container.activeMenu=this;
	},
	
	closeEnd:function() {
		clearInterval(this.pat);
		this.closing=false;
		if (this.cur>=this.itemsToClose.length)
			this.ownerButton.setClosedLabel();
		if (!TreeParams.OPEN_WHILE_CLOSING&&this.container.activeMenu&&this.container.activeMenu.menuInCue!=null&&this.container.activeMenu.menuInCue!=this) {
			this.container.activeMenu.menuInCue.openStart();
			if (this.menuInCue)
				this.container.activeMenu=this.menuInCue;
		} else {
		}
		this.menuInCue=null;
		if (Browser.IE6)
			setTimeout("repaintFix(document.getElementById('"+this.el.id+"'));",50);
	},
	
	getContainer:function() {
		var parentMenuElement=findAncestorWithClass(this.el,"menu");
		if (parentMenuElement!=null)
			return Menu.getInstance(parentMenuElement.id.replace(/Menu$/,""));
		if (!this._root) {
			var rt=findAncestorWithClass(this.el,"AnimTree");
			if (!rt)
				rt=document.body;
			if (!rt.id)
				rt.id="AnimTree_"+Math.round(Math.random()* 1E5);
			this._root=TreeList[rt.id];
			if (this._root == null)
				this._root=new Tree(rt);
			return this._root;
		}
	}
};

Tree=function(el) {
	this.el=el;
	this.activeMenu=null;
	this.id=el.id;
	TreeList[this.id]=this;
};

TreeList={};


if (document.getElementById&&!Browser.OP5&&!window.Tree_inited) {
	document.writeln('<style type="text/css"> .menu, .menuNode {display: none;} </style>');
	window.Tree_inited=true;
}
