//var c = 0;
//var rootMenus = new Array();

var lastEvent;

var Event_MouseOut = 0;
var Event_MouseOver = 1;

var SubMenuPos_Left = 0;
var SubMenuPos_Top = 1;
var SubMenuPos_Right = 2;
var SubMenuPos_Bottom = 3;

var MenuState_Hidden = 0;
var MenuState_Visible = 1;

var MenuItemState_Deselected = 0;
var MenuItemState_Selected = 1;

function C_Menu(_name)
{
	var className;
	this.className = "C_Menu";
	var name;
	this.name = _name;
	var layerID;
	var layer;
	var parentItem;
	var selectedItem;
	var openSubMenu;
	//var deepestOpenSubMenu;
	var items;
	var left;
	var top;
	var width;
	var height;
	var defaultState;
	var state;
	var openMenuItem
	this.defaultState = MenuState_Hidden;
	this.state = MenuState_Hidden;
	this.items = new Array();
	this.CreateByLayer = CreateByLayer;
	this.CreateByLayerID = CreateByLayerID;
	this.AddItem = AddItem;
	this.Show = Show;
	this.Hide = Hide;
	this.SetLeft = SetLeft;
	this.SetTop = SetTop;
	this.MoveToPos = MoveToPos;
	//this.SetDeepestOpenSubMenu = SetDeepestOpenSubMenu;
	this.SetOpenSubMenu = SetOpenSubMenu;
	this.SetSelectedItem = SetSelectedItem;
	this.ResetSelectedItem = ResetSelectedItem;
	//this.HideWithParentMenus = HideWithParentMenus;
	this.HideWithChildMenus = HideWithChildMenus;
	//this.HideDeepestWithParentMenus = HideDeepestWithParentMenus;
	//this.HideWithParentMenusTimed = HideWithParentMenusTimed;
	//this.CheckStates = CheckStates;
	this.ArrangeItemPositions = ArrangeItemPositions;
	
	function CreateByLayer(layerObj)
	{
		this.layer = layerObj;
		if(layerObj)
		{
			this.left = layerObj.GetLeft();
			this.top = layerObj.GetTop();
			this.width = layerObj.GetWidth();
			this.height = layerObj.GetHeight();
			if(!this.layerID)
			{
				this.layerID = layerObj.layerID;
			}
		}
	}
	
	function CreateByLayerID(layerID)
	{
		this.layerID = layerID;
		var layerObj;
		layerObj = new C_Layer();
		layerObj.CreateByID(layerID);
		this.CreateByLayer(layerObj);
	}
	
	function AddItem(item)
	{
		if(!item)
		{
			return(-1);
		}
		item.parentMenu = this;
		var a = this.items;
		var b = new Array(item);
		a = a.concat(b);
		this.items = a;
		this.ArrangeItemPositions();
	}
	
	function ArrangeItemPositions()
	{
		//im("C_Menu(" + this.name + ").ArrangeItemPositions()");
		var items = this.items;
		//var hasSelected = (this.selectedItem != null);
		var top = 0;
		for(var i = 0; i < items.length; i++)
		{
			//im(i);
			var menuItem = items[i];
			if(menuItem)
			{
				if(menuItem.className == "C_MenuItem")
				{
					menuItem.SetTop(top);
					var height = menuItem.GetHeight();
					if(!height)
					{
						height = 0;
					}
					top+= height;
					if(menuItem == this.selectedItem || menuItem.state == MenuItemState_Selected)
					{
						var openSubMenu = this.openSubMenu;
						//im("selected(" + this.name + "): openSubMenu: " + openSubMenu);
						if(openSubMenu && openSubMenu.className == "C_Menu")
						{
							//im("openSubMenu.height: " + openSubMenu.height);
							top+= openSubMenu.height;
						}
					}
				}
				else
				{
					em("menuItem.className(" + menuItem.className + ") != C_MenuItem");
				}
			}
		}
		//im(this.name + ": top: " + top);
		this.height = top;
		var parentItem = this.parentItem;
		if(parentItem && parentItem.className == "C_MenuItem")
		{
			var parentMenu = parentItem.parentMenu;
			if(parentMenu && parentMenu.className == "C_Menu")
			{
				if(parentMenu != this)
				{
					parentMenu.ArrangeItemPositions();
				}
			}
		}
	}
	
	/*function CheckStates()
	{
		return(0);
		//im("C_Menu(" + this.name + ").CheckStates()");
		var deepestOpenSubMenu = this.deepestOpenSubMenu;
		var openSubMenu = this.openSubMenu;
		var selectedItem = this.selectedItem;
		var items = this.items;
		var hasSelected = (this.selectedItem != null);
		//s+= "hasSelected: " + hasSelected + "<br>";
		for(var i = 0; i < items.length; i++)
		{
			var menuItem = items[i];
			if(menuItem)
			{
				if(menuItem.className == "C_MenuItem")
				{
					//s+= menuItem.state;
					var selected = hasSelected && (this.selectedItem == menuItem);//Most épp ő van kiválasztva
					//selected = selected || (menuItem.state == MenuItemState_Selected);
					
					//if(!((menuItem.state == MenuItemState_Selected) && selected))
					
					//s+= "<br>";
				}
			}
		}
		var parentItem = this.parentItem;
		if(parentItem)
		{
			var parentMenu = parentItem.parentMenu;
			if(parentMenu)
			{
				parentMenu.CheckStates();
			}
		}
	}*/
	
	function SetOpenSubMenu(menuObj)
	{
		//alert("SetOpenSubMenu");
		this.openSubMenu = menuObj;
		this.ArrangeItemPositions();
	}
	
	function SetSelectedItem(menuItemObj)//Reset: menuItemObj = null
	{
		//alert("SetSelectedItem");
		var menuItemObjlayerID = menuItemObj?menuItemObj.name:'null';
		//im(this.name + ".SetSelectedItem(" + menuItemObjlayerID + ")");
		var selectedItem = null;
		if(this.selectedItem)
		{
			selectedItem = this.selectedItem;
		}
		if((selectedItem == null) && (menuItemObj == null))
		{
			//im(this.name + ".SetSelectedItem(" + menuItemObjlayerID + "): selectedItem == menuItemObj : return(0)");
			return(0);
		}
		if(selectedItem == menuItemObj)
		{
			//im(this.name + ".SetSelectedItem(" + menuItemObjlayerID + "): selectedItem == menuItemObj : return(0)");
			return(0);
		}
		this.selectedItem = menuItemObj;
		/*this.CheckStates();
		var parentItem = this.parentItem;
		if(parentItem)//not root menu
		{
			if(parentItem.parentMenu)
			{
				var parentMenu = parentItem.parentMenu;
				if(menuItemObj)
				{
					parentMenu.SetSelectedItem(parentItem);
				}
				else
				{
					parentMenu.ResetSelectedItem();
				}
			}
		}*/
		return(0);
	}
	
	function ResetSelectedItem()
	{
		//im(this.name + ".ResetSelectedItem()");
		return(this.SetSelectedItem(null));
	}
	
	/*function SetDeepestOpenSubMenu(menuObj)
	{
		this.deepestOpenSubMenu = menuObj;
		var parentItem = this.parentItem;
		if(parentItem)//not root menu
		{
			var parentMenu = parentItem.parentMenu;
			if(parentMenu)
			{
				parentMenu.SetDeepestOpenSubMenu(menuObj);
			}
		}
		return(0);
	}*/
	
	function Show()
	{
		//im("Show");
		if(this.state == MenuState_Visible)
		{
			return(0);
		}
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.Show();
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		else
		{
			var items = this.items;
			//var hasSelected = (this.selectedItem != null);
			for(var i = 0; i < items.length; i++)
			{
				var menuItem = items[i];
				if(menuItem)
				{
					if(menuItem.className == "C_MenuItem")
					{
						menuItem.Show();
					}
					else
					{
						em("menuItem.className(" + menuItem.className + ") != C_MenuItem");
					}
				}
			}
			//return(-1);//ha nem layerek az itemek
		}
		this.state = MenuState_Visible;
		/*var deepestOpenSubMenu = this.deepestOpenSubMenu;
		if(deepestOpenSubMenu)
		{
			this.HideDeepestWithParentMenus(true);
		}*/
		if(this.parentItem)
		{
			var parentItem = this.parentItem;
			if(parentItem.parentMenu)
			{
				var parentMenu = parentItem.parentMenu;
				//im("parentMenu.SetOpenSubMenu(this);");
				parentMenu.SetOpenSubMenu(this);
				//parentMenu.SetSelectedItem(parentItem);
			}
		}
		//this.SetDeepestOpenSubMenu(this);
		return(0);
	}
	
	function Hide()
	{
		if(this.state == MenuState_Hidden)
		{
			return(0);
		}
		if(this.defaultState == MenuState_Visible)
		{
			return(0);
		}
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.Hide();
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		else
		{
			var items = this.items;
			//var hasSelected = (this.selectedItem != null);
			for(var i = 0; i < items.length; i++)
			{
				var menuItem = items[i];
				if(menuItem)
				{
					if(menuItem.className == "C_MenuItem")
					{
						menuItem.Hide();
					}
					else
					{
						em("menuItem.className(" + menuItem.className + ") != C_MenuItem");
					}
				}
			}
			//return(-1);//ha nem layerek az itemek
		}
		this.state = MenuState_Hidden;
		/*var deepestOpenSubMenu = this.deepestOpenSubMenu;
		if(deepestOpenSubMenu && (deepestOpenSubMenu != this))
		{
			//this.HideDeepestWithParentMenus(true);
			this.HideDeepestWithParentMenus(false);
		}
		this.SetDeepestOpenSubMenu(null);*/
		if(this.parentItem)
		{
			var parentItem = this.parentItem;
			if(parentItem.parentMenu)
			{
				var parentMenu = parentItem.parentMenu;
				parentMenu.SetOpenSubMenu(null);
				//parentMenu.SetSelectedItem(parentItem);
				//parentMenu.SetDeepestOpenSubMenu(parentMenu);
			}
		}
		return(0);
	}
	
	/*function HideDeepestWithParentMenus(timed)
	{
		var deepestOpenSubMenu = this.deepestOpenSubMenu;
		if(!deepestOpenSubMenu)
		{
			deepestOpenSubMenu = this;
		}
		deepestOpenSubMenu.HideWithParentMenus(timed);
	}
	
	function HideWithParentMenus(timed)
	{
		//var cmd = "HideWithParentMenusTimerProc(" + deepestOpenSubMenu.name + ");";
		var cmd;
		if(this.name)
		{
			cmd = this.name + ".HideWithParentMenusTimed();";
		}
		if(timed)
		{
			if(cmd)
			{
				window.setTimeout(cmd, 1500, "JavaScript");
			}
			else
			{
				em("HideWithParentMenus(timed): !cmd");
			}
		}
		else
		{
			if(cmd)
			{
				eval(cmd);
			}
			else
			{
				this.HideWithParentMenusTimed();
			}
		}
	}*/
	
	function HideWithChildMenus()
	{
		if(this.defaultState == MenuState_Visible)
		{
			return(0);
		}
		if(this.selectedItem)
		{
			var selectedItem = this.selectedItem;
			selectedItem.Deselect(false);
			//alert("HideWithChildMenus: this.selectedItem:" + selectedItem.name);
		}
		if(this.openSubMenu)
		{
			var openSubMenu = this.openSubMenu;
			openSubMenu.HideWithChildMenus();
			//alert("HideWithChildMenus: this.openSubMenu");
		}
		this.Hide();
	}
	
	/*function HideWithParentMenusTimed()
	{
		if(this.selectedItem)
		{
			return(0);
		}
		if(this.defaultState == MenuState_Visible)
		{
			return(0);
		}
		var parentItem = this.parentItem;
		var parentMenu;
		var parentSubMenu;
		if(parentItem)
		{
			parentMenu = parentItem.parentMenu;
			if(parentMenu)
			{
				parentSubMenu = parentMenu.openSubMenu;
				if(parentSubMenu && (parentSubMenu == this) && (parentMenu.selectedItem == parentItem) && (parentItem.state == MenuItemState_Selected))
				{
					return(0);//Nem kell becsukni
				}
			}
			parentItem.Deselect(false);
			parentItem.HideSubMenu();
		}
		this.Hide();
		if(parentMenu)
		{
			parentMenu.HideWithParentMenusTimed();
		}
	}*/
	
	function SetLeft(left)
	{
		//im("C_Menu(" + this.name + ").SetLeft(" + left + "), this.left: '" + this.left + "'");
		//im("left: " + left);
		if(this.left == left)
		{
			return(0);
		}
		this.left = left;
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.SetLeft(left);
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		else
		{
			var items = this.items;
			//var hasSelected = (this.selectedItem != null);
			for(var i = 0; i < items.length; i++)
			{
				var menuItem = items[i];
				if(menuItem)
				{
					if(menuItem.className == "C_MenuItem")
					{
						//menuItem.SetLeft(left);
						menuItem.UpdateLayerPos();
					}
					else
					{
						em("menuItem.className(" + menuItem.className + ") != C_MenuItem");
					}
				}
			}
		}
		return(0);
	}
	
	function SetTop(top)
	{
		//im("C_Menu(" + this.name + ").SetTop(" + top + "), this.top: '" + this.top + "'");
		if(this.top == top)
		{
			return(0);
		}
		this.top = top;
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.SetTop(top);
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		else
		{
			var items = this.items;
			//im(items.length);
			//var hasSelected = (this.selectedItem != null);
			for(var i = 0; i < items.length; i++)
			{
				//im(i);
				var menuItem = items[i];
				if(menuItem)
				{
					if(menuItem.className == "C_MenuItem")
					{
						menuItem.UpdateLayerPos();
					}
					else
					{
						em("menuItem.className(" + menuItem.className + ") != C_MenuItem");
					}
				}
			}
		}
		return(0);
	}
	
	function MoveToPos(left, top)
	{
		if(!this.SetLeft(left))
		{
			return(this.SetTop(top));
		}
		else
		{
			em("this.SetLeft(left)");
		}
		return(-1);
	}

}

function C_MenuItem(_name)
{
	var className;
	this.className = "C_MenuItem";
	var obj;
	var name;
	this.name = _name;
	var layer;
	var layerID;
	var parentMenu;
	var subMenu;
	var subMenuPos;
	var subMenuLeft;
	var subMenuTop;
	var left;
	var top;
	var width;
	var height;
	var state;
	var Tag;
	var OnSelect;
	var OnDeselect;
	var OnOver;
	var OnClick;
	var eventObj;
	var cssClassName;
	this.state = MenuItemState_Deselected;
	this.CreateByObj = CreateByObj;
	this.CreateByObjID = CreateByObjID;
	this.CreateByLayerID = CreateByLayerID;
	this.SetSubMenu = SetSubMenu;
	this.SetSubMenuPos = SetSubMenuPos;
	this.MoveSubMenuToPos = MoveSubMenuToPos;
	this.Select = Select;
	this.Deselect = Deselect;
	this.CallOnDeselect = CallOnDeselect;
	this.Show = Show;
	this.Hide = Hide;
	this.ShowSubMenu = ShowSubMenu;
	this.HideSubMenu = HideSubMenu;
	this.UpdateLayerPos = UpdateLayerPos;
	this.SetLeft = SetLeft;
	this.SetTop = SetTop;
	this.GetLeft = GetLeft;
	this.GetTop = GetTop;
	this.GetWidth = GetWidth;
	this.GetHeight = GetHeight;
	this.GetLeftAbs = GetLeftAbs;
	this.GetTopAbs = GetTopAbs;
	this.OnMouseOver = OnMouseOver;
	this.OnMouseOut = OnMouseOut;
	this.OnMouseClick = OnMouseClick;
	
	function CreateByObj(_obj)
	{
		this.obj = _obj;
		//_layer = new C_Layer();
		//_layer.CreateByObj(_obj);
		//this.layer = _layer;
	}
	
	function CreateByObjID(objID)
	{
		var obj = GetObjByID(objID);
		this.CreateByObj(obj);
	}
	
	function CreateByLayerID(layerID)
	{
		this.layerID = layerID;
		var layerObj;
		layerObj = new C_Layer();
		layerObj.CreateByID(layerID);
		this.layer = layerObj;
		this.CreateByObjID(layerID);
	}
	
	function SetLeft(left)
	{
		//im("C_MenuItem(" + this.layerID + ").SetLeft(" + left + "), this.left: '" + this.left + "'");
		if(this.left == left)
		{
			return(0);
		}
		this.left = left;
		this.UpdateLayerPos();
		return(0);
	}
	
	function SetTop(top)
	{
		//im("C_MenuItem(" + this.layerID + ").SetTop(" + top + "), this.top: '" + this.top + "'");
		if(this.top == top)
		{
			return(0);
		}
		this.top = top;
		this.UpdateLayerPos();
		return(0);
	}
	
	function Show()
	{
		//im("Item: Show");
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.Show();
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		return(0);
	}
	
	function Hide()
	{
		//im("Item: Hide");
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				layer.Hide();
			}
			else
			{
				em("layer.className(" + layer.className + ") != C_Layer");
			}
		}
		return(0);
	}
	
	function SetSubMenu(menu)
	{
		if(menu)
		{
			menu.parentItem = this;
		}
		this.subMenu = menu;
		this.MoveSubMenuToPos();
	}
	
	function Select()
	{
		if(this.state == MenuItemState_Selected)
		{
			return(0);
		}
		this.state = MenuItemState_Selected;
		if(this.parentMenu)
		{
			var parentMenu = this.parentMenu;
			parentMenu.SetSelectedItem(this);
		}
		if(this.OnSelect)
		{
			eval(this.OnSelect);
		}
		return(0);
	}
	
	function Deselect(timed)
	{
		if(this.state == MenuItemState_Deselected)
		{
			return(0);
		}
		this.state = MenuItemState_Deselected;
		if(this.parentMenu)
		{
			var parentMenu = this.parentMenu;
			if(parentMenu.selectedItem)
			{
				var selectedItem = parentMenu.selectedItem;
				if(selectedItem == this)
				{
					parentMenu.ResetSelectedItem();
				}
			}
		}
		/*var cmd = this.name + ".CallOnDeselect();";
		if(timed)
		{
			window.setTimeout(cmd, 10, "JavaScript");
		}
		else
		{
			if(cmd)
			{
				window.eval(cmd);
			}
			else
			{*/
				this.CallOnDeselect();
			//}
		//}
		return(0);
	}
	
	function CallOnDeselect()
	{
		if(this.state != MenuItemState_Deselected)
		{
			return(0);
		}
		if(this.OnDeselect)
		{
			eval(this.OnDeselect);
		}
		return(0);
	}
	
	function ShowSubMenu()
	{
		if(this.subMenu)
		{
			var menu = this.subMenu;
			//this.MoveSubMenuToPos();//Csak akkor kell, amikor változnak a pozíciók
			menu.Show();
		}
	}
	
	function HideSubMenu()
	{
		if(this.subMenu)
		{
			var menu = this.subMenu;
			//menu.Hide();
			menu.HideWithChildMenus();
		}
	}
	
	function SetSubMenuPos(pos)
	{
		this.subMenuPos = pos;
		this.MoveSubMenuToPos();
	}
	
	function GetLeft()
	{
		if(this.left)
		{
			return(this.left);
		}
		return(null);
	}
	
	function GetTop()
	{
		if(this.top)
		{
			return(this.top);
		}
		return(null);
	}
	
	function GetWidth()
	{
		/*var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				this.width = layer.GetWidth();
			}
		}*/
		return(this.width);
	}
	
	function GetHeight()
	{
		/*var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				this.height = layer.GetHeight();
			}
		}*/
		return(this.height);
	}
	
	function GetLeftAbs()
	{
		var leftBase = 0;
		var parentMenu = this.parentMenu;
		if(parentMenu)
		{
			leftBase = new Number(parentMenu.left);
		}
		var left = this.GetLeft();
		if(!left)
		{
			left = 0;
		}
		return(leftBase + new Number(left));
	}
	
	function GetTopAbs()
	{
		var topBase = 0;
		var parentMenu = this.parentMenu;
		if(parentMenu)
		{
			topBase = new Number(parentMenu.top);
		}
		var top = this.GetTop();
		if(!top)
		{
			top = 0;
		}
		return(topBase + new Number(top));
	}
	
	
	function UpdateLayerPos()
	{
		//im("C_MenuItem(" + this.layerID + ").UpdateLayerPos() BEGIN");
		var layer = this.layer;
		if(layer)
		{
			if(layer.className == "C_Layer")
			{
				var curX = layer.GetLeft();
				var curY = layer.GetTop();
				var absX = this.GetLeftAbs();
				var absY = this.GetTopAbs();
				absX = (!absX?0:absX);
				absY = (!absY?0:absY);
				var changed = false;
				if(curX != absX)
				{
					changed = true;
					layer.SetLeft(absX);
				}
				if(curY != absY)
				{
					changed = true;
					layer.SetTop(absY);
				}
				if(changed)
				{
					this.MoveSubMenuToPos();
				}
				//im("C_MenuItem(" + this.layerID + ").UpdateLayerPos() RETURN(0)");
				return(0);
			}
			else
			{
				em("ERROR: C_MenuItem(" + this.layerID + ").UpdateLayerPos(): layer.className(" + layer.className + ") != C_Layer");
			}
		}
		em("ERROR: C_MenuItem(" + this.layerID + ").UpdateLayerPos() END");
	}
	
	function MoveSubMenuToPos()
	{
		var menu = this.subMenu;
		if(!menu)
		{
			return(0);
		}
		var x = null;
		var y = null;
		var menu = this.subMenu;
		var pos = this.subMenuPos;
		var left = this.GetLeftAbs();
		var top = this.GetTopAbs();
		if(!left)
		{
			left = 0;
		}
		if(!top)
		{
			top = 0;
		}
		left = new Number(left);
		top = new Number(top);
		var width = null;
		var height = null;
		var subMenuLeft = this.subMenuLeft;
		var subMenuTop = this.subMenuTop;
		if(subMenuLeft != null && subMenuTop != null)
		{
			x = left + subMenuLeft;
			y = top + subMenuTop;
		}
		else
		{
			width = this.GetWidth();
			height = this.GetHeight();
			if(!width)
			{
				width = 0;
			}
			if(!height)
			{
				height = 0;
			}
			width = new Number(width);
			height = new Number(height);
			if(menu && pos)
			{
				switch(pos)
				{
					case SubMenuPos_Right:
						x = left + width;
						y = top;
						break;
					default:
						x = 0;
						y = 0;
						break;
				}
			}
		}
		//if(menu && x != null && y != null)
		if(menu && x && y)
		{
			menu.MoveToPos(x, y);
		}
	}
	
	function OnMouseOver(e)//event
	{
		this.eventObj = e;
		if(this.OnOver)
		{
			eval(this.OnOver);
		}
		this.eventObj = null;
		return(0);
	}
	
	function OnMouseOut(e)//event
	{
		this.eventObj = e;
		if(this.OnOut)
		{
			eval(this.OnOut);
		}
		this.eventObj = null;
		return(0);
	}
	
	function OnMouseClick(e)//event
	{
		this.eventObj = e;
		if(this.OnClick)
		{
			eval(this.OnClick);
		}
		this.eventObj = null;
		return(0);
	}
}

