vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Advanced Trade Skill Window v0.4.0
-- copyright 2006 by Rene Schneider (Slarti on EU-Blackhand)

-- main script file

ATSW_TRADE_SKILLS_DISPLAYED = 23;
ATSW_MAX_TRADE_SKILL_REAGENTS = 8;
ATSW_TRADE_SKILL_HEIGHT = 16;
ATSW_MAX_DELAY = 4.0;
ATSW_MAX_RETRIES = 5;

ATSWTypeColor = { };
ATSWTypeColor["optimal"] = { r = 1.00, g = 0.50, b = 0.25 };
ATSWTypeColor["medium"] = { r = 1.00, g = 1.00, b = 0.00 };
ATSWTypeColor["easy"] = { r = 0.25, g = 0.75, b = 0.25 };
ATSWTypeColor["trivial"] = { r = 0.50, g = 0.50, b = 0.50 };
ATSWTypeColor["header"] = { r = 1.00, g = 0.82, b = 0 };

ATSWRarityColor={};
ATSWRarityColor[5] = { r = 0.64, g = 0.21, b = 0.93 };
ATSWRarityColor[4] = { r = 0, g = 0.44, b = 0.87 };
ATSWRarityColor[3] = { r = 0.12, g = 1, b = 0 };
ATSWRarityColor[2] = { r = 1, g = 1, b = 1 };
ATSWRarityColor[1] = { r = 0.62, g = 0.62, b = 0.62 };

ATSWRarityNames={};
ATSWRarityNames["purple"]=5;
ATSWRarityNames["blue"]=4;
ATSWRarityNames["green"]=3;
ATSWRarityNames["white"]=2;
ATSWRarityNames["grey"]=1;


atsw_tradeskilllist={};
atsw_tradeskillheaders={};
atsw_skilllisting={};
atsw_tradeskillcounter={};
atsw_selectedskill="";
atsw_displayedgroup="";
atsw_retries=0;
atsw_retrydelay=0;
atsw_retry=false;
atsw_delay=0;
atsw_working=false;
atsw_processingtimeout=0;
atsw_scans=0;
atsw_updatedelay=0;
atsw_uncategorizedexpanded=true;
atsw_tradeskillid={};
atsw_orderby={};
atsw_updating=false;
atsw_incombat=false;
atsw_bankopened=false;
atsw_oldmode=false;
atsw_disabled={};

function ATSW_OnLoad()
        SLASH_ATSW1 = "/atsw";
        SlashCmdList["ATSW"] = ATSW_Command;
        ATSWFrame:RegisterEvent("TRADE_SKILL_UPDATE");
        ATSWFrame:RegisterEvent("TRADE_SKILL_CLOSE");
        ATSWFrame:RegisterEvent("TRADE_SKILL_SHOW");
        ATSWFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE");
        ATSWFrame:RegisterEvent("UPDATE_TRADESKILL_RECAST");
        ATSWFrame:RegisterEvent("BANKFRAME_OPENED");
        ATSWFrame:RegisterEvent("BANKFRAME_CLOSED");
        ATSWFrame:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
        ATSWFrame:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
        ATSWFrame:RegisterEvent("MERCHANT_SHOW");
        ATSWFrame:RegisterEvent("MERCHANT_UPDATE");
        ATSWFrame:RegisterEvent("MERCHANT_CLOSED");
        ATSWFrame:RegisterEvent("BAG_UPDATE");
        ATSWFrame:RegisterEvent("TRAINER_CLOSED");
        ATSWFrame:RegisterEvent("PLAYER_REGEN_DISABLED");
        ATSWFrame:RegisterEvent("PLAYER_REGEN_ENABLED");
        ATSWFrame:RegisterEvent("AUCTION_HOUSE_CLOSED");
        ATSWFrame:RegisterEvent("AUCTION_HOUSE_SHOW");
        ATSWFrame:RegisterEvent("CRAFT_SHOW");
        ATSWFrame:RegisterEvent("CRAFT_CLOSE");
end

function ATSW_ShowWindow()
        if(type(atsw_orderby)~="table") then atsw_orderby={}; end
        if(not atsw_orderby[UnitName("player")]) then atsw_orderby[UnitName("player")]={}; end
        if(not atsw_orderby[UnitName("player")][atsw_selectedskill]) then atsw_orderby[UnitName("player")][atsw_selectedskill]="nothing"; end
        if(atsw_oldmode and atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing") then 
                atsw_orderby[UnitName("player")][atsw_selectedskill]="name";
        end
        atsw_oldtradeskillcount=0;
        ShowUIPanel(ATSWCheckerFrame);
        SetPortraitTexture(ATSWFramePortrait, "player");
        if(not atsw_oldmode) then
                ExpandTradeSkillSubClass(0);
                if(ATSW_GetTradeSkillSelectionIndex()>1) then
                        ATSWFrame_SetSelection(ATSW_GetTradeSkillSelectionIndex());
                else
                        if(ATSW_GetNumTradeSkills()>0) then
                                ATSWFrame_SetSelection(ATSW_GetFirstTradeSkill());
                                FauxScrollFrame_SetOffset(ATSWListScrollFrame, 0);
                        end
                        ATSWListScrollFrameScrollBar:SetValue(0);
                end
        end
        ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION);
        ATSW_AdjustFrame();
        ATSW_ResetPossibleItemCounts();
        ATSW_CreateTradeSkillList();
        ATSW_CreateSkillListing();
        ATSWInv_UpdateItemList();
        ShowUIPanel(ATSWFrame);
        ATSWFrame_UpdateQueue();
        ATSWInv_UpdateQueuedItemList();
        ATSWFrame_Update();
        ATSWInputBox:SetText("1");
        atsw_updatedelay=0.5;
end

function ATSW_HideWindow()
        HideUIPanel(ATSWFrame);
end

function ATSW_GetSelectedSkill()
        atsw_selectedskill=ATSW_GetTradeSkillLine();
        if(not atsw_disabled[UnitName("player")]) then
                atsw_disabled[UnitName("player")]={};
        end
        if(not atsw_disabled[UnitName("player")][atsw_selectedskill]) then
                atsw_disabled[UnitName("player")][atsw_selectedskill]=0;
        end
end

function ATSW_CheckForRescan()
        atsw_scans=0;
        skillname=ATSW_GetTradeSkillLine();
        if(skillname) then
                if(skillname~=atsw_displayedgroup) then
                        atsw_displayedgroup=skillname;
                        atsw_selectedskill=skillname;
                        ATSW_DeleteQueue();
                        ATSW_CreateTradeSkillList();
                        ATSW_NoteNecessaryItemsForQueue();
                end
        end
end

function ATSW_OnHide()
        if(not atsw_oldmode) then 
                TradeSkillFrame_Hide(); 
        else
                CraftFrame_Hide();
        end
        HideUIPanel(ATSWCheckerFrame);
        HideUIPanel(ATSWReagentFrame);
        HideUIPanel(ATSWCSFrame);
end

function ATSW_Command(cmd)
        if(cmd=="show") then
                ATSW_ShowWindow();
        elseif(cmd=="disable") then
                ATSW_DisableForActiveTradeskill();
        elseif(cmd=="enable") then
                ATSW_EnableForActiveTradeskill();
        end
end

function ATSW_DisableForActiveTradeskill()
        if(atsw_oldmode) then
                if(CraftFrame and CraftFrame:IsVisible()) then
                        atsw_disabled[UnitName("player")][atsw_selectedskill]=1;
                        HideUIPanel(ATSWFrame);
                        CraftFrame:SetAlpha(1);
                        CraftFrame:SetScale(1);
                        ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_DEACTIVATED);
                end
        else
                if(TradeSkillFrame and TradeSkillFrame:IsVisible()) then
                        atsw_disabled[UnitName("player")][atsw_selectedskill]=1;
                        HideUIPanel(ATSWFrame);
                        TradeSkillFrame:SetAlpha(1);
                        TradeSkillFrame:SetScale(1);
                        ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_DEACTIVATED);
                end
        end
end

function ATSW_EnableForActiveTradeskill()
        if(atsw_oldmode) then
                if(CraftFrame and CraftFrame:IsVisible()) then
                        atsw_disabled[UnitName("player")][atsw_selectedskill]=0;
                        ATSW_ShowWindow();
                        CraftFrame:SetAlpha(0);
                        CraftFrame:SetScale(0.001);
                        ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_ACTIVATED);
                end
        else
                if(TradeSkillFrame and TradeSkillFrame:IsVisible()) then
                        atsw_disabled[UnitName("player")][atsw_selectedskill]=0;
                        ATSW_ShowWindow();
                        TradeSkillFrame:SetAlpha(0);
                        TradeSkillFrame:SetScale(0.001);
                        ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_ACTIVATED);
                end
        end
end

function ATSWFrame_Show()
        ATSW_ShowWindow();
end

function ATSW_CheckForTradeSkillWindow(arg1)
        if(ATSWFrame:IsVisible()) then
                if(atsw_updatedelay>0) then
                        atsw_updatedelay=atsw_updatedelay-arg1;
                        if(atsw_updatedelay<=0) then
                                ATSWFrame_Update();
                                atsw_updatedelay=0;
                        end
                end
                ATSW_CheckForRescan();
        end
        if(atsw_processnext==true) then 
                atsw_processnext=false;
                ATSW_ProcessNextQueueItem();
        end
        if(atsw_processing==true) then
                if(atsw_processingtimeout~=0) then
                        if(atsw_processingtimeout>0) then
                                atsw_processingtimeout=atsw_processingtimeout-arg1;
                        else
                                atsw_processingtimeout=0;
                                ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE);
                                atsw_processing=false;
                                ATSWFrame:UnregisterEvent("SPELLCAST_STOP");
                                ATSWFrame:UnregisterEvent("SPELLCAST_CHANNEL_STOP");
                                ATSWFrame:UnregisterEvent("SPELLCAST_START");
                                ATSWFrame:UnregisterEvent("SPELLCAST_INTERRUPTED");
                        end
                end
                if(atsw_retry==true) then
                        if(atsw_retrydelay<ATSW_MAX_DELAY) then
                                atsw_retrydelay=atsw_retrydelay+arg1;
                        else
                                atsw_retrydelay=0;
                                ATSW_ProcessNextQueueItem();
                        end
                end             
        end
        if(TradeSkillFrame==nil) then return; end
end

function ATSWFrame_OnEvent()
        if(event=="TRADE_SKILL_SHOW") then
                if(CraftFrame and CraftFrame:IsVisible()) then ATSW_HideWindow(); end
                atsw_oldmode=false;
                ATSW_GetSelectedSkill();
                if(atsw_disabled[UnitName("player")][atsw_selectedskill]==0) then
                        ATSW_ShowWindow();
                end
        elseif(event=="TRADE_SKILL_CLOSE") then
                ATSW_HideWindow();
        elseif(event=="CRAFT_SHOW") then
                if(TradeSkillFrame and TradeSkillFrame:IsVisible()) then ATSW_HideWindow(); end
                atsw_oldmode=true;
                local name=GetCraftDisplaySkillLine();
                if(name) then 
                        ATSW_GetSelectedSkill();
                        if(atsw_disabled[UnitName("player")][atsw_selectedskill]==0) then
                                ATSW_ShowWindow();
                        end
                end
        elseif(event=="CRAFT_CLOSE") then
                ATSW_HideWindow();
        elseif(event=="BANKFRAME_OPENED") then
                atsw_bankopened=true;
                ATSWBank_UpdateBankList();
        elseif(event=="BANKFRAME_CLOSED") then
                atsw_bankopened=false;
        elseif(event=="PLAYERBANKSLOTS_CHANGED") then
                ATSWBank_UpdateBankList();
        elseif(event=="PLAYERBANKBAGSLOTS_CHANGED") then
                ATSWBank_UpdateBankList();
        elseif(event=="MERCHANT_SHOW") then
                ATSWMerchant_InsertAutoBuyButton();
                ATSWMerchant_UpdateMerchantList();
                ATSWMerchant_AutoBuy();
        elseif(event=="MERCHANT_CLOSED") then
                ATSWMerchant_RemoveAutoBuyButton();
        elseif(event=="MERCHANT_UPDATE") then
                ATSWMerchant_UpdateMerchantList();
        elseif(event=="AUCTION_HOUSE_SHOW") then
                ATSWAuction_ShowShoppingList();
        elseif(event=="AUCTION_HOUSE_CLOSED") then
                ATSWAuction_HideShoppingList();
        elseif(event=="BAG_UPDATE") then
                if(ATSWFrame:IsVisible()) then
                        if(atsw_processing==true) then
                                if(table.getn(atsw_queue)==0) then
                                        atsw_processingtimeout=-1;
                                end
                        end
                        atsw_retries=0;
                        atsw_retrydelay=ATSW_MAX_DELAY;
                end
                ATSW_ResetPossibleItemCounts();
                ATSWInv_UpdateItemList();
                ATSWBank_UpdateBankList();
        end
        if(not ATSWFrame:IsVisible()) then
                return;
        end
        if(TradeSkillFrame and TradeSkillFrame:IsVisible() and atsw_disabled[UnitName("player")][atsw_selectedskill]==0) then
                TradeSkillFrame:SetAlpha(0);
                TradeSkillFrame:SetScale(0.001);
        end
        if(CraftFrame and CraftFrame:IsVisible() and atsw_disabled[UnitName("player")][atsw_selectedskill]==0 and GetCraftDisplaySkillLine()) then
                CraftFrame:SetAlpha(0);
                CraftFrame:SetScale(0.001);
        end
        if(event=="TRADE_SKILL_UPDATE") then
                if(atsw_scans<2) then
                        atsw_scans=atsw_scans+1;
                        ATSW_CreateTradeSkillList();
                        ATSWCreateButton:Disable();
                        ATSWQueueButton:Disable();
                        ATSWCreateAllButton:Disable();
                        ATSWQueueAllButton:Disable();
                        ATSWHighlightFrame:Hide();
                        if(ATSW_GetTradeSkillSelectionIndex()>1) then
                                ATSWFrame_SetSelection(ATSW_GetTradeSkillSelectionIndex());
                        else
                                if(ATSW_GetNumTradeSkills()>0) then
                                        ATSWFrame_SetSelection(ATSW_GetFirstTradeSkill());
                                        FauxScrollFrame_SetOffset(ATSWListScrollFrame, 0);
                                end
                                ATSWListScrollFrameScrollBar:SetValue(0);
                        end
                        if(atsw_updating==false) then
                                ATSW_ResetPossibleItemCounts();
                                ATSW_CreateSkillListing();
                                ATSWFrame_Update(); 
                        end
                end
        elseif(event=="UNIT_PORTRAIT_UPDATE") then
                if(arg1=="player") then
                        SetPortraitTexture(TradeSkillFramePortrait, "player");
                end
        elseif(event=="UPDATE_TRADESKILL_RECAST") then
                ATSWInputBox:SetNumber(GetTradeskillRepeatCount());
        elseif(event=="SPELLCAST_STOP" or event=="SPELLCAST_CHANNEL_STOP") then
                ATSW_SpellcastStop();
        elseif(event=="SPELLCAST_START") then
                ATSW_SpellcastStart();
        elseif(event=="SPELLCAST_INTERRUPTED") then
                ATSW_SpellcastInterrupted();
        elseif(event=="TRAINER_CLOSED") then
                ATSW_ResetPossibleItemCounts();
                ATSW_CreateSkillListing();
                if(ATSWFrame:IsVisible()) then ATSWFrame_Update(); end
        elseif(event=="PLAYER_REGEN_ENABLED") then
                atsw_incombat=false;
        elseif(event=="PLAYER_REGEN_DISABLED") then
                atsw_incombat=true;
        end
end

function ATSW_AdjustFrame()
        if(atsw_oldmode) then
                ATSWHeaderSortButton:Hide();
                ATSWInvSlotDropDown:Hide();
                ATSWSubClassDropDown:Hide();
                ATSWExpandButtonFrame:Hide();
                ATSWCreateButton:Hide();
                ATSWQueueButton:Hide();
                ATSWCreateAllButton:Hide();
                ATSWQueueAllButton:Hide();
                ATSWDecrementButton:Hide();
                ATSWInputBox:Hide();
                ATSWIncrementButton:Hide();
                ATSWQueueStartStopButton:Hide();
                ATSWQueueDeleteButton:Hide();
                ATSWReagentsButton:Hide();
                ATSWHorizontalBarLeft:Hide();
                ATSWHorizontalBarLeft2:Hide();
                ATSWHorizontalBarLeftAddon:Hide();
                ATSWHorizontalBarLeft2Addon:Hide();

                ATSWEnchantButton:Show();
                ATSWReagentLabel:SetPoint("TOPLEFT", "ATSWFrame", "TOPLEFT" , 380, -180);
                ATSWCraftDescription:Show();
        else
                ATSWHeaderSortButton:Show();
                ATSWInvSlotDropDown:Show();
                ATSWSubClassDropDown:Show();
                ATSWExpandButtonFrame:Show();
                ATSWCreateButton:Show();
                ATSWQueueButton:Show();
                ATSWCreateAllButton:Show();
                ATSWQueueAllButton:Show();
                ATSWDecrementButton:Show();
                ATSWInputBox:Show();
                ATSWIncrementButton:Show();
                ATSWQueueStartStopButton:Show();
                ATSWQueueDeleteButton:Show();
                ATSWReagentsButton:Show();
                ATSWHorizontalBarLeft:Show();
                ATSWHorizontalBarLeft2:Show();
                ATSWHorizontalBarLeftAddon:Show();
                ATSWHorizontalBarLeft2Addon:Show();

                ATSWEnchantButton:Hide();
                ATSWReagentLabel:SetPoint("TOPLEFT", "ATSWFrame", "TOPLEFT" , 380, -136);
                ATSWCraftDescription:Hide();
        end
end

function ATSW_SortTradeSkills()
        local tradeskills={};
        ExpandTradeSkillSubClass(0);
        local numTradeSkills=ATSW_GetNumTradeSkills();

        for i=1,numTradeSkills,1 do
                local skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(i);
                if(skillType~="header") then
                        local skillTypeNumber=0;
                        if(skillType=="easy") then skillTypeNumber=1; end
                        if(skillType=="medium") then skillTypeNumber=2; end
                        if(skillType=="optimal") then skillTypeNumber=3; end
                        table.insert(tradeskills,{name=skillName,id=i,skilltype=skillTypeNumber});
                end
        end

        atsw_tradeskillid={};
        table.setn(atsw_tradeskillid,0);
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name") then
                table.sort(tradeskills,ATSW_CompareName);
                for i=1,table.getn(tradeskills),1 do
                        table.insert(atsw_tradeskillid,tradeskills[i].id);
                end
        end
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then
                table.sort(tradeskills,ATSW_CompareDifficulty);
                for i=1,table.getn(tradeskills),1 do
                        table.insert(atsw_tradeskillid,tradeskills[i].id);
                end
        end
end

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

function ATSW_CompareDifficulty(i,j)
        return string.lower(i.skilltype) > string.lower(j.skilltype);
end

function ATSW_OrderBy(order)
        atsw_orderby[UnitName("player")][atsw_selectedskill]=order;
        ATSW_CreateSkillListing();
        ATSWFrame_Update();
end

function ATSWFrame_Update()
        if(type(atsw_orderby)~="table") then atsw_orderby={}; end
        if(not atsw_orderby[UnitName("player")]) then atsw_orderby[UnitName("player")]={}; end
        if(not atsw_orderby[UnitName("player")][atsw_selectedskill]) then atsw_orderby[UnitName("player")][atsw_selectedskill]="nothing"; end
        if(atsw_oldmode and atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing") then 
                atsw_orderby[UnitName("player")][atsw_selectedskill]="name";
        end
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name") then
                ATSWHeaderSortButton:SetChecked(false);
                ATSWNameSortButton:SetChecked(true);
                ATSWDifficultySortButton:SetChecked(false);
                ATSWCustomSortButton:SetChecked(false);
        elseif(atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then
                ATSWHeaderSortButton:SetChecked(false);
                ATSWNameSortButton:SetChecked(false);
                ATSWDifficultySortButton:SetChecked(true);
                ATSWCustomSortButton:SetChecked(false);
        elseif(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then
                ATSWHeaderSortButton:SetChecked(false);
                ATSWNameSortButton:SetChecked(false);
                ATSWDifficultySortButton:SetChecked(false);
                ATSWCustomSortButton:SetChecked(true);
        else
                ATSWHeaderSortButton:SetChecked(true);
                ATSWNameSortButton:SetChecked(false);
                ATSWDifficultySortButton:SetChecked(false);
                ATSWCustomSortButton:SetChecked(false);
        end
        for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do
                getglobal("ATSWSkill"..i):Hide();
        end
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing" or atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then
                ATSWExpandButtonFrame:Show();
                local numTradeSkills=table.getn(atsw_skilllisting);
                local skillOffset=FauxScrollFrame_GetOffset(ATSWListScrollFrame);

                if(numTradeSkills==0) then
                        ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION);
                        ATSWSkillName:Hide();
                        ATSWSkillIcon:Hide();
                        ATSWRequirementLabel:Hide();
                        ATSWCollapseAllButton:Disable();
                        for i=1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do
                                getglobal("ATSWReagent"..i):Hide();
                        end
                else
                        ATSWSkillName:Show();
                        ATSWSkillIcon:Show();
                        ATSWCollapseAllButton:Enable();
                end

                FauxScrollFrame_Update(ATSWListScrollFrame, numTradeSkills, ATSW_TRADE_SKILLS_DISPLAYED, ATSW_TRADE_SKILL_HEIGHT, nil, nil, nil, ATSWHighlightFrame, 293, 316);
                ATSWHighlightFrame:Hide();
                local jumped=1;
                for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do
                        local skillName, skillType, numAvailable, isExpanded;
                        local skillIndex;
                        repeat
                                skillIndex=skillOffset+jumped;
                                if(skillIndex>numTradeSkills) then
                                        skillName=nil;
                                else
                                        skillName = atsw_skilllisting[skillIndex].name;
                                        skillType = atsw_skilllisting[skillIndex].type;
                                        isExpanded = atsw_skilllisting[skillIndex].expanded;
                                end
                                jumped=jumped+1;
                        until ((skillName and ATSW_Filter(skillName)==true and ATSW_FilterInvSlot(skillName) and ATSW_FilterSubClass(skillName)) or skillIndex>numTradeSkills or skillType=="header");
                        if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end
                        local skillButton=getglobal("ATSWSkill"..i);
                        if(skillIndex<=numTradeSkills) then
                                if(ATSWListScrollFrame:IsVisible()) then
                                        skillButton:SetWidth(293);
                                else
                                        skillButton:SetWidth(323);
                                end
                                local color=ATSWTypeColor[skillType];
                                if(color) then
                                        skillButton:SetTextColor(color.r, color.g, color.b);
                                end
                                
                                if(atsw_skilllisting[skillIndex] and atsw_skilllisting[skillIndex].id) then
                                        skillButton:SetID(atsw_skilllisting[skillIndex].id);
                                else
                                        return;
                                end
                                skillButton:Show();
                                if(skillType=="header") then
                                        skillButton:SetText(skillName);
                                        if(isExpanded) then
                                                skillButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
                                        else
                                                skillButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
                                        end
                                        getglobal("ATSWSkill"..i.."Highlight"):SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight");
                                        getglobal("ATSWSkill"..i):UnlockHighlight();
                                else
                                        if(not skillName)then
                                                return;
                                        end
                                        skillButton:SetNormalTexture("");
                                        getglobal("ATSWSkill"..i.."Highlight"):SetTexture("");
                                        if(atsw_multicount==true) then
                                                if ( numAvailable == 0 ) then
                                                        skillButton:SetText(" "..skillName);
                                                else
                                                        skillButton:SetText(" "..skillName.." ["..numAvailable.."]");
                                                end
                                        else
                                                local numAvailableString=ATSW_GetNumItemsPossibleWithInventory(skillName).."/"..numAvailable;
                                                if ( numAvailableString == "0/0" ) then
                                                        skillButton:SetText(" "..skillName);
                                                else
                                                        skillButton:SetText(" "..skillName.." ["..numAvailableString.."]");
                                                end
                                        end
                                        
                                        if(ATSW_GetTradeSkillSelectionIndex()==atsw_skilllisting[skillIndex].id) then
                                                ATSWHighlightFrame:SetPoint("TOPLEFT", "ATSWSkill"..i, "TOPLEFT", 0, 0);
                                                ATSWHighlightFrame:Show();
                                                ATSWFrame.numAvailable = numAvailable;
                                                getglobal("ATSWSkill"..i):LockHighlight();
                                        else
                                                getglobal("ATSWSkill"..i):UnlockHighlight();
                                        end
                                end                     
                        else
                                skillButton:Hide();
                        end
                end
        end
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name" or atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then
                ATSWExpandButtonFrame:Hide();
                atsw_updating=true;
                ATSW_SortTradeSkills();
                local numTradeSkills=table.getn(atsw_tradeskillid);
                local skillOffset=FauxScrollFrame_GetOffset(ATSWListScrollFrame);

                if(numTradeSkills==0) then
                        ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION);
                        ATSWSkillName:Hide();
                        ATSWSkillIcon:Hide();
                        ATSWRequirementLabel:Hide();
                        ATSWCollapseAllButton:Disable();
                        for i=1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do
                                getglobal("ATSWReagent"..i):Hide();
                        end
                else
                        ATSWSkillName:Show();
                        ATSWSkillIcon:Show();
                        ATSWCollapseAllButton:Enable();
                end

                FauxScrollFrame_Update(ATSWListScrollFrame, numTradeSkills, ATSW_TRADE_SKILLS_DISPLAYED, ATSW_TRADE_SKILL_HEIGHT, nil, nil, nil, ATSWHighlightFrame, 293, 316);
                ATSWHighlightFrame:Hide();
                local jumped=1;
                for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do
                        local skillName, skillType, numAvailable, isExpanded, craftSubSpellName;
                        local skillIndex;
                        repeat
                                skillIndex=atsw_tradeskillid[skillOffset+jumped];
                                if(skillIndex==nil) then
                                        skillName=nil;
                                else    
                                        skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(skillIndex);
                                end
                                jumped=jumped+1;
                        until (((skillName and ATSW_Filter(skillName)==true and ATSW_FilterInvSlot(skillName) and ATSW_FilterSubClass(skillName)) or skillIndex==nil) and skillType~="header");
                        if(skillIndex) then
                                skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(skillIndex);
                                if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end
                                local skillButton=getglobal("ATSWSkill"..i);
                                if(ATSWListScrollFrame:IsVisible()) then
                                        skillButton:SetWidth(293);
                                else
                                        skillButton:SetWidth(323);
                                end
                                local color=ATSWTypeColor[skillType];
                                if(color) then
                                        skillButton:SetTextColor(color.r, color.g, color.b);
                                end
                                
                                skillButton:SetID(skillIndex);
                                skillButton:Show();
                                if(skillType=="header") then
                                        skillButton:SetText(skillName);
                                        if(isExpanded) then
                                                skillButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
                                        else
                                                skillButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
                                        end
                                        getglobal("ATSWSkill"..i.."Highlight"):SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight");
                                        getglobal("ATSWSkill"..i):UnlockHighlight();
                                else
                                        if(not skillName)then
                                                return;
                                        end
                                        skillButton:SetNormalTexture("");
                                        getglobal("ATSWSkill"..i.."Highlight"):SetTexture("");
                                        if(atsw_multicount==true) then
                                                if ( numAvailable == 0 ) then
                                                        skillButton:SetText(" "..skillName);
                                                else
                                                        skillButton:SetText(" "..skillName.." ["..numAvailable.."]");
                                                end
                                        else
                                                local numAvailableString=ATSW_GetNumItemsPossibleWithInventory(skillName).."/"..numAvailable;
                                                if ( numAvailableString == "0/0" ) then
                                                        skillButton:SetText(" "..skillName);
                                                else
                                                        skillButton:SetText(" "..skillName.." ["..numAvailableString.."]");
                                                end
                                        end
                                        
                                        if(ATSW_GetTradeSkillSelectionIndex()==skillIndex) then
                                                ATSWHighlightFrame:SetPoint("TOPLEFT", "ATSWSkill"..i, "TOPLEFT", 0, 0);
                                                ATSWHighlightFrame:Show();
                                                ATSWFrame.numAvailable = numAvailable;
                                                getglobal("ATSWSkill"..i):LockHighlight();
                                        else
                                                getglobal("ATSWSkill"..i):UnlockHighlight();
                                        end
                                end
                        end
                end
                atsw_updating=false;
        end
end

function ATSWSkillButton_OnClick(button)
        if(button=="LeftButton") then
                ATSWFrame_SetSelection(this:GetID(),true);
                ATSWFrame_Update();
        end
end

function ATSWFrame_SetSelection(id,wasClicked)
        local skillName, skillType, numAvailable;
        local listpos=ATSW_GetSkillListingPos(id);
        if(atsw_skilllisting[listpos]) then
                skillName = atsw_skilllisting[listpos].name;
                skillType = atsw_skilllisting[listpos].type;
        else
                skillName=nil;
        end
        if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end
        if(IsShiftKeyDown() and skillName~=nil and wasClicked~=nil) then
                if(arg1=="LeftButton" and ChatFrameEditBox:IsVisible()) then
                        ATSW_AddTradeSkillReagentLinksToChatFrame(skillName);
                end
        end
        ATSWHighlightFrame:Show();
        if(skillType=="header") then
                ATSWHighlightFrame:Hide();
                if(atsw_skilllisting[listpos].expanded) then
                        ATSW_SetHeaderExpanded(id,false);
                else
                        ATSW_SetHeaderExpanded(id,true);
                end
                ATSWFrame_Update();
                return;
        end
        ATSWFrame.selectedSkillName=skillName;
        ATSWFrame.selectedSkill = id;
        ATSW_SelectTradeSkill(id);

        if(ATSW_GetTradeSkillSelectionIndex()>ATSW_GetNumTradeSkills())then
                return;
        end
        local color=ATSWTypeColor[skillType];
        if(color) then
                ATSWHighlight:SetVertexColor(color.r, color.g, color.b);
        end

        -- General Info
        local skillLineName, skillLineRank, skillLineMaxRank = ATSW_GetTradeSkillLine();
        ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), skillLineName).." - "..ATSW_VERSION);
        -- Set statusbar info
        ATSWRankFrameSkillName:SetText(skillLineName);
        ATSWRankFrame:SetStatusBarColor(0.0, 0.0, 1.0, 0.5);
        ATSWRankFrameBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5);
        ATSWRankFrame:SetMinMaxValues(0, skillLineMaxRank);
        ATSWRankFrame:SetValue(skillLineRank);
        ATSWRankFrameSkillRank:SetText(skillLineRank.."/"..skillLineMaxRank);

        ATSWSkillName:SetText(skillName);
        if(atsw_oldmode and GetCraftDescription(id)) then
                ATSWCraftDescription:SetText(GetCraftDescription(id));
        end
        if(ATSW_GetTradeSkillCooldown(id)) then
                ATSWSkillCooldown:SetText(COOLDOWN_REMAINING.." "..SecondsToTime(ATSW_GetTradeSkillCooldown(id)));
        else
                ATSWSkillCooldown:SetText("");
        end
        ATSWSkillIcon:SetNormalTexture(ATSW_GetTradeSkillIcon(id));
        local minMade,maxMade = ATSW_GetTradeSkillNumMade(id);
        if(maxMade>1) then
                if(minMade==maxMade) then
                        ATSWSkillIconCount:SetText(minMade);
                else
                        ATSWSkillIconCount:SetText(minMade.."-"..maxMade);
                end
                if(ATSWSkillIconCount:GetWidth()>39) then
                        ATSWSkillIconCount:SetText("~"..floor((minMade + maxMade)/2));
                end
        else
                ATSWSkillIconCount:SetText("");
        end
        
        local creatable = 1;
        local numReagents = ATSW_GetTradeSkillNumReagents(id);
        for i=1, numReagents, 1 do
                local reagentName, reagentTexture, reagentCount, playerReagentCount = ATSW_GetTradeSkillReagentInfo(id, i);
                local reagent = getglobal("ATSWReagent"..i);
                local name = getglobal("ATSWReagent"..i.."Name");
                local count = getglobal("ATSWReagent"..i.."Count");
                if(not reagentName or not reagentTexture) then
                        reagent:Hide();
                else
                        reagent:Show();
                        SetItemButtonTexture(reagent, reagentTexture);
                        name:SetText(reagentName);
                        -- Grayout items
                        if(playerReagentCount<reagentCount) then
                                SetItemButtonTextureVertexColor(reagent, 0.5, 0.5, 0.5);
                                name:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
                        else
                                SetItemButtonTextureVertexColor(reagent, 1.0, 1.0, 1.0);
                                name:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
                        end
                        if(playerReagentCount>=100) then
                                playerReagentCount = "*";
                        end
                        count:SetText(playerReagentCount.." /"..reagentCount);
                end
        end
        local reagentToAnchorTo = numReagents;
        if((numReagents > 0) and (mod(numReagents, 2)==0)) then
                reagentToAnchorTo = reagentToAnchorTo - 1;
        end
        
        for i=numReagents+1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do
                getglobal("ATSWReagent"..i):Hide();
        end

        local spellFocus=BuildColoredListString(ATSW_GetTradeSkillTools(id));
        if(spellFocus) then
                ATSWRequirementLabel:Show();
                ATSWRequirementText:SetText(spellFocus);
        else
                ATSWRequirementLabel:Hide();
                ATSWRequirementText:SetText("");
        end

        if(creatable) then
                ATSWCreateButton:Enable();
                ATSWQueueButton:Enable();
                ATSWCreateAllButton:Enable();
                ATSWQueueAllButton:Enable();
        else
                ATSWCreateButton:Disable();
                ATSWQueueButton:Disable();
                ATSWCreateAllButton:Disable();
                ATSWQueueAllButton:Disable();
        end
end

function ATSWSubClassDropDown_OnLoad()
        UIDropDownMenu_Initialize(this, ATSWSubClassDropDown_Initialize);
        UIDropDownMenu_SetWidth(120);
        UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, 1);
end

function ATSWSubClassDropDown_OnShow()
        UIDropDownMenu_Initialize(this, ATSWSubClassDropDown_Initialize);
        if(atsw_currentsubclassfilter==0) then
                UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, 1);
        end
end

function ATSWSubClassDropDown_Initialize()
        ATSWFilterFrame_LoadSubClasses(GetTradeSkillSubClasses());
end

function ATSWFilterFrame_LoadSubClasses(...)
        local info = {};
        if ( arg.n > 1 ) then
                info.text = TEXT(ALL_SUBCLASSES);
                info.func = ATSWSubClassDropDownButton_OnClick;
                info.checked = allChecked;
                if(atsw_currentsubclassfilter==0) then info.checked=true; end
                UIDropDownMenu_AddButton(info);
        end
        
        local checked;
        for i=1, arg.n, 1 do
                if (atsw_currentsubclassfilter==0 and arg.n > 1) then
                        checked = nil;
                        UIDropDownMenu_SetText(TEXT(ALL_SUBCLASSES), ATSWSubClassDropDown);
                else
                        if(i==atsw_currentsubclassfilter) then
                                checked=true;
                                UIDropDownMenu_SetText(arg[i], ATSWSubClassDropDown);
                        else
                                checked=false;
                        end
                end
                info = {};
                info.text = arg[i];
                info.func = ATSWSubClassDropDownButton_OnClick;
                info.checked = checked;
                UIDropDownMenu_AddButton(info);
        end
end

function ATSWInvSlotDropDown_OnLoad()
        UIDropDownMenu_Initialize(this, ATSWInvSlotDropDown_Initialize);
        UIDropDownMenu_SetWidth(120);
        UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, 1);
end

function ATSWInvSlotDropDown_OnShow()
        UIDropDownMenu_Initialize(this, ATSWInvSlotDropDown_Initialize);
        if(atsw_currentinvslotfilter==0) then
                UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, 1);
        end
end

function ATSWInvSlotDropDown_Initialize()
        ATSWFilterFrame_LoadInvSlots(GetTradeSkillInvSlots());
end

function ATSWFilterFrame_LoadInvSlots(...)
        local info = {}
        if (arg.n > 1) then
                info.text = TEXT(ALL_INVENTORY_SLOTS);
                info.func = ATSWInvSlotDropDownButton_OnClick;
                info.checked = false;
                if(atsw_currentinvslotfilter==0) then info.checked=true; end
                UIDropDownMenu_AddButton(info);
        end
        
        local checked=false;
        for i=1, arg.n, 1 do
                if (atsw_currentinvslotfilter==0 and arg.n > 1) then
                        checked = false;
                        UIDropDownMenu_SetText(TEXT(ALL_INVENTORY_SLOTS), ATSWInvSlotDropDown);
                else
                        if(i==atsw_currentinvslotfilter) then
                                checked=true;
                                UIDropDownMenu_SetText(arg[i], ATSWInvSlotDropDown);
                        else
                                checked=false;
                        end
                end
                info = {};
                info.text = arg[i];
                info.func = ATSWInvSlotDropDownButton_OnClick;
                info.checked = checked;
                UIDropDownMenu_AddButton(info);
        end
end

function ATSWSubClassDropDownButton_OnClick()
        UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, this:GetID());
        if(this:GetID()==1) then
                atsw_subclassfilter=nil;
                atsw_subclassfiltered={};
                atsw_currentsubclassfilter=0;
                ATSW_CreateSkillListing();
                ATSWFrame_Update();
        else
                atsw_subclassfilter=this:GetID()-1;
                atsw_currentsubclassfilter=atsw_subclassfilter;
                SetTradeSkillSubClassFilter(this:GetID() - 1, 1, 1);
        end
end

atsw_currentinvslotfilter=0;
atsw_invslotfilter=nil;
atsw_invslotfiltered={};
atsw_currentsubclassfilter=0;
atsw_subclassfilter=nil;
atsw_subclassfiltered={};

function ATSWInvSlotDropDownButton_OnClick()
        UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, this:GetID());
        if(this:GetID()==1) then
                atsw_invslotfilter=nil;
                atsw_invslotfiltered={};
                atsw_currentinvslotfilter=0;
                ATSW_CreateSkillListing();
                ATSWFrame_Update();
        else
                atsw_invslotfilter=this:GetID()-1;
                atsw_currentinvslotfilter=atsw_invslotfilter;
                SetTradeSkillInvSlotFilter(this:GetID() - 1, 1, 1);
        end
end

function ATSW_FilterInvSlot(skillName)
        if(table.getn(atsw_invslotfiltered)==0) then return true; end
        if(atsw_invslotfiltered[skillName]) then 
                return true;
        else
                return false;
        end     
end

function ATSW_FilterSubClass(skillName)
        if(table.getn(atsw_subclassfiltered)==0) then return true; end
        if(atsw_subclassfiltered[skillName]) then 
                return true;
        else
                return false;
        end     
end

function ATSWCollapseAllButton_OnClick()
        if (this.collapsed) then
                this.collapsed = nil;
                if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then
                        if(atsw_customheaders[UnitName("player")]) then
                                if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then
                                        for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
                                                atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded=true;
                                        end
                                end
                        end
                        atsw_uncategorizedexpanded=true;
                else
                        for i=1,table.getn(atsw_tradeskillheaders),1 do
                                atsw_tradeskillheaders[i].expanded=true;
                        end
                end
        else
                this.collapsed = 1;
                ATSWListScrollFrameScrollBar:SetValue(0);
                if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then
                        if(atsw_customheaders[UnitName("player")]) then
                                if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then
                                        for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
                                                atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded=false;
                                        end
                                end
                        end
                        atsw_uncategorizedexpanded=false;
                else
                        for i=1,table.getn(atsw_tradeskillheaders),1 do
                                atsw_tradeskillheaders[i].expanded=false;
                        end
                end
        end
        ATSW_CreateSkillListing();
        ATSWFrame_Update();
end

atsw_queue={};

function ATSWFrame_UpdateQueue()
        local jobs=table.getn(atsw_queue);
        local offset=FauxScrollFrame_GetOffset(ATSWQueueScrollFrame);

        for i=1,4,1 do
                local jobindex=i+offset;
                local queueCount=getglobal("ATSWQueueItem"..i.."Count");
                local queueName=getglobal("ATSWQueueItem"..i.."Name");
                local queueItem=getglobal("ATSWQueueItem"..i);
                local queueButton=getglobal("ATSWQueueItem"..i.."DeleteButton");
                if(atsw_queue[jobindex]) then
                        queueCount:SetText(atsw_queue[jobindex].count.."x");
                        queueName:SetText(atsw_queue[jobindex].name);
                        queueItem.jobindex=jobindex;
                        queueButton.jobindex=jobindex;
                        queueItem:Show();
                        queueButton:Show();
                else
                        queueButton:Hide();
                        queueItem:Hide();
                end
        end

        FauxScrollFrame_Update(ATSWQueueScrollFrame, jobs, 4, 22);
end

atsw_preventupdate=false;

function ATSW_DeleteQueue()
        atsw_queue={};
        ATSW_ResetPossibleItemCounts();
        ATSWInv_UpdateQueuedItemList();
        ATSWFrame_UpdateQueue();
        ATSWFrame_Update();
end

function ATSW_DeleteJob(jobindex)
        if(atsw_queue[jobindex]) then
                table.remove(atsw_queue,jobindex);
                if(FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)>0 and FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)+4>table.getn(atsw_queue)) then
                        FauxScrollFrame_SetOffset(ATSWQueueScrollFrame,FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)-1);
                end
                if(atsw_preventupdate==false) then
                        ATSW_ResetPossibleItemCounts();
                        ATSWInv_UpdateQueuedItemList();
                        ATSWFrame_UpdateQueue();
                        ATSWFrame_Update();
                end
        end
end

function ATSW_AddJobLL(skillname, num)
        for i=1,table.getn(atsw_queue),1 do
                if(atsw_queue[i].name==skillname) then
                        atsw_queue[i].count=atsw_queue[i].count+num;
                        if(atsw_preventupdate==false) then
                                ATSW_ResetPossibleItemCounts();
                                ATSWInv_UpdateQueuedItemList();
                                ATSWFrame_UpdateQueue();
                                ATSWFrame_Update();
                        end
                        return;
                end
        end
        table.insert(atsw_queue,{name=skillname,count=num});
        if(atsw_preventupdate==false) then
                ATSW_ResetPossibleItemCounts();
                ATSWInv_UpdateQueuedItemList();
                ATSWFrame_UpdateQueue();
                ATSWFrame_Update();
        end
end

function ATSW_AddJobFirst(skillname, num)
        for i=1,table.getn(atsw_queue),1 do
                if(atsw_queue[i].name==skillname) then
                        atsw_queue[i].count=atsw_queue[i].count+num;
                        if(atsw_preventupdate==false) then
                                ATSW_ResetPossibleItemCounts();
                                ATSWInv_UpdateQueuedItemList();
                                ATSWFrame_UpdateQueue();
                                ATSWFrame_Update();
                        end
                        return;
                end
        end
        table.insert(atsw_queue,1,{name=skillname,count=num});
        if(atsw_preventupdate==false) then
                ATSW_ResetPossibleItemCounts();
                ATSWInv_UpdateQueuedItemList();
                ATSWFrame_UpdateQueue();
                ATSWFrame_Update();
        end
end

function ATSW_DeleteJobPartial(skillname, num)
        for i=1,table.getn(atsw_queue),1 do
                if(atsw_queue[i].name==skillname) then
                        atsw_queue[i].count=atsw_queue[i].count-num;
                        if(atsw_queue[i].count<=0) then ATSW_DeleteJob(i); end
                        if(atsw_preventupdate==false) then
                                ATSW_ResetPossibleItemCounts();
                                ATSWInv_UpdateQueuedItemList();
                                ATSWFrame_UpdateQueue();
                                ATSWFrame_Update();
                        end
                        return;
                end
        end
end

function ATSW_StartStopProcessing()
        if(atsw_processing==true) then
                atsw_processing=false;
                ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE);
        else
                atsw_processing=true;
                ATSWQueueStartStopButton:SetText(ATSW_STOPQUEUE);
                ATSW_StartProcessing();
        end
end

function ATSW_Enchant()
        DoCraft(GetCraftSelectionIndex());
end

function ATSW_SetColumnWidth(width, frame)
        if not frame then
        frame = this;
        end
        frame:SetWidth(width);
        getglobal(frame:GetName().."Middle"):SetWidth(width - 9);
        frame:Disable();
end

atsw_processingname="";
atsw_processing=false;
atsw_processnext=false;
atsw_lastremoved="";

function ATSW_StartProcessing()
        atsw_retries=0;
        atsw_retry=false;
        ATSWFrame:RegisterEvent("SPELLCAST_STOP");
        ATSWFrame:RegisterEvent("SPELLCAST_START");
        ATSWFrame:RegisterEvent("SPELLCAST_CHANNEL_STOP");
        ATSWFrame:RegisterEvent("SPELLCAST_INTERRUPTED");
        ATSW_ProcessNextQueueItem(true);        
end

function ATSW_ProcessNextQueueItem(directClick)
        if(table.getn(atsw_queue)>0 and atsw_retries<ATSW_MAX_RETRIES) then
--              atsw_processingname=atsw_queue[1].name;
--              atsw_working=true;
--              atsw_retries=atsw_retries+1;
--              atsw_retry=true;
--              atsw_retrydelay=0;
--              DoTradeSkill(ATSW_GetTradeSkillID(atsw_queue[1].name),1);
                if(directClick~=nil and directClick==true) then
                        ATSW_ProcessIt();
                else
                        ATSWCFItemName:SetText(ATSWCF_TITLE2.."\n"..atsw_queue[1].count.."x "..atsw_queue[1].name);
                        ShowUIPanel(ATSWContinueFrame);
                end
        else
                atsw_processingtimeout=5;
        end
end

function ATSW_ProcessIt()
        atsw_processingname=atsw_queue[1].name;
        atsw_working=true;
        atsw_retries=atsw_retries+1;
        atsw_retry=true;
        atsw_processnext=false;
        atsw_retrydelay=0;
        DoTradeSkill(ATSW_GetTradeSkillID(atsw_queue[1].name),atsw_queue[1].count);     
end

function ATSW_SpellcastStop()
        atsw_working=false;
        if(atsw_queue[1]) then
                atsw_lastremoved=atsw_processingname;
                ATSW_DeleteJobPartial(atsw_processingname,1);
                ATSWFrame_UpdateQueue();
        end
        if(atsw_processing==true) then 
                if(atsw_queue[1]~=nil and atsw_queue[1].name~=atsw_processingname) then
                        atsw_processnext=true;
                end
        else    
                ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE);
                ATSWFrame:UnregisterEvent("SPELLCAST_STOP");
                ATSWFrame:UnregisterEvent("SPELLCAST_START");
                ATSWFrame:UnregisterEvent("SPELLCAST_CHANNEL_STOP");
                ATSWFrame:UnregisterEvent("SPELLCAST_INTERRUPTED");
        end
end

function ATSW_SpellcastInterrupted()
        if(atsw_processing==true) then 
                atsw_working=false;
                ATSW_AddJobFirst(atsw_lastremoved,1);
                if(atsw_retries<ATSW_MAX_RETRIES) then
                        atsw_retries=atsw_retries+1;
                        atsw_retry=true;
                        atsw_retrydelay=0;
                        return;
                end
                ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE);
                atsw_processing=false;
                atsw_interrupted=true;
                ATSWFrame:UnregisterEvent("SPELLCAST_STOP");
                ATSWFrame:UnregisterEvent("SPELLCAST_START");
                ATSWFrame:UnregisterEvent("SPELLCAST_CHANNEL_STOP");
                ATSWFrame:UnregisterEvent("SPELLCAST_INTERRUPTED");
        end
end

function ATSW_SpellcastStart()
        atsw_retry=false;
        atsw_retrydelay=0;
        atsw_processingtimeout=0;
end

function ATSWDBF_OnOK()
        if(table.getn(atsw_queue)>0) then
                ATSW_ProcessIt();
        end
end

function ATSWDBF_OnAbort()
        ATSW_StartStopProcessing();     
end

function ATSW_GetTradeSkillID(skillName) 
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==skillName) then 
                        return atsw_tradeskilllist[i].id;
                end
        end
        return 0;
end

function ATSW_GetTradeSkillListPos(id)
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].id==id) then 
                        return i;
                end
        end
        return -1;      
end

function ATSW_GetTradeSkillListPosByName(name)
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==name) then 
                        return i;
                end
        end
        return -1;      
end

function ATSW_CreateTradeSkillList()
        local numTradeSkills=ATSW_GetNumTradeSkills();
        local currentHeader=0;

        atsw_oldtradeskillheaders=atsw_tradeskillheaders;
        atsw_tradeskilllist={};
        atsw_tradeskillheaders={};

        if(atsw_oldmode) then 
                table.insert(atsw_tradeskillheaders,{name="invisibleheader",id=0,list={},expanded=true});
                currentHeader=1;
        end

        for i=1,numTradeSkills,1 do
                local skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(i);
                if(skillName~=nil) then
                        if(skillType=="header") then
                                local oldexpanded=true;
                                for j=1,table.getn(atsw_oldtradeskillheaders),1 do
                                        if(atsw_oldtradeskillheaders[j].name==skillName) then
                                                oldexpanded=atsw_oldtradeskillheaders[j].expanded;
                                        end
                                end
                                table.insert(atsw_tradeskillheaders,{name=skillName,id=i,list={},expanded=oldexpanded});
                                currentHeader=table.getn(atsw_tradeskillheaders);
                        else
                                if(currentHeader>0 or atsw_oldmode) then
                                        reagentlist={};
                                        local numReagents = ATSW_GetTradeSkillNumReagents(i);
                                        local skillLink = ATSW_GetTradeSkillItemLink(i);
                                        local numMade = ATSW_GetTradeSkillNumMade(i);
                                        for j=1, numReagents, 1 do
                                                local reagentName, reagentTexture, reagentCount, playerReagentCount = ATSW_GetTradeSkillReagentInfo(i, j);
                                                local reagentLink = ATSW_GetTradeSkillReagentItemLink(i,j);
                                                if(reagentName) then
                                                        table.insert(reagentlist,{name=reagentName,count=reagentCount,link=reagentLink});
                                                end
                                        end
                                        table.insert(atsw_tradeskilllist,{name=skillName,id=i,reagents=reagentlist,link=skillLink,type=skillType,num=numMade});
                                        table.insert(atsw_tradeskillheaders[currentHeader].list,table.getn(atsw_tradeskilllist));
                                end
                        end
                end
        end

        local check=false;

        if(atsw_invslotfilter~=nil) then
                atsw_invslotfilter=nil;
                atsw_invslotfiltered={};
                for i=1,table.getn(atsw_tradeskilllist),1 do
                        atsw_invslotfiltered[atsw_tradeskilllist[i].name]=1;
                        table.setn(atsw_invslotfiltered,table.getn(atsw_invslotfiltered)+1);
                end
                for i=1,table.getn(atsw_tradeskillheaders),1 do
                        atsw_invslotfiltered[atsw_tradeskillheaders[i].name]=1;
                        table.setn(atsw_invslotfiltered,table.getn(atsw_invslotfiltered)+1);
                end
                SetTradeSkillInvSlotFilter(0, 1, 1);
                check=true;
        end

        if(atsw_subclassfilter~=nil) then
                atsw_subclassfilter=nil;
                atsw_subclassfiltered={};
                for i=1,table.getn(atsw_tradeskilllist),1 do
                        atsw_subclassfiltered[atsw_tradeskilllist[i].name]=1;
                        table.setn(atsw_subclassfiltered,table.getn(atsw_subclassfiltered)+1);
                end
                for i=1,table.getn(atsw_tradeskillheaders),1 do
                        atsw_subclassfiltered[atsw_tradeskillheaders[i].name]=1;
                        table.setn(atsw_subclassfiltered,table.getn(atsw_subclassfiltered)+1);
                end
                SetTradeSkillSubClassFilter(0, 1, 1);
                check=true;
        end

        if(check==false) then
                ATSW_CreateSkillListing();
        end
end

function ATSW_GetSkillListingPos(id)
        for i=1,table.getn(atsw_skilllisting),1 do
                if(atsw_skilllisting[i].id==id) then 
                        return i;
                end
        end
        return -1;      
end

function ATSW_CreateSkillListing()
        atsw_skilllisting={};
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]~="custom") then
                for i=1,table.getn(atsw_tradeskillheaders),1 do
                        table.insert(atsw_skilllisting,{type="header",name=atsw_tradeskillheaders[i].name,expanded=atsw_tradeskillheaders[i].expanded,id=atsw_tradeskillheaders[i].id});
                        if(atsw_tradeskillheaders[i].expanded==true) then
                                for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do
                                        local skillName=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name;
                                        local skillID=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].id;
                                        local skillType=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].type;
                                        local numMade=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].num;
                                        local skillLink=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].link;
                                        table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink});
                                end
                        end
                end
        else
                local atsw_allskills={};
                for i=1,table.getn(atsw_tradeskillheaders),1 do
                        for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do
                                table.insert(atsw_allskills,atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name);
                        end
                end
                if(atsw_customheaders[UnitName("player")]) then
                        if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then
                                for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do
                                        table.insert(atsw_skilllisting,{type="header",name=atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name,expanded=atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded,id=i*1000});
                                        if(atsw_customsorting[UnitName("player")] and atsw_customsorting[UnitName("player")][atsw_selectedskill] and atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then
                                                for j=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do
                                                        local skillName=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][j].name;
                                                        local skillID, skillType, numMade, skillLink=ATSW_GetSkillDataFromSkillList(skillName);
                                                        if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded==true) then table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink}); end
                                                        for k=1,table.getn(atsw_allskills),1 do
                                                                if(atsw_allskills[k]==skillName) then
                                                                        table.remove(atsw_allskills,k);
                                                                end
                                                        end
                                                end
                                        end
                                end
                        end
                end
                if(table.getn(atsw_allskills)>0) then
                        table.insert(atsw_skilllisting,{type="header",name=ATSWCS_UNCATEGORIZED,expanded=atsw_uncategorizedexpanded,id=1001});
                        if(atsw_uncategorizedexpanded==true) then
                                for i=1,table.getn(atsw_allskills),1 do
                                        local skillName=atsw_allskills[i];
                                        local skillID, skillType, numMade, skillLink=ATSW_GetSkillDataFromSkillList(skillName);
                                        table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink});
                                end
                        end
                end
        end
end

function ATSW_GetSkillDataFromSkillList(skillName)
        for i=1,table.getn(atsw_tradeskillheaders),1 do
                for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do
                        if(skillName==atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name) then
                                local skillID=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].id;
                                local skillType=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].type;
                                local numMade=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].num;
                                local skillLink=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].link;
                                return skillID, skillType, numMade, skillLink;
                        end
                end
        end
        return nil,nil,nil,nil;
end

function ATSW_SetHeaderExpanded(id,value)
        if(atsw_orderby[UnitName("player")][atsw_selectedskill]~="custom") then
                for i=1,table.getn(atsw_tradeskillheaders),1 do
                        if(atsw_tradeskillheaders[i].id==id) then
                                atsw_tradeskillheaders[i].expanded=value;
                        end
                end
        else
                if(id==1001) then
                        atsw_uncategorizedexpanded=value;
                else
                        atsw_customheaders[UnitName("player")][atsw_selectedskill][id/1000].expanded=value;
                end
        end
        ATSW_CreateSkillListing();
end

function ATSW_AddTradeSkillReagentLinksToChatFrame(skillName)
        local channel,chatnumber = ChatFrameEditBox.chatType;
        if channel=="WHISPER" then
                chatnumber = ChatFrameEditBox.tellTarget
        elseif channel=="CHANNEL" then
                chatnumber = ChatFrameEditBox.channelTarget
        end
        local chatline;
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i]) then
                        if(atsw_tradeskilllist[i].name==skillName) then
                                SendChatMessage(ATSW_REAGENTLIST1..atsw_tradeskilllist[i].link..ATSW_REAGENTLIST2,channel,nil,chatnumber);
                                for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                        chatline=atsw_tradeskilllist[i].reagents[j].count.."x "..atsw_tradeskilllist[i].reagents[j].link;
                                        SendChatMessage(chatline,channel,nil,chatnumber);
                                end
                        end
                end
        end
end

function ATSWFrameIncrement_OnClick()
        if(ATSWInputBox:GetNumber()<100) then
                ATSWInputBox:SetNumber(ATSWInputBox:GetNumber()+1);
        end
end

function ATSWFrameDecrement_OnClick()
        if(ATSWInputBox:GetNumber()>0) then
                ATSWInputBox:SetNumber(ATSWInputBox:GetNumber()-1);
        end
end

function ATSW_GetNumItemsPossible(skillName)
        if(atsw_tradeskillcounter[skillName]) then
                return atsw_tradeskillcounter[skillName];
        end
        return ATSW_GetNumItemsPossibleNoCache(skillName,true);
end

function ATSW_GetNumItemsPossibleNoCache(skillName,writeCache)
        local atsw_considermerchants_backup=atsw_considermerchants;
        if(atsw_considermerchants==true and ATSW_CheckIfCreatedOnlyWithVendorStuff(skillName)==true) then
                atsw_considermerchants=false;
        end
        for i=1,500,1 do
                atsw_temporaryitemlist={};
                if(ATSW_CheckIfPossible(skillName,i)==false) then 
                        atsw_temporaryitemlist={};
                        if(writeCache==true) then atsw_tradeskillcounter[skillName]=(i-1); end
                        atsw_considermerchants=atsw_considermerchants_backup;
                        return (i-1);
                end
        end
        atsw_considermerchants=atsw_considermerchants_backup;
        return 0;
end

function ATSW_GetNumItemsPossibleWithInventory(skillName)
        local atsw_considerbank_backup=atsw_considerbank;
        local atsw_consideralts_backup=atsw_consideralts;
        local atsw_considermerchants_backup=atsw_considermerchants;
        atsw_considerbank=false;
        atsw_consideralts=false;
        atsw_considermerchants=false;
        local count=ATSW_GetNumItemsPossibleNoCache(skillName,false);
        atsw_considerbank=atsw_considerbank_backup;
        atsw_consideralts=atsw_consideralts_backup;
        atsw_considermerchants=atsw_considermerchants_backup;
        return count;
end

function ATSW_ToggleReagentFrame()
        if(ATSWReagentFrame:IsVisible()) then
                HideUIPanel(ATSWReagentFrame);
        else
                ATSW_ShowNecessaryReagents();
        end
end

function ATSW_ResetPossibleItemCounts()
        atsw_tradeskillcounter={};
end

function ATSW_AddJob(skillName,count)
        atsw_temporaryitemlist={};
        local numMade=1;
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==skillName) then
                        numMade=atsw_tradeskilllist[i].num;
                end
        end
        ATSW_AddJobRecursive(skillName,count*numMade,true);     
end

function ATSW_AddJobRecursive(skillName,count,firstcall)
        if(ATSW_CheckBlacklist(skillName)==false or firstcall==true) then
                for i=1,table.getn(atsw_tradeskilllist),1 do
                        if(atsw_tradeskilllist[i].name==skillName) then
                                local usagecount=math.ceil(count/atsw_tradeskilllist[i].num);
                                for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                        local itemcount=ATSW_GetItemCountMinusQueued(atsw_tradeskilllist[i].reagents[j].name);
                                        if(itemcount<0) then itemcount=0; end
                                        local necessary=atsw_tradeskilllist[i].reagents[j].count*usagecount;
                                        if(itemcount<necessary) then
                                                local missing=necessary-itemcount;
                                                ATSW_AddJobRecursive(atsw_tradeskilllist[i].reagents[j].name,missing,false);
                                        end
                                end
                                ATSW_AddJobLL(skillName,usagecount);
                        end
                end
        end
end

function ATSW_CheckIfPossible(skillName,count)
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==skillName) then
                        for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                local usagecount=math.ceil(count/atsw_tradeskilllist[i].num);
                                local itemcount=ATSW_GetItemCountMinusQueuedAndTemporary(atsw_tradeskilllist[i].reagents[j].name);
                                local necessary=atsw_tradeskilllist[i].reagents[j].count*count;
                                if(itemcount>=necessary) then
                                        ATSW_TemporaryUseItem(atsw_tradeskilllist[i].reagents[j].name,necessary);
                                else
                                        local missing=necessary-itemcount;
                                        local response=ATSW_CheckIfPossible(atsw_tradeskilllist[i].reagents[j].name,missing);
                                        if(response==false) then return false; end
                                end
                        end
                        return true;
                end
        end
        return false;
end

function ATSW_CheckIfCreatedOnlyWithVendorStuff(skillName)
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==skillName) then
                        for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                local response=ATSW_CheckIfCreatedOnlyWithVendorStuff(atsw_tradeskilllist[i].reagents[j].name);
                                if(response==false) then return false; end
                        end
                        return true;
                end
        end
        return ATSWMerchant_CheckIfAvailable(skillName);
end

atsw_missingitems={};

function ATSW_NoteMissingItems(skillName,count)
        if(ATSW_CheckBlacklist(skillName)==false) then
                for i=1,table.getn(atsw_tradeskilllist),1 do
                        if(atsw_tradeskilllist[i].name==skillName) then
                                for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                        local itemcount=ATSW_GetItemCountMinusQueuedAndTemporary(atsw_tradeskilllist[i].reagents[j].name);
                                        local necessary=atsw_tradeskilllist[i].reagents[j].count*count;
                                        if(itemcount>=necessary) then
                                                ATSW_TemporaryUseItem(atsw_tradeskilllist[i].reagents[j].name,necessary);
                                        else
                                                local missing=necessary-itemcount;
                                                ATSW_NoteMissingItems(atsw_tradeskilllist[i].reagents[j].name,missing);
                                        end
                                end
                                return;
                        end
                end
        end
        for i=1,table.getn(atsw_missingitems),1 do
                if(atsw_missingitems[i]) then
                        if(atsw_missingitems[i].name==skillName) then
                                atsw_missingitems[i].cnt=atsw_missingitems[i].cnt+count;
                                return;
                        end
                end
        end
        table.insert(atsw_missingitems,{name=skillName,cnt=count});
end

function ATSW_OutputMissingItems(skillName,count)
        ATSW_DisplayMessage(ATSW_ITEMSMISSING1..count.."x '"..skillName.."'"..ATSW_ITEMSMISSING2);
        for i=1,table.getn(atsw_missingitems),1 do
                ATSW_DisplayMessage(atsw_missingitems[i].cnt.."x '"..atsw_missingitems[i].name.."'");
        end     
end

atsw_necessaryitems={};

function ATSW_NoteNecessaryItems(skillName,count,itemLink)
        for i=1,table.getn(atsw_tradeskilllist),1 do
                if(atsw_tradeskilllist[i].name==skillName) then
                        for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do
                                local necessary=atsw_tradeskilllist[i].reagents[j].count*count;
                                local found=false;
                                for x=1,table.getn(atsw_necessaryitems),1 do
                                        if(atsw_necessaryitems[x]) then
                                                if(atsw_necessaryitems[x].name==atsw_tradeskilllist[i].reagents[j].name) then
                                                        atsw_necessaryitems[x].cnt=atsw_necessaryitems[x].cnt+necessary;
                                                        found=true;
                                                        break;
                                                end
                                        end
                                end
                                if(found==false) then
                                        table.insert(atsw_necessaryitems,{name=atsw_tradeskilllist[i].reagents[j].name,cnt=necessary,link=atsw_tradeskilllist[i].reagents[j].link});
                                end
                        end
                        return;
                end
        end
end

function ATSW_NoteNecessaryItemsForQueue()
        atsw_necessaryitems={};
        for i=1,table.getn(atsw_queue),1 do
                ATSW_NoteNecessaryItems(atsw_queue[i].name,atsw_queue[i].count,nil);
        end
        ATSW_FilterNecessaryItems();
end

function ATSW_FilterNecessaryItems()
        for i=1,table.getn(atsw_necessaryitems),1 do
                for k=1,table.getn(atsw_queue),1 do
                        if(atsw_necessaryitems[i].name==atsw_queue[k].name) then
                                atsw_necessaryitems[i].cnt=atsw_necessaryitems[i].cnt-atsw_queue[k].count;
                        end
                end
        end
        for i=table.getn(atsw_necessaryitems),1,-1 do
                if(atsw_necessaryitems[i].cnt<=0) then
                        table.remove(atsw_necessaryitems,i);
                end
        end
end

function ATSW_NoteNecessaryItemsForTradeskill(skillName,skillCount)
        local atsw_queue_backup=atsw_queue;
        atsw_preventupdate=true;
        atsw_queue={};
        ATSW_AddJob(skillName,skillCount);
        ATSW_NoteNecessaryItemsForQueue();
        atsw_queue=atsw_queue_backup;
        atsw_preventupdate=false;
end

function ATSW_ShowNecessaryReagents()
        ATSW_NoteNecessaryItemsForQueue();
        for i=1,20,1 do
                local count=getglobal("ATSWRFReagent"..i.."Count");
                local item=getglobal("ATSWRFReagent"..i.."Item");
                local inv=getglobal("ATSWRFReagent"..i.."Inventory");
                local bank=getglobal("ATSWRFReagent"..i.."Bank");
                local merchant=getglobal("ATSWRFReagent"..i.."Merchant");
                local alt=getglobal("ATSWRFReagent"..i.."Alt");
                local missing=getglobal("ATSWRFReagent"..i.."Missing");
                if(atsw_necessaryitems[i]) then
                        local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[i].name);
                        local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[i].name);
                        local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[i].name);
                        local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[i].cnt;
                        local items_merchant=ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[i].name);
                        count:SetText(atsw_necessaryitems[i].cnt.."x");
                        count:Disable();
                        count:Show();
                        item:SetText("["..atsw_necessaryitems[i].name.."]");
                        item.link=atsw_necessaryitems[i].link;
                        item:Show();
                        inv:SetText(items_inventory);
                        inv:Disable();
                        inv:Show();
                        if(items_inventory>=atsw_necessaryitems[i].cnt) then
                                inv:SetTextColor(0,1,0);
                        else
                                inv:SetTextColor(1,0,0);
                        end
                        bank:SetText(items_bank);
                        bank:Disable();
                        bank:Show();
                        if(items_bank>=atsw_necessaryitems[i].cnt) then
                                bank:SetTextColor(0,1,0);
                        else
                                bank:SetTextColor(1,0,0);
                        end
                        merchant:SetText("X");
                        merchant:Disable();
                        if(items_merchant==true) then
                                merchant:Show();
                        else
                                merchant:Hide();
                        end
                        alt:SetText(items_alt);
                        if(items_alt>0) then
                                alt:Enable();
                                alt.itemname=atsw_necessaryitems[i].name;
                        else
                                alt:Disable();
                        end
                        alt:Show();
                        if(items_alt>=atsw_necessaryitems[i].cnt) then
                                alt:SetTextColor(0,1,0);
                        else
                                alt:SetTextColor(1,0,0);
                        end
                        if(items_missing>=0) then
                                missing:SetText("+"..items_missing);
                                missing:SetTextColor(0,1,0);
                        else
                                missing:SetText(items_missing);
                                missing:SetTextColor(1,0,0);
                        end
                        missing:Disable();
                        missing:Show();
                else
                        count:Hide();
                        item:Hide();
                        inv:Hide();
                        bank:Hide();
                        merchant:Hide();
                        alt:Hide();
                        missing:Hide();
                end
        end
        ShowUIPanel(ATSWReagentFrame);
end

function ATSWItemButton_OnEnter()
    if(this.link) then
        GameTooltip:SetOwner(this, "ANCHOR_NONE");
        GameTooltip:SetPoint("BOTTOMLEFT",this:GetName(),"TOPLEFT");
        GameTooltip:SetHyperlink(string.gsub(this.link, "|c(%x+)|H(item:%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r", "%2"));
        GameTooltip:Show();
    end
end

function ATSWItemButton_OnLeave()
        GameTooltip:Hide();
end

function ATSW_TemporaryUseItem(itemname,count)
        if(atsw_temporaryitemlist[itemname]) then
                atsw_temporaryitemlist[itemname]=atsw_temporaryitemlist[itemname]+count;
        else
                atsw_temporaryitemlist[itemname]=count;
        end     
end

function ATSW_CheckBlacklist(itemname)
        for i=1,table.getn(atsw_blacklist),1 do
                if(atsw_blacklist[i]) then
                        if(atsw_blacklist[i]==itemname) then return true; end
                end
        end
        return false;   
end

atsw_filter="";

function ATSW_UpdateFilter(filtertext)
        atsw_filter=filtertext;
        ATSWFrame_Update();     
end

function ATSW_Filter(skillname)
        if(skillname==nil) then return false; end
        if(skillname=="") then return true; end
        local parameters={};
        for w in string.gfind(atsw_filter, ":[^:]*") do
                local _, _, param_name, param_value=string.find(w, ":(%a+)%s([^:]*)");
                if(param_name~=nil) then _, _, param_name=string.find(param_name,"^%s*(.-)%s*$"); end
                if(param_value~=nil) then _, _, param_value=string.find(param_value,"^%s*(.-)%s*$"); end
                if(param_name~=nil) then
                        table.insert(parameters,{name=param_name,value=param_value});
                end
        end
        local _, _, searchstring=string.find(atsw_filter,"^([^:]*):?");
        if(searchstring~=nil) then
                _, _, searchstring=string.find(searchstring,"^%s*(.-)%s*$");
                table.insert(parameters,1,{name="name",value=searchstring});
        end
        for i=1,table.getn(parameters),1 do
                if(parameters[i].name=="name") then
                        if(string.find(string.lower(skillname),".-"..string.lower(parameters[i].value)..".-")==nil) then
                                return false;
                        end
                end
                if(parameters[i].name=="reagent") then
                        local index=ATSW_GetTradeSkillListPosByName(skillname);
                        if(index~=-1) then
                                local found=false;
                                for j=1,table.getn(atsw_tradeskilllist[index].reagents),1 do
                                        if(string.find(string.lower(atsw_tradeskilllist[index].reagents[j].name),".-"..string.lower(parameters[i].value)..".-")~=nil) then
                                                found=true;
                                        end
                                end
                                if(found==false) then return false; end
                        else
                                return false;
                        end
                end
                if(parameters[i].name=="minlevel") then
                        local index=ATSW_GetTradeSkillListPosByName(skillname);
                        if(index~=-1) then
                                local level=ATSW_GetItemMinLevel(atsw_tradeskilllist[index].id);
                                if(tonumber(parameters[i].value,10)==nil or level==0 or level<tonumber(parameters[i].value,10)) then
                                        return false;
                                end
                        else
                                return false;
                        end
                end
                if(parameters[i].name=="maxlevel") then
                        local index=ATSW_GetTradeSkillListPosByName(skillname);
                        if(index~=-1) then
                                local level=ATSW_GetItemMinLevel(atsw_tradeskilllist[index].id);
                                if(tonumber(parameters[i].value,10)==nil or level==0 or level>tonumber(parameters[i].value,10)) then
                                        return false;
                                end
                        else
                                return false;
                        end
                end
                if(parameters[i].name=="minrarity") then
                        local index=ATSW_GetTradeSkillListPosByName(skillname);
                        if(index~=-1) then
                                local rarity=ATSW_GetItemRarity(atsw_tradeskilllist[index].id);
                                local reference=ATSWRarityNames[parameters[i].value];
                                if(reference==nil or rarity==0 or rarity<reference) then
                                        return false;
                                end
                        else
                                return false;
                        end
                end
                if(parameters[i].name=="maxrarity") then
                        local index=ATSW_GetTradeSkillListPosByName(skillname);
                        if(index~=-1) then
                                local rarity=ATSW_GetItemRarity(atsw_tradeskilllist[index].id);
                                local reference=ATSWRarityNames[parameters[i].value];
                                if(reference==nil or rarity==0 or rarity>reference) then
                                        return false;
                                end
                        else
                                return false;
                        end
                end
                if(parameters[i].name=="minpossible") then
                        local possible=ATSW_GetNumItemsPossibleWithInventory(skillname);
                        if(tonumber(parameters[i].value,10)==nil or possible<tonumber(parameters[i].value,10)) then
                                return false;
                        end
                end
                if(parameters[i].name=="maxpossible") then
                        local possible=ATSW_GetNumItemsPossibleWithInventory(skillname);
                        if(tonumber(parameters[i].value,10)==nil or possible>tonumber(parameters[i].value,10)) then
                                return false;
                        end
                end
                if(parameters[i].name=="minpossibletotal") then
                        local possible=ATSW_GetNumItemsPossible(skillname);
                        if(tonumber(parameters[i].value,10)==nil or possible<tonumber(parameters[i].value,10)) then
                                return false;
                        end
                end
                if(parameters[i].name=="maxpossibletotal") then
                        local possible=ATSW_GetNumItemsPossible(skillname);
                        if(tonumber(parameters[i].value,10)==nil or possible>tonumber(parameters[i].value,10)) then
                                return false;
                        end
                end
        end
        return true;
end

function ATSW_GetItemMinLevel(tradeskillid)
        ATSWScanTooltip:SetOwner(ATSWFrame, "ANCHOR_TOPLEFT");
        ATSWScanTooltip:SetTradeSkillItem(tonumber(tradeskillid,10));
        local linecount=ATSWScanTooltip:NumLines();
        local k;
        for k=1,linecount,1 do
                local ttextLeft = getglobal("ATSWScanTooltipTextLeft"..k);
                if(ttextLeft) then
                        local text=ttextLeft:GetText();
                        if(text) then
                                local _, _, level=string.find(text,ATSW_SCAN_MINLEVEL);
                                if(level) then
                                        ATSWScanTooltip:Hide();
                                        return tonumber(level,10);
                                end
                        end
                end
        end
        ATSWScanTooltip:Hide();
        return 0;
end

function ATSW_GetItemRarity(tradeskillid)
        ATSWScanTooltip:SetOwner(ATSWFrame, "ANCHOR_TOPLEFT");
        ATSWScanTooltip:SetTradeSkillItem(tonumber(tradeskillid,10));
        local ttextLeft = getglobal("ATSWScanTooltipTextLeft1");
        if(ttextLeft) then
                local cr,cg,cb=ttextLeft:GetTextColor();
                if(cr) then
                        cr=ATSW_Round(cr,2);
                        cg=ATSW_Round(cg,2);
                        cb=ATSW_Round(cb,2);
                        local col;
                        for col=1,5,1 do
                                if(ATSWRarityColor[col].r==cr and ATSWRarityColor[col].g==cg and ATSWRarityColor[col].b==cb) then
                                        ATSWScanTooltip:Hide();
                                        return col;
                                end
                        end
                end
        end
        ATSWScanTooltip:Hide();
        return 0;
end

function ATSW_Test()
        local stats=GetTradeSkillItemStats(3);
        ATSW_DisplayMessage(stats);
end

function ATSW_ToggleOptionsFrame()
        if(ATSWOptionsFrame:IsVisible()) then
                HideUIPanel(ATSWOptionsFrame);
        else
                if(atsw_multicount==true) then
                        ATSWOFUnifiedCounterButton:SetChecked(true);
                        ATSWOFSeparateCounterButton:SetChecked(false);
                else
                        ATSWOFUnifiedCounterButton:SetChecked(false);
                        ATSWOFSeparateCounterButton:SetChecked(true);
                end
                if(atsw_considerbank==true) then
                        ATSWOFIncludeBankButton:SetChecked(true);
                else    
                        ATSWOFIncludeBankButton:SetChecked(false);
                end
                if(atsw_consideralts==true) then
                        ATSWOFIncludeAltsButton:SetChecked(true);
                else    
                        ATSWOFIncludeAltsButton:SetChecked(false);
                end
                if(atsw_considermerchants==true) then
                        ATSWOFIncludeMerchantsButton:SetChecked(true);
                else    
                        ATSWOFIncludeMerchantsButton:SetChecked(false);
                end
                if(atsw_autobuy==true) then
                        ATSWOFAutoBuyButton:SetChecked(true);
                else    
                        ATSWOFAutoBuyButton:SetChecked(false);
                end
                if(atsw_recipetooltip==true) then
                        ATSWOFTooltipButton:SetChecked(true);
                else
                        ATSWOFTooltipButton:SetChecked(false);
                end
                if(atsw_displayshoppinglist==true) then
                        ATSWOFShoppingListButton:SetChecked(true);
                else
                        ATSWOFShoppingListButton:SetChecked(false);
                end
                ShowUIPanel(ATSWOptionsFrame);
        end
end

function ATSW_ToggleCSFrame()
        ShowUIPanel(ATSWCSFrame);
end

-- tooltip functions

atsw_recipetooltip=true;

function ATSW_DisplayTradeskillTooltip()
        if(atsw_recipetooltip==false) then return; end
        ATSWTradeskillTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT",-300);
        ATSWTradeskillTooltip:SetBackdropColor(0,0,0,1);

        local tradeskillid=this:GetID();
        local skillName, skillType, numAvailable;
        local listpos=ATSW_GetSkillListingPos(tradeskillid);
        if(atsw_skilllisting[listpos]) then
                skillName = atsw_skilllisting[listpos].name;
                skillType = atsw_skilllisting[listpos].type;
        else
                skillName=nil;
                akillType=nil;
        end

        if(skillName and skillType ~= "header") then
                ATSWTradeskillTooltip:AddLine(skillName);
                local color=ATSWTypeColor[skillType];
                if(color) then
                        ATSWTradeskillTooltipTextLeft1:SetVertexColor(color.r, color.g, color.b);
                end
                ATSWTradeskillTooltip:AddLine(ATSW_GetNumItemsPossibleWithInventory(skillName)..ATSW_TOOLTIP_PRODUCABLE);
                ATSWTradeskillTooltipTextLeft2:SetVertexColor(1, 1, 1);
                ATSWTradeskillTooltip:AddLine(" ");
                ATSWTradeskillTooltip:AddLine(ATSW_TOOLTIP_NECESSARY);

                ATSW_NoteNecessaryItemsForTradeskill(skillName,1);
                for i=1,20,1 do
                        if(atsw_necessaryitems[i]) then
                                local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[i].name);
                                local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[i].name);
                                local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[i].name);
                                local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[i].cnt;
                                local items_merchant="";
                                if(ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[i].name)==true) then
                                        items_merchant=ATSW_TOOLTIP_BUYABLE;
                                end                             
                                ATSWTradeskillTooltip:AddLine(atsw_necessaryitems[i].cnt.."x "..atsw_necessaryitems[i].name.." ("..items_inventory.." / "..items_bank.." / "..items_alt..")"..items_merchant);
                                local r,g,b=ATSW_GetLinkColorRGB(atsw_necessaryitems[i].link);
                                getglobal("ATSWTradeskillTooltipTextLeft"..(4+i)):SetVertexColor(r/256, g/256, b/256);
                        end
                end
                ATSWTradeskillTooltip:AddLine(ATSW_TOOLTIP_LEGEND);
                
                ATSWTradeskillTooltip:Show();
        end
end

function ATSW_GetLinkColor(link)
        if(link) then
                local _,_,color = string.find(link, "^.*|cff(.-)|.*$");
                return color;
        else
                return nil;
        end
end

function ATSW_GetLinkColorRGB(link)
        if(link) then
                local color=ATSW_HexToDec(ATSW_GetLinkColor(link));
                local r=math.floor(color/65536);
                local g=math.floor((color-r*65536)/256);
                local b=math.floor((color-r*65536-g*256));
                return r,g,b;
        else
                return 0,0,0;
        end
end

-- item count functions

atsw_considerbank=false;
atsw_consideralts=false;
atsw_considermerchants=false;
atsw_multicount=true;

function ATSW_GetItemCountMinusQueuedAndTemporary(itemname)
        if(atsw_temporaryitemlist[itemname]) then
                return ATSW_GetItemCountMinusQueued(itemname)-atsw_temporaryitemlist[itemname];
        else
                return ATSW_GetItemCountMinusQueued(itemname);
        end
end

function ATSW_GetItemCountMinusQueued(itemname)
        local getitemcount=ATSWInv_GetItemCount(itemname);
        if(atsw_considerbank==true) then
                getitemcount=getitemcount+ATSWBank_GetItemCount(itemname);
        end
        if(atsw_considermerchants==true) then
                if(atsw_merchantlist[itemname]) then 
                        getitemcount=getitemcount+99999;
                end
        end
        if(atsw_consideralts==true) then
                getitemcount=getitemcount+ATSWAlt_GetItemCount(itemname);
        end
        if(atsw_queueditemlist[itemname]) then
                return getitemcount-atsw_queueditemlist[itemname];
        else
                return getitemcount;
        end
end

-- inventory functions

function ATSWInv_GetItemName(bag, slot)
        local link = GetContainerItemLink(bag, slot);
        if(link) then
        local _,_,name = string.find(link, "^.*%[(.*)%].*$");
        return name;
        else
        return nil;
    end
end

atsw_itemlist={};
atsw_queueditemlist={};
atsw_temporaryitemlist={};

function ATSWInv_UpdateItemList()
        if(atsw_incombat==true) then return; end
        if(not atsw_itemlist[GetRealmName()]) then
                atsw_itemlist[GetRealmName()]={};
        end
        atsw_itemlist[GetRealmName()][UnitName("player")]={};
        for container=0, 4, 1 do
                for slot=1, GetContainerNumSlots(container), 1 do
                        local itemname=ATSWInv_GetItemName(container,slot);
                        if(itemname) then
                                local _, itemcount=GetContainerItemInfo(container, slot);
                                if(atsw_itemlist[GetRealmName()][UnitName("player")][itemname]) then
                                        atsw_itemlist[GetRealmName()][UnitName("player")][itemname]=atsw_itemlist[GetRealmName()][UnitName("player")][itemname]+itemcount;
                                else
                                        atsw_itemlist[GetRealmName()][UnitName("player")][itemname]=itemcount;
                                        table.setn(atsw_itemlist[GetRealmName()][UnitName("player")],table.getn(atsw_itemlist[GetRealmName()][UnitName("player")])+1);
                                end
                        end
                end
        end
        if(ATSWFrame:IsVisible()) then ATSWFrame_Update(); end
end

function ATSWInv_GetItemCount(itemname)
        if(atsw_itemlist[GetRealmName()]) then
                if(atsw_itemlist[GetRealmName()][UnitName("player")]) then
                        if(atsw_itemlist[GetRealmName()][UnitName("player")][itemname]) then
                                return atsw_itemlist[GetRealmName()][UnitName("player")][itemname];
                        end
                end
        end
        return 0;
end

function ATSWInv_UpdateQueuedItemList()
        atsw_queueditemlist={};
        for i=1,table.getn(atsw_queue),1 do
                for j=1,table.getn(atsw_tradeskilllist),1 do
                        if(atsw_tradeskilllist[j].name==atsw_queue[i].name) then
                                for k=1,table.getn(atsw_tradeskilllist[j].reagents),1 do
                                        if(atsw_tradeskilllist[j].reagents[k]) then
                                                if(atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]) then
                                                        atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]=atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]+atsw_tradeskilllist[j].reagents[k].count*atsw_queue[i].count;
                                                else
                                                        atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]=atsw_tradeskilllist[j].reagents[k].count*atsw_queue[i].count;
                                                        table.setn(atsw_queueditemlist,table.getn(atsw_queueditemlist)+1);
                                                end
                                        end
                                end
                        end
                end
        end     
end

-- bank functions

atsw_bankitemlist={};

function ATSWBank_UpdateBankList()
        if(atsw_bankopened==true) then
                if(not atsw_bankitemlist[GetRealmName()]) then
                        atsw_bankitemlist[GetRealmName()]={};
                end
                atsw_bankitemlist[GetRealmName()][UnitName("player")]={};
                for slot=1, 24, 1 do
                        local name=ATSWInv_GetItemName(BANK_CONTAINER,slot);
                        if(name) then
                                local icon, count = GetContainerItemInfo(BANK_CONTAINER, slot);
                                ATSWBank_AddToBankList(name,count);
                        end
                end
                for container=5, 10, 1 do
                        for slot=1, GetContainerNumSlots(container), 1 do
                                local name=ATSWInv_GetItemName(container,slot);
                                if(name) then
                                        local icon, count = GetContainerItemInfo(container, slot);
                                        ATSWBank_AddToBankList(name,count);
                                end
                        end
                end
        end
end

function ATSWBank_AddToBankList(name,count)
        if(not atsw_bankitemlist[GetRealmName()]) then
                atsw_bankitemlist[GetRealmName()]={};
        end
        if(not atsw_bankitemlist[GetRealmName()][UnitName("player")]) then
                atsw_bankitemlist[GetRealmName()][UnitName("player")]={};
        end
        if(atsw_bankitemlist[GetRealmName()][UnitName("player")][name]) then
                atsw_bankitemlist[GetRealmName()][UnitName("player")][name]=atsw_bankitemlist[GetRealmName()][UnitName("player")][name]+count;
        else
                atsw_bankitemlist[GetRealmName()][UnitName("player")][name]=count;
        end
end

function ATSWBank_GetItemCount(name)
        if(atsw_bankitemlist[GetRealmName()]) then
                if(atsw_bankitemlist[GetRealmName()][UnitName("player")]) then
                        if(atsw_bankitemlist[GetRealmName()][UnitName("player")][name]) then
                                return atsw_bankitemlist[GetRealmName()][UnitName("player")][name];
                        end     
                end
        end
        return 0;
end

-- alternative character functions

atsw_playernames={};

function ATSWAlt_GetItemCount(name)
        return ATSWAlt_GetItemCountInInventory(name)+ATSWAlt_GetItemCountInBank(name);  
end

function ATSWAlt_GetItemCountInInventory(name)
        local itemcount=0;
        if(atsw_itemlist[GetRealmName()]) then
                atsw_playernames={};
                table.foreach(atsw_itemlist[GetRealmName()],ATSWAlt_TableIterator);
                for i=1,table.getn(atsw_playernames),1 do
                        if(atsw_itemlist[GetRealmName()][atsw_playernames[i]]) then
                                if(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name]) then
                                        itemcount=itemcount+atsw_itemlist[GetRealmName()][atsw_playernames[i]][name];
                                end
                        end
                end
        end
        return itemcount;       
end

function ATSWAlt_GetItemCountInBank(name)
        local itemcount=0;
        if(atsw_bankitemlist[GetRealmName()]) then
                atsw_playernames={};
                table.foreach(atsw_bankitemlist[GetRealmName()],ATSWAlt_TableIterator);
                for i=1,table.getn(atsw_playernames),1 do
                        if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]]) then
                                if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name]) then
                                        itemcount=itemcount+atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name];
                                end
                        end
                end
        end
        return itemcount;       
end

function ATSWAlt_TableIterator(key,value)
        if(key~=UnitName("player")) then table.insert(atsw_playernames,key); end
end

function ATSWAlt_GetItemLocation(name)
        ATSW_DisplayMessage(ATSW_ALTLIST1..name..ATSW_ALTLIST2);
        if(atsw_itemlist[GetRealmName()]) then
                atsw_playernames={};
                table.foreach(atsw_itemlist[GetRealmName()],ATSWAlt_TableIterator);
                for i=1,table.getn(atsw_playernames),1 do
                        if(atsw_itemlist[GetRealmName()][atsw_playernames[i]]) then
                                if(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name]) then
                                        ATSW_DisplayMessage(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name].."x "..ATSW_ALTLIST3..atsw_playernames[i]);
                                end
                        end
                end
        end
        if(atsw_bankitemlist[GetRealmName()]) then
                atsw_playernames={};
                table.foreach(atsw_bankitemlist[GetRealmName()],ATSWAlt_TableIterator);
                for i=1,table.getn(atsw_playernames),1 do
                        if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]]) then
                                if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name]) then
                                        ATSW_DisplayMessage(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name].."x "..ATSW_ALTLIST4..atsw_playernames[i]);
                                end
                        end
                end
        end
end

-- auction functions

atsw_displayshoppinglist=true;

function ATSWAuction_ShowShoppingList()
        if(AuctionFrame:IsVisible() and table.getn(atsw_queue)>0 and atsw_displayshoppinglist) then
                ATSWShoppingListFrame:Show();
                ATSWShoppingListFrame:SetPoint("TOPLEFT","AuctionFrame","TOPLEFT",353,-436);
                ATSW_NoteNecessaryItemsForQueue();
                ATSWAuction_UpdateReagentList();
        end
end

function ATSWAuction_HideShoppingList()
        ATSWShoppingListFrame:Hide();   
end

function ATSWAuction_UpdateReagentList()
        local reagents=table.getn(atsw_necessaryitems);
        local offset=FauxScrollFrame_GetOffset(ATSWSLScrollFrame);
        for i=1,5,1 do
                local count=getglobal("ATSWSLFReagent"..i.."Count");
                local item=getglobal("ATSWSLFReagent"..i.."Item");
                local inv=getglobal("ATSWSLFReagent"..i.."Inventory");
                local bank=getglobal("ATSWSLFReagent"..i.."Bank");
                local merchant=getglobal("ATSWSLFReagent"..i.."Merchant");
                local alt=getglobal("ATSWSLFReagent"..i.."Alt");
                local missing=getglobal("ATSWSLFReagent"..i.."Missing");
                if(atsw_necessaryitems[offset+i]) then
                        local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[offset+i].name);
                        local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[offset+i].name);
                        local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[offset+i].name);
                        local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[offset+i].cnt;
                        local items_merchant=ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[offset+i].name);
                        count:SetText(atsw_necessaryitems[offset+i].cnt.."x");
                        count:Disable();
                        count:Show();
                        item:SetText("["..atsw_necessaryitems[offset+i].name.."]");
                        item.link=atsw_necessaryitems[offset+i].link;                   
                        item.itemname=atsw_necessaryitems[offset+i].name;
                        item:Show();
                        inv:SetText(items_inventory);
                        inv:Disable();
                        inv:Show();
                        if(items_inventory>=atsw_necessaryitems[offset+i].cnt) then
                                inv:SetTextColor(0,1,0);
                        else
                                inv:SetTextColor(1,0,0);
                        end
                        bank:SetText(items_bank);
                        bank:Disable();
                        bank:Show();
                        if(items_bank>=atsw_necessaryitems[offset+i].cnt) then
                                bank:SetTextColor(0,1,0);
                        else
                                bank:SetTextColor(1,0,0);
                        end
                        merchant:SetText("X");
                        merchant:Disable();
                        if(items_merchant==true) then
                                merchant:Show();
                        else
                                merchant:Hide();
                        end
                        alt:SetText(items_alt);
                        if(items_alt>0) then
                                alt:Enable();
                                alt.itemname=atsw_necessaryitems[offset+i].name;
                        else
                                alt:Disable();
                        end
                        alt:Show();
                        if(items_alt>=atsw_necessaryitems[offset+i].cnt) then
                                alt:SetTextColor(0,1,0);
                        else
                                alt:SetTextColor(1,0,0);
                        end
                        if(items_missing>=0) then
                                missing:SetText("+"..items_missing);
                                missing:SetTextColor(0,1,0);
                        else
                                missing:SetText(items_missing);
                                missing:SetTextColor(1,0,0);
                        end
                        missing:Disable();
                        missing:Show();
                else
                        count:Hide();
                        item:Hide();
                        inv:Hide();
                        bank:Hide();
                        merchant:Hide();
                        alt:Hide();
                        missing:Hide();
                end
        end
        FauxScrollFrame_Update(ATSWSLScrollFrame, reagents, 5, 5);
end

function ATSWAuction_SearchForItem(itemname)
        if(CanSendAuctionQuery()) then
                BrowseName:SetText(itemname);
                AuctionFrameBrowse_Search();
                BrowseNoResultsText:SetText(BROWSE_NO_RESULTS);
        end
end

-- merchant functions

atsw_autobuy=false;
atsw_merchantlist={};

function ATSWMerchant_InsertAutoBuyButton()
        if(table.getn(atsw_queue)==0) then return; end
        if(ATSWMerchant_Buy(true)==false) then return; end
        ATSWAutoBuyButtonFrame:Show();
        ATSWAutoBuyButtonFrame:SetPoint("TOPLEFT", "MerchantFrame", "TOPLEFT" , 60, -28);
        ATSWAutoBuyButtonFrame:SetFrameStrata("HIGH");
end

function ATSWMerchant_RemoveAutoBuyButton()
        ATSWAutoBuyButtonFrame:Hide();
end

function ATSWMerchant_ExecuteAutoBuy()
        ATSWMerchant_RemoveAutoBuyButton();
        ATSWMerchant_Buy();
end

function ATSWMerchant_UpdateMerchantList()
        if(MerchantFrame:IsVisible()) then
                local numitems=GetMerchantNumItems();
                if(numitems==148) then numitems=0; end
                for i=1,numitems,1 do
                        local itemname=ATSWMerchant_GetItemName(i);
                        if(itemname) then
                                local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(i);
                                if(numAvailable==-1) then
                                        atsw_merchantlist[itemname]=true;
                                end
                        end
                end
        end
end

function ATSWMerchant_GetItemName(slot)
        local link = GetMerchantItemLink(slot);
        if(link) then
        local _,_,name = string.find(link, "^.*%[(.*)%].*$");
        return name;
        else
        return nil;
    end
end

function ATSWMerchant_CheckIfAvailable(itemname)
        if(atsw_merchantlist[itemname]) then
                return true;
        else
                return false;
        end
end

function ATSWMerchant_AutoBuy()
        if(atsw_autobuy==true) then
                ATSWMerchant_Buy();
        end
end

function ATSWMerchant_Buy(onlyCheck)
        local needtobuy=false;
        if(table.getn(atsw_queue)>0) then
                if(MerchantFrame:IsVisible()) then
                        ATSW_NoteNecessaryItemsForQueue();
                        autobuymessage=false;
                        local numitems=GetMerchantNumItems();
                        if(numitems==148) then numitems=0; end
                        for i=1,numitems,1 do
                                local itemname=ATSWMerchant_GetItemName(i);
                                if(itemname) then
                                        for k=1,table.getn(atsw_necessaryitems),1 do
                                                if(atsw_necessaryitems[k]) then
                                                        if(atsw_necessaryitems[k].name==itemname) then
                                                                local stilltobuy=atsw_necessaryitems[k].cnt-ATSWInv_GetItemCount(itemname);
                                                                if(stilltobuy>0) then
                                                                        local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(i);
                                                                        local itemid = ATSW_GetItemID(GetMerchantItemLink(i));
                                                                        local sName, sLink, iQuality, iLevel, sType, sSubType, iCount = GetItemInfo(itemid);
                                                                        local itemstobuy=math.ceil(stilltobuy/quantity);
                                                                        if(onlyCheck==nil or onlyCheck==false) then
                                                                                if(iCount==nil) then
                                                                                        for l=1,itemstobuy,1 do
                                                                                                BuyMerchantItem(i,1);
                                                                                        end
                                                                                else
                                                                                        local fullstackstobuy=math.floor(stilltobuy/iCount);
                                                                                        local fullstackitemcount=math.floor(iCount/quantity);
                                                                                        local resttobuy=math.ceil((stilltobuy-(fullstackstobuy*iCount))/quantity);
                                                                                        if(fullstackstobuy>0) then
                                                                                                for l=1,fullstackstobuy,1 do
                                                                                                        BuyMerchantItem(i,fullstackitemcount);
                                                                                                end
                                                                                        end
                                                                                        if(resttobuy>0) then
                                                                                                BuyMerchantItem(i,resttobuy);
                                                                                        end
                                                                                end
                                                                                if(autobuymessage==false) then
                                                                                        ATSW_DisplayMessage(ATSW_AUTOBUYMESSAGE);
                                                                                        autobuymessage=true;
                                                                                end
                                                                                local totalprice=price*itemstobuy;
                                                                                local gold=math.floor(totalprice/10000);
                                                                                local silver=math.floor((totalprice-gold*10000)/100);
                                                                                local copper=math.mod(totalprice,100);
                                                                                local moneystring="";
                                                                                if(gold>0) then
                                                                                        moneystring=gold.."g "..silver.."s "..copper.."c";
                                                                                elseif(silver>0) then
                                                                                        moneystring=silver.."s "..copper.."c";
                                                                                else
                                                                                        moneystring=copper.."c";
                                                                                end
                                                                                ATSW_DisplayMessage((itemstobuy*quantity).."x "..GetMerchantItemLink(i).." ("..moneystring..")");
                                                                        else
                                                                                needtobuy=true;
                                                                        end
                                                                end
                                                        end
                                                end
                                        end
                                end
                        end
                end
        end
        return needtobuy;
end

-- general utility functions

function ATSW_DisplayMessage(msg)
        DEFAULT_CHAT_FRAME:AddMessage(msg);
end

function ATSW_HexToDec(hex)
        hex=string.upper(hex);
        local total=0;
        for i=1,string.len(hex),1 do
                local char=string.byte(hex,i);
                local numeric;
                if(char>64) then
                        numeric=char-55;
                else
                        numeric=char-48;
                end
                total=total+numeric*math.pow(16,string.len(hex)-i);
        end
        return total;
end

function ATSW_GetItemID(link)
        if(link) then
                local _,_,id = string.find(link, "^.*|Hitem:(%d*):.*%[.*%].*$");
                return id;
        else
                return nil;
        end
end

function ATSW_Round(number,decimals)
        return math.floor((number*math.pow(10,decimals)+0.5))/math.pow(10,decimals);
end

Generated by GNU Enscript 1.6.5.90.