vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
CCWatchEffectSelection = "";
local STATUS_COLOR = "|c000066FF";
local bModify = false;
local AR_DiagOpen = false;

local DisplayTable = {}

CCWatchConfig_SwatchFunc_SetColor =
{
         ["Urge"]       = function(x) CCWatch_SetColorCallback("Urge") end,
         ["Low"]        = function(x) CCWatch_SetColorCallback("Low") end,
         ["Normal"]     = function(x) CCWatch_SetColorCallback("Normal") end,
         ["Effect"]     = function(x) CCWatch_SetColorCallback("Effect") end,
}

CCWatchConfig_SwatchFunc_CancelColor =
{
         ["Urge"]       = function(x) CCWatch_CancelColorCallback("Urge", x) end,
         ["Low"]        = function(x) CCWatch_CancelColorCallback("Low", x) end,
         ["Normal"]     = function(x) CCWatch_CancelColorCallback("Normal", x) end,
         ["Effect"]     = function(x) CCWatch_CancelColorCallback("Effect", x) end,
}


--[[
function POBJI(k, v)
        local str = k.." : ";
        if type(v) ~= "table" and type(v) ~= "userdata" and type(v) ~= "function" and type(v) ~= "nil" then
                CCWatch_AddMessage(str..v);
        else
                str = str.."type = "..type(v);
                if type(v) == "table" then
                        CCWatch_AddMessage(str.." -> ");
                        POBJ(v);
                else
                        CCWatch_AddMessage(str);
                end
        end
end

function POBJ(obj)
        table.foreach(obj, POBJI);
end
--]]

local function SetButtonPickerColor(button, color)
        getglobal(button.."_SwatchTexture"):SetVertexColor(color.r, color.g, color.b);
        getglobal(button.."_BorderTexture"):SetVertexColor(color.r, color.g, color.b);
        getglobal(button).r = color.r;
        getglobal(button).g = color.g;
        getglobal(button).b = color.b;
end

function CCWatch_DisableDropDown(dropDown)
        getglobal(dropDown:GetName().."Text"):SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
        getglobal(dropDown:GetName().."Button"):Disable();
end

function CCWatch_EnableDropDown(dropDown)
        getglobal(dropDown:GetName().."Text"):SetVertexColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
        getglobal(dropDown:GetName().."Button"):Enable();
end


function UpdateSortTable()
        DisplayTable = {}
        table.foreach(CCWATCH.CCS, function (k, v) table.insert(DisplayTable, k) end);
        table.sort(DisplayTable);
end

function CCWatchOptions_Toggle()
        if(CCWatchOptionsFrame:IsVisible()) then
                CCWatchOptionsFrame:Hide();
        else
                CCWatchOptionsFrame:Show();
        end
end


--------------------------------------------------------------------------------
-- Main Frame
--------------------------------------------------------------------------------

function CCWatchOptionsBarsTab_OnClick()
        CCWatchOptionsBarsFrame:Show();
        CCWatchOptionsEffectsFrame:Hide();
        CCWatchOptionsLearnFrame:Hide();

        PlaySound("igMainMenuOptionCheckBoxOn");
end

function CCWatchOptionsEffectsTab_OnClick()
        CCWatchOptionsBarsFrame:Hide();
        CCWatchOptionsEffectsFrame:Show();
        CCWatchOptionsLearnFrame:Hide();

        PlaySound("igMainMenuOptionCheckBoxOn");
end

function CCWatchOptionsLearnTab_OnClick()
        CCWatchOptionsBarsFrame:Hide();
        CCWatchOptionsEffectsFrame:Hide();
        CCWatchOptionsLearnFrame:Show();

        PlaySound("igMainMenuOptionCheckBoxOn");
end

function CCWatchOptionsBarsFrame_OnShow()
        CCWatchOptionsBarsTabTexture:Show();
        CCWatchOptionsBarsTab:SetBackdropBorderColor(1, 1, 1, 1);
end

function CCWatchOptionsEffectsFrame_OnShow()
        CCWatchOptionsEffectsTabTexture:Show();
        CCWatchOptionsEffectsTab:SetBackdropBorderColor(1, 1, 1, 1);
end

function CCWatchOptionsLearnFrame_OnShow()
        CCWatchOptionsLearnTabTexture:Show();
        CCWatchOptionsLearnTab:SetBackdropBorderColor(1, 1, 1, 1);
end

function CCWatchOptionsBarsFrame_OnHide()
        CCWatchOptionsBarsTabTexture:Hide();
        CCWatchOptionsBarsTab:SetBackdropBorderColor(0.25, 0.25, 0.25, 1.0);
end

function CCWatchOptionsEffectsFrame_OnHide()
        CCWatchOptionsEffectsTabTexture:Hide();
        CCWatchOptionsEffectsTab:SetBackdropBorderColor(0.25, 0.25, 0.25, 1.0);
end

function CCWatchOptionsLearnFrame_OnHide()
        CCWatchOptionsLearnTabTexture:Hide();
        CCWatchOptionsLearnTab:SetBackdropBorderColor(0.25, 0.25, 0.25, 1.0);
end

--------------------------------------------------------------------------------
-- Bars Frame
--------------------------------------------------------------------------------

function CCWatchOptions_UnlockToggle()
        if CCWATCH.STATUS == 2 then
                CCWatch_BarLock();
                CCWatch_AddMessage(CCWATCH_LOCKED);
        else
                CCWatch_BarUnlock();
                CCWatch_AddMessage(CCWATCH_UNLOCKED);
        end
end

function CCWatchOptions_InvertToggle()
        CCWATCH.INVERT = not CCWATCH.INVERT;
        CCWatch_Save[CCWATCH.PROFILE].invert = CCWATCH.INVERT;
        if CCWATCH.INVERT then
                CCWatch_AddMessage(CCWATCH_INVERSION_ON);
        else
                CCWatch_AddMessage(CCWATCH_INVERSION_OFF);
        end
end

function CCWatchOptions_LeadingToggle()
        CCWATCH.LEADINGTIMER = not CCWATCH.LEADINGTIMER;
        CCWatch_Save[CCWATCH.PROFILE].LeadingTimer = CCWATCH.LEADINGTIMER;
        if CCWATCH.LEADINGTIMER then
                CCWatch_SetLeadingTimer(true);
                CCWatch_AddMessage(CCWATCH_LEADINGTIMER_ON);
        else
                CCWatch_SetLeadingTimer(false);
                CCWatch_AddMessage(CCWATCH_LEADINGTIMER_OFF);
        end
end

function CCWatchOptions_ColorOverTimeToggle()
        CCWATCH.COLOROVERTIME = not CCWATCH.COLOROVERTIME;
        CCWatch_Save[CCWATCH.PROFILE].ColorOverTime = CCWATCH.COLOROVERTIME;
        if CCWATCH.COLOROVERTIME then
                CCWatch_AddMessage(CCWATCH_COLOROVERTIME_ON);
        else
                CCWatch_AddMessage(CCWATCH_COLOROVERTIME_OFF);
        end
end

function CCWatchOptions_SetBarColorUrge()
        CCWatch_Save[CCWATCH.PROFILE].CoTUrgeValue = CCWatchOptionsBarColorUrgeEdit:GetNumber();
        CCWATCH.COTURGEVALUE = CCWatch_Save[CCWATCH.PROFILE].CoTUrgeValue;
end

function CCWatchOptions_SetBarColorLow()
        CCWatch_Save[CCWATCH.PROFILE].CoTLowValue = CCWatchOptionsBarColorLowEdit:GetNumber();
        CCWATCH.COTLOWVALUE = CCWatch_Save[CCWATCH.PROFILE].CoTLowValue;
end

function CCWatchGrowthDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsMenuGrowthDropDown";
        local info = { };

        info.text = CCWATCH_OPTION_GROWTH_OFF;
        info.value = "off";
        info.owner = this;
        info.func = CCWatchGrowthDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = CCWATCH_OPTION_GROWTH_UP;
        info.value = "up";
        info.owner = this;
        info.func = CCWatchGrowthDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
        
        info.text = CCWATCH_OPTION_GROWTH_DOWN;
        info.value = "down";
        info.owner = this;
        info.func = CCWatchGrowthDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchTimersDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsMenuTimersDropDown";
        local info = { };

        info.text = CCWATCH_OPTION_TIMERS_OFF;
        info.value = "off";
        info.owner = this;
        info.func = CCWatchTimersDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = CCWATCH_OPTION_TIMERS_ON;
        info.value = "on";
        info.owner = this;
        info.func = CCWatchTimersDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
        
        info.text = CCWATCH_OPTION_TIMERS_REVERSE;
        info.value = "reverse";
        info.owner = this;
        info.func = CCWatchTimersDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchGrowthDropDown_OnClick()
        if (this.value == "off") then
                CCWatch_Save[CCWATCH.PROFILE].growth = 0;
                CCWATCH.GROWTH = CCWatch_Save[CCWATCH.PROFILE].growth;
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_OFF);
                CCWatch_AddMessage(CCWATCH_GROW_OFF);
        elseif( this.value == "up" ) then
                CCWatch_Save[CCWATCH.PROFILE].growth = 1;
                CCWATCH.GROWTH = CCWatch_Save[CCWATCH.PROFILE].growth;
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_UP);
                CCWatch_AddMessage(CCWATCH_GROW_UP);
        elseif( this.value == "down" ) then
                CCWatch_Save[CCWATCH.PROFILE].growth = 2;
                CCWATCH.GROWTH = CCWatch_Save[CCWATCH.PROFILE].growth;
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_DOWN);
                CCWatch_AddMessage(CCWATCH_GROW_DOWN);
        end
end

function CCWatchTimersDropDown_OnClick()
        if (this.value == "off") then
                CCWatch_Save[CCWATCH.PROFILE].timers = 0;
                CCWATCH.TIMERS = CCWatch_Save[CCWATCH.PROFILE].timers;
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_OFF);
                CCWatch_AddMessage(CCWATCH_TIMERS_OFF);
        elseif( this.value == "on" ) then
                CCWatch_Save[CCWATCH.PROFILE].timers = 1;
                CCWATCH.TIMERS = CCWatch_Save[CCWATCH.PROFILE].timers;
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_ON);
                CCWatch_AddMessage(CCWATCH_TIMERS_ON);
        elseif( this.value == "reverse" ) then
                CCWatch_Save[CCWATCH.PROFILE].timers = 2;
                CCWATCH.TIMERS = CCWatch_Save[CCWATCH.PROFILE].timers;
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_REVERSE);
                CCWatch_AddMessage(CCWATCH_TIMERS_REVERSE);
        end
end

--------------------------------------------------------------------------------
-- Monitor Frame
--------------------------------------------------------------------------------

function CCWatchOptions_MonitorCCToggle()
        CCWATCH.MONITORING = bit.bxor(CCWATCH.MONITORING, ETYPE_CC);
        CCWatch_Save[CCWATCH.PROFILE].Monitoring = CCWATCH.MONITORING;
        if bit.band(CCWATCH.MONITORING, ETYPE_DEBUFF) == 0 then
                if bit.band(CCWATCH.MONITORING, ETYPE_CC) ~= 0 then
                        CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE");
                        CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE");
                else
                        CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE");
                        CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE");
                end
        end
end

function CCWatchOptions_MonitorDebuffToggle()
        CCWATCH.MONITORING = bit.bxor(CCWATCH.MONITORING, ETYPE_DEBUFF);
        CCWatch_Save[CCWATCH.PROFILE].Monitoring = CCWATCH.MONITORING;
        if bit.band(CCWATCH.MONITORING, ETYPE_CC) == 0 then
                if bit.band(CCWATCH.MONITORING, ETYPE_DEBUFF) ~= 0 then
                        CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE");
                        CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE");
                else
                        CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE");
                        CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE");
                end
        end
end

function CCWatchOptions_MonitorBuffToggle()
        CCWATCH.MONITORING = bit.bxor(CCWATCH.MONITORING, ETYPE_BUFF);
        CCWatch_Save[CCWATCH.PROFILE].Monitoring = CCWATCH.MONITORING;
        if bit.band(CCWATCH.MONITORING, ETYPE_BUFF) ~= 0 then
                CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS");
                CCWatchObject:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS");
        else
                CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS");
                CCWatchObject:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS");
        end
end

function CCWatchOptions_ArcanistToggle()
        CCWATCH.ARCANIST = not CCWATCH.ARCANIST;
        CCWatch_Save[CCWATCH.PROFILE].arcanist = CCWATCH.ARCANIST;
        if CCWATCH.ARCANIST then
                CCWATCH.CCS[CCWATCH_POLYMORPH].LENGTH = CCWATCH.CCS[CCWATCH_POLYMORPH].LENGTH + 15;
                CCWatch_AddMessage(CCWATCH_ARCANIST_ON);
        else
                CCWATCH.CCS[CCWATCH_POLYMORPH].LENGTH = CCWATCH.CCS[CCWATCH_POLYMORPH].LENGTH - 15;
                CCWatch_AddMessage(CCWATCH_ARCANIST_OFF);
        end
        CCWatchOptionsFrameArcanist:SetChecked(CCWATCH.ARCANIST);
end

function CCWatchOptions_WarnAppliedToggle()
        CCWATCH.WARNMSG = bit.bxor(CCWATCH.WARNMSG, CCW_EWARN_APPLIED);
        CCWatch_Save[CCWATCH.PROFILE].WarnMsg = CCWATCH.WARNMSG;
        CCWatchOptionsFrameWarnApplied:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_APPLIED));
end

function CCWatchOptions_WarnFadedToggle()
        CCWATCH.WARNMSG = bit.bxor(CCWATCH.WARNMSG, CCW_EWARN_FADED);
        CCWatch_Save[CCWATCH.PROFILE].WarnMsg = CCWATCH.WARNMSG;
        CCWatchOptionsFrameWarnFaded:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_FADED));
end

function CCWatchOptions_WarnBrokenToggle()
        CCWATCH.WARNMSG = bit.bxor(CCWATCH.WARNMSG, CCW_EWARN_BROKEN);
        CCWatch_Save[CCWATCH.PROFILE].WarnMsg = CCWATCH.WARNMSG;
        CCWatchOptionsFrameWarnBroken:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_BROKEN));
end

function CCWatchOptions_WarnLowTimeToggle()
        CCWATCH.WARNMSG = bit.bxor(CCWATCH.WARNMSG, CCW_EWARN_LOWTIME);
        CCWatch_Save[CCWATCH.PROFILE].WarnMsg = CCWATCH.WARNMSG;
        CCWatchOptionsFrameWarnLowTime:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_LOWTIME));
end

function CCWatchOptions_SetWarnLow()
        CCWatch_Save[CCWATCH.PROFILE].WarnLow = CCWatchOptionsFrameWarnLowEdit:GetNumber();
        CCWATCH.WARNLOW = CCWatch_Save[CCWATCH.PROFILE].WarnLow;
end

function CCWatchOptionsStyleDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsStyleDropDown";
        local info = { };

        info.text = CCWATCH_OPTION_STYLE_CURRENT;
        info.value = "normal";
        info.owner = this;
        info.func = CCWatchOptionsStyleDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = CCWATCH_OPTION_STYLE_RECENT;
        info.value = "recent";
        info.owner = this;
        info.func = CCWatchOptionsStyleDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
        
        info.text = CCWATCH_OPTION_STYLE_ALL;
        info.value = "all";
        info.owner = this;
        info.func = CCWatchOptionsStyleDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchOptionsStyleDropDown_OnClick()
        if (this.value == "normal") then
                CCWatch_Save[CCWATCH.PROFILE].style = 0;
                CCWATCH.STYLE = CCWatch_Save[CCWATCH.PROFILE].style;
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_CURRENT);
                CCWatch_AddMessage(CCWATCH_STYLE_CURRENT);
        elseif( this.value == "recent" ) then
                CCWatch_Save[CCWATCH.PROFILE].style = 1;
                CCWATCH.STYLE = CCWatch_Save[CCWATCH.PROFILE].style;
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_RECENT);
                CCWatch_AddMessage(CCWATCH_STYLE_RECENT);
        elseif( this.value == "all" ) then
                CCWatch_Save[CCWATCH.PROFILE].style = 2;
                CCWATCH.STYLE = CCWatch_Save[CCWATCH.PROFILE].style;
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_ALL);
                CCWatch_AddMessage(CCWATCH_STYLE_ALL);
        end
end


function CCWatchOptionsWarnCCDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsWarnCCDropDown";
        local info = { };

        info.text = "EMOTE";
        info.value = "EMOTE";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "SAY";
        info.value = "SAY";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
        
        info.text = "PARTY";
        info.value = "PARTY";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "RAID";
        info.value = "RAID";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "YELL";
        info.value = "YELL";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "CHANNEL";
        info.value = "CHANNEL";
        info.owner = this;
        info.func = CCWatchOptionsWarnCCDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchOptionsWarnCCDropDown_OnClick()
        if (this.value == "EMOTE") or (this.value == "SAY") or (this.value == "PARTY") 
                or (this.value == "RAID") or (this.value == "YELL") or (this.value == "CHANNEL") then
                CCWatch_Save[CCWATCH.PROFILE].WarnType = this.value;
                CCWATCH.WARNTYPE = CCWatch_Save[CCWATCH.PROFILE].WarnType;
                CCWatchOptionsWarnCCDropDownText:SetText(this.value);
                if (this.value == "CHANNEL") then
                        CCWatchOptionsFrameCustomCCEdit:Show();
                else
                        CCWatchOptionsFrameCustomCCEdit:Hide();
                end
                CCWatch_AddMessage(CCWATCH_WARNCC_SETTO..this.value);
        end
end

function CCWatchOptions_SetCustomCC()
        CCWatch_Save[CCWATCH.PROFILE].WarnCustomCC = CCWatchOptionsFrameCustomCCEdit:GetText();
        CCWATCH.WARNCUSTOMCC = CCWatch_Save[CCWATCH.PROFILE].WarnCustomCC;
end

--------------------------------------------------------------------------------
-- Learn Frame
--------------------------------------------------------------------------------

function CCWatchOptions_MonitorToggle()
end

function CCWatchOptions_WarnToggle()
end

function CCWatchOptions_UseColorToggle()
        if CCWatchOptionsEffectUseColor:GetChecked() then
                CCWatchOptionsBarColorEffect:Enable();
        else
                CCWatchOptionsBarColorEffect:Disable();
        end
end

function CCWatchOptionsEffectTypeDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsEffectTypeDropDown";
        local info = { };

        info.text = "CC";
        info.value = "cc";
        info.owner = this;
        info.func = CCWatchOptionsEffectTypeDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "DEBUFF";
        info.value = "debuff";
        info.owner = this;
        info.func = CCWatchOptionsEffectTypeDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
        
        info.text = "BUFF";
        info.value = "buff";
        info.owner = this;
        info.func = CCWatchOptionsEffectTypeDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchOptionsEffectGroupDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsEffectGroupDropDown";
        local info = { };

        info.text = "1";
        info.value = "1";
        info.owner = this;
        info.func = CCWatchOptionsEffectGroupDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "2";
        info.value = "2";
        info.owner = this;
        info.func = CCWatchOptionsEffectGroupDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "3";
        info.value = "3";
        info.owner = this;
        info.func = CCWatchOptionsEffectGroupDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "4";
        info.value = "4";
        info.owner = this;
        info.func = CCWatchOptionsEffectGroupDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = "5";
        info.value = "5";
        info.owner = this;
        info.func = CCWatchOptionsEffectGroupDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchOptionsEffectDRDropDown_OnInit()
        UIDROPDOWNMENU_INIT_MENU = "CCWatch_OptionsEffectDRDropDown";
        local info = { };

        info.text = CCWATCH_OPTION_DR_NEVER;
        info.value = "0";
        info.owner = this;
        info.func = CCWatchOptionsEffectDRDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = CCWATCH_OPTION_DR_MOBPLAYERS;
        info.value = "1";
        info.owner = this;
        info.func = CCWatchOptionsEffectDRDropDown_OnClick;
        UIDropDownMenu_AddButton(info);

        info.text = CCWATCH_OPTION_DR_PLAYERS;
        info.value = "2";
        info.owner = this;
        info.func = CCWatchOptionsEffectDRDropDown_OnClick;
        UIDropDownMenu_AddButton(info);
end

function CCWatchOptionsEffectTypeDropDown_OnClick()
        if (this.value == "cc") then
                CCWatchOptionsEffectTypeDropDownText:SetText("CC");
        elseif( this.value == "debuff" ) then
                CCWatchOptionsEffectTypeDropDownText:SetText("DEBUFF");
        elseif( this.value == "buff" ) then
                CCWatchOptionsEffectTypeDropDownText:SetText("BUFF");
        end
end

function CCWatchOptionsEffectDRDropDown_OnClick()
        if (this.value == "0") then
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_NEVER);
        elseif( this.value == "1") then
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_MOBPLAYERS);
        else
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_PLAYERS);
        end
end

function CCWatchOptionsEffectGroupDropDown_OnClick()
        CCWatchOptionsEffectGroupDropDownText:SetText(this.value);
end

function CCWatchOptionsLearnDelete_OnClick()
-- Pop alert to confirm deletion
        CCWatch_ShowDeletePrompt();
end


function CCWatchOptionsLearnClear_OnClick()
        CCWatchOptionsEffectNameEdit:SetText("");
        CCWatchOptionsEffectNameStatic:SetText("");
        CCWatchOptionsEffectDurationEdit:SetText("");
        CCWatchOptionsEffectDurationStatic:SetText("");

        CCWatchOptionsEffectTypeDropDownText:SetText("CC");
        CCWatchOptionsEffectGroupDropDownText:SetText("1");
        CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_NEVER);
        CCWatchOptionsEffectMonitor:SetChecked(true);
        CCWatchOptionsEffectWarn:SetChecked(false);
        CCWatchOptionsEffectUseColor:SetChecked(false);
        CCWatchOptionsBarColorEffect:Disable();
        SetButtonPickerColor("CCWatchOptionsBarColorEffect", {r=0,g=0,b=0});

        CCWatchOptionsLearnModify:SetText("Add");
        bModify = false;

        CCWatch_EnableDropDown(CCWatchOptionsEffectTypeDropDown);
        CCWatch_EnableDropDown(CCWatchOptionsEffectGroupDropDown);
        CCWatch_EnableDropDown(CCWatchOptionsEffectDRDropDown);
        CCWatchOptionsEffectNameEdit:Show();
        CCWatchOptionsEffectDurationEdit:Show();
end

function CCWatchOptionsLearnModify_OnClick()
        local effect = CCWatchOptionsEffectNameEdit:GetText();
        local duration = CCWatchOptionsEffectDurationEdit:GetNumber();
        local group = CCWatchOptionsEffectGroupDropDownText:GetText();
        local stype = CCWatchOptionsEffectTypeDropDownText:GetText();
        local sdr = CCWatchOptionsEffectDRDropDownText:GetText();
        local monitor = CCWatchOptionsEffectMonitor:GetChecked();
        local warn = CCWatchOptionsEffectWarn:GetChecked();

        local color = {r=0, g=0, b=0};

        local etype;
        local edr;
        if stype == "BUFF" then
                etype = ETYPE_BUFF;
        elseif stype == "DEBUFF" then
                etype = ETYPE_DEBUFF;
        else
                etype = ETYPE_CC;
        end

        if dr == CCWATCH_OPTION_DR_NEVER then
                edr = 0;
        elseif sdr == CCWATCH_OPTION_DR_MOBPLAYERS then
                edr = 1;
        else
                edr = 2;
        end

        if effect == "" then
                message("Invalid Effect name");
                return;
        end
        if duration <= 0 then
                message("Invalid duration.");
                return;
        end

        if CCWatchOptionsEffectUseColor:GetChecked() then
                color.r = CCWatchOptionsBarColorEffect.r;
                color.g = CCWatchOptionsBarColorEffect.g;
                color.b = CCWatchOptionsBarColorEffect.b;
        else
                color = nil;
        end

        if bModify then
-- modifying
                -- check if existing custom effect
                if CCWatch_Save[CCWATCH.PROFILE].SavedCC[effect] ~= nil then
                        if effect ~= CCWatchEffectSelection then -- skillname change...
                                -- remove old effect
                                CCWATCH.CCS[CCWatchEffectSelection] = nil;
                                CCWatch_Save[CCWATCH.PROFILE].ConfCC[CCWatchEffectSelection] = nil;
                                CCWatch_Save[CCWATCH.PROFILE].SavedCC[CCWatchEffectSelection] = nil;
                        end
                        -- add/update effect
                        CCWatchAddEffect(false, effect, group, etype, duration, edr, monitor, warn, color);
                else -- if not we are modifying a builtin effect
                        if effect ~= CCWatchEffectSelection then -- skillname change...
                                message("WARNING : adding an effect require to select the NEW button");
                        end
                        CCWatchAddEffect(true, effect, group, etype, duration, edr, monitor, warn, color);
                end
        else
-- add
                if CCWATCH.CCS[effect] ~= nil then
                        message("Effect '"..effect.."' already exist.\nPlease select Edit to modify it");
                        return;
                else
                        CCWatchAddEffect(false, effect, group, etype, duration, edr, monitor, warn, color);
                end
        end
        UpdateSortTable();      
        CCWatchOptionsEffects_Update();
        CCWatch_AddMessage(CCWATCH_EFFECT.." "..effect..CCWATCH_ADDEDMODIFIED);
end

--------------------------------------------------------------------------------
-- Custom effect management
--------------------------------------------------------------------------------

function CCWatchAddEffect(builtin, effect, group, etype, duration, diminishes, monitor, warn, color)
        local iWarn;
        if warn then
                iWarn = 1;
        else
                iWarn = 0;
        end
        CCWATCH.CCS[effect] = {
                GROUP = tonumber(group),
                ETYPE = etype,
                LENGTH = duration,
                DIMINISHES = diminishes,
                MONITOR = monitor,
                WARN = iWarn,
                COLOR = color,

                TARGET = "",
                PLAYER = nil,
                TIMER_START = 0,
                TIMER_END = 0,
                DIMINISH = 1
        };

        if builtin then
                CCWatch_Save[CCWATCH.PROFILE].ConfCC[effect] = {
                        MONITOR = monitor,
                        WARN = iWarn,
                        COLOR = color
                };
        else
                CCWatch_Save[CCWATCH.PROFILE].SavedCC[effect] = {
                        GROUP = tonumber(group),
                        ETYPE = etype,
                        LENGTH = duration,
                        DIMINISHES = diminishes,
                        MONITOR = monitor,
                        WARN = iWarn,
                        COLOR = color
                };
        end
end

function CCWatch_SetColorCallback(id)
        local iRed, iGreen, iBlue = ColorPickerFrame:GetColorRGB();
        local swatch, button, border;

        button = getglobal("CCWatchOptionsBarColor" .. id);
        swatch = getglobal("CCWatchOptionsBarColor" .. id .. "_SwatchTexture");
        border = getglobal("CCWatchOptionsBarColor" .. id .. "_BorderTexture");

        swatch:SetVertexColor(iRed, iGreen, iBlue);
        border:SetVertexColor(iRed, iGreen, iBlue);
        button.r = iRed;
        button.g = iGreen;
        button.b = iBlue;

        if id == "Urge" then
                CCWATCH.COTURGECOLOR.r = iRed;
                CCWATCH.COTURGECOLOR.g = iGreen;
                CCWATCH.COTURGECOLOR.b = iBlue;
                CCWatch_Save[CCWATCH.PROFILE].CoTUrgeColor = CCWATCH.COTURGECOLOR;
        elseif id == "Low" then
                CCWATCH.COTLOWCOLOR.r = iRed;
                CCWATCH.COTLOWCOLOR.g = iGreen;
                CCWATCH.COTLOWCOLOR.b = iBlue;
                CCWatch_Save[CCWATCH.PROFILE].CoTLowColor = CCWATCH.COTLOWCOLOR;
        elseif id == "Normal" then
                CCWATCH.COTNORMALCOLOR.r = iRed;
                CCWATCH.COTNORMALCOLOR.g = iGreen;
                CCWATCH.COTNORMALCOLOR.b = iBlue;
                CCWatch_Save[CCWATCH.PROFILE].CoTNormalColor = CCWATCH.COTNORMALCOLOR;
        end
end

function CCWatch_CancelColorCallback(id, prev)
        local iRed = prev.r;
        local iGreen = prev.g;
        local iBlue = prev.b;

        local swatch, button, border;

        button = getglobal("CCWatchOptionsBarColor" .. id);
        swatch = getglobal("CCWatchOptionsBarColor" .. id .. "_SwatchTexture");
        border = getglobal("CCWatchOptionsBarColor" .. id .. "_BorderTexture");
        
        swatch:SetVertexColor(iRed, iGreen, iBlue);
        border:SetVertexColor(iRed, iGreen, iBlue);
        button.r = iRed;
        button.g = iGreen;
        button.b = iBlue;
end



function CCWatchOptionsLearnFillFields()
        if CCWatchEffectSelection == nil then
                return;
        end

        -- check if builtin effect to disable editing
        if CCWatch_Save[CCWATCH.PROFILE].SavedCC[CCWatchEffectSelection] == nil then
                CCWatch_DisableDropDown(CCWatchOptionsEffectTypeDropDown);
                CCWatch_DisableDropDown(CCWatchOptionsEffectGroupDropDown);
                CCWatch_DisableDropDown(CCWatchOptionsEffectDRDropDown);
                -- hack because I have no other idea
                CCWatchOptionsEffectNameEdit:Hide();
                CCWatchOptionsEffectDurationEdit:Hide();
                CCWatchOptionsEffectNameStatic:SetText(CCWatchEffectSelection);
                CCWatchOptionsEffectDurationStatic:SetText(CCWATCH.CCS[CCWatchEffectSelection].LENGTH);
        else
                CCWatch_EnableDropDown(CCWatchOptionsEffectTypeDropDown);
                CCWatch_EnableDropDown(CCWatchOptionsEffectGroupDropDown);
                CCWatch_EnableDropDown(CCWatchOptionsEffectDRDropDown);
                CCWatchOptionsEffectNameEdit:Show();
                CCWatchOptionsEffectDurationEdit:Show();
                CCWatchOptionsEffectNameStatic:SetText("");
                CCWatchOptionsEffectDurationStatic:SetText("");
        end
        CCWatchOptionsEffectNameEdit:SetText(CCWatchEffectSelection);
        CCWatchOptionsEffectDurationEdit:SetText(CCWATCH.CCS[CCWatchEffectSelection].LENGTH);

        if CCWATCH.CCS[CCWatchEffectSelection].ETYPE == ETYPE_BUFF then
                CCWatchOptionsEffectTypeDropDownText:SetText("BUFF");
        elseif CCWATCH.CCS[CCWatchEffectSelection].ETYPE == ETYPE_DEBUFF then
                CCWatchOptionsEffectTypeDropDownText:SetText("DEBUFF");
        else
                CCWatchOptionsEffectTypeDropDownText:SetText("CC");
        end
        CCWatchOptionsEffectGroupDropDownText:SetText(CCWATCH.CCS[CCWatchEffectSelection].GROUP);

        if CCWATCH.CCS[CCWatchEffectSelection].DIMINISHES == 0 then
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_NEVER);
        elseif CCWATCH.CCS[CCWatchEffectSelection].DIMINISHES == 1 then
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_MOBPLAYERS);
        else
                CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_PLAYERS);
        end

        CCWatchOptionsEffectMonitor:SetChecked(CCWATCH.CCS[CCWatchEffectSelection].MONITOR);
        local bFlag = CCWATCH.CCS[CCWatchEffectSelection].WARN > 0;
        CCWatchOptionsEffectWarn:SetChecked(bFlag);

        if CCWATCH.CCS[CCWatchEffectSelection].COLOR ~= nil then
                CCWatchOptionsEffectUseColor:SetChecked(true);
                CCWatchOptionsBarColorEffect:Enable();
                SetButtonPickerColor("CCWatchOptionsBarColorEffect", CCWATCH.CCS[CCWatchEffectSelection].COLOR);
        else
                CCWatchOptionsEffectUseColor:SetChecked(false);
                CCWatchOptionsBarColorEffect:Disable();
                SetButtonPickerColor("CCWatchOptionsBarColorEffect", {r=1,g=1,b=1});
        end

        bModify = true;
        CCWatchOptionsLearnModify:SetText("Modify");
end

function CCWatch_DeleteLearntEffect()
        CCWATCH.CCS[CCWatchEffectSelection] = nil;
--      CCWatch_Save[CCWATCH.PROFILE].SavedCC[CCWatchEffectSelection] = nil;
        CCWatch_Save[CCWATCH.PROFILE].SavedCC[CCWatchEffectSelection] = {}

        UpdateSortTable();
        CCWatchOptionsEffects_Update();
        CCWatch_OpenDiagToggle();

        CCWatch_AddMessage(CCWATCH_REMOVED_NOTICE..CCWatchEffectSelection..".");
        CCWatchEffectSelection = "";
end


function CCWatchOptions_OnLoad()
        UIPanelWindows['CCWatchOptionsFrame'] = {area = 'center', pushable = 1};
end

--------------------------------------------------------------------------------
-- Init
--------------------------------------------------------------------------------
function CCWatchOptions_Init()
        CCWatchSliderAlpha:SetValue(CCWATCH.ALPHA);
        CCWatchSliderScale:SetValue(CCWATCH.SCALE);
        CCWatchSliderWidth:SetValue(CCWATCH.WIDTH);

        CCWatchOptionsFrameMonitorCC:SetChecked(bit.band(CCWATCH.MONITORING, ETYPE_CC));
        CCWatchOptionsFrameMonitorDebuff:SetChecked(bit.band(CCWATCH.MONITORING, ETYPE_DEBUFF));
        CCWatchOptionsFrameMonitorBuff:SetChecked(bit.band(CCWATCH.MONITORING, ETYPE_BUFF));

        CCWatchOptionsFrameUnlock:SetChecked(CCWATCH.STATUS == 2);
        CCWatchOptionsFrameInvert:SetChecked(CCWATCH.INVERT);
        CCWatchOptionsFrameArcanist:SetChecked(CCWATCH.ARCANIST);
        CCWatchOptionsWarnCCDropDownText:SetText(CCWATCH.WARNTYPE);
        CCWatchOptionsFrameCustomCCEdit:SetText(CCWATCH.WARNCUSTOMCC);
        if CCWATCH.WARNTYPE == "CHANNEL" then
                CCWatchOptionsFrameCustomCCEdit:Show();
        else
                CCWatchOptionsFrameCustomCCEdit:Hide();
        end

        CCWatchOptionsEffectTypeDropDownText:SetText("CC");
        CCWatchOptionsEffectGroupDropDownText:SetText("1");
        CCWatchOptionsEffectDRDropDownText:SetText(CCWATCH_OPTION_DR_NEVER);
        CCWatchOptionsEffectMonitor:SetChecked(true);
        CCWatchOptionsEffectWarn:SetChecked(false);

        if CCWATCH.GROWTH == 0 then
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_OFF);
        elseif CCWATCH.GROWTH == 1 then
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_UP);
        else
                CCWatchGrowthDropDownText:SetText(CCWATCH_OPTION_GROWTH_DOWN);
        end

        if CCWATCH.TIMERS == 0 then
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_OFF);
        elseif CCWATCH.TIMERS == 1 then
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_ON);
        else
                CCWatchTimersDropDownText:SetText(CCWATCH_OPTION_TIMERS_REVERSE);
        end

        if CCWATCH.STYLE == 0 then
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_CURRENT);
        elseif CCWATCH.STYLE == 1 then
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_RECENT);
        else
                CCWatchOptionsStyleDropDownText:SetText(CCWATCH_OPTION_STYLE_ALL);
        end

        UpdateSortTable();
        CCWatchOptionsEffects_Update();

        CCWatchOptionsUseColorOverTime:SetChecked(CCWATCH.COLOROVERTIME);

        CCWatchOptionsBarColorUrge.swatchFunc = CCWatchConfig_SwatchFunc_SetColor["Urge"];
        CCWatchOptionsBarColorUrge.cancelFunc = CCWatchConfig_SwatchFunc_CancelColor["Urge"];
        CCWatchOptionsBarColorLow.swatchFunc = CCWatchConfig_SwatchFunc_SetColor["Low"];
        CCWatchOptionsBarColorLow.cancelFunc = CCWatchConfig_SwatchFunc_CancelColor["Low"];
        CCWatchOptionsBarColorNormal.swatchFunc = CCWatchConfig_SwatchFunc_SetColor["Normal"];
        CCWatchOptionsBarColorNormal.cancelFunc = CCWatchConfig_SwatchFunc_CancelColor["Normal"];

        CCWatchOptionsBarColorEffect.swatchFunc = CCWatchConfig_SwatchFunc_SetColor["Effect"];
        CCWatchOptionsBarColorEffect.cancelFunc = CCWatchConfig_SwatchFunc_CancelColor["Effect"];
        CCWatchOptionsBarColorEffect:Disable();

        SetButtonPickerColor("CCWatchOptionsBarColorUrge", CCWATCH.COTURGECOLOR);
        SetButtonPickerColor("CCWatchOptionsBarColorLow", CCWATCH.COTLOWCOLOR);
        SetButtonPickerColor("CCWatchOptionsBarColorNormal", CCWATCH.COTNORMALCOLOR);

        CCWatchOptionsFrameWarnApplied:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_APPLIED));
        CCWatchOptionsFrameWarnFaded:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_FADED));
        CCWatchOptionsFrameWarnBroken:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_BROKEN));
        CCWatchOptionsFrameWarnLowTime:SetChecked(bit.band(CCWATCH.WARNMSG, CCW_EWARN_LOWTIME));

        CCWatchOptionsFrameLeading:SetChecked(CCWATCH.LEADINGTIMER);

        CCWatchOptionsBarsFrame:Show();
        CCWatchOptionsEffectsTabTexture:Hide();
        CCWatchOptionsEffectsTab:SetBackdropBorderColor(0.25, 0.25, 0.25, 1.0);
        CCWatchOptionsLearnTabTexture:Hide();
        CCWatchOptionsLearnTab:SetBackdropBorderColor(0.25, 0.25, 0.25, 1.0);

        CCWatchOptionsBarColorUrgeEdit:SetText(CCWATCH.COTURGEVALUE);
        CCWatchOptionsBarColorLowEdit:SetText(CCWATCH.COTLOWVALUE);
        CCWatchOptionsFrameWarnLowEdit:SetText(CCWATCH.WARNLOW);
end

--------------------------------------------------------------------------------
-- Scroll Frame functions
--------------------------------------------------------------------------------

local item;
local CCcount;
local curoffset;

local function EffectsUpdate(k, v)
        item = item + 1;
        if (curoffset > item) or ((item - curoffset) >= 11) then
                return;
        end

        local itemSlot = getglobal("CCWatchOptionsEffectsItem"..(item-curoffset+1));
        local name = v;
        if (name == CCWatchEffectSelection) then
                itemSlot:SetTextColor(1, 1, 0);
        else
                itemSlot:SetTextColor(1, 1, 1);
        end
        itemSlot:SetText(name);
        itemSlot:Show();
end

function CCWatchOptionsEffects_Update()
--      CCWatch_AddMessage("CCWatchOptionsEffects_Update");

        CCcount = 0;

        CCcount = table.getn(DisplayTable);

        FauxScrollFrame_Update(CCWatchOptionsEffectsListScrollFrame, CCcount, 11, 16);

        item = -1;
        curoffset = FauxScrollFrame_GetOffset(CCWatchOptionsEffectsListScrollFrame);
--      CCWatch_AddMessage("We're at "..curoffset);

        table.foreach(DisplayTable, EffectsUpdate);
end

-- Tooltip Window

function CCWatchOptionsEffects_OnEnter()
--      CCWatch_AddMessage("CCWatchOptionsEffects_OnEnter");
        
        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");

        local spellname = this:GetText();
        if spellname == nil then
                return;
        end

        if CCWATCH.CCS[spellname] == nil then
                CCWatch_AddMessage("Error : '"..spellname.."' not found in effect array.");
                return;
        end
        local str = spellname.."\nDuration: "..CCWATCH.CCS[spellname].LENGTH.."\nType: ";
        if CCWATCH.CCS[spellname].ETYPE == ETYPE_BUFF then
                str = str.."Buff";
        elseif CCWATCH.CCS[spellname].ETYPE == ETYPE_DEBUFF then
                str = str.."DeBuff";
        else
                str = str.."CC";
        end
        str = str.."\nDR: ";
        if CCWATCH.CCS[spellname].DIMINISHES == 0 then
                str = str..CCWATCH_OPTION_DR_NEVER;
        elseif CCWATCH.CCS[spellname].DIMINISHES == 1 then
                str = str..CCWATCH_OPTION_DR_MOBPLAYERS;
        else
                str = str..CCWATCH_OPTION_DR_PLAYERS;
        end
        str = str.."\nMonitor: ";
        if CCWATCH.CCS[spellname].MONITOR then
                str = str.."on";
        else
                str = str.."off";
        end
        str = str.."\nWarn: ";
        if CCWATCH.CCS[spellname].WARN > 0 then
                str = str.."on";
        else
                str = str.."off";
        end

        GameTooltip:SetText(str, 1, 1, 1);
end


-- Confirm dialog frame

function CCWatch_OpenDiagToggle()
        if (CCWatch_DiagOpen) then
                CCWatch_DiagOpen = false;
        else
                CCWatch_DiagOpen = true;
        end
end

function CCWatch_ShowDeletePrompt(cost) 
        StaticPopupDialogs["CCWATCH_DELETE_EFFECT"] = {
                text = TEXT(STATUS_COLOR..CCWATCH_FULLVERSION.." (Elwen)\n\n\n"..CCWATCH_LEARN_DELETE_PROMPT.."'"..CCWatchEffectSelection.."' ?"),
                button1 = TEXT(OKAY),
                button2 = TEXT(CANCEL),
                OnAccept = function()
                        CCWatch_DeleteLearntEffect();
                end,
                OnShow = function()
                        CCWatch_OpenDiagToggle();
                end,
                OnHide = function()
                        CCWatch_OpenDiagToggle();
                end,
                showAlert = 1,
                timeout = 0,
                exclusive = 0,
                whileDead = 1,
                interruptCinematic = 1
        };
        PlaySound("QUESTADDED");
        StaticPopup_Show("CCWATCH_DELETE_EFFECT");
end