function FreecomMenu()
{
	this.Menus = new Array();
	this.AddMenu = FreecomMenu_AddMenu;
	this.Render = FreecomMenu_Render;
	this.RenderSubItems = FreecomMenu_RenderSubItems;
	this.ArrayIndex = -1;
}
function FreecomMenu_AddMenu(subMenu)
{
	index = this.Menus.length;
	subMenu.ParentObject = this;
	subMenu.ArrayIndex = MenuItemArray.length;
	MenuItemArray[MenuItemArray.length] = subMenu;
	this.Menus[index] = subMenu;
	return subMenu;
}
function FreecomMenu_Render(baseTagName)
{
	var o='<table class="FCMMain" cellpadding="0" cellspacing="0" onmouseout="MenuOut();">';
	o+="\n";
	o+="<tr>\n";
	// Headings
	for(i=0;i<this.Menus.length;i++)
	{
		tag = "FCMNU_" + i;
		this.Menus[i].TagName = tag;
		o+="<td class=\"FCMHead\" id=\"" + tag + "\"";
		if(this.Menus[i].Menus.length>0)
		{
			// Sub menus
			o+=" onmouseover=\"";
			o+="RenderMenu(" + this.Menus[i].ArrayIndex + ");\"";
			o+=">";
			o+=this.Menus[i].Text;
		}
		else
		{
			// No sub
			o+="\>" + this.Menus[i].Text;
		}
		o+="</td>\n";
	}
	o+="</tr>\n</table>\n";
	
	// First level menus
	for(var i=0;i<this.Menus.length;i++)
	{
		var tag = "FCMNU_" + i;
		if(this.Menus[i].Menus.length>0)
		{
			o+='\n<table class="FCMDropTbl" id="' + tag + 'C" cellpadding="0" cellspacing="0" onmouseout="MenuOut();"';
			o+=" onmouseover=\"ClearTimer();\"";
			o+='>';
			o+="\n";
			for(var j=0;j<this.Menus[i].Menus.length;j++)
			{
				this.Menus[i].Menus[j].ParentTagName=tag;
				this.Menus[i].Menus[j].TagName=tag+"_"+j;
				o+='<tr><td id="' + this.Menus[i].Menus[j].TagName + '" class="FCMDropTblCell' + selectedCSSStyle + '"';
				
				if (this.Menus[i].Menus[j].Menus.length > 0)
				{
					o+=' onmouseover="';
					o+="RenderSubMenu(" + this.Menus[i].Menus[j].ArrayIndex + ");";
					o+='"';
				}
				
				o+=">" + this.Menus[i].Menus[j].Text;
				o+="</td></tr>\n";
			}
			o+="</table>\n";
			
			// Loop through sub items for any more submenus
			for(var j=0;j<this.Menus[i].Menus.length;j++)
			{
				if (this.Menus[i].Menus[j].Menus.length > 0)
				{
					o+=this.RenderSubItems(this.Menus[i].Menus[j]);
				}
			}
		}
	}		
	
	var el = document.getElementById(baseTagName);
	el.innerHTML=o;

}
function FreecomMenu_RenderSubItems(menuItem)
{
	var tag = menuItem.TagName;
	var o='\n<table cellpadding="0" cellspacing="0" class="FCMDropTbl" id="' + tag + 'C" onmouseout="MenuOut(' + menuItem.ArrayIndex + ');" onmouseover="ClearTimer();">';
	o+="\n";
	for(var j=0;j<menuItem.Menus.length;j++)
	{
		menuItem.Menus[j].ParentTagName=tag;
		menuItem.Menus[j].TagName=tag+"_"+j;
		o+='<tr><td id="' + menuItem.Menus[j].TagName + '" class="FCMDropTblCell' + selectedCSSStyle + '"';
		
		if (menuItem.Menus[j].Menus.length)
		{
			o+=' onmouseover="';
			o+="RenderSubMenu(" + menuItem.Menus[j].ArrayIndex + ");";
			o+='"';
		}
		
		o+=">" + menuItem.Menus[j].Text;
		o+="</td></tr>\n";
	}
	o+="</table>\n";
	
	for(var j=0;j<menuItem.Menus.length;j++)
	{
		if (menuItem.Menus[j].Menus.length > 0)
		{
			o+=this.RenderSubItems(menuItem.Menus[j]);
		}
	}
	return o;
}

//# FreecomMenu End

//# FreecomMenuItem
function FreecomMenuItem(text)
{
	this.Text = text;
	this.Menus = new Array();
	this.AddMenu = FreecomMenuItem_AddMenu;
	this.TagName = "";
	this.ParentTagName = "";
	this.ParentObject = null;
	this.ArrayIndex = -1;
}
function FreecomMenuItem_AddMenu(subMenu)
{
	subMenu.ParentObject = this;
	index = this.Menus.length;
	subMenu.ArrayIndex = MenuItemArray.length;
	MenuItemArray[MenuItemArray.length] = subMenu;
	this.Menus[index] = subMenu;
}
//# FreecomMenuItem End

//# Global Objects
var MenuItemArray = new Array();
var Timer = null;
var CurrentMenuIndex = -1;
var MenuActive = false;
//# Global Objects End
 
//# Generic Utils
function GetXPos(e)
{
	var x;
	x=e.offsetLeft;
	if(e.offsetParent!=null) x+=GetXPos(e.offsetParent);
	return x;
}
function GetYPos(e)
{
	var y;
	y=e.offsetTop;
	if(e.offsetParent!=null) y+=GetYPos(e.offsetParent);
	return y;
}
function LinkEvent(obj, evType, fn)
{
	if(obj.addEventListener)
	{
		obj.addEventListener(evType, fn, false); 
		return true;
	}
	else if (obj.attachEvent)
	{
		var r = obj.attachEvent('on'+evType, fn);
		return r;
	} 
	else 
	{
		return false;
	}
}
function RenderMenu(arrayIndex)
{
	ClearTimer();
	CurrentMenuIndex = arrayIndex;
	CloseMenu(menu, false);
	var tag = MenuItemArray[arrayIndex].TagName;
	var parentEl = document.getElementById(tag);
	x = GetXPos(parentEl);
	y = GetYPos(parentEl) - 5;
	
	var el = document.getElementById(tag + "C");
	el.style.position = 'absolute';
	el.style.left = x;
	el.style.top = y + parentEl.offsetHeight;
	el.style.display='block';
}
function RenderSubMenu(arrayIndex)
{
	ClearTimer();
	CurrentMenuIndex = arrayIndex;
	CloseMenu(MenuItemArray[arrayIndex].ParentObject, false);
	var tag = MenuItemArray[arrayIndex].TagName;
	var el = document.getElementById(tag + "C");
	var parentEl = document.getElementById(tag);
	x = GetXPos(parentEl);
	y = GetYPos(parentEl);
	el.style.position = 'absolute';
	el.style.top = y;
	el.style.left = x + parentEl.offsetWidth;
	el.style.display = 'block';
}

function CloseMenu(currentMenu, levelClose)
{
	// Close the content table if required
	if (levelClose)
	{
		tag = currentMenu.TagName + "C";
		var el = document.getElementById(tag);
		if (el != null) el.style.display='none';
	}
	
	if (currentMenu.Menus.length > 0)
	{
		for (var n=0;n<currentMenu.Menus.length;n++)
		{
			CloseMenu(currentMenu.Menus[n], true);
		}
	}
}

function MenuOut(arrayIndex)
{
	StartTimer();
}

function StartTimer()
{
	ClearTimer();
	Timer = setInterval(CloseDown, 200);
}

function ClearTimer()
{
	clearInterval(Timer);
}

function CloseDown()
{
	ClearTimer();
	CloseMenu(menu, false);
}

function FDebug(msg)
{
	var opt = new Option(msg, "");
	Pants.logger.options[Pants.logger.options.length] = opt;
}
//# Generic Utils End

var menu = null; //new FreecomMenu();
var selectedCSSStyle = '';