Menu=new Object();

Menu.hideTimeoutTime=1000;
Menu.hideTimeoutID=null;
Menu.currentItem=null;
Menu.selectedItem=null;

Menu.init=function(){
	this.root.htmlContainer.onmouseout=function(){
		Menu.hideTimeoutID=setTimeout('Menu.collapse()',Menu.hideTimeoutTime);
	};
	this.root.htmlContainer.onmouseover=function(){
		clearTimeout(Menu.hideTimeoutID);
	};
	this.root.display=true;
	this.root.init();
	this.update();
};

Menu.writePath=function(){
	if(this.selectedItem){
		var path=new Array();
		var item=this.selectedItem;
		while(item!=this.root){
			path[path.length]=item;
			item=item.parent;
		}
		for(var i=path.length-1;i>=0;i--){
			var link=path[i].htmlElement.getElementsByTagName('A')[0];
			document.write(' \/ <a href="'+link.href+'">'+((document.all)?link.innerHTML:link.firstChild.nodeValue)+'<\/a>');
		}
	}
};

Menu.find=function(element){
	return this.root.find();
};

Menu.setSelected=function(element){
	var selectedItem=this.root.find(element);
	Menu.selectedItem=selectedItem;
	while(selectedItem!=null){
		selectedItem.selected=true;
		selectedItem=selectedItem.parent;		
	}
};

Menu.collapse=function(){
	this.root.hide();
	this.update();
};

Menu.update=function(){
	this.root.update();
};


Menu.parse=function(rootElement,itemTagName,menuTagName){
	this.root=this.parseItem(rootElement,itemTagName,menuTagName);	
}

Menu.parseItem=function(element,itemTagName,menuTagName){
	var item=new MenuItem(element);
	for(var i=0;i<element.childNodes.length;i++){
		var e=element.childNodes[i];
		if(e.tagName==menuTagName){
			item.htmlContainer=e;
			break;
		}
	}
	for(var i=0;i<item.htmlContainer.childNodes.length;i++){
		var e=item.htmlContainer.childNodes[i];
		if(e.tagName==itemTagName){
			item.add(this.parseItem(e,itemTagName,menuTagName));
		}
	}
	return item;
};

function MenuItem(htmlElement){
	this.htmlElement=htmlElement;
	this.htmlContainer=htmlElement;
	this.children=new Array();
	this.parent=null;
	this.display=false;
	this.selected=false;
	htmlElement.item=this;
}

MenuItem.prototype.init=function(){	
	this.baseClassName=this.htmlElement.className;
	//this.baseClassName+=((this.baseClassName!='')?' ':'')+'item';
	this.baseClassName+=((this.baseClassName!='')?' ':'')+((this.htmlElement!=this.htmlContainer)?'parent':'');
	this.baseClassName+=((this.baseClassName!='')?' ':'')+((this.selected)?'selected':'');
	if(this.parent!=null){
		this.htmlElement.onmouseover=this.onMouseOver;
	}
	for(var i=0;i<this.children.length;i++){
		this.children[i].init();
	}
};

MenuItem.prototype.find=function(htmlElement){
	if(this.htmlElement==htmlElement){
		return this;
	}
	for(var i=0;i<this.children.length;i++){
		var f=this.children[i].find(htmlElement);
		if(f){
			return f;
		}
	}
	return null;
};

MenuItem.prototype.add=function(child){
	this.children[this.children.length]=child;
	child.parent=this;
};

MenuItem.prototype.hide=function(){
	if(this.parent!=null){
		this.display=false;
	}
	for(var i=0;i<this.children.length;i++){
		this.children[i].hide();
	}
};

MenuItem.prototype.show=function(){	
	if(this.parent!=null){
		this.display=true;
		this.parent.show();
	}
};

MenuItem.prototype.update=function(){
	this.htmlElement.className=this.baseClassName+((this.display)?((this.baseClassName!='')?' ':'')+'hover':'');
	if(this.htmlContainer!=this.htmlElement){		
		this.htmlContainer.style.display=(this.display)?'block':'none';
	}
	if(this.display){
		for(var i=0;i<this.children.length;i++){
			this.children[i].update();
		}
	}
	// ie daran erinnern, dass wir diese elemente sehen wollen ..
	this.htmlContainer.style.visibility='visible';	
	this.htmlElement.style.visibility='visible';	
};

MenuItem.prototype.onMouseOver=function(){
	var p=Menu.currentItem;
	while(p!=null){
		if(p==this.item){
			break;
		}
		p=p.parent;
	}
	if(p==null){
		Menu.root.hide();
		Menu.currentItem=this.item;
	}
	Menu.currentItem.show();
	Menu.update();
};