function OpenStackSplitFrame(maxStack, parent, anchor, anchorTo)
	if ( StackSplitFrame.owner ) then
		StackSplitFrame.owner.hasStackSplit = 0;
	end
	
	if ( not maxStack or maxStack < 1 ) then
		StackSplitFrame:Hide();
		return;
	end

	StackSplitFrame.maxStack = maxStack;
	StackSplitFrame.owner = parent;
	parent.hasStackSplit = 1;
	StackSplitFrame.split = 1;
	StackSplitFrame.typing = 0;
	StackSplitText:SetText(StackSplitFrame.split);
	StackSplitLeftButton:Disable();
	StackSplitRightButton:Enable();

	StackSplitFrame:ClearAllPoints();
	StackSplitFrame:SetPoint(anchor, parent, anchorTo, 0, 0);
	StackSplitFrame:Show();
end

function UpdateStackSplitFrame(maxStack)
	StackSplitFrame.maxStack = maxStack;
	if ( StackSplitFrame.maxStack < 2 ) then
		if ( StackSplitFrame.owner ) then
			StackSplitFrame.owner.hasStackSplit = 0;
		end
		StackSplitFrame:Hide();
		return;
	end

	if ( StackSplitFrame.split > StackSplitFrame.maxStack ) then
		StackSplitFrame.split = StackSplitFrame.maxStack;
		StackSplitText:SetText(StackSplitFrame.split);
	end

	if ( StackSplitFrame.split == StackSplitFrame.maxStack ) then
		StackSplitRightButton:Disable();
	else
		StackSplitRightButton:Enable();
	end

	if ( StackSplitFrame.split == 1 ) then
		StackSplitLeftButton:Disable();
	else
		StackSplitLeftButton:Enable();
	end
end

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

	if ( self.typing == 0 ) then
		self.typing = 1;
		self.split = 0;
	end

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

	if ( split <= self.maxStack ) then
		self.split = split;
		StackSplitText:SetText(split);
		if ( split == self.maxStack ) then
			StackSplitRightButton:Disable();
		else
			StackSplitRightButton:Enable();
		end
		if ( split == 1 ) then
			StackSplitLeftButton:Disable();
		else
			StackSplitLeftButton:Enable();
		end
	elseif ( split == 0 ) then
		self.split = 1;
	end
end

function StackSplitFrame_OnKeyDown(self,key)
	local numKey = gsub(key, "NUMPAD", "");
	if ( key == "BACKSPACE" or key == "DELETE" ) then
		if ( self.typing == 0 or self.split == 1 ) then
			return;
		end

		self.split = floor(self.split / 10);
		if ( self.split <= 1 ) then
			self.split = 1;
			self.typing = 0;
			StackSplitLeftButton:Disable();
		else
			StackSplitLeftButton:Enable();
		end
		StackSplitText:SetText(self.split);
		if ( self.money == self.maxStack ) then
			StackSplitRightButton:Disable();
		else
			StackSplitRightButton:Enable();
		end
	elseif ( key == "ENTER" ) then
		StackSplitFrameOkay_Click();
	elseif ( GetBindingFromClick(key) == "TOGGLEGAMEMENU" ) then
		StackSplitFrameCancel_Click();
	elseif ( key == "LEFT" or key == "DOWN" ) then
		StackSplitFrameLeft_Click();
	elseif (key == "RIGHT" or key == "UP" ) then
		StackSplitFrameRight_Click();
	elseif ( not ( tonumber(numKey) ) and GetBindingAction(key) ) then
		--Running bindings not used by the StackSplit frame allows players to retain control of their characters.
		RunBinding(GetBindingAction(key));
	end
	
	self.down = self.down or {};
	self.down[key] = true;
end

function StackSplitFrame_OnKeyUp(self,key)
	local numKey = gsub(key, "NUMPAD", "");
	if ( not ( tonumber(numKey) ) 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
	
	if ( self.down ) then
		self.down[key] = nil;
	end
end

function StackSplitFrameLeft_Click()
	if ( StackSplitFrame.split == 1 ) then
		return;
	end

	StackSplitFrame.split = StackSplitFrame.split - 1;
	StackSplitText:SetText(StackSplitFrame.split);
	if ( StackSplitFrame.split == 1 ) then
		StackSplitLeftButton:Disable();
	end
	StackSplitRightButton:Enable();
end

function StackSplitFrameRight_Click()
	if ( StackSplitFrame.split == StackSplitFrame.maxStack ) then
		return;
	end

	StackSplitFrame.split = StackSplitFrame.split + 1;
	StackSplitText:SetText(StackSplitFrame.split);
	if ( StackSplitFrame.split == StackSplitFrame.maxStack ) then
		StackSplitRightButton:Disable();
	end
	StackSplitLeftButton:Enable();
end

function StackSplitFrameOkay_Click()
	StackSplitFrame:Hide();
	
	if ( StackSplitFrame.owner ) then
		StackSplitFrame.owner.SplitStack(StackSplitFrame.owner, StackSplitFrame.split);
	end
end

function StackSplitFrameCancel_Click()
	StackSplitFrame:Hide();
end

function StackSplitFrame_OnHide (self)	
	for key in next, (self.down or {}) do
		if ( GetBindingAction(key) ) then
			RunBinding(GetBindingAction(key), "up");
		end
		self.down[key] = nil;
	end
	
	if ( StackSplitFrame.owner ) then
		StackSplitFrame.owner.hasStackSplit = 0;
	end
end