menuController = {
	
	menus: [],
			
	mouseOver: function(obj,e){

		var menu = this.getMenu(obj);

		if (menu.timer) window.clearTimeout(menu.timer);
		
		var target = this.getEventTarget(e);

		var liElement = null;	

		if (menu.classOver) {

			liElement = this.getElement(target,"LI");

			if (liElement) liElement.className = menu.classOver;			 

		} 	

		if (target != obj){

			var a = this.getElement(target,"UL");					

			var par;

			while (menu.opened.length >0 && menu.opened[menu.opened.length-1] != a && (par=menu.opened.pop())) par.style.display='none';					
								
			if ((!menu.triggerElementTagName || target.nodeName == menu.triggerElementTagName) && (!menu.triggerElementClassName || menu.triggerElementClassName == target.className)){
			    	
				if (!liElement) liElement = this.getElement(target,"LI");			    	
				
                                if (liElement) a = this.getFirstChild(liElement,"UL");
				
				if (!menu.triggerElementTagName && !menu.triggerElementTagName){
					
					target= liElement;

				}						

				if (a){

					menu.opened.push(a);					
									
					var coords = this.getDemensions(target);	
																
					a.style.zIndex = 1000 + menu.opened.length;
					a.style.display='block';									

					if (menu.position == 'left'||menu.opened.length > 1) {
					        
						a.style.left = (coords.x + coords.w + menu.offsetX) + 'px';
						a.style.top = (coords.y + menu.offsetY) + 'px';

					} else if (menu.position == 'top') {
 											

						a.style.left = (coords.x + menu.offsetX) + 'px';			
						a.style.top = (coords.y + coords.h + menu.offsetY) + 'px';

					} 					
										
				}														

			}
						

		}		
		
	},

	closeAll: function(menu){

		var a = null;

	        while(a=menu.opened.pop()) a.style.display="none";			

	},

	mouseOut: function(obj,e){
		
		var menu = this.getMenu(obj);
				
		if (menu.classOut) {

			var target = this.getEventTarget(e);

			target = this.getElement(target,"LI");

			if (target) target.className = menu.classOut;

		}

		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.triggerElementTagName = null;
			a.triggerElementClassName = null;
			a.offsetX = 0;
			a.offsetY = 0;
			a.overColor = null;	
			a.outColor = null;
			a.position = "left";
			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) 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){
	
		while (obj&&(obj.nodeName!=tagname))
			obj = obj.parentNode;
		
		return obj;
	
	},
	
	getFirstChild : function(obj,tagname){

		obj = obj.firstChild;		

		if (obj&&obj.nodeName != tagname)		
			return this.getNextSibling(obj,tagname);

		return obj;

	},

	getNextSibling : function(obj,tagname){
		
		obj = obj.nextSibling;
		
		while (obj&&(obj.nodeName!=tagname))
			obj = obj.nextSibling; 
			
		return obj;				
	}
				
}