UIMENU_BUTTON_HEIGHT = 16;
UIMENU_BUTTON_WIDTH = 104;
UIMENU_BORDER_HEIGHT = 12;
UIMENU_BORDER_WIDTH = 12;

UIMENU_NUMBUTTONS = 32;
UIMENU_TIMEOUT = 2.0;

function UIMenu_Initialize(self)
	self.numButtons = 0;
	self.subMenu = "";
	local name = self:GetName();
	for i = 1, UIMENU_NUMBUTTONS, 1 do
		local button = _G[name.."Button"..i];
		button:SetWidth(UIMENU_BUTTON_WIDTH);
		button:SetHeight(UIMENU_BUTTON_HEIGHT);
		button:Hide();
		
		local shortcutString = _G[button:GetName().."ShortcutText"];
		shortcutString:Hide();
	end

	self:SetWidth(UIMENU_BUTTON_WIDTH + (UIMENU_BORDER_WIDTH * 2));
	self:SetHeight(UIMENU_BORDER_HEIGHT * 2);
end

function UIMenu_OnShow(self)
	self.timeleft = UIMENU_TIMEOUT;
	self.counting = 0;
end

function UIMenu_AddButton(self, text, shortcut, func, nested, value)
	local id = self.numButtons + 1;
	if ( id > UIMENU_NUMBUTTONS ) then
		message("Too many buttons in UIMenu: "..self:GetName());
		return;
	end

	self.numButtons = id;

	local button = _G[self:GetName().."Button"..id];
	if ( text ) then
		button:SetText(text);
	end
	button.func = func;
	button.nested = nested;
	button.value = value;
	button:Show();

	if ( shortcut ) then
		local shortcutString = _G[button:GetName().."ShortcutText"];
		shortcutString:SetText(shortcut);
		shortcutString:Show();
	end

	self:SetHeight((id * UIMENU_BUTTON_HEIGHT) + (UIMENU_BORDER_HEIGHT * 2));
end

function UIMenu_OnUpdate(self, elapsed)
	if ( self.counting == 1 ) then
		local timeleft = self.timeleft - elapsed;
		if ( timeleft <= 0 ) then
			self:Hide();
			return;
		end
		self.timeleft = timeleft;
	end
end

function UIMenuButton_OnLoad(self)
	self:SetPoint("TOP", self:GetParent(), "TOP", 0, -((self:GetID() - 1) * UIMENU_BUTTON_HEIGHT) - UIMENU_BORDER_HEIGHT);
end

function UIMenuButton_OnClick(self)
	local func = self.func;
	if ( func ) then
		func(self);
	end

	self:GetParent():Hide();
	PlaySound("UChatScrollButton");
end

function UIMenu_StartCounting(menu)
	menu.counting = 1;

	if ( menu.onlyAutoHideSelf ) then
		return;
	end
	local parentName = menu.parentMenu;
	if ( parentName ) then
		UIMenu_StartCounting(_G[parentName]);
	end
end

function UIMenu_StopCounting(menu)
	menu.counting = 0;
	menu.timeleft = UIMENU_TIMEOUT;

	local parentName = menu.parentMenu;
	if ( parentName ) then
		UIMenu_StopCounting(_G[parentName]);
	end
end

function UIMenuButton_OnEnter(self)
	local nested = self.nested;
	if ( nested ) then
		local menu = _G[nested];
		if ( not menu:IsShown() ) then
			local oldMenu = _G[self:GetParent().subMenu];
			if ( oldMenu ) then
				oldMenu:Hide();
			end

			self:GetParent().subMenu = nested;
			menu:ClearAllPoints();
			menu:SetPoint("BOTTOMLEFT", self, "BOTTOMRIGHT", 10, -12);
			menu:Show();
			if ( menu:GetRight() and menu:GetRight() > GetScreenWidth() ) then
				-- flip the menu's anchor if it is running off the screen
				menu:ClearAllPoints();
				menu:SetPoint("BOTTOMRIGHT", self, "BOTTOMLEFT", -10, -12);
			end
		end

		UIMenu_StopCounting(menu);
	else
		UIMenu_StopCounting(self:GetParent());
	end
end

function UIMenuButton_OnLeave(self)
	UIMenu_StartCounting(self:GetParent());
	
	local nested = self.nested;
	if ( nested ) then
		UIMenu_StartCounting(_G[nested]);
	end
end

function UIMenu_AutoSize(frame)
	if ( UIMenu_GetNumButtons(frame) == 0 ) then
		return;
	end
	local button, buttonName, shortcutText;
	local name = frame:GetName();
	local width;
	local maxWidth = 0;
	for i=1, UIMENU_NUMBUTTONS do
		buttonName = name.."Button"..i
		button = _G[buttonName];
		if ( button:IsShown() ) then
			width = button:GetTextWidth();
			shortcutText = _G[buttonName.."ShortcutText"];
			if ( shortcutText:GetText() ~= "" ) then
				width = width + shortcutText:GetWidth();
			end
			-- Add padding
			width = width + 20;
			if ( width > maxWidth ) then
				maxWidth = width;
			end
		end
	end
	for i=1, UIMENU_NUMBUTTONS do
		_G[name.."Button"..i]:SetWidth(maxWidth);
	end
	frame:SetWidth(maxWidth + (UIMENU_BORDER_WIDTH * 2));
end

function UIMenu_FinishInitializing(frame)
	if ( UIMenu_GetNumButtons(frame) == 0 ) then
		return false;
	end
	UIMenu_AutoSize(frame);
	return true;
end

function UIMenu_GetNumButtons(frame)
	if ( not frame.numButtons ) then
		return 0;
	end
	return frame.numButtons;
end