TITAN_MONEY_ID = "Money";
TITAN_MONEY_FREQUENCY = 1;

local startMoney;
local startSessionTime;

function TitanPanelMoneyButton_OnLoad()
	this.registry = { 
		id = TITAN_MONEY_ID,
		builtIn = 1,
		version = TITAN_VERSION,
		menuText = TITAN_MONEY_MENU_TEXT, 
		tooltipTitle = TITAN_MONEY_TOOLTIP,
		tooltipTextFunction = "TitanPanelMoneyButton_GetTooltipText",
		frequency = TITAN_MONEY_FREQUENCY,
		updateType = TITAN_PANEL_UPDATE_TOOLTIP,
	};

	SmallMoneyFrame_OnLoad();
	this:RegisterEvent("PLAYER_ENTERING_WORLD");

	WoW_OpenCoinPickupFrame = OpenCoinPickupFrame;	
	OpenCoinPickupFrame = Titan_OpenCoinPickupFrame;
end

function TitanPanelMoneyButton_OnEvent() 
	MoneyFrame_OnEvent()
	if (event == "PLAYER_ENTERING_WORLD") then
		MoneyFrame_UpdateMoney();
		if (not startMoney) then
			startMoney = GetMoney();
			startSessionTime = 0;
		end
	end
end

function TitanPanelMoneyCopperButton_OnClick(button)
	if (button == "LeftButton") then
		local parent = this:GetParent();
		OpenCoinPickupFrame(1, MoneyTypeInfo[parent.moneyType].UpdateFunc(), parent);
		parent.hasPickup = 1;
	end
end

function TitanPanelMoneySilverButton_OnClick(button)
	if (button == "LeftButton") then
		local parent = this:GetParent();
		OpenCoinPickupFrame(COPPER_PER_SILVER, MoneyTypeInfo[parent.moneyType].UpdateFunc(), parent);
		parent.hasPickup = 1;
	end
end

function TitanPanelMoneyGoldButton_OnClick(button)
	if (button == "LeftButton") then
		local parent = this:GetParent();
		OpenCoinPickupFrame(COPPER_PER_GOLD, MoneyTypeInfo[parent.moneyType].UpdateFunc(), parent);
		parent.hasPickup = 1;
	end
end

function TitanPanelMoneyButton_GetTooltipText()
	local sessionTime = TitanUtils_GetSessionTime() - startSessionTime;
	local initialMoney = startMoney;
	local fluctMoney = GetMoney() - initialMoney;
	local fluctMoneyPerHour = TitanPanelMoneyButton_GetMoneyPerHour(fluctMoney, sessionTime);
	
	if fluctMoneyPerHour == nil then
		fluctMoneyPerHour = 0;
	end
	-- Current money Text
	local currentMoneyRichText = TITAN_MONEY_TOOLTIP_CURRENT.."\t"..
			TitanUtils_GetHighlightText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(GetMoney())));

	-- Initial money Text
	local initialMoneyRichText = TITAN_MONEY_TOOLTIP_INITIAL.."\t"..
			TitanUtils_GetHighlightText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(initialMoney)));
	
	-- Money Fluctuation Text
	local fluctMoneyRichText;
	local fluctMoneyPerHourRichText;
	if (fluctMoney < 0) then		
		fluctMoneyRichText = TITAN_MONEY_TOOLTIP_LOST.."\t"..
			TitanUtils_GetRedText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(0 - fluctMoney)));
		fluctMoneyPerHourRichText = TITAN_MONEY_TOOLTIP_LOST_HOUR.."\t"..
			TitanUtils_GetRedText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(0 - fluctMoneyPerHour)));
	elseif (fluctMoney == 0) then
		fluctMoneyRichText = TITAN_MONEY_TOOLTIP_EARNED.."\t"..
			TitanUtils_GetHighlightText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(0)));
		fluctMoneyPerHourRichText = TITAN_MONEY_TOOLTIP_EARNED_HOUR.."\t"..
			TitanUtils_GetHighlightText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(0)));
	else
		fluctMoneyRichText = TITAN_MONEY_TOOLTIP_EARNED.."\t"..
			TitanUtils_GetGreenText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(fluctMoney)));
		fluctMoneyPerHourRichText = TITAN_MONEY_TOOLTIP_EARNED_HOUR.."\t"..
			TitanUtils_GetGreenText(format(TITAN_MONEY_FORMAT, TitanPanelMoneyButton_BreakMoney(fluctMoneyPerHour)));
	end
	
	return ""..
		currentMoneyRichText.."\n"..
		initialMoneyRichText.."\n"..
		fluctMoneyRichText.."\n"..
		fluctMoneyPerHourRichText.."\n"..
		TitanUtils_GetGreenText(TITAN_MONEY_TOOLTIP_HINTS);
end

function TitanPanelRightClickMenu_PrepareMoneyMenu()
	TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_MONEY_ID].menuText);
	TitanPanelRightClickMenu_AddCommand(TITAN_MONEY_MENU_RESET_SESSION, TITAN_MONEY_ID, "TitanPanelMoneyButton_ResetSession");
	TitanPanelRightClickMenu_AddSpacer();	
	TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_MONEY_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end

function TitanPanelMoneyButton_ResetSession()
	startMoney = GetMoney();
	startSessionTime = TitanUtils_GetSessionTime();
end

function TitanPanelMoneyButton_GetMoneyPerHour(money, session)
	if (money and session and session > 0) then
		return money / session * 3600;
	end
end

function TitanPanelMoneyButton_BreakMoney(money)
	-- Non-negative money only
	if (money >= 0) then
		local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
		local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
		local copper = mod(money, COPPER_PER_SILVER);
		return gold, silver, copper;
	end
end

function Titan_OpenCoinPickupFrame(multiplier, maxMoney, parent)
	if ( CoinPickupFrame.owner ) then
		CoinPickupFrame.owner.hasPickup = 0;
	end

	if ( GetCursorMoney() > 0 ) then
		if ( CoinPickupFrame.owner ) then
			MoneyTypeInfo[parent.moneyType].DropFunc();
			PlaySound("igBackPackCoinSelect");
		end
		CoinPickupFrame:Hide();
		return;
	end

	CoinPickupFrame.multiplier = multiplier;
	CoinPickupFrame.maxMoney = floor(maxMoney / multiplier);
	if ( CoinPickupFrame.maxMoney == 0 ) then
		CoinPickupFrame:Hide();
		return;
	end

	CoinPickupFrame.owner = parent;
	CoinPickupFrame.money = 1;
	CoinPickupFrame.typing = 0;
	CoinPickupText:SetText(CoinPickupFrame.money);
	CoinPickupLeftButton:Disable();
	CoinPickupRightButton:Enable();

	if ( multiplier == 1 ) then
		CoinPickupCopperIcon:Show();
	else
		CoinPickupCopperIcon:Hide();
	end

	if ( multiplier == COPPER_PER_SILVER ) then
		CoinPickupSilverIcon:Show();
	else
		CoinPickupSilverIcon:Hide();
	end

	if ( multiplier == (COPPER_PER_GOLD) ) then
		CoinPickupGoldIcon:Show();
	else
		CoinPickupGoldIcon:Hide();
	end

	position = TitanUtils_GetRealPosition(TITAN_MONEY_ID);

	if (parent:GetName() == "TitanPanelMoneyButton") then

		local scale = TitanPanelGetVar("Scale");
		if scale == nil then scale = 1; end
		if (position == TITAN_PANEL_PLACE_TOP) then 
			CoinPickupFrame:ClearAllPoints();
			CoinPickupFrame:SetPoint("TOPLEFT", parent:GetName(), "BOTTOMLEFT", -10, -4 * scale);
		else
			CoinPickupFrame:ClearAllPoints();
			CoinPickupFrame:SetPoint("BOTTOMLEFT", parent:GetName(), "TOPLEFT", -10, 0);
		end		
	else
		CoinPickupFrame:ClearAllPoints();
		CoinPickupFrame:SetPoint("BOTTOMRIGHT", parent:GetName(), "TOPRIGHT", 0, 0);
		if (position == TITAN_PANEL_PLACE_TOP) then 
			CoinPickupFrame:ClearAllPoints();
			CoinPickupFrame:SetPoint("TOPLEFT", parent:GetName(), "BOTTOMLEFT", -10, -4 * scale);
		else
			CoinPickupFrame:ClearAllPoints();
			CoinPickupFrame:SetPoint("BOTTOMLEFT", parent:GetName(), "TOPLEFT", -10, 0);
		end		
	end
	CoinPickupFrame:Show();
	PlaySound("igBackPackCoinSelect");
end
