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.submenuElementTagName);

		if (!overElement) overElement = this.getElement(target,menu.menuElementTagName);

		if (overElement&&target != obj){

			var container = this.getElement(target,menu.submenuContainerTagName);

			var par;

			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') {

						//alert(coords.y + ' ' + coords.h + ' ' + menu.offsetY);
						submenu.style.left = (coords.x + menu.offsetX) + 'px';
						submenu.style.top = (coords.y + coords.h + menu.offsetY) + 'px';

					}

					submenu.style.display='block';

				}

			//}

		}

	},

	closeAll: function(menu){

		var a = null;

		while(a=menu.opened.pop()) a.style.display="none";

	},

	mouseOut: function(obj,e){

		var menu = this.getMenu(obj);

		/* closeAll(menu);  */

        if (menu.timer) window.clearTimeout(menu.timer);

		menu.timer = window.setTimeout(function(){menuController.closeAll(menu)},menu.closeDelay);

	},

	idMenu : ''
	,

	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;
			if (obj == document.getElementById(this.idMenu)) return;
		}

		return obj;

	}

};




var a = menuController.getMenu("topmenu");
a.closeDelay = 300;
a.position = "top";
function gt (url) { document.location = url; }
function cc (obj,newname) {obj.className = newname;}

function CloseTopMenu() {	var menu = menuController.getMenu("topmenu");
	var a = null;
	while(a=menu.opened.pop()) a.style.display="none";}
