menuController = {
	
	menus: [],
			
	mouseOver: function(obj,e){

		var menu = this.getMenu(obj);

		if (menu.timer) window.clearTimeout(menu.timer);
		
		var target = this.getEventTarget(e);
						
		var root = false;				
										
		var overElement = this.getElement(target,menu.elementTagName,menu.elementClassName);
		
		if (!overElement) overElement = this.getElement(target,menu.elementTagName,menu.elementOverClassName);
		
		if (!overElement) {
		
			overElement = this.getElement(target,menu.rootElementTagName,menu.rootElementClassName);
			
			if (!overElement) {
			
				overElement = this.getElement(target,menu.rootElementTagName,menu.rootElementOverClassName);			
				
			}	
			
			if (!overElement) {
			
				//alert("Error can't find, overMenuElement check your css and html");
				return true;
				
			} 
			
			root = true;			
			
			//if (menu.rootElementOverClassName) overElement.className = menu.rootElementOverClassName;
						
		} /*else {
		
			if (menu.elementOverClassName) overElement.className = menu.elementOverClassName;
					
		}*/	
						
		if (overElement&&target != obj){

			var container = this.getElement(target,menu.submenuContainerTagName,menu.submenuContainerClassName);				
						
			var par;

			while (menu.opened.length >0 && (root||menu.opened[menu.opened.length-1] != container) && (par=menu.opened.pop())) {
			
				/*
				if (menu.opened.length == 0 && menu.rootElementOverClassName){
				
					
					var p = this.getParent(par, menu.rootElementTagName, menu.rootElementOverClassName);						
					
					if (p) p.className = menu.rootElementClassName;
									
				} else if (menu.elementOverClassName){
		
					var p = this.getParent(par, menu.elementTagName, menu.elementOverClassName);						
					if (p) p.className = menu.elementClassName;
				
				}*/							
				
				par.style.display='none';													
			}
													
			if ((!menu.triggerElementTagName || target.nodeName == menu.triggerElementTagName) && (!menu.triggerElementClassName || menu.triggerElementClassName == target.className)){
					
				var submenu	= this.getFirstChild(overElement,menu.submenuContainerTagName,menu.submenuContainerClassName);										
											    	
				if (submenu) {									
				
					if (menu.positioningPoint == 'overElement'){
						
						target = overElement;
																		
					}
				
					menu.opened.push(submenu);										
																								
					var coords = this.getDemensions(target);	
					
					//alert(coords.toSource());
																					
					submenu.style.zIndex = 1000 + menu.opened.length;														

					if (menu.position == 'left'||menu.opened.length > 1) {
					        
						submenu.style.left = (coords.x + coords.w + menu.offsetX) + 'px';
						submenu.style.top = (coords.y + menu.offsetY) + 'px';

					} else if (menu.position == 'top') {
 											
						submenu.style.left = (coords.x + menu.offsetX) + 'px';			
						submenu.style.top = (coords.y + coords.h + menu.offsetY) + 'px';

					}
					
					submenu.style.display='block';	
																				
				} 		 				
									
			}
						
		}
				
		if (root&&menu.rootElementOverClassName) overElement.className = menu.rootElementOverClassName;														 					
		if (!root&&menu.elementOverClassName) overElement.className = menu.elementOverClassName;														
				
	},

	closeAll: function(menu){

		var a = null;

		while(a=menu.opened.pop()) {
	        	        
	        /*	        
			if (menu.opened.length == 0 && menu.rootElementOverClassName){
				
				var p = this.getParent(a, menu.rootElementTagName, menu.rootElementOverClassName);						
					
				if (p) p.className = menu.rootElementClassName;
									
			}*/							
	        	        	
	        a.style.display="none";			
	        	
		}	 	        	 

	},

	mouseOut: function(obj,e){
		
		var menu = this.getMenu(obj);
				
		var target = this.getEventTarget(e);

		var overElement = this.getElement(target,menu.elementTagName,menu.elementOverClassName);
					
		if (!overElement) {
			
				overElement = this.getElement(target,menu.rootElementTagName,menu.rootElementOverClassName);						
				if (overElement) {
										
					if (menu.rootElementOverClassName) overElement.className = menu.rootElementClassName;
				
				}
				
		}else {
		
			if (menu.elementOverClassName) overElement.className = menu.elementClassName;
					
		}

		if (menu.timer) window.clearTimeout(menu.timer);

		menu.timer = window.setTimeout(function(){menuController.closeAll(menu)},menu.closeDelay);

	},

	getMenu: function(objOrId){

		if (objOrId){

			var obj = null;
			var id = null;	  			

			if (typeof(objOrId) == 'string') {

			 	id = objOrId;		

			} else {

			        obj = objOrId;
				id = obj.id;
				
			}	
				
	
			for (var i=0; i < this.menus.length; i++) {

				if (obj&&this.menus[i].obj==obj||id&&this.menus[i].id==id){
			        
					if (obj) this.menus[i].obj = obj;
					if (id) this.menus[i].id = id;
					return this.menus[i];

				}


			}

			var a = {};
						
			a.opened = [];
			a.obj = obj;
			a.id = id;
			
			a.rootElementClassName = null;
			a.rootElementOverClassName = null;			
			a.rootElementTagName = "TD";
			
			a.elementClassName = null;
			a.elementOverClassName = null;
			a.elementTagName = "LI";
			
			a.submenuContainerTagName = "UL";
			a.submenuContainerClassName = null;
			
			a.triggerElementTagName = null;
			a.triggerElementClassName = null;
			a.triggerElementExpandedClassName = null;			
			
			a.offsetX = 0;
			a.offsetY = 0;
			a.position = "top";
			a.positioningPoint = "overElement"; // can position over trigger Element = "overTriggerElement";
			a.closeDelay = 1500;

			this.menus.push(a);
			return a;	
			
	  	}

		return null;

	},


	getEventTarget: function(e){

		if (!e) e = window.event;
		
       		if (e.target) {

			if (e.target.nodeType == 3) e.target = e.target.parentNode;
        	 	return e.target;
        	 
      		} else if (e.srcElement)

        	return e.srcElement;

	},
	
	
	getDemensions : function(obj) {

		var a = new Object();

		a.h = obj.offsetHeight;
		a.w = obj.offsetWidth;		
		a.x=0;
		a.y=0;

		if (obj.offsetParent) {
		
			while (obj.offsetParent) {
			
				if (obj.style.left) {
					/*a.x += parseInt(obj.style.left);									
					a.y += parseInt(obj.style.top);*/									
				break;
				}
				
				a.y += obj.offsetTop;
				a.x += obj.offsetLeft;
				obj = obj.offsetParent;
			}
			
		} else {
			
			if (obj.x) a.x += obj.x;
			if (obj.y) a.y += obj.y;

		}

		return a;

	},
	
	getElement : function(obj,tagname,className){										
																	
		while (obj&&obj.nodeName!='BODY'&&!(obj.nodeName == tagname&&(!className||className==obj.className))){
																	
			obj = obj.parentNode;
			
		}	
		
		if (obj.nodeName=='BODY') return null;
		
		return obj;	
	},
	
	getFirstChild : function(obj,tagname,className){

		obj = obj.firstChild;		
				
		if (obj&&!(obj.nodeName == tagname&&(!className||className==obj.className)))		
			return this.getNextSibling(obj,tagname,className);

		return null;
	},

	getNextSibling : function(obj,tagname,className){
										
		obj = obj.nextSibling;
						
		while (obj&&!(obj.nodeName==tagname&&(!className||className==obj.className))){			
			obj = obj.nextSibling; 
		}	
																	
		return obj;		
						
	}
				
};