COINFRAME_BINDING_CACHE = {}

function 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(CoinPickupFrame);
			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

	CoinPickupFrame:SetPoint("BOTTOMRIGHT", parent, "TOPRIGHT", 0, 0);
	CoinPickupFrame:Show();
	PlaySound("igBackPackCoinSelect");
end

function UpdateCoinPickupFrame(maxMoney)
	if not CoinPickupFrame.multiplier then
		return;
	end
	CoinPickupFrame.maxMoney = floor(maxMoney / CoinPickupFrame.multiplier);
	if CoinPickupFrame.maxMoney == 0 then
		if CoinPickupFrame.owner then
			CoinPickupFrame.owner.hasPickup = 0;
		end
		CoinPickupFrame:Hide();
		return;
	end

	if not CoinPickupFrame.money or not CoinPickupFrame.maxMoney then
		-- Failsafe
		return;
	end

	if CoinPickupFrame.money > CoinPickupFrame.maxMoney then
		CoinPickupFrame.money = CoinPickupFrame.maxMoney;
		CoinPickupText:SetText(CoinPickupFrame.money);
	end

	if CoinPickupFrame.money == CoinPickupFrame.maxMoney then
		CoinPickupRightButton:Disable();
	else
		CoinPickupRightButton:Enable();
	end

	if CoinPickupFrame.money == 1 then
		CoinPickupLeftButton:Disable();
	else
		CoinPickupLeftButton:Enable();
	end
end

function CoinPickupFrame_OnChar(self, text)
	if text < "0" or text > "9" then
		return;
	end

	if self.typing == 0 then
		self.typing = 1;
		self.money = 0;
	end

	local money = (self.money * 10) + text;
	if money == self.money then
		if self.money == 0 then
			self.money = 1;
		end
		return;
	end

	if money <= self.maxMoney then
		self.money = money;
		CoinPickupText:SetText(money);
		if money == self.maxMoney then
			CoinPickupRightButton:Disable();
		else
			CoinPickupRightButton:Enable();
		end
		if money == 1 then
			CoinPickupLeftButton:Disable();
		else
			CoinPickupLeftButton:Enable();
		end
	elseif money == 0 then
		self.money = 1;
	end
end

function CoinPickupFrame_OnKeyDown(self, key)
	if key == "BACKSPACE" or key == "DELETE" then
		if self.typing == 0 or self.money == 1 then
			return;
		end

		self.money = floor(self.money / 10);
		if self.money <= 1 then
			self.money = 1;
			self.typing = 0;
			CoinPickupLeftButton:Disable();
		else
			CoinPickupLeftButton:Enable();
		end
		CoinPickupText:SetText(self.money);
		if self.money == self.maxMoney then
			CoinPickupRightButton:Disable();
		else
			CoinPickupRightButton:Enable();
		end
	elseif key == "ENTER" then
		CoinPickupFrameOkay_Click();
	elseif key == "ESCAPE" then
		CoinPickupFrameCancel_Click();
	elseif key == "LEFT" or key == "DOWN" then
		CoinPickupFrameLeft_Click();
	elseif key == "RIGHT" or key == "UP" then
		CoinPickupFrameRight_Click();
	elseif not ( tonumber(key) ) and GetBindingAction(key) then
		--Running bindings not used by the CoinPickup frame allows players to retain control of their characters.
		RunBinding(GetBindingAction(key));
	end
	
	COINFRAME_BINDING_CACHE[key] = true;
end

function CoinPickupFrame_OnKeyUp(self, key)
	if not ( tonumber(key) ) and GetBindingAction(key) then
		--If we don't run the up bindings as well, interesting things happen (like you never stop moving)
		RunBinding(GetBindingAction(key), "up");
	end
	
	COINFRAME_BINDING_CACHE[key] = nil;
end

function CoinPickupFrameLeft_Click()
	if CoinPickupFrame.money == 1 then
		return;
	end

	CoinPickupFrame.money = CoinPickupFrame.money - 1;
	CoinPickupText:SetText(CoinPickupFrame.money);
	if CoinPickupFrame.money == 1 then
		CoinPickupLeftButton:Disable();
	end
	CoinPickupRightButton:Enable();
end

function CoinPickupFrameRight_Click()
	if CoinPickupFrame.money == CoinPickupFrame.maxMoney then
		return;
	end

	CoinPickupFrame.money = CoinPickupFrame.money + 1;
	CoinPickupText:SetText(CoinPickupFrame.money);
	if CoinPickupFrame.money == CoinPickupFrame.maxMoney then
		CoinPickupRightButton:Disable();
	end
	CoinPickupLeftButton:Enable();
end

function CoinPickupFrameOkay_Click()
	if (CoinPickupFrame.money > 0) and CoinPickupFrame.owner then
		MoneyTypeInfo[CoinPickupFrame.owner.moneyType].PickupFunc(CoinPickupFrame, CoinPickupFrame.money * CoinPickupFrame.multiplier);
	end
	CoinPickupFrame:Hide();
	PlaySound("igBackPackCoinOK");
end

function CoinPickupFrameCancel_Click()
	CoinPickupFrame:Hide();
	PlaySound("igBackPackCoinCancel");
end

function CoinPickupFrame_OnHide()
	if CoinPickupFrame.owner then
		CoinPickupFrame.owner.hasPickup = 0;
	end
	
	for key in next, COINFRAME_BINDING_CACHE do
		if GetBindingAction(key) then
			RunBinding(GetBindingAction(key), "up");
		end
		COINFRAME_BINDING_CACHE[key] = nil;
	end
end
