menuController = {
	
	menus: [],

	inWork: false,
	isIE : (navigator.userAgent.indexOf("MSIE") != -1?true:false),
			
	mouseOver: function(obj,e){

		if (this.inWork==false) this.inWork = true;
		else return true;
		
		var menu = this.getMenu(obj);

		if (menu.timer) window.clearTimeout(menu.timer);
		
		var target = this.getEventTarget(e);
						
		var root = true;				
										
		var overElement = this.getElement(target,menu.submenuElementTagName);
		
		if (!overElement) overElement = this.getElement(target,menu.menuElementTagName);
		else root = false;		
								
		if (overElement&&target != obj&&target.nodeName!=menu.submenuContainerTagName){

			var container = this.getElement(target,menu.submenuContainerTagName);				
						
			var par;

			//if (menu.opened.length >0&&menu.opened[menu.opened.length-1]==container) return true;

			while (menu.opened.length >0 && (root||menu.opened[menu.opened.length-1] != container) && (par=menu.opened.pop())) 				
				par.style.display='none';													
																
			//if ((!menu.triggerElementTagName || target.nodeName == menu.triggerElementTagName) && (!menu.triggerElementClassName || menu.triggerElementClassName == target.className)){
					
			var submenu	= this.getFirstChild(overElement,menu.submenuContainerTagName);										
											    	
				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-35+(this.isIE?10:0)) + 'px';

					}
					
					submenu.style.display='block';	
																				
				} 		 				
									
			//}
						
		}		

		this.inWork = false;
		return true;				
				
	},

	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.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.menuElementTagName = "TD";
			a.submenuElementTagName = "LI";
			a.submenuContainerTagName = "UL";
									
			/*
			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;

	},
	
	getFirstChild : function(obj,tagname){

		if (obj) obj = obj.firstChild;		
					
		if (obj&&obj.nodeName==tagname) return obj;					
														
		return this.getNextSibling(obj,tagname);

	},

	getNextSibling : function(obj,tagname){
										
		if (obj) obj = obj.nextSibling;

		while (obj&&obj.nodeName!=tagname) obj = obj.nextSibling;
		
		return obj;		
						
	},
	
	getElement : function(obj,tagname){										
																
		while (obj&&obj.nodeName!=tagname) obj = obj.parentNode;														
					 																						
		return obj;	
		
	}
				
};