function delegate( that, thatMethod )
{
	if(arguments.length > 2)
	{
	  var _params = [];
	  for(var n = 2; n < arguments.length; ++n) _params.push(arguments[n]);
	  return function() { return thatMethod.apply(that,_params); }
	}
	else
	  return function() { return thatMethod.call(that); }
}

var CatSubmenu = 
{
	mainMenu : false,
	itemIds : false,
	items: [],

	currentSubitem: false,
	oTimeout : false,

	registerItems: function()
	{
		this.mainMenu = document.getElementById('cat_menu');
		this.mainMenu.onmouseover = delegate(CatSubmenu, CatSubmenu.menuOver);
		this.mainMenu.onmouseout = delegate(CatSubmenu, CatSubmenu.menuOut);
		for (var i=0; i<arguments.length; i++)
		{
			var e = document.getElementById('cat_menu_'+arguments[i]);
			if (e)
			{
				this.items[arguments[i]] = e;
				e.onmouseover = delegate(CatSubmenu, CatSubmenu.menuOver);
				e.onmouseout = delegate(CatSubmenu, CatSubmenu.menuOut);
			}
		}

		this.itemIds = arguments;
	
	},

	hideSubmenu : function(id)
	{
		if (this.items[id])
		{
			this.items[id].style.display = 'none';
		}
	},

	showMainmenu : function()
	{
		if (this.mainMenu)
		{
			this.mainMenu.style.display = 'block';
		}
		else
		{
		}
	},

	showSubmenu : function(id, ref)
	{
		if (this.items[id])
		{
			this.items[id].style.display = 'block';
			if (ref)
			{
				var t = ref.offsetTop;
				t += ref.offsetParent.offsetTop;
				this.items[id].style.top = t + 'px';
			}
		}
	},

	triggerSubmenu : function(caller, submenu)
	{
		if (this.items[submenu] && submenu != this.currentSubitem)
		{
			this.hideSubmenu(this.currentSubitem);
			this.showSubmenu(submenu, caller);
			this.currentSubitem = submenu;
		}
	},

	menuOver: function()
	{
		// clear timeout
		window.clearTimeout(this.oTimeout);
	},

	menuOut: function()
	{
		window.clearTimeout(this.oTimeout);
		this.oTimeout = window.setTimeout(delegate(CatSubmenu, CatSubmenu.hideMenu), 1000);
	},

	hideMenu: function()
	{
		this.mainMenu.style.display = 'none';

		for (var i=0; i < this.itemIds.length; i++)
		{
			this.hideSubmenu(this.itemIds[i]);
		}
	}
}

