vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- version
TITAN_GUILD_VERSION = "3.41";
--[[

        Titan Panel [Guild]: A simple guild list for the Titan Panel AddOn.
                copyright 2005 by chicogrande (jluzier@gmail.com)
                
        - Lists online guild members in a tooltip, green rank text indicating an officer
        - Menu shows names of online members, with click to /whisper functionality. Green text = officer
        - Menu has options to /guild chat and /officer chat
        - Menu has option to toggle Show offline members, which changes this setting in your Social frame, Guild tab
        - Advanced menus to /w, /invite, /friend or /who guild members
        - Shows default messages if the player is not a member of a guild
        - Updates the guild listing every 5 minutes to accomodate the GuildRoster() delay. The update only takes place if
          the player is 'idle' and not accessing conflicting UI frames or Titan elements
        - Tooltip and right-click menu content is sortable using the Sort menu option, works like the guild frame
        - Colors rank names (Advanced) or player names (Simple) based on rank index
        - To save space, player can turn off menu options
        - Filtering on a level range and zone, as it relates to the player
        - Filtering on a single class in the player's faction
        - Paging of simple and advanced right-click menu contents to deal with large-guild issues
]]

----------------------------------------------------------------------
--  Local variables
----------------------------------------------------------------------
TITAN_GUILD_ID = "Guild";
-- attempting to update every 300 seconds
TITAN_GUILD_FREQUENCY = 300;
-- the guild tab #
TITAN_GUILD_TAB_NUMBER = 3;
-- function used to hide options
TITAN_GUILD_BUTTON_SHOWOPTIONS = "TitanPanelGuildButton_ToggleShowMenuOptions";
TITAN_GUILD_BUTTON_CLOSEMENU = "TitanPanelGuildButton_CloseMenu";
TITAN_GUILD_BUTTON_COMPUTEPAGES = "TitanPanelGuildButton_ComputePages";
TITAN_GUILD_BUTTON_FORWARDPAGE = "TitanPanelGuildButton_PageForward";
TITAN_GUILD_BUTTON_BACKWARDPAGE = "TitanPanelGuildButton_PageBackward";

-- threshold for leaf level items in right-click menu
TITAN_GUILD_LIST_THRESHOLD = 15;
TITAN_GUILD_TOOLTIP_THRESHOLD = 26;

-- my internal timer used to keep track of when to run GuildRoster()
guild_TimeCounter = 0;
-- tables used to build the rank based right-click messaging menu
masterTable = {};
masterTableSimple = {};
-- level range for filtering on level +/- TITAN_GUILD_LEVEL_RANGE
TITAN_GUILD_LEVEL_RANGE = 5;

-- paging vars
currIndex = 1;
maxIndex = TITAN_GUILD_LIST_THRESHOLD;
numGuildOnline = 0;
numGuildOnlineFiltered = 0;
numPages = 0;
currPage = 1;
pagingRemainder = 0;
priorAdvMenuValue = TITAN_NIL;
TitanGuildFirstCycle = true;

----------------------------------------------------------------------
--  TitanPanelGuildButton_OnLoad()
----------------------------------------------------------------------
function TitanPanelGuildButton_OnLoad()
        if( DEFAULT_CHAT_FRAME ) then
                DEFAULT_CHAT_FRAME:AddMessage("Titan Panel [Guild] v"..TITAN_GUILD_VERSION.." loaded");
        end
        -- init guild_TimeCounter
        guild_TimeCounter = 0;
        masterTable = {};
        masterTableSimple = {};
        --TitanPanelGuildButton_ListInitMaster();
        this.registry = { 
                id = TITAN_GUILD_ID,
                version = TITAN_GUILD_VERSION,
                menuText = TITAN_GUILD_MENU_TEXT, 
                buttonTextFunction = "TitanPanelGuildButton_GetButtonText",
                tooltipTitle = TITAN_GUILD_TOOLTIP,
                tooltipTextFunction = "TitanPanelGuildButton_GetTooltipText",
                icon = "Interface\\PetitionFrame\\GuildCharter-Icon.blp",       
                iconWidth = 16,
                savedVariables = {
                        ShowLabelText = 1,
                        ShowIcon = 1,
                        ShowAdvancedMenus = 0,
                        ShowMenuOptions = 1,
                        ShowTooltipName = 1,
                        ShowTooltipZone = 1,
                        ShowTooltipRank = 1,
                        ShowTooltipNote = TITAN_NIL,
                        ShowTooltipLevel = 1,
                        ShowTooltipClass = 1,
                        FilterMyLevel = TITAN_NIL,
                        FilterMyZone = TITAN_NIL,
                        FilterClasses = TITAN_NIL,
                        SortByValue = TITAN_NIL,
                        DisableRosterUpdates = TITAN_NIL,
                        DisableMouseOverUpdates = 1,
                        RosterUpdateTime = TITAN_GUILD_FREQUENCY,
                }
        };
        this:RegisterEvent("GUILD_ROSTER_SHOW");
        this:RegisterEvent("GUILD_ROSTER_UPDATE");
        this:RegisterEvent("GUILD_REGISTRAR_SHOW");
        this:RegisterEvent("GUILD_REGISTRAR_CLOSED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("SYSMSG");   
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_OnEvent()
--  traps and deals with GUILD_ROSTER_SHOW and GUILD_ROSTER_UPDATE
----------------------------------------------------------------------
function TitanPanelGuildButton_OnEvent()
        -- hide the FriendsFrame by capturing the GUILD_ROSTER_SHOW event       
        if (event == "PLAYER_ENTERING_WORLD") then
                --guildPrintDebugMessage(event);
                if (IsInGuild()) then                   
                        FriendsFrame:UnregisterEvent("GUILD_ROSTER_UPDATE");
                        GuildRoster();
                        FriendsFrame:RegisterEvent("GUILD_ROSTER_UPDATE");
                end
        elseif (event == "GUILD_ROSTER_SHOW") then
                --guildPrintDebugMessage(event);
                -- build the table used to generate the right-click menus
                TitanPanelGuildButton_ListInitMaster();
        elseif (event == "GUILD_ROSTER_UPDATE") then
                --guildPrintDebugMessage(event);
                TitanPanelGuildButton_ListInitMaster();
        end
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);  
        TitanPanelButton_UpdateTooltip();
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_OnEnter()
----------------------------------------------------------------------
function TitanPanelGuildButton_OnEnter()
        if (not (TitanGetVar(TITAN_GUILD_ID, "DisableMouseOverUpdates"))) then
                if (IsInGuild()) then   
                        FriendsFrame:UnregisterEvent("GUILD_ROSTER_UPDATE");
                        GuildRoster();
                        FriendsFrame:RegisterEvent("GUILD_ROSTER_UPDATE");
                end
                TitanPanelGuildButton_ListInitMaster();
                TitanPanelButton_UpdateButton(TITAN_GUILD_ID);  
                TitanPanelButton_UpdateTooltip();
        end
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_OnClick(arg1)
----------------------------------------------------------------------
function TitanPanelGuildButton_OnClick(button)
        -- open the guild pane on a left click
        if ( button == "LeftButton" and not IsControlKeyDown()) then
                if (GuildOrg) then -- EMERALD: If GuildOrg is installed, open its window instead of the Blizzard default one
                        if (not GuildOrg:IsVisible()) then
                                ShowUIPanel(GuildOrg);
                        elseif (GuildOrg:IsVisible()) then
                                HideUIPanel(GuildOrg);
                        end
                else
                        if (not FriendsFrame:IsVisible()) then
                            ToggleFriendsFrame(TITAN_GUILD_TAB_NUMBER);
                            FriendsFrame_Update();
                                --PanelTemplates_SetTab(FriendsFrame, TITAN_GUILD_TAB_NUMBER);
                                --ShowUIPanel(FriendsFrame);
                        elseif (FriendsFrame:IsVisible()) then
                                ToggleFriendsFrame(TITAN_GUILD_TAB_NUMBER);
                                --HideUIPanel(FriendsFrame);
                        end
                end
        elseif ( button == "LeftButton" and IsControlKeyDown()) then
                -- forcing an update, since auto-update might be off
                FriendsFrame:UnregisterEvent("GUILD_ROSTER_UPDATE");
                if (IsInGuild()) then           
                        GuildRoster();
                end
                FriendsFrame:RegisterEvent("GUILD_ROSTER_UPDATE");
                TitanPanelGuildButton_ListInitMaster();
        end
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_OnUpdate()
----------------------------------------------------------------------
function TitanPanelGuildButton_OnUpdate(elapsed)
        -- using my own damn timer
        if (TitanGuildFirstCycle) then -- This will prevent the login delay before first update
                guild_TimeCounter = TitanGetVar(TITAN_GUILD_ID, "RosterUpdateTime");
                if (not (TitanGetVar(TITAN_GUILD_ID, "DisableRosterUpdates"))) then
                        TitanPanelGuildButton_GetGuildRoster(timeLeft);
                end
                TitanGuildFirstCycle = false;
        else
                local timeLeft = guild_TimeCounter - elapsed;
                if (timeLeft <= 0) then
                        guild_TimeCounter = TitanGetVar(TITAN_GUILD_ID, "RosterUpdateTime");
                        if (not (TitanGetVar(TITAN_GUILD_ID, "DisableRosterUpdates"))) then
                                TitanPanelGuildButton_GetGuildRoster(timeLeft);
                        end
                else
                        guild_TimeCounter = timeLeft;
                end
        end
end

----------------------------------------------------------------------
-- TitanPanelGuildButton_GetButtonText(id)
----------------------------------------------------------------------
function TitanPanelGuildButton_GetButtonText(id)
        -- toggling label/icon display dumps the guild count, get a fresh count
        TitanPanelGuildButton_ListInitMaster();
        local id = TitanUtils_GetButton(id, true);
        local NumGuild = 0;
        local buttonRichText = "";
        if (IsInGuild()) then
                NumGuild = GetNumGuildMembers();
                if (GetGuildInfo("player")) then
                        TITAN_GUILD_BUTTON_LABEL = GetGuildInfo("player")..": ";
                end
                -- create string for Titan bar display
                if (GetGuildRosterShowOffline()) then
                        if (numGuildOnlineFiltered > 0) then
                                buttonRichText = format(TITAN_GUILD_BUTTON_TEXT_FILTERED, TitanUtils_GetGreenText(numGuildOnline), TitanUtils_GetNormalText(numGuildOnlineFiltered), TitanUtils_GetHighlightText(NumGuild));
                        else
                                buttonRichText = format(TITAN_GUILD_BUTTON_TEXT, TitanUtils_GetGreenText(numGuildOnline), TitanUtils_GetHighlightText(NumGuild));
                        end
                else
                        if (numGuildOnlineFiltered > 0) then
                                buttonRichText = format(TITAN_GUILD_BUTTON_TEXT, TitanUtils_GetGreenText(numGuildOnline), TitanUtils_GetNormalText(numGuildOnlineFiltered));
                        else
                                buttonRichText = format(TITAN_GUILD_BUTTON_TEXT_ONLINEONLY_FORMAT, TitanUtils_GetGreenText(numGuildOnline));    
                        end
                end
                -- return button text
                return TITAN_GUILD_BUTTON_LABEL, buttonRichText;
        else
                return TITAN_GUILD_BUTTON_LABEL, TITAN_GUILD_NOT_IN_GUILD;
        end
end

----------------------------------------------------------------------
-- TitanPanelGuildButton_GetTooltipText()
----------------------------------------------------------------------
function TitanPanelGuildButton_GetTooltipText()
        local NumGuild = 0;
        local tooltipRichText = "";
        local guild_name = "";
        local guild_rank = "";
        local guild_rankIndex = "";
        local guild_level = "";
        local guild_class = "";
        local guild_zone = "";
        local guild_note = "";
        local guild_officernote = "";
        local guild_online = "";
        local guild_status = "";
        local guildIndex;
        local richRankText = " ";
        local showWarning = 0;
        local rowCount = 0;
        -- player is in a guild, construct the tooltip text
        if (IsInGuild()) then
                tooltipRichText = TitanUtils_GetNormalText(GetGuildInfo("player"));
                tooltipRichText = tooltipRichText.."\t"..TitanUtils_GetGreenText(TITAN_GUILD_TOOLTIP_HINT_TEXT); -- add hint
                --if (TitanGetVar(TITAN_GUILD_ID, "SortByValue")) then
                --      tooltipRichText = tooltipRichText.."\t".."Sorted by: "..TitanGetVar(TITAN_GUILD_ID, "SortByValue").."\n";
                --else
                        tooltipRichText = tooltipRichText.."\n";
                --end
                -- display current filters
                if (TitanGetVar(TITAN_GUILD_ID, "FilterMyZone")) then
                        tooltipRichText = tooltipRichText..TITAN_GUILD_MENU_FILTER_MYZONE..": "..GetZoneText().."\n";
                end
                if (TitanGetVar(TITAN_GUILD_ID, "FilterMyLevel")) then
                        tooltipRichText = tooltipRichText..TITAN_GUILD_MENU_FILTER_MYLEVEL..": "..TitanPanelGuildButton_GetMinLevel().."-"..TitanPanelGuildButton_GetMaxLevel().."\n";
                end
                if (TitanGetVar(TITAN_GUILD_ID, "FilterClasses")) then
                        tooltipRichText = tooltipRichText..TITAN_GUILD_MENU_FILTER_CLASS..": "..TitanGetVar(TITAN_GUILD_ID, "FilterClasses").."\n";
                end             
                NumGuild = GetNumGuildMembers();
                for guildIndex=1, NumGuild do
                        guild_name, guild_rank, guild_rankIndex, guild_level, guild_class, guild_zone, guild_note, guild_officernote, guild_online, guild_status = GetGuildRosterInfo(guildIndex);
                        richRankText = TitanPanelGuildButton_ColorRankNameText(guild_rankIndex, guild_rank);
                        -- on game load, the zone info is sometimes unknown
                        if (not guild_zone) then
                                guild_zone = " . ";
                        end
                        if ( guild_online == 1 ) then
                                -- check for player zone and level filters
                                if TitanPanelGuildButton_IsPassFilter(guild_zone, guild_level, guild_class) then
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipLevel")) then
                                                tooltipRichText = tooltipRichText.."  ("..TitanUtils_GetColoredText(guild_level, TG.Color["orange"])..") ";
                                        end                                     
                                        if (guild_status ~= " ") then
                                                tooltipRichText = tooltipRichText..TitanUtils_GetColoredText(guild_status, TG.Color["yellow"]).." ";
                                        end                                     
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipName")) then
                                                tooltipRichText = tooltipRichText..TitanPanelGuildButton_ColorPlayerName(guild_name, guild_class);
                                        end
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipNote")) then
                                                if (guild_note ~= "") then
                                                        tooltipRichText = tooltipRichText..TitanUtils_GetColoredText(" ("..guild_note..")", TG.Color["gray"]).."\t";
                                                else
                                                        tooltipRichText = tooltipRichText.."\t";
                                                end
                                        else
                                                tooltipRichText = tooltipRichText.."\t";
                                        end
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipZone")) then
                                                tooltipRichText = tooltipRichText.." "..TitanUtils_GetColoredText(guild_zone, TG.Color["cyan"]);
                                        end
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipClass")) then
                                                tooltipRichText = tooltipRichText.." "..TitanPanelGuildButton_ColorClassName(guild_class);
                                        end
                                        if (TitanGetVar(TITAN_GUILD_ID, "ShowTooltipRank")) then
                                                tooltipRichText = tooltipRichText.." "..richRankText;
                                        end
                                        tooltipRichText = tooltipRichText.."\n";                                
                                
                                rowCount = rowCount+1
                                end
                        end
                        -- if the tooltip limit is going to be exceeded, stop
                        if (rowCount == TITAN_GUILD_TOOLTIP_THRESHOLD) then
                                showWarning = 1
                                break;
                        end
                end
                
                -- add warning if too large
                if (showWarning == 1) then
                        tooltipRichText = tooltipRichText.."\n"..TitanUtils_GetRedText(TITAN_GUILD_TOOLTIP_WARNING);            
                end
                return tooltipRichText;
        else
                -- show a default message if the player is not in a guild       
                return TitanUtils_GetNormalText(TITAN_GUILD_NOT_IN_GUILD);
        end
end

----------------------------------------------------------------------
-- Utility functions
----------------------------------------------------------------------
        TG = {};
        TG.Color = {};
        TG.Color["red"] = { r = 1.0, g = 0.0, b = 0.0 }
        TG.Color["green"] = { r = 0.0, g = 1.0, b = 0.0 }
        TG.Color["blue"] = { r = 0.0, g = 0.0, b = 1.0 }
        TG.Color["white"] = { r = 1.0, g = 1.0, b = 1.0 }
        TG.Color["magenta"] = { r = 1.0, g = 0.0, b = 1.0 }
        TG.Color["yellow"] = { r = 1.0, g = 1.0, b = 0.0 }
        TG.Color["cyan"] = { r = 0.0, g = 1.0, b = 1.0 }
        TG.Color["gray"] = { r = 0.7, g = 0.7, b = 0.7 }
        TG.Color["orange"] = { r = 1.0, g = 0.6, b = 0.0 }

        -- Gives standard class colour
        TITAN_GUILD_CLASSCOLORINDEX = {
                [1] = "|cffff7d0a",
                [2] = "|cffaad2aa",
                [3] = "|cff69cdf0",
                [4] = "|cfff58cb9",
                [5] = "|cffffffff",
                [6] = "|cfffff569",     
                [7] = "|cfff58cb9",
                [8] = "|cffc88296",
                [9] = "|cffc89b6e",
        }

----------------------------------------------------------------------
--  TitanPanelGuildButton_ColorClassName()
--  colors the class name based on the raid colors
----------------------------------------------------------------------
function TitanPanelGuildButton_ColorClassName(className)
        local i = TITAN_GUILD_CLASSINDEX[className];
        local coloredClassText = TITAN_GUILD_CLASSCOLORINDEX[i]..className.."|r";
        return coloredClassText;
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_ColorPlayerName()
--  colors the player name based on the raid colors
----------------------------------------------------------------------
function TitanPanelGuildButton_ColorPlayerName(playerName, className)
        local i = TITAN_GUILD_CLASSINDEX[className];
        local coloredPlayerName = TITAN_GUILD_CLASSCOLORINDEX[i]..playerName.."|r";
        return coloredPlayerName;
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_SortGuildRoster()
--  executes the SortGuildRoster function and updates the button
----------------------------------------------------------------------
function TitanPanelGuildButton_SortGuildRoster()
        -- if a stored sort value exists, then sort
        --guildPrintDebugMessage(TitanGetVar(TITAN_GUILD_ID, "SortByValue"));
        if (TitanGetVar(TITAN_GUILD_ID, "SortByValue")) then
                SortGuildRoster(string.lower(TitanGetVar(TITAN_GUILD_ID, "SortByValue")));
        end
        --guildPrintDebugMessage("Done sorting");
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_SetSortByValue()
--  persist the user's sort selection
----------------------------------------------------------------------
function TitanPanelGuildButton_SetSortByValue()
        TitanSetVar(TITAN_GUILD_ID, "SortByValue", this.value);
        -- conduct the sort
        TitanPanelGuildButton_SortGuildRoster()
        TitanPanelGuildButton_CloseMenu();
        TitanPanelGuildButton_ListInitMaster();
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
        TitanPanelButton_UpdateTooltip();       
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_SetTooltipChoice()
--  used to config the tooltip output
----------------------------------------------------------------------
function TitanPanelGuildButton_SetTooltipChoice()
        local tooltipConfigVar = "ShowTooltip"..this.value;
        TitanToggleVar(TITAN_GUILD_ID, tooltipConfigVar);
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_SetRosterUpdateTime()
--  persist the roster update time selection
----------------------------------------------------------------------
function TitanPanelGuildButton_SetRosterUpdateTime()
        --guildPrintDebugMessage(this.value);
        TitanSetVar(TITAN_GUILD_ID, "RosterUpdateTime", this.value);
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_CloseMenu()
----------------------------------------------------------------------
function TitanPanelGuildButton_CloseMenu() 
        TitanPanelRightClickMenu_Close()
end

-- toggle the advanced menuing
function TitanPanelGuildButton_ToggleAdvancedMenus()
        TitanToggleVar(TITAN_GUILD_ID, "ShowAdvancedMenus");
        TitanPanelGuildButton_ListInitMaster()
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- toggle the advanced menuing
function TitanPanelGuildButton_ToggleShowMenuOptions()
        TitanToggleVar(TITAN_GUILD_ID, "ShowMenuOptions");
        TitanPanelGuildButton_ListInitMaster();
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- toggle filter on player level menuing
function TitanPanelGuildButton_ToggleFilterMyLevel()
        TitanToggleVar(TITAN_GUILD_ID, "FilterMyLevel");
        TitanPanelGuildButton_CloseMenu();
        TitanPanelGuildButton_ListInitMaster();
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- toggle filter on player zone advanced menuing
function TitanPanelGuildButton_ToggleFilterMyZone()
        TitanToggleVar(TITAN_GUILD_ID, "FilterMyZone");
        TitanPanelGuildButton_CloseMenu();
        TitanPanelGuildButton_ListInitMaster();
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- toggle the roster updates
function TitanPanelGuildButton_ToggleRosterUpdates()
        TitanToggleVar(TITAN_GUILD_ID, "DisableRosterUpdates");
        TitanPanelGuildButton_ListInitMaster()
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- toggle the roster updates
function TitanPanelGuildButton_ToggleMouseOverUpdates()
        TitanToggleVar(TITAN_GUILD_ID, "DisableMouseOverUpdates");
        TitanPanelGuildButton_ListInitMaster()
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- add class filters
function TitanPanelGuildButton_AddClassFilter()
        --local lClasses = TitanGetVar(TITAN_GUILD_ID, "FilterClasses");
        --table.insert(lClasses, classValue);
        --TitanSetVar(TITAN_GUILD_ID, "FilterClasses", lClasses);
        if (this.value == "All") then
                TitanSetVar(TITAN_GUILD_ID, "FilterClasses", TITAN_NIL);
        else
                TitanSetVar(TITAN_GUILD_ID, "FilterClasses", this.value);
        end
        TitanPanelGuildButton_CloseMenu();
        TitanPanelGuildButton_ListInitMaster();
        TitanPanelButton_UpdateButton(TITAN_GUILD_ID);
end

-- send a /w chat command
function TitanPanelGuildButton_GuildWhisper()
        if ( not ChatFrameEditBox:IsVisible() ) then
                ChatFrame_OpenChat("/w".." "..this.value.." ");
        else
                ChatFrameEditBox:SetText("/w".." "..this.value.." ");
        end
end

-- send a /g chat command
function TitanPanelGuildButton_OpenGuildChat()
        if ( not ChatFrameEditBox:IsVisible() ) then
                ChatFrame_OpenChat("/g");
        else
                ChatFrameEditBox:SetText("/g");
        end
end

-- send a /o chat command
function TitanPanelGuildButton_OpenGuildOfficerChat()
        if ( not ChatFrameEditBox:IsVisible() ) then
                ChatFrame_OpenChat("/o");
        else
                ChatFrameEditBox:SetText("/o");
        end
end

-- invoke invite to group command
function TitanPanelGuildButton_InviteToGroup()
        InviteByName(this.value);
end

-- invoke a /who query on a guild member
function TitanPanelGuildButton_SendWhoRequest()
        SendWho(this.value);
end

-- add a guild member to your friends list
function TitanPanelGuildButton_AddFriend()
        AddFriend(this.value);
end

-- check for frames which only exist for certain classes
function TitanPanelGuildButton_CheckForFrame(frameName)
        if (frameName) then
                return frameName:IsVisible();
        end
end

-- get the min level for filtering
function TitanPanelGuildButton_GetMinLevel()
        local playerLevel = UnitLevel("player");
        local levelMin = 1;
        if (playerLevel <= TITAN_GUILD_LEVEL_RANGE) then
                levelMin = 1;
        else
                levelMin = playerLevel - TITAN_GUILD_LEVEL_RANGE;
        end
        return levelMin;
end

-- get the max level for filtering
function TitanPanelGuildButton_GetMaxLevel()
        local playerLevel = UnitLevel("player");
        local levelMax = 60;
        if (playerLevel + TITAN_GUILD_LEVEL_RANGE >= 60) then
                levelMax = 60;
        else
                levelMax = playerLevel + TITAN_GUILD_LEVEL_RANGE;
        end
        return levelMax;
end

-- TitanPanelGuildButton_ColorRankNameText()
function TitanPanelGuildButton_ColorRankNameText(guild_rankIndex, guild_rank)
        local green = GREEN_FONT_COLOR;         -- 0.1, 1.00, 0.1
        local yellow = NORMAL_FONT_COLOR;       -- 1.0, 0.82, 0.0
        local red = RED_FONT_COLOR;                             -- 1.0, 0.10, 0.1
        
        local color = {};
        local index = guild_rankIndex;
        local nRanks = GuildControlGetNumRanks();
        local pct = ((guild_rankIndex*100)/nRanks)/100;
        local colortxt = "";
        if (index == 0) then
                color = red;
        elseif (index == (nRanks/2)) then
                color = yellow;
        elseif (index == nRanks) then
                color = green;
        elseif (index > (nRanks/2)) then
                local pctmod = (1.0 - pct) * 2;
                color.r =(yellow.r - green.r)*pctmod + green.r;
                color.g = (yellow.g - green.g)*pctmod + green.g;
                color.b = (yellow.b - green.b)*pctmod + green.b;
        elseif (index < (nRanks/2)) then
                local pctmod = (0.5 - pct) * 2; 
                color.r = (red.r - yellow.r)*pctmod + yellow.r;
                color.g = (red.g - yellow.g)*pctmod + yellow.g;
                color.b = (red.b - yellow.b)*pctmod + yellow.b;
        end
        colortxt = TitanUtils_GetColoredText(guild_rank, color);
        return colortxt;
end

-- used for chat frame based debug messaging
function guildPrintDebugMessage(msg)
        if( DEFAULT_CHAT_FRAME ) then
                DEFAULT_CHAT_FRAME:AddMessage("<GUILD_DEBUG> "..msg);
        end     
end

----------------------------------------------------------------------
-- TitanPanelGuildButton_GetGuildRoster(timer)
-- time based wrapper for the GuildRoster() call
-- calling based on a countdown from TitanGetVar(TITAN_GUILD_ID, "RosterUpdateTime")
----------------------------------------------------------------------
function TitanPanelGuildButton_GetGuildRoster(timer)
        if (timer and timer <= 0) then
                if (IsInGuild()) then
                        FriendsFrame:UnregisterEvent("GUILD_ROSTER_UPDATE");
                        --guildPrintDebugMessage("Calling GuildRoster()");
                        GuildRoster();
                        FriendsFrame:RegisterEvent("GUILD_ROSTER_UPDATE");
                        -- reset the timer to full ... EMERALD: Only do this reset on positive hit
                        guild_TimeCounter = TitanGetVar(TITAN_GUILD_ID, "RosterUpdateTime");
                end
        end
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_ConstructGuildTable()
--  constructs a table used to generate the right-click menu nav
----------------------------------------------------------------------
function TitanPanelGuildButton_ConstructGuildTable()
        local g_name, g_rank, g_rankIndex, g_level, g_class, g_zone, g_note, g_officernote, g_online, g_status
        local rankTable = {};
        local rankMembers = {};
        masterTable = {};
        local gIndex;
        local rIndex;
        local guildNum = GetNumGuildMembers();
        local numRanks = GuildControlGetNumRanks();
        local rankMemberTablePos;
        -- for all ranks, create the tabled used for the right-click menus
        for rIndex=1, numRanks do
                rankMembers = {};
                rankTable = {};
                rankMemberTablePos = 1;
                -- insert the rank name at pos 1
                rankTable.rank = GuildControlGetRankName(rIndex);
                for gIndex=1, guildNum do
                        g_name, g_rank, g_rankIndex, g_level, g_class, g_zone, g_note, g_officernote, g_online, g_status = GetGuildRosterInfo(gIndex);
                        -- guildPrintDebugMessage("g_name: "..g_name..", g_rank: "..g_rank..", g_rankIndex: "..g_rankIndex..", g_level: "..g_level..", g_class: "..g_class..", g_zone: "..g_zone..", g_note: "..g_note..", g_officernote: "..g_officernote..", g_online: "..g_online..", g_status: "..g_status);
                        -- guild rank index might be zero based, so add 1
                        g_rankIndex = g_rankIndex + 1;
                        -- check if online before adding to table
                        if (g_online == 1) then
                                -- check filters before adding to table
                                if TitanPanelGuildButton_IsPassFilter(g_zone, g_level, g_class) then
                                        if (g_rankIndex == rIndex) then
                                                --guildPrintDebugMessage("MATCH guild_rankIndex: "..g_rankIndex.." = "..rIndex.." "..g_name.." "..g_rank);
                                                table.insert(rankMembers, rankMemberTablePos, g_name);
                                                --guildPrintDebugMessage(rankMembers[rankMemberTablePos]);
                                                rankMemberTablePos = rankMemberTablePos + 1;
                                        end
                                end
                        end
                end
                rankTable.members = rankMembers;
                table.insert(masterTable, rIndex, rankTable);
        end
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_ConstructSimpleGuildTable()
--  constructs a table used to generate the flat right-click nav
----------------------------------------------------------------------
function TitanPanelGuildButton_ConstructSimpleGuildTable()
        local g_name, g_rank, g_rankIndex, g_level, g_class, g_zone, g_note, g_officernote, g_online, g_status
        masterTableSimple = {};
        local gIndex;
        local rIndex;
        local guildNum = GetNumGuildMembers();
        local simpleMemberTablePos = 1;
        for gIndex=1, guildNum do
                g_name, g_rank, g_rankIndex, g_level, g_class, g_zone, g_note, g_officernote, g_online, g_status = GetGuildRosterInfo(gIndex);
                -- check if online before adding to table
                if (g_online == 1) then
                        -- check filters before adding to table
                        if TitanPanelGuildButton_IsPassFilter(g_zone, g_level, g_class) then
                                -- insert into a flat table for rendering the simple menus
                                local filteredPlayer = {name=g_name,rankIndex=g_rankIndex};
                                table.insert(masterTableSimple, simpleMemberTablePos, filteredPlayer);
                                simpleMemberTablePos = simpleMemberTablePos + 1;        
                        end
                end
        end
end

----------------------------------------------------------------------
--  TitanPanelGuildButton_ListInitMaster()
--  wrapper for several functions called on a list update
----------------------------------------------------------------------
function TitanPanelGuildButton_ListInitMaster()
        TitanPanelGuildButton_InitPaging();
        TitanPanelGuildButton_ComputeOnlineGuildMembers();
        TitanPanelGuildButton_ComputePages();
        TitanPanelGuildButton_ConstructSimpleGuildTable();
        TitanPanelGuildButton_ConstructGuildTable();
end