vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
------------------------------------------------------
-- AdSpace.lua
------------------------------------------------------
FAS_VERSION = "11200.2";
------------------------------------------------------

FAS_SPECIAL_VENDOR_COLOR = {r=1.0, g=0.5, b=0.25};
FAS_INDENT = "  ";

FAS_AllClasses = { "PALADIN", "SHAMAN", "MAGE", "PRIEST", "WARLOCK", "WARRIOR", "HUNTER", "ROGUE", "DRUID", "ANY" };

-- Configuration
FAS_Config = { };

FAS_Config_Default = { };
FAS_Config_Default.ShowCost = false;
FAS_Config_Default.PostToRaid = true;

FAS_Config_Default.Recipes = true;
FAS_Config_Default.Librams = true;
FAS_Config_Default.Darkmoon = true;
FAS_Config_Default.AD = true;
FAS_Config_Default.ZG = true;
FAS_Config_Default.AQ20 = true;
FAS_Config_Default.AQ40 = true;

FAS_OptionsText = {
        ["Recipes"] = FAS_OPTION_RECIPES,
        ["ShowCost"] = FAS_OPTION_RECIPE_COST,
        ["Librams"] = FAS_OPTION_LIBRAM,
        ["Darkmoon"] = FAS_OPTION_DARKMOON,
        ["AD"] = FAS_OPTION_AD,
        ["ZG"] = FAS_OPTION_ZG.." "..GFWUtils.Gray(FAS_OPTION_ZG_FACTION),
        ["AQ20"] = FAS_OPTION_AQ20.." "..GFWUtils.Gray(FAS_OPTION_AQ20_FACTION),
        ["AQ40"] = FAS_OPTION_AQ40.." "..GFWUtils.Gray(FAS_OPTION_AQ40_FACTION),
        ["PostToRaid"] = FAS_OPTION_POST_RAID,
};

local function FAS_Tooltip_Hook(frame, name, link, source)
        
        if (link) then
                local _, _, itemID  = string.find(link, "item:(%d+):%d+:%d+:%d+");
                itemID = tonumber(itemID);
                local itemInfo = FAS_ItemInfo[itemID];

                if (FAS_Config.Recipes and itemInfo) then
                        if (source == "MERCHANT") then
                                return false; -- kinda silly to show merchants who sell this when we're seeing this at a merchant
                        end
                        local myFaction = UnitFactionGroup("player");
                        local vendors = GFWTable.Merge(FAS_VendorInfo[myFaction][itemID], FAS_VendorInfo["Neutral"][itemID]);
                        local note = itemInfo.note;
                        
                        local color;
                        local intro;
                        if (note) then
                                color = FAS_SPECIAL_VENDOR_COLOR;
                        else
                                color = GFW_FONT_COLOR;
                        end
                        if (FAS_Config.ShowCost) then
                                intro = string.format(SOLD_FOR_PRICE_BY, GFWUtils.TextGSC(itemInfo.b));
                        else
                                intro = SOLD_BY;
                        end
                                        
                        if (table.getn(vendors) > 1) then
                                frame:AddLine(intro..":", color.r, color.g, color.b);
                                for i, aVendor in vendors do
                                        local vendorLoc = FAS_VendorLocations[aVendor];
                                        if (vendorLoc) then
                                                local vendorName = FAS_Localized[aVendor] or aVendor;
                                                local vendorLocation = FAS_Localized[vendorLoc] or vendorLoc;
                                                frame:AddLine(FAS_INDENT..string.format(VENDOR_LOCATION_FORMAT, vendorName, vendorLocation), color.r, color.g, color.b);
                                        else
                                                GFWUtils.PrintOnce(GFWUtils.Red("AdSpace "..FAS_VERSION.." error: ").."Can't find location for "..aVendor..". Please report to gazmik@fizzwidget.com.", 60);
                                                return false;
                                        end
                                end
                        elseif (table.getn(vendors) == 1) then
                                local vendorLoc = FAS_VendorLocations[vendors[1]];
                                if (vendorLoc) then
                                        local vendorName = FAS_Localized[vendors[1]] or vendors[1];
                                        local vendorLocation = FAS_Localized[vendorLoc] or vendorLoc;
                                        frame:AddLine(intro.." "..string.format(VENDOR_LOCATION_FORMAT, vendorName, vendorLocation), color.r, color.g, color.b);
                                else
                                        GFWUtils.PrintOnce(GFWUtils.Red("AdSpace "..FAS_VERSION.." error: ").."Can't find location for "..vendorName..". Please report to gazmik@fizzwidget.com.", 60);
                                        return false;
                                end
                        else
                                local found = false;
                                for _, faction in {"Alliance", "Horde", "Neutral"} do
                                        if (FAS_VendorInfo[faction][itemID]) then
                                                found = true;
                                        end
                                end
                                if not (found) then
                                        GFWUtils.PrintOnce(GFWUtils.Red("AdSpace "..FAS_VERSION.." error: ")..link.."("..itemID..") is listed but has no vendors. Please report to gazmik@fizzwidget.com.", 60);
                                        return false;
                                end
                        end
                        if (note ~= "") then
                                frame:AddLine(note, color.r, color.g, color.b);
                        end
                        return true;
                end
                
                local libramInfo = FAS_LibramInfo[itemID];
                if (FAS_Config.Librams and libramInfo) then
                        local color = FAS_SPECIAL_VENDOR_COLOR;
                        local returnToName = FAS_Localized[libramInfo.name] or libramInfo.name;
                        local returnToLocation = FAS_Localized[FAS_VendorLocations[libramInfo.name]] or FAS_VendorLocations[libramInfo.name];
                        local bonus = FAS_Localized[libramInfo.bonus] or libramInfo.bonus;
                        frame:AddLine(RETURN_TO.." "..string.format(VENDOR_LOCATION_FORMAT, returnToName, returnToLocation), color.r, color.g, color.b);
                        frame:AddLine(string.format(ARCANUM_FORMAT, bonus), color.r, color.g, color.b);
                        return true;
                end

                local darkmoonInfo = FAS_DarkmoonInfo[itemID];
                if (FAS_Config.Darkmoon and darkmoonInfo) then
                        local color = FAS_SPECIAL_VENDOR_COLOR;
                        frame:AddLine(darkmoonInfo, color.r, color.g, color.b);
                        return true;
                end

                local tokenInfo = FAS_TokenInfo[itemID];
                if ((FAS_Config.ZG or FAS_Config.AQ20 or FAS_Config.AQ40) and  tokenInfo) then
                        local color = FAS_SPECIAL_VENDOR_COLOR;
                        local addedLines;
                        for _, faction in FAS_TokenFactions do
                                local _, _, factionAbbrev = string.find(faction, "(.-)_FACTION");
                                if (FAS_Config[factionAbbrev]) then
                                        local reportLines = {};
                                        for _, class in FAS_AllClasses do
                                                if (not (class == "SHAMAN" and UnitFactionGroup("player") == "Alliance") and 
                                                    not (class == "PALADIN" and UnitFactionGroup("player") == "Horde")) then
                                                        for _, rewardID in tokenInfo do
                                                                local reward = FAS_TokenRewards[rewardID];
                                                                if (reward and reward.class == class and reward.faction == faction) then
                                                                        local repNeeded;
                                                                        if (reward.rep) then
                                                                                repNeeded = getglobal("FACTION_STANDING_LABEL"..reward.rep);
                                                                        end
                                                                        local reportLine = "";
                                                                        reportLine = reportLine .. reward.type;
                                                                        if (repNeeded) then
                                                                                reportLine = reportLine .. " ("..repNeeded..")";
                                                                        end
                                                                        reportLine = reportLine .. ", ";
                                                                        if (reportLines[class]) then
                                                                                reportLines[class] = reportLines[class] .. reportLine;
                                                                        else
                                                                                reportLines[class] = reportLine;
                                                                        end
                                                                end
                                                        end
                                                        if (reportLines[class]) then
                                                                reportLines[class] = string.gsub(reportLines[class], ", $", "");
                                                        end
                                                end
                                        end
                                        if (GFWTable.Count(reportLines) > 0) then
                                                frame:AddLine(string.format(FAS_FACTION_REWARDS, getglobal(faction)), color.r, color.g, color.b);
                                                addedLines = true;
                                                for class, reportLine in reportLines do
                                                        frame:AddLine("  "..getglobal(class)..": "..reportLine, color.r, color.g, color.b);
                                                end
                                        end
                                end
                        end
                        if (addedLines) then
                                return true;
                        end
                end

                for key, tokenSetList in FAS_FactionTokenSets do
                        if (FAS_Config[key]) then
                                for _, coinSet in tokenSetList do
                                        local found;
                                        local otherCoins = {};
                                        for _, coinID in coinSet do
                                                if (itemID == coinID) then
                                                        found = true;
                                                else
                                                        local itemText = FAS_TokenNames[coinID];
                                                        itemText = FAS_Localized[itemText] or itemText;
                                                        table.insert(otherCoins, itemText);
                                                end
                                        end
                                        if (found) then
                                                local color = FAS_SPECIAL_VENDOR_COLOR;
                                                frame:AddLine(FAS_TURNIN.." "..getglobal(key.."_FACTION"), color.r, color.g, color.b);
                                                if (table.getn(otherCoins) > 0) then
                                                        frame:AddDoubleLine(" ", FAS_WITH.." "..table.concat(otherCoins, ", "), color.r, color.g, color.b, color.r, color.g, color.b);
                                                end
                                                return true;
                                        end
                                end
                        end
                end
        end
        
end

function FAS_OnLoad()

        -- Register Slash Commands
        SLASH_FAS1 = "/adspace";
        SLASH_FAS2 = "/ads";
        SlashCmdList["FAS"] = function(msg)
                FAS_ChatCommandHandler(msg);
        end
        
        -- Register for Events
        this:RegisterEvent("ADDON_LOADED");

        GFWTooltip_AddCallback("GFW_AdSpace", FAS_Tooltip_Hook);

        table.insert(UISpecialFrames,"FAS_OptionsFrame");       

        GFWUtils.Print("Fizzwidget AdSpace "..FAS_VERSION.." initialized!");
end

function FAS_OnEvent(event, arg1)

        -- Save Variables
        if ( event == "ADDON_LOADED" ) then
                if (FAS_Config.Tooltip) then
                        for key, value in FAS_Config_Default do
                                if (FAS_Config[key] == nil) then
                                        FAS_Config[key] = FAS_Config_Default[key];
                                end
                        end
                        FAS_Config.Tooltip = nil;
                end
                this:UnregisterEvent("ADDON_LOADED");
        end
end

function FAS_ChatCommandHandler(msg)

        if ( msg == "" ) then
                if FAS_OptionsFrame:IsVisible() then
                        HideUIPanel(FAS_OptionsFrame);
                else
                        ShowUIPanel(FAS_OptionsFrame);
                end
                return;
        end

        -- Print Help
        if ( msg == "help" ) or ( msg == "" ) then
                GFWUtils.Print("Fizzwidget AdSpace "..FAS_VERSION..":");
                GFWUtils.Print("/adspace (or /ads)");
                GFWUtils.Print("- "..GFWUtils.Hilite("help").." - Print this helplist.");
                GFWUtils.Print("- "..GFWUtils.Hilite("[item link]").." - Show info for an item in the chat window.");
                GFWUtils.Print("- "..GFWUtils.Hilite("status").." - Check current settings.");
                GFWUtils.Print("- "..GFWUtils.Hilite("recipes on").." | "..GFWUtils.Hilite("off").." - Show info for vendor-supplied recipes in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("showcost on").." | "..GFWUtils.Hilite("off").." - Also show vendor prices for recipes.");
                GFWUtils.Print("- "..GFWUtils.Hilite("librams on").." | "..GFWUtils.Hilite("off").." - Show info for librams in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("darkmoon on").." | "..GFWUtils.Hilite("off").." - Show info for Darkmoon Faire grey item turn-ins in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("zg on").." | "..GFWUtils.Hilite("off").." - Show info for for special raid loot from Zul'Gurub (Zandalar Tribe rewards) in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("aq20 on").." | "..GFWUtils.Hilite("off").." - Show info for for special raid loot from Ruins of Ahn'Qiraj (Cenarion Circle rewards) in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("aq40 on").." | "..GFWUtils.Hilite("off").." - Show info for for special raid loot from Ahn'Qiraj (Brood of Nozdormu rewards) in tooltips.");
                GFWUtils.Print("- "..GFWUtils.Hilite("post on").." | "..GFWUtils.Hilite("off").." - Post to raid/party chat when getting raid loot info via "..GFWUtils.Hilite("/ads [item link]")..".");
                return;
        end
        
        if (msg == "version") then
                GFWUtils.Print("Fizzwidget AdSpace "..FAS_VERSION);
                return;
        end
        
        if ( msg == "status" ) then
                local gotSomething;
                if (FAS_Config.Recipes) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("vendor-supplied recipes").." in tooltips.");
                        gotSomething = 1;
                        if (FAS_Config.ShowCost) then
                                GFWUtils.Print("Also showing vendor price for recipes.");
                        end
                end
                if (FAS_Config.Librams) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Librams").." in tooltips.");
                        gotSomething = 1;
                end
                if (FAS_Config.Darkmoon) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Darkmoon Faire grey item turn-ins").." in tooltips.");
                        gotSomething = 1;
                end
                if (FAS_Config.ZG) then
                        GFWUtils.Print("Showing info for special raid loot from "..GFWUtils.Hilite("Zul'Gurub (Zandalar Tribe rewards)").." in tooltips.");
                        gotSomething = 1;
                end
                if (FAS_Config.AQ20) then
                        GFWUtils.Print("Showing info for special raid loot from "..GFWUtils.Hilite("Ruins of Ahn'Qiraj (AQ20 Cenarion Circle rewards)").." in tooltips.");
                        gotSomething = 1;
                end
                if (FAS_Config.AQ40) then
                        GFWUtils.Print("Showing info for special raid loot from "..GFWUtils.Hilite("Ahn'Qiraj (AQ40 Brood of Nozdormu rewards)").." in tooltips.");
                        gotSomething = 1;
                end
                if ((FAS_Config.ZG or FAS_Config.AQ20 or FAS_Config.AQ40) and FAS_Config.PostToRaid) then
                        GFWUtils.Print("Will post to raid/party chat when showing info for raid loot via "..GFWUtils.Hilite("/ads [link]")..".");
                end
                if (not gotSomething) then
                        GFWUtils.Print("Not adding any info to tooltips.");
                end
                return;
        end
        
        if (msg == "test") then
                local itemInfoCount = 0;
                for itemID in FAS_ItemInfo do
                        local found = false;
                        for _, faction in {"Alliance", "Horde", "Neutral"} do
                                if (FAS_VendorInfo[faction][itemID]) then
                                        found = true;
                                end
                        end
                        if not (found) then
                                GFWUtils.Print("Item ID "..itemID.." not found in FAS_VendorInfo.");
                        end
                        itemInfoCount = itemInfoCount + 1;
                end
                GFWUtils.Print(itemInfoCount.." entries in FAS_ItemInfo.");
                for _, faction in {"Alliance", "Horde", "Neutral"} do
                        local vendorInfoCount = 0;
                        for itemID in FAS_VendorInfo[faction] do
                                if (FAS_ItemInfo[itemID] == nil) then
                                        GFWUtils.Print("Item ID "..itemID.." not found in FAS_ItemInfo.");
                                end
                                vendorInfoCount = vendorInfoCount + 1;
                        end
                        GFWUtils.Print(vendorInfoCount.." entries in FAS_VendorInfo["..faction.."].");
                end
                return;
        end

        local _, _, cmd, args = string.find(msg, "^([%l%d']+) *(.*)");
        if (cmd) then cmd = string.lower(cmd); end
        
        if (cmd == "recipes" or cmd == "recipe") then
                if (args == "on") then
                        FAS_Config.Recipes = true;
                elseif (args == "off") then
                        FAS_Config.Recipes = nil;
                else
                        FAS_Config.Recipes = not FAS_Config.Recipes;
                end
                if (FAS_Config.Recipes) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("vendor-supplied recipes").." in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for "..GFWUtils.Hilite("vendor-supplied recipes").." in tooltips.");
                end
                return;
        end
        if (cmd == "showcost" or cmd == "cost") then
                if (args == "on") then
                        FAS_Config.ShowCost = true;
                elseif (args == "off") then
                        FAS_Config.ShowCost = nil;
                else
                        FAS_Config.ShowCost = not FAS_Config.ShowCost;
                end
                if (FAS_Config.ShowCost) then
                        GFWUtils.Print("Also showing vendor price for recipes.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing vendor price for recipes.");
                end
                return;
        end
        if (cmd == "librams" or cmd == "libram") then
                if (args == "on") then
                        FAS_Config.Librams = true;
                elseif (args == "off") then
                        FAS_Config.Librams = nil;
                else
                        FAS_Config.Librams = not FAS_Config.Librams;
                end
                if (FAS_Config.Librams) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Librams").." in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for "..GFWUtils.Hilite("Librams").." in tooltips.");
                end
                return;
        end
        if (cmd == "darkmoon") then
                if (args == "on") then
                        FAS_Config.Darkmoon = true;
                elseif (args == "off") then
                        FAS_Config.Darkmoon = nil;
                else
                        FAS_Config.Darkmoon = not FAS_Config.Darkmoon;
                end
                if (FAS_Config.Darkmoon) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Darkmoon Faire grey item turn-ins").." in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for "..GFWUtils.Hilite("Darkmoon Faire grey item turn-ins").." in tooltips.");
                end
                return;
        end
        if (cmd == "zg" or cmd == "zul'gurub" or cmd == "zulgurub" or cmd == "zandalar") then
                if (args == "on") then
                        FAS_Config.ZG = true;
                elseif (args == "off") then
                        FAS_Config.ZG = nil;
                else
                        FAS_Config.ZG = not FAS_Config.ZG;
                end
                if (FAS_Config.ZG) then
                        GFWUtils.Print("Showing info for special raid loot from"..GFWUtils.Hilite("Zul'Gurub (Zandalar Tribe rewards)").." in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for special raid loot from"..GFWUtils.Hilite("Zul'Gurub (Zandalar Tribe rewards)").." in tooltips.");
                end
                return;
        end
        if (cmd == "aq20" or cmd == "cenarion") then
                if (args == "on") then
                        FAS_Config.AQ20 = true;
                elseif (args == "off") then
                        FAS_Config.AQ20 = nil;
                else
                        FAS_Config.AQ20 = not FAS_Config.AQ20;
                end
                if (FAS_Config.AQ20) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Ruins of Ahn'Qiraj (AQ20)").." special raid loot in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for "..GFWUtils.Hilite("Ruins of Ahn'Qiraj (AQ20)").." special raid loot in tooltips.");
                end
                return;
        end
        if (cmd == "aq40" or cmd == "brood" or cmd == "nozdormu") then
                if (args == "on") then
                        FAS_Config.AQ40 = true;
                elseif (args == "off") then
                        FAS_Config.AQ40 = nil;
                else
                        FAS_Config.AQ40 = not FAS_Config.AQ40;
                end
                if (FAS_Config.AQ40) then
                        GFWUtils.Print("Showing info for "..GFWUtils.Hilite("Ahn'Qiraj (AQ40)").." special raid loot in tooltips.");
                else
                        GFWUtils.Print(GFWUtils.Red("Not").."showing info for "..GFWUtils.Hilite("Ahn'Qiraj (AQ40)").." special raid loot in tooltips.");
                end
                return;
        end
        if (cmd == "post" or cmd == "raid" or cmd == "party") then
                if (args == "on") then
                        FAS_Config.PostToRaid = true;
                elseif (args == "off") then
                        FAS_Config.PostToRaid = nil;
                else
                        FAS_Config.PostToRaid = not FAS_Config.PostToRaid;
                end
                if (FAS_Config.PostToRaid) then
                        GFWUtils.Print("Will post to raid/party chat when getting info for raid loot via "..GFWUtils.Hilite("/ads [link]")".");
                else
                        GFWUtils.Print("Will only print to chat window when getting info for raid loot via "..GFWUtils.Hilite("/ads [link]")".");
                end
                return;
        end
        
        if (args == nil or args == "") then
                args = msg;
        end
        local postedText;
        for itemLink in string.gfind(args, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[.-%]|h|r") do
                postedText = nil;
                local _, _, itemID  = string.find(itemLink, "|c%x+|Hitem:(%d+):%d+:%d+:%d+|h%[.-%]|h|r");
                if (itemID == nil or itemID == "") then
                        GFWUtils.Print("Usage: "..GFWUtils.Hilite("/ads info <item link>"));
                        return;
                end
                itemID = tonumber(itemID);
                
                local itemInfo = FAS_ItemInfo[itemID];
                if (itemInfo) then
                        local myFaction = UnitFactionGroup("player");
                        local vendors = GFWTable.Merge(FAS_VendorInfo[myFaction][itemID], FAS_VendorInfo["Neutral"][itemID]);
                        local note = itemInfo.note;
                        local intro = itemLink..": "..string.format(SOLD_FOR_PRICE_BY, GFWUtils.TextGSC(itemInfo.b));

                        if (vendors == nil or vendors == {}) then
                                GFWUtils.Print(GFWUtils.Red("AdSpace "..FAS_VERSION.." error: ")..itemLink.."("..itemID..") is listed but has no vendors. Please report to gazmik@fizzwidget.com.");
                                return;
                        end
                        GFWUtils.Print(intro);
                        for i, aVendor in vendors do
                                local vendorName = FAS_Localized[aVendor] or aVendor;
                                local vendorLocation = FAS_Localized[FAS_VendorLocations[aVendor]] or FAS_VendorLocations[aVendor];
                                GFWUtils.Print(string.format(VENDOR_LOCATION_FORMAT, vendorName, vendorLocation));
                        end
                        if (note and note ~= "") then
                                GFWUtils.Print(GFWUtils.Hilite(note));
                        end
                        postedText = 1;
                end
                
                local libramInfo = FAS_LibramInfo[itemID];
                if (libramInfo) then
                        local returnToName = FAS_Localized[libramInfo.name] or libramInfo.name;
                        local returnToLocation = FAS_Localized[FAS_VendorLocations[libramInfo.name]] or FAS_VendorLocations[libramInfo.name];
                        local bonus = FAS_Localized[libramInfo.bonus] or libramInfo.bonus;
                        GFWUtils.Print(itemLink..": "..RETURN_TO.." "..string.format(VENDOR_LOCATION_FORMAT, returnToName, returnToLocation));
                        GFWUtils.Print(bonus);
                        postedText = 1;
                end
                
                local darkmoonInfo = FAS_DarkmoonInfo[itemID];
                if (darkmoonInfo) then
                        GFWUtils.Print(itemLink..": "..darkmoonInfo);
                        postedText = 1;
                end

                local tokenInfo = FAS_TokenInfo[itemID];
                if (tokenInfo) then
                        for _, faction in FAS_TokenFactions do
                                local reportLines = {};
                                for _, class in FAS_AllClasses do
                                        for _, rewardID in tokenInfo do
                                                local reward = FAS_TokenRewards[rewardID];
                                                if (reward and reward.class == class and reward.faction == faction) then
                                                        local link = GFWUtils.ItemLink(rewardID);
                                                        local repNeeded;
                                                        if (reward.rep) then
                                                                repNeeded = getglobal("FACTION_STANDING_LABEL"..reward.rep);
                                                        end
                                                        local reportLine = "";
                                                        if (link) then
                                                                reportLine = reportLine .. link .. " - ";
                                                        end
                                                        reportLine = reportLine .. reward.type;
                                                        if (repNeeded) then
                                                                reportLine = reportLine .. " ("..repNeeded..")";
                                                        end
                                                        reportLine = reportLine .. ", ";
                                                        if (reportLines[class]) then
                                                                reportLines[class] = reportLines[class] .. reportLine;
                                                        else
                                                                reportLines[class] = reportLine;
                                                        end
                                                end
                                        end
                                        if (reportLines[class]) then
                                                reportLines[class] = string.gsub(reportLines[class], ", $", "");
                                        end
                                end
                                if (GFWTable.Count(reportLines) > 0) then
                                        local _, _, factionAbbrev = string.find(faction, "(.-)_FACTION");
                                        postedText = 1;
                                        if (FAS_Config[factionAbbrev]) then
                                                FAS_Post(itemLink..": "..string.format(FAS_FACTION_REWARDS, getglobal(faction)));
                                                for class, reportLine in reportLines do
                                                        FAS_Post("   "..getglobal(class)..": "..reportLine);
                                                end
                                        else
                                                FAS_Post(itemLink..": "..string.format(FAS_FACTION_REWARDS_COUNT, GFWTable.Count(reportLines), getglobal(faction)));
                                        end
                                end
                        end
                end

                local rewardInfo = FAS_TokenRewards[itemID];
                if (rewardInfo) then
                        local link = GFWUtils.ItemLink(itemID);
                        FAS_Post(link..": "..string.format(ITEM_REQ_REPUTATION, getglobal(rewardInfo.faction), getglobal("FACTION_STANDING_LABEL"..rewardInfo.rep)));
                        local reportLines = {};
                        for tokenID, rewards in FAS_TokenInfo do
                                if (GFWTable.KeyOf(rewards, itemID)) then
                                        local itemText = GFWUtils.ItemLink(tokenID);
                                        local itemQuality = FAS_TokenQuality[tokenID];
                                        if (itemText == nil) then
                                                itemText = FAS_TokenNames[tokenID];
                                                itemText = FAS_Localized[itemText] or itemText;
                                                local _, _, _, color = GetItemQualityColor(math.floor(itemQuality));
                                                itemText = color..itemText..FONT_COLOR_CODE_CLOSE;
                                        end
                                        if (rewardInfo == ENSCRIBE) then
                                                -- ZG enchants take 1 each of any reagent
                                                itemText = "1 x "..itemText;
                                        else
                                                -- other token quests take 1 epic only, or 5 of one green + 5 another green + 2 blue + 1 "special"
                                                if (itemQuality == 2) then
                                                        itemText = "5 x "..itemText;
                                                elseif (itemQuality == 3) then
                                                        itemText = "2 x "..itemText;                                    
                                                else
                                                        itemText = "1 x "..itemText;
                                                end
                                        end
                                        table.insert(reportLines, itemText);
                                end
                        end
                        table.sort(reportLines);
                        for _, line in reportLines do
                                FAS_Post(line);
                        end     
                        postedText = 1;
                end
                
                if (not postedText) then
                        GFWUtils.Print("Nothing known about "..itemLink..".");
                end
        end
        if (postedText) then
                return;
        end
        -- if we made it down here, there were args we didn't understand... time to remind the user what to do.
        FAS_ChatCommandHandler("help");

end

function FAS_StripColor(text)
        if (string.find(text, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[.-%]|h|r")) then
                return text;
        else
                return string.gsub(text, "|c"..string.rep("%x", 8).."(.-)|r", "%1");
        end
end

function FAS_Post(msg)
        if (FAS_Config.PostToRaid and GetNumRaidMembers() > 0) then
                msg = FAS_StripColor(msg);
                SendChatMessage(msg, "RAID");   
        elseif (FAS_Config.PostToRaid and GetNumPartyMembers() > 0) then
                msg = FAS_StripColor(msg);
                SendChatMessage(msg, "PARTY");  
        else
                GFWUtils.Print(msg);
        end
end

function FAS_CheckMerchant(itemID)
        for merchantIndex = 1, GetMerchantNumItems() do
                local link = GetMerchantItemLink(merchantIndex);
                local _, _, merchantItemID  = string.find(link, "item:(%d+):%d+:%d+:%d+");
                if (tonumber(merchantItemID) == itemID) then
                        return true;
                end
        end
        return false;
end

function FAS_OptionsShow()

        FAS_VersionText:SetText("v. "..FAS_VERSION);

        for option, description in FAS_OptionsText do
                local button = getglobal("FAS_OptionsButton_"..option);
                local text = getglobal("FAS_OptionsButton_"..option.."Text");
                
                if (button and text) then
                        button:SetChecked(FAS_Config[option]);
                        text:SetText(description);
                end
        end
        
end

function FAS_OptionsClick()
        local button = this:GetName();
        local option = string.gsub(button, "FAS_OptionsButton_", "");
        FAS_Config[option] = this:GetChecked();
end

-- private, for building localization tables
function FAS_Translate(langCode)

        tempTranslations = {};
        
        local localizedVendorInfo = getglobal("FAS_VendorInfo_"..langCode);
        local localizedVendorLocations = getglobal("FAS_VendorLocations_"..langCode);
        for faction, factionVendorList in FAS_VendorInfo do
                for itemID, vendorList in factionVendorList do
                        local localizedVendors = localizedVendorInfo[faction][itemID];
                        if (localizedVendors and type(localizedVendors) == "table") then
                                for index, name in vendorList do
                                        local localizedName = localizedVendors[index];
                                        
                                        if (localizedName == nil) then break; end
                                        
                                        if (localizedName ~= name) then
                                                if (tempTranslations[name] == nil) then
                                                        tempTranslations[name] = {};
                                                end
                                                table.insert(tempTranslations[name], localizedName);
                                        end
                                        
                                        local location = FAS_VendorLocations[name];
                                        local localizedLocation = localizedVendorLocations[localizedName];
                                        if (localizedLocation and localizedLocation ~= location) then
                                                if (tempTranslations[location] == nil) then
                                                        tempTranslations[location] = {};
                                                end
                                                table.insert(tempTranslations[location], localizedLocation);
                                        end
                                end
                        end
                end
        end
        
        local localizedLibramInfo = getglobal("FAS_LibramInfo_"..langCode);
        for itemID, libramInfo in FAS_LibramInfo do
                local localizedInfo = localizedLibramInfo[itemID];
                if (localizedInfo and type(localizedInfo) == "table") then
                                        
                        if (localizedInfo.name ~= libramInfo.name) then
                                if (tempTranslations[libramInfo.name] == nil) then
                                        tempTranslations[libramInfo.name] = {};
                                end
                                table.insert(tempTranslations[libramInfo.name], localizedInfo.name);
                        end
                        if (localizedInfo.bonus ~= libramInfo.bonus) then
                                if (tempTranslations[libramInfo.bonus] == nil) then
                                        tempTranslations[libramInfo.bonus] = {};
                                end
                                table.insert(tempTranslations[libramInfo.bonus], localizedInfo.bonus);
                        end
                        
                        local location = FAS_VendorLocations[libramInfo.name];
                        local localizedLocation = localizedVendorLocations[localizedInfo.name];
                        if (localizedLocation and localizedLocation ~= location) then
                                if (tempTranslations[location] == nil) then
                                        tempTranslations[location] = {};
                                end
                                table.insert(tempTranslations[location], localizedLocation);
                        end
                end
        end
        
        FAS_Config[langCode] = {};
        for baseString, translations in tempTranslations do
                if (table.getn(translations) == 1) then
                        FAS_Config[langCode][baseString] = translations[1];
                else
                        local mergedTranslations = {}
                        for _, translation in translations do
                                if (GFWTable.KeyOf(mergedTranslations, translation) == nil) then
                                        table.insert(mergedTranslations, translation);
                                end
                        end
                        if (table.getn(mergedTranslations) == 1) then
                                FAS_Config[langCode][baseString] = mergedTranslations[1];
                        else
                                FAS_Config[langCode][baseString] = mergedTranslations;
                        end
                end
        end

end