-- Advanced Trade Skill Window v0.5.1
-- copyright 2006 by Rene Schneider (Slarti on EU-Blackhand)

-- custom sorting options script file

atsw_customsorting={};
atsw_customheaders={};
atsw_uncategorized={};
atsw_opencategory=0;

function ATSWCS_OnLoad()
	if(atsw_customsorting[UnitName("player")]==nil) then
		atsw_customsorting[UnitName("player")]={};
	end
	if(atsw_customsorting[UnitName("player")][atsw_selectedskill]==nil) then
		atsw_customsorting[UnitName("player")][atsw_selectedskill]={};
	end
	if(atsw_customheaders[UnitName("player")]==nil) then
		atsw_customheaders[UnitName("player")]={};
	end
	if(atsw_customheaders[UnitName("player")][atsw_selectedskill]==nil) then
		atsw_customheaders[UnitName("player")][atsw_selectedskill]={};
	end
	FauxScrollFrame_SetOffset(ATSWCSUListScrollFrame, 0);
	FauxScrollFrame_SetOffset(ATSWCSSListScrollFrame, 0);
	ATSWCS_UpdateUncategorizedList();
	ATSWCS_UpdateSkillList();
end

function ATSWCS_OnHide()

end

function ATSWCSFrame_OnEvent()
	
end

function ATSWCS_HideWindow()
	HideUIPanel(ATSWCSFrame);
end

function ATSWCS_Update()
	ATSWCS_UpdateSkillList();
end

function ATSWCS_UpdateSkillList()
	if(atsw_customsorting[UnitName("player")]==nil) then
		atsw_customsorting[UnitName("player")]={};
	end
	if(atsw_customsorting[UnitName("player")][atsw_selectedskill]==nil) then
		atsw_customsorting[UnitName("player")][atsw_selectedskill]={};
	end
	if(atsw_customheaders[UnitName("player")]==nil) then
		atsw_customheaders[UnitName("player")]={};
	end
	if(atsw_customheaders[UnitName("player")][atsw_selectedskill]==nil) then
		atsw_customheaders[UnitName("player")][atsw_selectedskill]={};
	end
	local totalcount=table.getn(atsw_uncategorized);
	local offset=FauxScrollFrame_GetOffset(ATSWCSUListScrollFrame);
	for i=1,23,1 do
		local skillbutton=_G["ATSWCSSkill"..i];
		if(atsw_uncategorized[offset+i]) then		
			skillbutton:SetText(atsw_uncategorized[offset+i].name);
			skillbutton:Show();
			skillbutton.skillname=atsw_uncategorized[offset+i].name;
			local color=ATSWTypeColor[atsw_uncategorized[offset+i].type];
			if(color) then
				skillbutton:SetNormalFontObject(color.font);
			end
		else
			skillbutton:Hide();
		end
	end
	offset=FauxScrollFrame_GetOffset(ATSWCSSListScrollFrame);
	local header=1;
	local skill=0;
	local i=1-offset;
	repeat
		local skillbutton=nil;
		local skillframe=nil;
		if(i>=1 and i<=17) then
			skillbutton=_G["ATSWCSCSkill"..i.."SkillButton"];
			skillframe=_G["ATSWCSCSkill"..i];
		end
		if(atsw_customheaders[UnitName("player")][atsw_selectedskill][header] and skill==0) then
			if(i>=1 and i<=17) then
				skillbutton:SetText(atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name);
				skillbutton:SetNormalFontObject(ATSWTypeColor.header.font);
				skillframe.skillname=atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name;
				skillbutton:GetParent().btype="header";
			end
			if(header==atsw_opencategory) then
				if(i>=1 and i<=17) then skillbutton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); end
				skill=1;
			else
				if(i>=1 and i<=17) then	skillbutton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); end
				header=header+1;
			end
			if(i>=1 and i<=17) then
				_G["ATSWCSCSkill"..i.."SkillButtonHighlight"]:SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight");
				skillbutton:UnlockHighlight();
				skillframe:Show();
				skillbutton:Show();
				_G["ATSWCSCSkill"..i.."MoveUp"]:Show();
				_G["ATSWCSCSkill"..i.."MoveDown"]:Show();
				_G["ATSWCSCSkill"..i.."Delete"]:Show();
			end
		elseif(atsw_opencategory==header) then
			if(atsw_customsorting[UnitName("player")][atsw_selectedskill] and atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name]) then
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name][skill]) then
					if(i>=1 and i<=17) then
						skillbutton:SetText(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name][skill].name);
						skillframe.skillname=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name][skill].name;
						skillbutton:SetNormalFontObject(ATSWTypeColor[atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][header].name][skill].type].font);
						skillframe:Show();
						skillbutton:Show();
						skillbutton:SetNormalTexture("");
						_G["ATSWCSCSkill"..i.."MoveUp"]:Show();
						_G["ATSWCSCSkill"..i.."MoveDown"]:Show();
						_G["ATSWCSCSkill"..i.."Delete"]:Show();
						_G["ATSWCSCSkill"..i.."SkillButtonHighlight"]:SetTexture("");
						skillbutton:GetParent().btype="recipe";
					end
					skill=skill+1;
				else
					if(skill==1) then
						if(i>=1 and i<=17) then
							skillbutton:SetText(ATSWCS_NOTHINGINCATEGORY);
							skillframe.skillname=ATSWCS_NOTHINGINCATEGORY;
							skillbutton:SetNormalFontObject(GameFontNormalLeftGrey);
							skillframe:Show();
							skillbutton:Show();
							skillbutton:SetNormalTexture("");
							_G["ATSWCSCSkill"..i.."SkillButtonHighlight"]:SetTexture("");
							_G["ATSWCSCSkill"..i.."MoveUp"]:Hide();
							_G["ATSWCSCSkill"..i.."MoveDown"]:Hide();
							_G["ATSWCSCSkill"..i.."Delete"]:Hide();
						end
					else
						i=i-1;
					end
					skill=0;
					header=header+1;
				end
			else
				if(skill==1) then
					if(i>=1 and i<=17) then
						skillbutton:SetText(ATSWCS_NOTHINGINCATEGORY);
						skillframe.skillname=ATSWCS_NOTHINGINCATEGORY;
						skillbutton:SetNormalFontObject(GameFontNormalLeftGrey);
						skillframe:Show();
						skillbutton:Show();
						skillbutton:SetNormalTexture("");
						_G["ATSWCSCSkill"..i.."SkillButtonHighlight"]:SetTexture("");
						_G["ATSWCSCSkill"..i.."MoveUp"]:Hide();
						_G["ATSWCSCSkill"..i.."MoveDown"]:Hide();
						_G["ATSWCSCSkill"..i.."Delete"]:Hide();
					end
				else
					i=i-1;
				end
				skill=0;
				header=header+1;
			end
		else
			if(i>=1 and i<=17) then
				skillbutton:Show();
				skillframe:Hide();
				skillframe.skillname=nil;
			end
		end
		i=i+1;
	until(i>17);
	local totalcount2=0;
	if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then
		totalcount2=totalcount2+table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]);
		if(atsw_opencategory~=0) then
			if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][atsw_opencategory].name]) then
				totalcount2=totalcount2+table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][atsw_opencategory].name]);
			else
				totalcount2=totalcount2+1;
			end
		end
	end
	FauxScrollFrame_Update(ATSWCSUListScrollFrame, totalcount, 23, 16);
	FauxScrollFrame_Update(ATSWCSSListScrollFrame, totalcount2, 17, 16);
	ATSW_CreateSkillListing();
	ATSWFrame_Update();
end

function ATSWCS_UpdateUncategorizedList()
	atsw_uncategorized={};
	for i=1,table.getn(atsw_tradeskilllist),1 do
		if(ATSWCS_CheckIfCategorized(atsw_tradeskilllist[i].name)==false) then
			table.insert(atsw_uncategorized,{name=atsw_tradeskilllist[i].name, type=atsw_tradeskilllist[i].type}); 
		end
	end
	table.sort(atsw_uncategorized,ATSWCS_SortUncategorizedList);
end

function ATSWCS_SortUncategorizedList(i,j)
	return string.lower(i.name) < string.lower(j.name);
end

function ATSWCS_CheckIfCategorized(skillName)
	if(atsw_customsorting[UnitName("player")]) then
		if(atsw_customsorting[UnitName("player")][atsw_selectedskill]) then
			for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for k=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
						if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k].name==skillName) then
							return true;
						end
					end
				end
			end
		end
	end
	return false;
end

function ATSWCS_AddCategory(categoryName)
	for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
		if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name==categoryName) then return; end
	end
	table.insert(atsw_customheaders[UnitName("player")][atsw_selectedskill],{name=categoryName, expanded=false});
	ATSWCS_UpdateSkillList();
end

function ATSWCS_MoveUp(skillName)
	for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
		if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name==skillName) then
			if(i>1) then
				local buffer=atsw_customheaders[UnitName("player")][atsw_selectedskill][i-1];
				atsw_customheaders[UnitName("player")][atsw_selectedskill][i-1]=atsw_customheaders[UnitName("player")][atsw_selectedskill][i];
				atsw_customheaders[UnitName("player")][atsw_selectedskill][i]=buffer;
				break;
			end
		end
	end
	if(atsw_customsorting[UnitName("player")]) then
		if(atsw_customsorting[UnitName("player")][atsw_selectedskill]) then
			for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for k=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
						if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k].name==skillName) then
							if(k>1) then
								local buffer=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k-1];
								atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k-1]=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k]
								atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k]=buffer;
								break;
							end
						end
					end
				end
			end
		end
	end
	ATSWCS_UpdateSkillList();
end

function ATSWCS_MoveDown(skillName)
	for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
		if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name==skillName) then
			if(i<table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill])) then
				local buffer=atsw_customheaders[UnitName("player")][atsw_selectedskill][i+1];
				atsw_customheaders[UnitName("player")][atsw_selectedskill][i+1]=atsw_customheaders[UnitName("player")][atsw_selectedskill][i];
				atsw_customheaders[UnitName("player")][atsw_selectedskill][i]=buffer;
				break;
			end
		end
	end
	if(atsw_customsorting[UnitName("player")]) then
		if(atsw_customsorting[UnitName("player")][atsw_selectedskill]) then
			for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for k=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
						if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k].name==skillName) then
							if(k<table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name])) then
								local buffer=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k+1];
								atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k+1]=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k]
								atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k]=buffer;
								break;
							end
						end
					end
				end
			end
		end
	end
	ATSWCS_UpdateSkillList();
end

function ATSWCS_Delete(self,skillName,onlySkill)
	if(self:GetParent().btype=="header" and onlySkill==nil) then
		for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
			if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name==skillName) then
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for j=table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1,-1 do
						ATSWCS_Delete(self,atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][j].name,true);
					end
				end
				table.remove(atsw_customheaders[UnitName("player")][atsw_selectedskill],i);
				if(atsw_opencategory==i) then atsw_opencategory=0; end
			end
		end
	end
	if(atsw_customsorting[UnitName("player")]) then
		if(atsw_customsorting[UnitName("player")][atsw_selectedskill]) then
			for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for k=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
						if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k].name==skillName) then
							table.remove(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name],k);
							break;
						end
					end
				end
			end
		end
	end
	ATSWCS_UpdateUncategorizedList();
	ATSWCS_UpdateSkillList();
end

function ATSWCSCSkillButton_OnClick(self, skillName)
	if(self:GetParent().btype=="header") then
		for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
			if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name==skillName) then
				if(atsw_opencategory==i) then
					atsw_opencategory=0;
				else
					atsw_opencategory=i;
				end
				ATSWCS_UpdateUncategorizedList();
				ATSWCS_UpdateSkillList();
				return;
			end
		end
	end
	if(atsw_customsorting[UnitName("player")]) then
		if(atsw_customsorting[UnitName("player")][atsw_selectedskill]) then
			for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
				if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
					for k=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
						if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][k].name==skillName) then
							table.remove(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name],k);
							break;
						end
					end
				end
			end
		end
	end
	ATSWCS_UpdateUncategorizedList();
	ATSWCS_UpdateSkillList();
end

function ATSWCSSkillButton_OnClick(skillName)
	if(atsw_opencategory==0) then return; end
	for i=1,table.getn(atsw_uncategorized),1 do
		if(atsw_uncategorized[i].name==skillName) then
			if(atsw_customsorting[UnitName("player")][atsw_selectedskill]==nil) then atsw_customsorting[UnitName("player")][atsw_selectedskill]={}; end
			if(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][atsw_opencategory].name]==nil) then atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][atsw_opencategory].name]={}; end
			table.insert(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][atsw_opencategory].name],{name=skillName,type=atsw_uncategorized[i].type});
		end
	end
	ATSWCS_UpdateUncategorizedList();
	ATSWCS_UpdateSkillList();
end