vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
NL_NEED_FRAME_LEFT_INDENT = 20
NL_NEED_FRAME_TOP_INDENT = 30
NL_NEED_FRAME_SPACING = 25

NLNeedFrameName = "NLConfigNeedsFrame";
NLMainFrameName = "NLConfigFrame";



--------------------------------------------------------
-- NL_GetConfigForCurrentPlayer
--------
-- Get the configuration for this player.
--------------------------------------------------------
function NL_GetConfigForCurrentPlayer( doDefaults )
        if( NL_CONFIGS == nil ) then
                NL_CONFIGS = {};
        end

        local sName = UnitName("player") .. " " .. GetCVar("realmName");

        if( doDefaults or NL_CONFIGS[sName] == nil or NL_CONFIGS[sName].Version == nil or NL_CONFIGS[sName].Version < 2 ) then
                NL_CONFIGS[sName] = {};
                if( NL_CONFIGS[sName].Version and NL_CONFIGS[sName].Version < 2 ) then
                        NL_Msg("IMPORTANT NOTE: Version 2.00 of Needy List has reset your Needy List configuration.");
                end
                NL_CONFIGS[sName].Needs = {};

                local NeedsList = NL_CONFIGS[sName].Needs;
                local numNeeds = 0;

                -- top priority need is always STICKIED
                NeedsList[numNeeds] = {Name="NeverShow",Toggle=0,BGColor={r = 0.0, g = 0.0, b = 1.0, opacity = 0.5},Filter={Type="Units",Names=""}};
                numNeeds = numNeeds + 1;

                NeedsList[numNeeds] = {Name="Sticky",Toggle=0,BGColor={r = 0.0, g = 0.0, b = 1.0, opacity = 0.5},Filter={Type="Units",Names=""}};
                numNeeds = numNeeds + 1;

                NeedsList[numNeeds] = {Name="Health",Toggle=1,BGColor={r = 1.0, g = 0.0, b = 0.0, opacity = 0.8},Threshold=75,Filter={Type="Everyone"}};
                NL_CONFIGS[sName].HealthNeedIndex = numNeeds;
                numNeeds = numNeeds + 1;

                if( NL_PLAYERCLASS == NL_PRIEST_NAME or NL_PLAYERCLASS == NL_PALADIN_NAME ) then
                        NeedsList[numNeeds] = {Name="Magic",Type="DEBUFF",Toggle=1,BGColor={r = 1.0, g = 0.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;
                end

                if( NL_PLAYERCLASS == NL_SHAMAN_NAME or NL_PLAYERCLASS == NL_DRUID_NAME or NL_PLAYERCLASS == NL_PALADIN_NAME ) then
                        NeedsList[numNeeds] = {Name="Poison",Type="DEBUFF",Toggle=1,BGColor={r = 1.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;
                end

                if( NL_PLAYERCLASS == NL_SHAMAN_NAME or NL_PLAYERCLASS == NL_PRIEST_NAME or NL_PLAYERCLASS == NL_PALADIN_NAME ) then
                        NeedsList[numNeeds] = {Name="Disease",Type="DEBUFF",Toggle=1,BGColor={r = 0.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;
                end

                if( NL_PLAYERCLASS == NL_MAGE_NAME or NL_PLAYERCLASS == NL_DRUID_NAME ) then
                        NeedsList[numNeeds] = {Name="Curse",Type="DEBUFF",Toggle=1,BGColor={r = 0.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;
                end

                -- for priests specifically
                if( NL_PLAYERCLASS == NL_PRIEST_NAME ) then

                        NeedsList[numNeeds] = {Name="Fortitude",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="ShadowProt",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="PWShield",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 0.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DivineSpirit",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8}};
                        NeedsList[numNeeds].Filter = NLGetSpecialFilter(true, false);
                        numNeeds = numNeeds + 1;

                        if( UnitRace("player") == NL_DWARF_NAME ) then
                                NeedsList[numNeeds] = {Name="FearWard",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 1.0, b = 0.5, opacity = 0.8},Filter={Type="Everyone"}};
                                numNeeds = numNeeds + 1;
                        elseif( UnitRace("player") == NL_UNDEAD_NAME ) then
                                NeedsList[numNeeds] = {Name="TouchOfWeakness",Type="BUFF",Toggle=0,BGColor={r = 0.0, g = 1.0, b = 0.5, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                                numNeeds = numNeeds + 1;
                        elseif( UnitRace("player") == NL_HUMAN_NAME ) then
                                NeedsList[numNeeds] = {Name="Feedback",Type="BUFF",Toggle=0,BGColor={r = 0.8, g = 0.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                                numNeeds = numNeeds + 1;
                        elseif( UnitRace("player") == NL_TROLL_NAME ) then
                                NeedsList[numNeeds] = {Name="Shadowguard",Type="BUFF",Toggle=0,BGColor={r = 0.8, g = 0.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                                numNeeds = numNeeds + 1;
                        end

                        NeedsList[numNeeds] = {Name="InnerFire",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 0.5, b = 0.5, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                end

                -- for druids specifically
                if( NL_PLAYERCLASS == NL_DRUID_NAME ) then
                        NeedsList[numNeeds] = {Name="Mark",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="Thorns",Type="BUFF",Toggle=0,BGColor={r = 0.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="Clarity",Type="BUFF",Toggle=0,BGColor={r = 0.4, g = 0.4, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="Mana",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Threshold=25};
                        NeedsList[numNeeds].Filter = NLGetSpecialFilter(true, false);
                        NL_CONFIGS[sName].ManaNeedIndex = numNeeds;
                        numNeeds = numNeeds + 1;
                end

                -- for paladins specifically
                if( NL_PLAYERCLASS == NL_PALADIN_NAME ) then
                        NeedsList[numNeeds] = {Name="BlessMight",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="BlessWisdom",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8}};
                        NeedsList[numNeeds].Filter = NLGetSpecialFilter(true, false);
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="BlessKings",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="BlessSalvation",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="BlessLight",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="BlessSanctuary",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;
                end

                -- for mages specifically
                if( NL_PLAYERCLASS == NL_MAGE_NAME ) then
                        NeedsList[numNeeds] = {Name="Intellect",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8}};
                        NeedsList[numNeeds].Filter = NLGetSpecialFilter(true, false);
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="MageArmor",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="FrostArmor",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="IceArmor",Type="BUFF",Toggle=1,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DampenMagic",Type="BUFF",Toggle=0,BGColor={r = 0.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="AmplifyMagic",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 0.5, b = 0.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="ManaShield",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                end

                -- for warlocks specifically
                if( NL_PLAYERCLASS == NL_WARLOCK_NAME ) then
                        NeedsList[numNeeds] = {Name="Soulstone",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DemonArmor",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 0.0, b = 0.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DemonSkin",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 0.0, b = 0.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="UnendingBreath",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DetectLesserInvis",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DetectInvis",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="DetectGreaterInvis",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Everyone"}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="FireShield",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 0.5, b = 0.5, opacity = 0.8}};
                        NeedsList[numNeeds].Filter = NLGetSpecialFilter(false, true);
                        NeedsList[numNeeds].Filter.Demon = false;
                        numNeeds = numNeeds + 1;
                end

                -- for rogues specifically
                if( NL_PLAYERCLASS == NL_ROGUE_NAME ) then
                        NeedsList[numNeeds] = {Name="DetectTraps",Type="BUFF",Toggle=1,BGColor={r = 1.0, g = 1.0, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="MainhandPoison",Type="ENCHANT",Toggle=0,BGColor={r = 0.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="OffhandPoison",Type="ENCHANT",Toggle=0,BGColor={r = 0.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                end

                -- for shaman specifically
                if( NL_PLAYERCLASS == NL_SHAMAN_NAME ) then
                        NeedsList[numNeeds] = {Name="LightningShield",Type="BUFF",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="Rockbiter",Type="ENCHANT",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 0.5, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                        
                        NeedsList[numNeeds] = {Name="Flametongue",Type="ENCHANT",Toggle=0,BGColor={r = 1.0, g = 0.5, b = 0.5, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                        
                        NeedsList[numNeeds] = {Name="Frostbrand",Type="ENCHANT",Toggle=0,BGColor={r = 0.5, g = 0.5, b = 1.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;

                        NeedsList[numNeeds] = {Name="Windfury",Type="ENCHANT",Toggle=0,BGColor={r = 0.75, g = 0.75, b = 0.75, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                end

                if( NL_PLAYERCLASS == NL_PRIEST_NAME or NL_PLAYERCLASS == NL_DRUID_NAME or NL_PLAYERCLASS == NL_PALADIN_NAME or NL_PLAYERCLASS == NL_SHAMAN_NAME ) then
                        NeedsList[numNeeds] = {Name="Resurrection",Toggle=1,BGColor={r = 0.5, g = 0.5, b = 0.5, opacity = 0.8},Filter={Type="Everyone"}};
                        NL_CONFIGS[sName].ResurrectionNeedIndex = numNeeds;
                        numNeeds = numNeeds + 1;
                end

                if( NL_PLAYERCLASS == NL_WARRIOR_NAME ) then
                        NeedsList[numNeeds] = {Name="BattleShout",Type="BUFF",Toggle=0,BGColor={r = 1.0, g = 0.5, b = 0.5, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                        numNeeds = numNeeds + 1;
                end

                NeedsList[numNeeds] = {Name="WellFed",Toggle=0,BGColor={r = 1.0, g = 1.0, b = 0.0, opacity = 0.8},Filter={Type="Units",Names=UnitName("player")}};
                numNeeds = numNeeds + 1;

                NL_CONFIGS[sName].NumNeeds = numNeeds;
        end

        if( not NL_CONFIGS[sName].ShowHealth ) then NL_CONFIGS[sName].ShowHealth = 1; end
        if( not NL_CONFIGS[sName].ShowMana ) then NL_CONFIGS[sName].ShowMana = 0; end
        if( not NL_CONFIGS[sName].FrameWidth ) then NL_CONFIGS[sName].FrameWidth = 80; end
        if( not NL_CONFIGS[sName].MaxUnits ) then NL_CONFIGS[sName].MaxUnits = 10; end
        if( not NL_CONFIGS[sName].UseWhenSolo ) then NL_CONFIGS[sName].UseWhenSolo = 1; end
        if( not NL_CONFIGS[sName].UseInParty ) then NL_CONFIGS[sName].UseInParty = 1; end
        if( not NL_CONFIGS[sName].UseInRaid ) then NL_CONFIGS[sName].UseInRaid = 1; end
        if( not NL_CONFIGS[sName].AutoSort ) then NL_CONFIGS[sName].AutoSort = 1; end
        if( not NL_CONFIGS[sName].ShowTooltips ) then NL_CONFIGS[sName].ShowTooltips = 1; end
        if( not NL_CONFIGS[sName].LargeNeedIcons ) then NL_CONFIGS[sName].LargeNeedIcons = 1; end
        if( not NL_CONFIGS[sName].UseCastParty ) then NL_CONFIGS[sName].UseCastParty = 1; end
        if( not NL_CONFIGS[sName].ShowHealthNum ) then NL_CONFIGS[sName].ShowHealthNum = 0; end
        if( not NL_CONFIGS[sName].ShowNeeds ) then NL_CONFIGS[sName].ShowNeeds = 1; end
        if( not NL_CONFIGS[sName].ShowBuffs ) then NL_CONFIGS[sName].ShowBuffs = 0; end
        if( not NL_CONFIGS[sName].ShowHealBuffs ) then NL_CONFIGS[sName].ShowHealBuffs = 0; end
        if( not NL_CONFIGS[sName].ShowDebuffs ) then NL_CONFIGS[sName].ShowDebuffs = 0; end
        if( not NL_CONFIGS[sName].SwapNeedsAndDetails ) then
                NL_CONFIGS[sName].SwapNeedsAndDetails = 0;
        elseif( NL_CONFIGS[sName].SwapNeedsAndDetails == 1 ) then
                        -- change the anchor points on all the needs and details frames
                NLAnchorDetails("target", false);
                NLAnchorDetails("player", false);
                NLAnchorDetails("pet", false);
                for i=1, 4 do
                        NLAnchorDetails("party"..i, false);
                        NLAnchorDetails("partypet"..i, false);
                end
                for i=1, 40 do
                        NLAnchorDetails("raid"..i, false);
                        NLAnchorDetails("raidpet"..i, false);
                end
        end
        if( not NL_CONFIGS[sName].InvertList ) then NL_CONFIGS[sName].InvertList = 0; end
        if( not NL_CONFIGS[sName].ColorByClass ) then NL_CONFIGS[sName].ColorByClass = 0; end
        if( not NL_CONFIGS[sName].BlackListDelay ) then NL_CONFIGS[sName].BlackListDelay = 5; end
        if( not NL_CONFIGS[sName].ShowTargetFrame ) then NL_CONFIGS[sName].ShowTargetFrame = 0; end
        if( not NL_CONFIGS[sName].ResurrectionNeedIndex ) then
                for i=1, NL_CONFIGS[sName].NumNeeds - 1 do
                        if( NL_CONFIGS[sName].Needs[i].Name == "Resurrection" ) then
                                NL_CONFIGS[sName].ResurrectionNeedIndex = i;
                        end
                end
        end

        NL_CONFIGS[sName].Version = NL_CURRENT_VERSION;

        return NL_CONFIGS[sName];
end

function NLGetSpecialFilter(manaUsersOnly, myPartyOnly)
        local newFilter = {};

        newFilter.Type="Multi";
        newFilter.Names = {};
        newFilter.Names[NL_PRIEST_NAME]=true;
        newFilter.Names[NL_MAGE_NAME]=true;
        newFilter.Names[NL_HUNTER_NAME]=true;
        newFilter.Names[NL_WARLOCK_NAME]=true;
        newFilter.Names[NL_DRUID_NAME]=true;
        newFilter.Names[NL_DEMON_NAME]=true;
        if( not manaUsersOnly ) then
                newFilter.Names[NL_WARRIOR_NAME] = true;
                newFilter.Names[NL_ROGUE_NAME] = true;
                newFilter.Names[NL_BEAST_NAME] = true;
        end
        if( UnitFactionGroup( "player" ) == "Horde" ) then
                newFilter.Names[NL_SHAMAN_NAME] = true;
        else
                newFilter.Names[NL_PALADIN_NAME] = true;
        end
        if( not myPartyOnly ) then
                newFilter.Names["Party 1"] = true;
                newFilter.Names["Party 2"] = true;
                newFilter.Names["Party 3"] = true;
                newFilter.Names["Party 4"] = true;
                newFilter.Names["Party 5"] = true;
                newFilter.Names["Party 6"] = true;
                newFilter.Names["Party 7"] = true;
                newFilter.Names["Party 8"] = true;
        end
        newFilter.Names["My Party"] = true;

        return newFilter;
end

function NL_InitializeConfigFrame()
        getglobal(NLMainFrameName .. "_CheckButtonUseWhenSolo"):SetChecked(NLConfig.UseWhenSolo);
        getglobal(NLMainFrameName .. "_CheckButtonUseInParty"):SetChecked(NLConfig.UseInParty);
        getglobal(NLMainFrameName .. "_CheckButtonUseInRaid"):SetChecked(NLConfig.UseInRaid);
        getglobal(NLMainFrameName .. "_CheckButtonShowHealth"):SetChecked(NLConfig.ShowHealth);
        getglobal(NLMainFrameName .. "_CheckButtonShowMana"):SetChecked(NLConfig.ShowMana);
        getglobal(NLMainFrameName .. "_CheckButtonShowNeeds"):SetChecked(NLConfig.ShowNeeds);
        getglobal(NLMainFrameName .. "_CheckButtonShowBuffs"):SetChecked(NLConfig.ShowBuffs);
        getglobal(NLMainFrameName .. "_CheckButtonShowHealBuffs"):SetChecked(NLConfig.ShowHealBuffs);
        getglobal(NLMainFrameName .. "_CheckButtonShowDebuffs"):SetChecked(NLConfig.ShowDebuffs);
        getglobal(NLMainFrameName .. "_CheckButtonSwapNeedsAndDetails"):SetChecked(NLConfig.SwapNeedsAndDetails);
        getglobal(NLMainFrameName .. "_CheckButtonUseCastParty"):SetChecked(NLConfig.UseCastParty);
        getglobal(NLMainFrameName .. "_CheckButtonShowHealthNum"):SetChecked(NLConfig.ShowHealthNum);
        getglobal(NLMainFrameName .. "_CheckButtonShowHealthLost"):SetChecked(NLConfig.ShowHealthLost);
        getglobal(NLMainFrameName .. "_CheckButtonAutoSort"):SetChecked(NLConfig.AutoSort);
        getglobal(NLMainFrameName .. "_CheckButtonInvertList"):SetChecked(NLConfig.InvertList);
        getglobal(NLMainFrameName .. "_CheckButtonShowTooltips"):SetChecked(NLConfig.ShowTooltips);
        getglobal(NLMainFrameName .. "_CheckButtonLargeNeedIcons"):SetChecked(NLConfig.LargeNeedIcons);
        getglobal(NLMainFrameName .. "_CheckButtonSpellNotify"):SetChecked(NLConfig.SpellNotify);
        getglobal(NLMainFrameName .. "_CheckButtonHideHeader"):SetChecked(NLConfig.HideHeader);
        getglobal(NLMainFrameName .. "_CheckButtonColorByClass"):SetChecked(NLConfig.ColorByClass);
        getglobal(NLMainFrameName .. "_SliderFrameWidth"):SetValue(NLConfig.FrameWidth);
        getglobal(NLMainFrameName .. "_BlackListDelay"):SetNumber(NLConfig.BlackListDelay);
        getglobal(NLMainFrameName .. "_MaxUnits"):SetNumber(NLConfig.MaxUnits);
        getglobal(NLMainFrameName .. "_CheckButtonShowTargetFrame"):SetChecked(NLConfig.ShowTargetFrame);
end

function NL_SaveConfig()
        if( getglobal(NLMainFrameName .. "_CheckButtonUseWhenSolo"):GetChecked() == nil ) then
                NLConfig.UseWhenSolo = 0;
        else
                NLConfig.UseWhenSolo = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonUseInParty"):GetChecked() == nil ) then
                NLConfig.UseInParty = 0;
        else
                NLConfig.UseInParty = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonUseInRaid"):GetChecked() == nil ) then
                NLConfig.UseInRaid = 0;
        else
                NLConfig.UseInRaid = 1;
        end

        if( getglobal(NLMainFrameName .. "_CheckButtonShowHealth"):GetChecked() == nil ) then
                NLConfig.ShowHealth = 0;
        else
                NLConfig.ShowHealth = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowMana"):GetChecked() == nil ) then
                NLConfig.ShowMana = 0;
        else
                NLConfig.ShowMana = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowNeeds"):GetChecked() == nil ) then
                NLConfig.ShowNeeds = 0;
        else
                NLConfig.ShowNeeds = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowBuffs"):GetChecked() == nil ) then
                NLConfig.ShowBuffs = 0;
        else
                NLConfig.ShowBuffs = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowHealBuffs"):GetChecked() == nil ) then
                NLConfig.ShowHealBuffs = 0;
        else
                NLConfig.ShowHealBuffs = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowDebuffs"):GetChecked() == nil ) then
                NLConfig.ShowDebuffs = 0;
        else
                NLConfig.ShowDebuffs = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonUseCastParty"):GetChecked() == nil ) then
                NLConfig.UseCastParty = 0;
        else
                NLConfig.UseCastParty = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowHealthNum"):GetChecked() == nil ) then
                NLConfig.ShowHealthNum = 0;
        else
                NLConfig.ShowHealthNum = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowHealthLost"):GetChecked() == nil ) then
                NLConfig.ShowHealthLost = 0;
        else
                NLConfig.ShowHealthLost = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonAutoSort"):GetChecked() == nil ) then
                NLConfig.AutoSort = 0;
        else
                NLConfig.AutoSort = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonSpellNotify"):GetChecked() == nil ) then
                NLConfig.SpellNotify = 0;
        else
                NLConfig.SpellNotify = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonHideHeader"):GetChecked() == nil ) then
                NLConfig.HideHeader = 0;
        else
                NLConfig.HideHeader = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonShowTooltips"):GetChecked() == nil ) then
                NLConfig.ShowTooltips = 0;
        else
                NLConfig.ShowTooltips = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonLargeNeedIcons"):GetChecked() == nil ) then
                NLConfig.LargeNeedIcons = 0;
        else
                NLConfig.LargeNeedIcons = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonSwapNeedsAndDetails"):GetChecked() == nil ) then
                -- change the anchor points on all the needs and details frames
                NLAnchorDetails("target", true);
                NLAnchorDetails("player", true);
                NLAnchorDetails("pet", true);
                for i=1, 4 do
                        NLAnchorDetails("party"..i, true);
                        NLAnchorDetails("partypet"..i, true);
                end
                for i=1, 40 do
                        NLAnchorDetails("raid"..i, true);
                        NLAnchorDetails("raidpet"..i, true);
                end
                NLConfig.SwapNeedsAndDetails = 0;
        else
                -- change the anchor points on all the needs and details frames
                NLAnchorDetails("target", false);
                NLAnchorDetails("player", false);
                NLAnchorDetails("pet", false);
                for i=1, 4 do
                        NLAnchorDetails("party"..i, false);
                        NLAnchorDetails("partypet"..i, false);
                end
                for i=1, 40 do
                        NLAnchorDetails("raid"..i, false);
                        NLAnchorDetails("raidpet"..i, false);
                end
                NLConfig.SwapNeedsAndDetails = 1;
        end
        if( getglobal(NLMainFrameName .. "_CheckButtonInvertList"):GetChecked() == nil ) then
                NLConfig.InvertList = 0;
        else
                NLConfig.InvertList = 1;
        end

        if( getglobal(NLMainFrameName .. "_CheckButtonColorByClass"):GetChecked() == nil ) then
                NLConfig.ColorByClass = 0;
        else
                NLConfig.ColorByClass = 1;
        end

        if( getglobal(NLMainFrameName .. "_CheckButtonShowTargetFrame"):GetChecked() == nil ) then
                NLConfig.ShowTargetFrame = 0;
        else
                NLConfig.ShowTargetFrame = 1;
        end

        NLConfig.FrameWidth = getglobal(NLMainFrameName .. "_SliderFrameWidth"):GetValue();
        NLConfig.BlackListDelay = getglobal(NLMainFrameName .. "_BlackListDelay"):GetNumber();
        NLConfig.MaxUnits = getglobal(NLMainFrameName .. "_MaxUnits"):GetNumber();


        NL_CheckIfEnabled();

        if( NL_ENABLED ) then
                NLHeader:Hide();
                NLHeader:Show();
        end
end

function NLAnchorDetails( member, side )
        if( side ) then
                getglobal("NLMember" .. member .. "BuffsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "BuffsDetails"):SetPoint("BOTTOMRIGHT", "NLMember" .. member, "BOTTOMLEFT", 5, 0);
                getglobal("NLMember" .. member .. "DebuffsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "DebuffsDetails"):SetPoint("BOTTOMRIGHT", "NLMember" .. member .. "BuffsDetails", "BOTTOMLEFT", 5, 0);
                getglobal("NLMember" .. member .. "NeedsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "NeedsDetails"):SetPoint("BOTTOMLEFT", "NLMember" .. member, "BOTTOMRIGHT", -5, 0);
        else
                getglobal("NLMember" .. member .. "BuffsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "BuffsDetails"):SetPoint("BOTTOMLEFT", "NLMember" .. member, "BOTTOMRIGHT", -5, 0);
                getglobal("NLMember" .. member .. "DebuffsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "DebuffsDetails"):SetPoint("BOTTOMLEFT", "NLMember" .. member .. "BuffsDetails", "BOTTOMRIGHT", -5, 0);
                getglobal("NLMember" .. member .. "NeedsDetails"):ClearAllPoints();
                getglobal("NLMember" .. member .. "NeedsDetails"):SetPoint("BOTTOMRIGHT", "NLMember" .. member, "BOTTOMLEFT", 5, 0);
        end
end

function NL_InitializeConfigSpellsFrame()
        if( not NLConfig.HealSpells ) then
                return;
        end

        if( NLConfig.HealSpells[1] ) then
                getglobal("NLConfigSpellsFrameHeal1"):SetText(NLConfig.HealSpells[1]);
        else
                getglobal("NLConfigSpellsFrameHeal1"):SetText("");
        end
        if( NLConfig.HealSpells[2] ) then
                getglobal("NLConfigSpellsFrameHeal2"):SetText(NLConfig.HealSpells[2]);
        else
                getglobal("NLConfigSpellsFrameHeal2"):SetText("");
        end
        if( NLConfig.HealSpells[3] ) then
                getglobal("NLConfigSpellsFrameHeal3"):SetText(NLConfig.HealSpells[3]);
        else
                getglobal("NLConfigSpellsFrameHeal3"):SetText("");
        end
        if( NLConfig.HealSpells[4] ) then
                getglobal("NLConfigSpellsFrameHeal4"):SetText(NLConfig.HealSpells[4]);
        else
                getglobal("NLConfigSpellsFrameHeal4"):SetText("");
        end
        if( NLConfig.HealSpells[5] ) then
                getglobal("NLConfigSpellsFrameHeal5"):SetText(NLConfig.HealSpells[5]);
        else
                getglobal("NLConfigSpellsFrameHeal5"):SetText("");
        end
end

function NL_SaveSpellsConfig()
        if( not NLConfig.HealSpells ) then
                NLConfig.HealSpells = {};
        end
        if( getglobal("NLConfigSpellsFrameHeal1"):GetText() == "" ) then
                NLConfig.HealSpells[1] = nil;
        else
                NLConfig.HealSpells[1] = getglobal("NLConfigSpellsFrameHeal1"):GetText();
        end
        if( getglobal("NLConfigSpellsFrameHeal2"):GetText() == "" ) then
                NLConfig.HealSpells[2] = nil;
        else
                NLConfig.HealSpells[2] = getglobal("NLConfigSpellsFrameHeal2"):GetText();
        end
        if( getglobal("NLConfigSpellsFrameHeal3"):GetText() == "" ) then
                NLConfig.HealSpells[3] = nil;
        else
                NLConfig.HealSpells[3] = getglobal("NLConfigSpellsFrameHeal3"):GetText();
        end
        if( getglobal("NLConfigSpellsFrameHeal4"):GetText() == "" ) then
                NLConfig.HealSpells[4] = nil;
        else
                NLConfig.HealSpells[4] = getglobal("NLConfigSpellsFrameHeal4"):GetText();
        end
        if( getglobal("NLConfigSpellsFrameHeal5"):GetText() == "" ) then
                NLConfig.HealSpells[5] = nil;
        else
                NLConfig.HealSpells[5] = getglobal("NLConfigSpellsFrameHeal5"):GetText();
        end
end

function NL_InitializeConfigNeedsFrame()
        -- loop through all allowed need monitors for this char
        for i = 0, NLConfig.NumNeeds - 1 do
                local CurrentNeed = NLConfig.Needs[i];
                if( CurrentNeed == nil ) then
                        return;
                end

                if( CurrentNeed.Name == "Health" ) then
                        NLConfigNeedsFrameNeedHealth_EditBox:SetNumber( CurrentNeed.Threshold );
                end

                if( CurrentNeed.Name == "Mana" ) then
                        NLConfigNeedsFrameNeedMana_EditBox:SetNumber( CurrentNeed.Threshold );
                end

                local frame = getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name);

                frame:ClearAllPoints();
                frame:SetPoint("TOPLEFT", NLNeedFrameName, "TOPLEFT", NL_NEED_FRAME_LEFT_INDENT, -NL_NEED_FRAME_TOP_INDENT - i * NL_NEED_FRAME_SPACING );
                getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name .. "_CheckButton"):SetChecked(CurrentNeed.Toggle);

                frame.r = CurrentNeed.BGColor.r;
                frame.g = CurrentNeed.BGColor.g;
                frame.b = CurrentNeed.BGColor.b;
                getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name .. "_ColorSwatchNormalTexture"):SetVertexColor( frame.r, frame.g, frame.b );
                frame.swatchFunc = function() NLConfig_SetColor(CurrentNeed.Name); end;
                frame.cancelFunc = function() NLConfig_CancelColor(CurrentNeed.Name); end;

                getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name):Show();
                getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name).Priority = i;

                if( CurrentNeed.Filter ~= nil ) then
                        getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name).Filter = CurrentNeed.Filter;
                end
        end
end

function NL_SaveNeedsConfig()
        -- if the frame's priority doesn't match the need priority, update the need priority
        for i = 0, NLConfig.NumNeeds - 1 do
                local frame = getglobal( NLNeedFrameName .. "Need" .. NLConfig.Needs[i].Name );
                -- move the frame that was
                if( frame.Priority ~= i ) then
                        local tempNeed = NLConfig.Needs[frame.Priority];
                        NLConfig.Needs[frame.Priority] = NLConfig.Needs[i];
                        NLConfig.Needs[i] = tempNeed;
                        i = i - 1;
                end
        end

        for i = 0, NLConfig.NumNeeds - 1 do
                local CurrentNeed = NLConfig.Needs[i];
                if( CurrentNeed == nil ) then
                        return;
                end

                if( CurrentNeed.Name == "Health" ) then
                         CurrentNeed.Threshold = getglobal(NLNeedFrameName .. "NeedHealth_EditBox"):GetNumber();
                         NLConfig.HealthNeedIndex = i;
                end

                if( CurrentNeed.Name == "Mana" ) then
                         CurrentNeed.Threshold = getglobal(NLNeedFrameName .. "NeedMana_EditBox"):GetNumber();
                         NLConfig.ManaNeedIndex = i;
                end

                if( CurrentNeed.Name == "Resurrection" ) then
                         NLConfig.ResurrectionNeedIndex = i;
                end
                
                if( getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name .. "_CheckButton"):GetChecked() == nil ) then
                        CurrentNeed.Toggle = 0;
                else
                        CurrentNeed.Toggle = 1;
                end

                local frame = getglobal( NLNeedFrameName .. "Need" .. CurrentNeed.Name );

                CurrentNeed.BGColor.r = frame.r;
                CurrentNeed.BGColor.g = frame.g;
                CurrentNeed.BGColor.b = frame.b;

                if( getglobal( NLNeedFrameName .. "Need" .. CurrentNeed.Name ).Filter ~= nil ) then
                        CurrentNeed.Filter = getglobal(NLNeedFrameName .. "Need" .. CurrentNeed.Name).Filter;
                end
        end
end

function NL_OpenColorPicker(button)
        CloseMenus();
        if ( not button ) then
                button = this;
        end
        ColorPickerFrame.func = button.swatchFunc;
        ColorPickerFrame:SetColorRGB(button.r, button.g, button.b);
        ColorPickerFrame.previousValues = {r = button.r, g = button.g, b = button.b, opacity = button.opacity};
        ColorPickerFrame.cancelFunc = button.cancelFunc;
        ColorPickerFrame:Show();
end

function NLConfig_SetColor(needName)
        local frame = getglobal( NLNeedFrameName .. "Need" .. needName );
        local r,g,b = ColorPickerFrame:GetColorRGB();
        getglobal( NLNeedFrameName .. "Need" .. needName .. "_ColorSwatchNormalTexture"):SetVertexColor(r,g,b);
        frame.r = r;
        frame.g = g;
        frame.b = b;
end

function NLConfig_CancelColor(needName)
        local frame = getglobal( NLNeedFrameName .. "Need" .. needName );
        local CurrentNeed = NLConfig.Needs[frame.Priority];

        frame.r = CurrentNeed.BGColor.r;
        frame.g = CurrentNeed.BGColor.g;
        frame.b = CurrentNeed.BGColor.b;
        getglobal( NLNeedFrameName .. "Need" .. needName .. "_ColorSwatchNormalTexture"):SetVertexColor( frame.r, frame.g, frame.b );
end

function NL_SwapNeedFrames( frame1, frame2 )
        -- swap these frames
        local tempPriority = frame1.Priority;
        frame1.Priority = frame2.Priority;
        frame2.Priority = tempPriority;

        frame1:ClearAllPoints();
        frame1:SetPoint("TOPLEFT", NLNeedFrameName, "TOPLEFT", NL_NEED_FRAME_LEFT_INDENT, -NL_NEED_FRAME_TOP_INDENT - frame1.Priority * NL_NEED_FRAME_SPACING );
        frame2:ClearAllPoints();
        frame2:SetPoint("TOPLEFT", NLNeedFrameName, "TOPLEFT", NL_NEED_FRAME_LEFT_INDENT, -NL_NEED_FRAME_TOP_INDENT - frame2.Priority * NL_NEED_FRAME_SPACING );
end

function NL_PopulateUnitFilterFrame( filter )
        if( filter == nil or filter.Type ~= "Units" ) then
                return;
        end

        if( filter.Names ~= nil ) then
                NLFilterListFrameUnitsSubframeNames:SetText( filter.Names );
        else
                NLFilterListFrameUnitsSubframeNames:SetText( "" );
        end
end

function NL_PopulatePartyFilterFrame( filter )
        if( filter == nil or filter.Type ~= "Multi" ) then
                return;
        end

        if( filter.Names == nil ) then
                filter.Names = {};
        end

        for i=1, 8 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeParty" .. i );
                if( filter.Names["Party "..i] ) then
                        frame:SetBackdropColor(0.5, 0.5, 1, 1);
                        frame.Flagged = true;
                else
                        frame:SetBackdropColor(0, 0, 0.5, 1);
                        frame.Flagged = false;
                end
        end

        if( filter.Names["My Party"] ) then
                NLFilterListFrameMultiSubframeParty9:SetBackdropColor(0.5, 0.5, 1, 1);
                NLFilterListFrameMultiSubframeParty9.Flagged = true;
        else
                NLFilterListFrameMultiSubframeParty9:SetBackdropColor(0, 0, 0.5, 1);
                NLFilterListFrameMultiSubframeParty9.Flagged = false;
        end
end

function NL_SelectAllPartyFilterFrame()
        for i=1, 9 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeParty" .. i );
                frame:SetBackdropColor(0.5, 0.5, 1, 1);
                frame.Flagged = true;
                getglobal(NLFilterListFrame.NeedFrame).Filter.Names[ getglobal( frame:GetName() .. "Text" ):GetText() ] = true;
        end
end

function NL_SelectNonePartyFilterFrame()
        for i=1, 9 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeParty" .. i );
                frame:SetBackdropColor(0, 0, 0.5, 1);
                frame.Flagged = false;
                getglobal(NLFilterListFrame.NeedFrame).Filter.Names[ getglobal( frame:GetName() .. "Text" ):GetText() ] = false;
        end
end

function NL_PopulateClassFilterFrame( filter )
        if( filter == nil or filter.Type ~= "Multi" ) then
                return;
        end

        if( filter.Names == nil ) then
                filter.Names = {};
        end

        for i = 1, 10 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeClass" .. i );
                
                local class = NLClassLists[i][UnitFactionGroup("player")];
                if( filter.Names[class] ) then
                        frame:SetBackdropColor(0.5, 0.5, 1, 1);
                        frame.Flagged = true;
                else
                        frame:SetBackdropColor(0, 0, 0.5, 1);
                        frame.Flagged = false;
                end
                frame:Show();
        end
end

function NL_SelectAllClassFilterFrame()
        for i = 1, 10 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeClass" .. i );
                frame:SetBackdropColor(0.5, 0.5, 1, 1);
                frame.Flagged = true;
                getglobal(NLFilterListFrame.NeedFrame).Filter.Names[ getglobal( frame:GetName() .. "Text" ):GetText() ] = true;
        end
end

function NL_SelectNoneClassFilterFrame()
        for i = 1, 10 do
                local frame = getglobal( "NLFilterListFrameMultiSubframeClass" .. i );
                frame:SetBackdropColor(0, 0, 0.5, 1);
                frame.Flagged = false;
                getglobal(NLFilterListFrame.NeedFrame).Filter.Names[ getglobal( frame:GetName() .. "Text" ):GetText() ] = true;
        end
end