vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Cooldown Count

        By sarf

        This mod allows you to see the amount of time left until the cooldown expires on an action button.

        Thanks goes to Drex of the #cosmostesters channel for suggesting this!

        $Id$
        $Rev$
        $LastChangedBy$
        $Date$
        
        
   ]]

-- Constants
COOLDOWNCOUNT_CUTOFF_TIME = 2; -- how many seconds the cooldown has to be for CooldownCount to be displayed
COOLDOWNCOUNT_HOUR_MINUTES_FORMAT_LIMIT = 3600;
COOLDOWNCOUNT_MINUTES_SECONDS_FORMAT_LIMIT = 60;

COOLDOWNCOUNT_WIDTH = 64;
COOLDOWNCOUNT_HEIGHT = 32;

-- how many seconds between updates
COOLDOWNCOUNT_UPDATE_TIME = 0.25;

-- how many seconds the flashing will occur (maximum)
COOLDOWNCOUNT_MAXIMUM_FLASH_TIME = 10;

-- Variables
CooldownCount_NoSpaces = 0;
CooldownCount_Enabled = 0;
CooldownCount_UseLongTimerDescriptions = 0;
CooldownCount_UseLongTimerDescriptionsForSeconds = 0;
CooldownCount_TimeBetweenFlashes = 0.5;
CooldownCount_HideUntilTimeLeft = 0;
CooldownCount_RogueStealth = 0;

CooldownCount_Saved_CooldownFrame_SetTimer = nil;
CooldownCount_Cosmos_Registered = 0;

CooldownCount_LastUpdate = 0;

CooldownCount_UserScale = 2;

CooldownCount_FramesAndTheirButtonNames = {
};

CooldownCountColorDefaultNormal = { 1.0, 0.82, 0.0 };
CooldownCountColorDefaultFlash = { 1.0, 0.12, 0.12 };
CooldownCountAlpha = 1.0;

CooldownCountOptions = { 
        color = { 
                normal = { 1.0, 0.82, 0.0 }; 
                flash = { 1.0, 0.12, 0.12 };
        };
        alpha = 1.0;
};

CooldownCount_ButtonNames = {
        "ActionButton", "BonusActionButton", 
        "MultiBarBottomLeftButton", "MultiBarBottomRightButton", "MultiBarRightButton", "MultiBarLeftButton",
};





CooldownCount_DisplayValues_WithSpace = nil;
CooldownCount_DisplayValues_WithoutSpace = nil;

function CooldownCount_PrecalcDisplayValues()
        CooldownCount_DisplayValues_WithSpace = {};
        CooldownCount_DisplayValues_WithoutSpace = {};
        for i = 1, 60 do 
                CooldownCount_DisplayValues_WithSpace[i] = i.."";
                CooldownCount_DisplayValues_WithoutSpace[i] = i.."";
                CooldownCount_DisplayValues_WithSpace[i*60] = i.." m";
                CooldownCount_DisplayValues_WithoutSpace[i*60] = i.."m";
        end
        for i = 1, 96 do 
                CooldownCount_DisplayValues_WithSpace[i*60*60] = i.." h";
                CooldownCount_DisplayValues_WithoutSpace[i*60*60] = i.."h";
        end
end

-- executed on load, calls general set-up functions
function CooldownCount_OnLoad()
        CooldownCount_PrecalcDisplayValues();
        CooldownCount_Register();
        local f = CooldownCountFrame;
        f:RegisterEvent("VARIABLES_LOADED");
end

function CooldownCount_SetFlashSpeed(speed, quiet)
        if ( speed ) then
                if ( speed ~= CooldownCount_TimeBetweenFlashes ) then
                        if ( not quiet ) then
                                CooldownCount_Print(format(COOLDOWNCOUNT_CHAT_FLASHSPEED, speed));
                        end
                        CooldownCount_TimeBetweenFlashes = speed;
                end
        end
end

function CooldownCount_SetHideUntilTimeLeft(value, quiet)
        if ( value ) then
                if ( CooldownCount_HideUntilTimeLeft ~= value ) then
                        if ( not quiet ) then
                                CooldownCount_Print(format(COOLDOWNCOUNT_CHAT_HIDEUNTILTIMELEFT, value));
                        end
                        CooldownCount_HideUntilTimeLeft = value;
                        CooldownCount_DoUpdate(true);
                end
        end
end

function CooldownCount_SetUserScale(scale, quiet)
        if ( scale ) then
                if ( scale ~= CooldownCount_UserScale ) then
                        if ( not quiet ) then
                                CooldownCount_Print(format(COOLDOWNCOUNT_CHAT_USERSCALE, scale));
                        end
                        CooldownCount_UserScale = scale;
                        CooldownCount_DoUpdate(true);
                end
        end
end

function CooldownCount_CooldownFrame_SetTimer(this, start, duration, enable)
        CooldownCount_Saved_CooldownFrame_SetTimer(this, start, duration, enable);
        CooldownCount_UpdateCooldownCount(this, start, duration, enable);
end

function CooldownCount_GenerateButtonUpdateList()
        local updateList = {};
        local name = nil;
        for k, v in CooldownCount_ButtonNames do
                for i = 1, 12 do
                        name = v..i;
                        if ( getglobal(name) ) then
                                table.insert(updateList, name);
                        end
                end
        end
        return updateList;
end

CooldownCount_ButtonUpdateList = nil;

function CooldownCount_RegenerateList()
        CooldownCount_ButtonUpdateList = CooldownCount_GenerateButtonUpdateList();
end

function CooldownCount_DoUpdate(force)
        local curTime = GetTime();
        if ( not CooldownCount_ButtonUpdateList ) then
                CooldownCount_RegenerateList();
        end
        for k, v in CooldownCount_ButtonUpdateList do
                CooldownCount_DoUpdateCooldownCount(v, force);
        end
        CooldownCount_LastUpdate = curTime;
end

function CooldownCount_OnUpdate(elapsed)
        local curTime = GetTime();
        if ( ( CooldownCount_LastUpdate ) and ( CooldownCount_LastUpdate > 0 ) ) then
                if ( ( CooldownCount_LastUpdate + COOLDOWNCOUNT_UPDATE_TIME) < curTime ) then
                        CooldownCount_DoUpdate();
                end
        else
                CooldownCount_LastUpdate = curTime;
        end
end

function CooldownCount_GetFormattedNumber(number)
        if (strlen(number) < 2 ) then
                return "0"..number;
        else
                return number;
        end
end

function CooldownCount_GetFormattedTime(time)
        local newTime = math.floor(time);
        
        local formattedTime = "";
        
        local arr = CooldownCount_DisplayValues_WithSpace;
        if ( CooldownCount_NoSpaces == 1 ) then arr = CooldownCount_DisplayValues_WithoutSpace; end
        if ( newTime > COOLDOWNCOUNT_HOUR_MINUTES_FORMAT_LIMIT ) then
                local hours = 0;
                
                if ( CooldownCount_UseLongTimerDescriptions == 1 ) then
                        hours = math.floor((newTime / 3600));
                        local minutes = math.floor( (( newTime - ( 3600 * hours ) )  / 60) + 0.5 );
                        formattedTime = format(COOLDOWNCOUNT_HOUR_MINUTES_FORMAT, hours, CooldownCount_GetFormattedNumber(minutes));
                else
                        hours = math.floor((newTime / 3600)+0.5);
                        --formattedTime = format(COOLDOWNCOUNT_HOURS_FORMAT, hours);
                        formattedTime = arr[hours*3600];
                end
                
        elseif ( newTime > COOLDOWNCOUNT_MINUTES_SECONDS_FORMAT_LIMIT ) then
                local minutes = 0;
                if ( CooldownCount_UseLongTimerDescriptions == 1 ) then
                        minutes = math.floor( ( newTime  / 60 ));
                        local seconds = math.ceil( newTime - ( 60 * minutes ));
                        formattedTime = format(COOLDOWNCOUNT_MINUTES_SECONDS_FORMAT, minutes, CooldownCount_GetFormattedNumber(seconds));
                else
                        minutes = math.ceil( ( newTime  / 60 ));
                        --formattedTime = format(COOLDOWNCOUNT_MINUTES_FORMAT, minutes);
                        formattedTime = arr[minutes*60];
                end
        else
                --[[
                if ( CooldownCount_UseLongTimerDescriptionsForSeconds == 1 ) then
                        formattedTime = format(COOLDOWNCOUNT_SECONDS_LONG_FORMAT, newTime);
                else
                        --formattedTime = format(COOLDOWNCOUNT_SECONDS_FORMAT, newTime);
                        formattedTime = arr[newTime];
                end
                ]]--
                formattedTime = format(COOLDOWNCOUNT_SECONDS_FORMAT, newTime);
        end
        
        return formattedTime;
end     

--/script CooldownCount_CooldownFrame_SetTimer(getglobal("SecondActionButton3Cooldown"), 544630, 300, 1);
--/script getglobal("SecondActionButton3CooldownCount"):SetText("15"); getglobal("SecondActionButton3CooldownCount"):Show();
--/script Print(getglobal("SecondActionButton3CooldownCount"):GetText());

CooldownCount_OneLetterScale = 1.5;
CooldownCount_TwoLetterScale = 1;
CooldownCount_ThreeLetterScale = 0.66;
CooldownCount_FourLetterScale = 0.5;

CooldownCount_PrecalculatedSizes = {
        [1] = 1,
        [2] = 0.8,
        [3] = 0.7,
        [4] = 0.5,
        [5] = 0.4
};

function CooldownCount_GetAppropriateScale(newTime, noAutoScale)
        if ( not newTime ) then
                newTime = "";
        end
        local lenWithoutSpaces = strlen(string.gsub(newTime, " ", ""));
        local len = strlen(newTime);
        local lenSpaces = len-lenWithoutSpaces;
        local scale = (2 / (lenWithoutSpaces + floor(lenSpaces/2)));
        if ( noAutoScale ) then 
                scale = 1; 
        else
                if ( lenWithoutSpaces < len ) then
                        scale = (2 / len);
                end
                if ( CooldownCount_PrecalculatedSizes[len] ) then
                        scale = CooldownCount_PrecalculatedSizes[len];
                else
                        for k, v in CooldownCount_PrecalculatedSizes do
                                if ( k >= len ) then
                                        scale = v;
                                        break;
                                end
                        end
                end
        end
        if ( scale > 1 ) then scale = 1; end
        if ( CooldownCount_UserScale ) and ( CooldownCount_UserScale > 0 ) then 
                scale = scale * CooldownCount_UserScale;
        end
        if ( not noAutoScale ) then if ( scale > 2 ) then scale = 2; end end
        if ( noAutoScale ) then if ( scale > 2 ) then scale = 2; end end
        return scale;
end

CooldownCount_BasePosition = "CENTER";
CooldownCount_RelativeToPosition = "CENTER";

function CooldownCount_DoUpdateCooldownCount(name, force)
        local cooldownName = name.."Cooldown";
        local parent = getglobal(name);
        local icon = getglobal(name.."Icon");
        local buttonCooldown = getglobal(cooldownName);
        local cooldownCount = getglobal(cooldownName.."Count");
        local cooldownCountFrame = getglobal(cooldownName.."CountFrame");
        
        local debug = false;
        
        if ( ( ( not parent ) or ( not parent:IsVisible() ) ) or ( ( icon ) and ( not icon:IsVisible() ) ) ) then
                if ( cooldownCount ) then
                        cooldownCount:Hide();
                end
                if ( cooldownCountFrame ) then
                        cooldownCountFrame:Hide();
                end
                return;
        else
                local frameLevel = parent:GetFrameLevel();
                if ( cooldownCountFrame ) then
                        cooldownCountFrame:SetFrameLevel(frameLevel+4);
                end
                if ( cooldownCount ) then
                        cooldownCount:SetWidth(COOLDOWNCOUNT_WIDTH);
                        cooldownCount:SetHeight(COOLDOWNCOUNT_HEIGHT);
                end
        end

        local cooldownCountValuesName = (cooldownName.."CountValues");
        local cooldownCountValues = getglobal(cooldownCountValuesName);
        if ( not cooldownCountValues ) then
                if ( cooldownCount ) then
                        cooldownCount:Hide();
                end
                if ( cooldownCountFrame ) then
                        cooldownCountFrame:Hide();
                end
                return;
        end
        local start = cooldownCountValues[1];
        local duration = cooldownCountValues[2];
        local enable = cooldownCountValues[3];
        if ( (CooldownCount_Enabled == 1) and ( start > 0 and duration > 0) ) then
                local remainingTimeCutOff = COOLDOWNCOUNT_CUTOFF_TIME;
                local remainingTime = -1;
                local flashTimeMax = COOLDOWNCOUNT_MAXIMUM_FLASH_TIME;
                local flashTime = duration / 4;
                if ( flashTime > flashTimeMax ) then
                        flashTime = flashTimeMax;
                end
                
                if ( start <= 0 ) then
                        remainingTime = -1;
                else
                        remainingTime = ceil(( start + duration ) - GetTime());
                end
                
                if ( ( cooldownCount ) and ( cooldownCountFrame ) ) then
                        --Print(format("Remaining time : %d", remainingTime));
                        if ( ( not cooldownCount:IsVisible() ) and ( duration <= remainingTimeCutOff ) ) then
                                --if ( debug ) then Print("cut off engaged lixom"); end
                                return;
                        end
                        if ( ( remainingTime <= 0 ) ) then
                                if ( cooldownCount:IsVisible() ) then
                                        cooldownCount:Hide();
                                end
                                if ( cooldownCountFrame:IsVisible() ) then
                                        cooldownCountFrame:Hide();
                                end
                        else
                                if ( CooldownCount_HideUntilTimeLeft > 0 ) then
                                        if ( CooldownCount_HideUntilTimeLeft < remainingTime ) then
                                                cooldownCount:Hide();
                                                return;
                                        else
                                                cooldownCount:Show();
                                        end
                                end
                                local newTime = CooldownCount_GetFormattedTime(remainingTime)
                                if ( ( cooldownCount.flashing ) ) then
                                        if ( ( not cooldownCount.flashTime ) or ( (cooldownCount.flashTime + CooldownCount_TimeBetweenFlashes) < GetTime() ) ) then
                                                if ( cooldownCount.flashingon ) then
                                                        local r, g, b = unpack(CooldownCountOptions.color.normal);
                                                        cooldownCount:SetVertexColor(r, g, b);
                                                        cooldownCount.flashingon = false;
                                                else
                                                        local r, g, b = unpack(CooldownCountOptions.color.flash);
                                                        cooldownCount:SetVertexColor(r, g, b);
                                                        cooldownCount.flashingon = true;
                                                end
                                                cooldownCount.flashTime = GetTime();
                                        end
                                else
                                        local r, g, b = unpack(CooldownCountOptions.color.normal);
                                        cooldownCount:SetVertexColor(r, g, b);
                                        newTimeString = newTime;
                                end
                                --Print(format("NewTime : %s", newTime));
                                cooldownCount:SetAlpha(CooldownCountOptions.alpha);
                                
                                local oldTime = cooldownCount:GetText();
                                
                                if ( newTime ~= oldTime ) or ( force ) then
                                        cooldownCount:SetText(newTime);
                                        local oldScale = getglobal(cooldownName.."CountFrameScale");
                                        if ( not oldScale ) then
                                                oldScale = cooldownCountFrame:GetScale();
                                                setglobal(cooldownName.."CountFrameScale", oldScale);
                                        end
                                        local noAutoScale = false;
                                        local newScale = oldScale * CooldownCount_GetAppropriateScale(newTime, noAutoScale);
                                        cooldownCountFrame:SetScale(newScale);
                                        local oldWidth = getglobal(cooldownName.."CountFrameWidth");
                                        if ( not oldWidth ) then
                                                oldWidth = cooldownCountFrame:GetWidth();
                                                setglobal(cooldownName.."CountFrameWidth", oldWidth);
                                        end
                                        local newWidth = newScale * oldWidth;
                                        if ( newWidth < 32 ) then newWidth = 32; end
                                        cooldownCountFrame:SetWidth(newWidth);
                                        cooldownCount:SetWidth(newWidth);
                                        local oldHeight = getglobal(cooldownName.."CountFrameHeight");
                                        if ( not oldHeight ) then
                                                oldHeight = cooldownCountFrame:GetHeight();
                                                setglobal(cooldownName.."CountFrameHeight", oldHeight);
                                        end
                                        local newHeight = newScale * oldHeight;
                                        if ( newHeight < 10 ) then newHeight = 10; end
                                        cooldownCountFrame:SetHeight(newHeight);
                                        cooldownCount:SetHeight(newHeight);
                                end
                                
                                if ( remainingTime <= flashTime ) then
                                        cooldownCount.flashing = true;
                                else
                                        cooldownCount.flashing = false;
                                end
                                
                                if ( ( cooldownCount.flashingQWEQWE ) ) then
                                        if ( not cooldownCount:IsVisible() ) then
                                                cooldownCount:Show();
                                        else
                                                cooldownCount:Hide();
                                        end
                                        if ( not cooldownCountFrame:IsVisible() ) then
                                                cooldownCountFrame:Show();
                                        else
                                                cooldownCountFrame:Hide();
                                        end
                                else
                                        if ( not cooldownCount:IsVisible() ) then
                                                cooldownCount:Show();
                                        end
                                        if ( not cooldownCountFrame:IsVisible() ) then
                                                cooldownCountFrame:Show();
                                        end
                                end
                        end
                end
        else
                if ( cooldownCount ) then
                        cooldownCount:Hide();
                end
                if ( cooldownCountFrame ) then
                        cooldownCountFrame:Hide();
                end
        end
end

function CooldownCount_OldUpdateCooldownCount(this, start, duration, enable)
        local cooldownCount = getglobal(this:GetName().."Count");
        local cooldownCountFrame = getglobal(this:GetName().."CountFrame");
        local cooldownCountValuesName = (this:GetName().."CountValues");
        local cooldownCountValues = { start, duration, enable };
        if ( cooldownCount ) then
                setglobal(cooldownCountValuesName, cooldownCountValues);
        end
        --CooldownCount_DoUpdateCooldownCount(this:GetName());
end

function CooldownCount_UpdateCooldownCount(this, start, duration, enable)
        local cooldownCount = getglobal(this:GetName().."Count");
        local cooldownCountFrame = getglobal(this:GetName().."CountFrame");
        local cooldownCountValuesName = (this:GetName().."CountValues");
        if (not getglobal(cooldownCountValuesName)) then
                setglobal(cooldownCountValuesName, {});
        end
        if ( cooldownCount ) then
                getglobal(cooldownCountValuesName)[1] = start;
                getglobal(cooldownCountValuesName)[2] = duration;
                getglobal(cooldownCountValuesName)[3] = enable;
        end
end


-- Hooks/unhooks functions. If toggle is 1, hooks functions, otherwise it unhooks functions.
--  Hooking functions mean that you replace them with your own functions and then call the 
--  original function at your leisure.
function CooldownCount_Setup_Hooks(toggle)
        if ( toggle == 1 ) then
                if ( ( CooldownFrame_SetTimer ~= CooldownCount_CooldownFrame_SetTimer ) and (CooldownCount_Saved_CooldownFrame_SetTimer == nil) ) then
                        CooldownCount_Saved_CooldownFrame_SetTimer = CooldownFrame_SetTimer;
                        CooldownFrame_SetTimer = CooldownCount_CooldownFrame_SetTimer;
                end
        else
                if ( CooldownFrame_SetTimer == CooldownCount_CooldownFrame_SetTimer) then
                        CooldownFrame_SetTimer = CooldownCount_Saved_CooldownFrame_SetTimer;
                        CooldownCount_Saved_CooldownFrame_SetTimer = nil;
                end
        end
end

-- Handles events
function CooldownCount_OnEvent(event)
        if ( event == "ACTIONBAR_PAGE_CHANGED" ) then
                CooldownCount_DoUpdate();
                return;
        end
        if ( event == "VARIABLES_LOADED" ) then
                if ( CooldownCount_Cosmos_Registered == 0 ) then
                        CooldownCount_LoadOptions();
                end
                if ( CooldownCount_RogueStealth == 1 ) or ( UnitClass("player") ~= COOLDOWNCOUNT_CLASS_ROGUE ) then
                        table.insert(CooldownCount_ButtonNames, "ShapeshiftButton");
                        CooldownCount_RegenerateList();
                end
                return;
        end
end

function CooldownCount_Toggle_UseLongTimers(toggle)
        local oldvalue = CooldownCount_UseLongTimerDescriptions;
        local newvalue = toggle;
        if ( ( toggle ~= 1 ) and ( toggle ~= 0 ) ) then
                if (oldvalue == 1) then
                        newvalue = 0;
                elseif ( oldvalue == 0 ) then
                        newvalue = 1;
                else
                        newvalue = 0;
                end
        end
        CooldownCount_UseLongTimerDescriptions = newvalue;
        if ( newvalue ~= oldvalue ) then
                if ( newvalue == 1 ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_USELONGTIMERS_ENABLED);
                else
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_USELONGTIMERS_DISABLED);
                end
        end
        CooldownCount_Register_Cosmos();
end

-- Toggles the enabled/disabled state of the CooldownCount
--  if toggle is 1, it's enabled
--  if toggle is 0, it's disabled
--   otherwise, it's toggled
function CooldownCount_Toggle_Enabled(toggle)
        local oldvalue = CooldownCount_Enabled;
        local newvalue = toggle;
        if ( ( toggle ~= 1 ) and ( toggle ~= 0 ) ) then
                if (oldvalue == 1) then
                        newvalue = 0;
                elseif ( oldvalue == 0 ) then
                        newvalue = 1;
                else
                        newvalue = 0;
                end
        end
        CooldownCount_Enabled = newvalue;
        CooldownCount_Setup_Hooks(newvalue);
        if ( newvalue ~= oldvalue ) then
                if ( newvalue == 1 ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_ENABLED);
                else
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_DISABLED);
                end
        end
        CooldownCount_Register_Cosmos();
end

function CooldownCount_Toggle_RogueStealth(toggle)
        local oldvalue = CooldownCount_RogueStealth;
        local newvalue = toggle;
        if ( ( toggle ~= 1 ) and ( toggle ~= 0 ) ) then
                if (oldvalue == 1) then
                        newvalue = 0;
                elseif ( oldvalue == 0 ) then
                        newvalue = 1;
                else
                        newvalue = 0;
                end
        end
        CooldownCount_RogueStealth = newvalue;
        if ( newvalue ~= oldvalue ) then
                if ( newvalue == 1 ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_ROGUE_STEALTH_ENABLED);
                else
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_ROGUE_STEALTH_DISABLED);
                end
        end
        local index = nil;
        local value = "ShapeshiftButton";
        for k, v in CooldownCount_ButtonNames do
                if ( v == value ) then
                        index = k;
                        break;
                end
        end
        if ( CooldownCount_RogueStealth == 1 ) then
                if ( not index ) then
                        table.insert(CooldownCount_ButtonNames, value);
                        CooldownCount_RegenerateList();
                end
        else
                if ( index ) then
                        table.remove(CooldownCount_ButtonNames, index);
                        CooldownCount_RegenerateList();
                end
        end
        CooldownCount_Register_Cosmos();
end

function CooldownCount_Toggle_NoSpaces(toggle)
        local oldvalue = CooldownCount_NoSpaces;
        local newvalue = toggle;
        if ( ( toggle ~= 1 ) and ( toggle ~= 0 ) ) then
                if (oldvalue == 1) then
                        newvalue = 0;
                elseif ( oldvalue == 0 ) then
                        newvalue = 1;
                else
                        newvalue = 0;
                end
        end
        CooldownCount_NoSpaces = newvalue;
        if ( newvalue ~= oldvalue ) then
                if ( newvalue == 1 ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_NOSPACES_ENABLED);
                else
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_NOSPACES_DISABLED);
                end
                CooldownCount_DoUpdate();
        end
        CooldownCount_Register_Cosmos();
end

function CooldownCount_Set_Alpha(value, quiet)
        local oldvalue = CooldownCountOptions.alpha;
        local newvalue = value;
        CooldownCountOptions.alpha = newvalue;
        if ( newvalue ~= oldvalue ) then
                if ( not quiet ) then
                        CooldownCount_Print(string.format(COOLDOWNCOUNT_CHAT_ALPHA_FORMAT), newvalue);
                end
                CooldownCount_DoUpdate(true);
        end
        CooldownCount_Register_Cosmos();
end

function CooldownCount_Set_NormalColor(r, g, b, quiet)
        local arr = nil;
        if ( type(r) == "table" ) then
                arr = r;
                quiet = g;
        else
                arr = { r, g, b };
        end
        local changed = false;
        for k, v in CooldownCountOptions.color.normal do
                if ( arr[k] ~= v ) then
                        changed = true;
                        break;
                end
        end
        if ( changed ) then
                CooldownCountOptions.color.normal = arr;
                if ( not quiet ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_NORMAL_COLOR_SET);
                end
                CooldownCount_DoUpdate(true);
        end
        CooldownCount_Register_Cosmos();
end

function CooldownCount_Set_FlashColor(r, g, b, quiet)
        local arr = nil;
        if ( type(r) == "table" ) then
                arr = r;
                quiet = g;
        else
                arr = { r, g, b };
        end
        local changed = false;
        for k, v in CooldownCountOptions.color.flash do
                if ( arr[k] ~= v ) then
                        changed = true;
                        break;
                end
        end
        if ( changed ) then
                CooldownCountOptions.color.flash = arr;
                if ( not quiet ) then
                        CooldownCount_Print(COOLDOWNCOUNT_CHAT_FLASH_COLOR_SET);
                end
                CooldownCount_DoUpdate(true);
        end
        CooldownCount_Register_Cosmos();
end

-- Prints out text to a chat box.
function CooldownCount_Print(msg,r,g,b,frame,id,unknown4th)
        if(unknown4th) then
                local temp = id;
                id = unknown4th;
                unknown4th = id;
        end
                                
        if (not r) then r = 1.0; end
        if (not g) then g = 1.0; end
        if (not b) then b = 1.0; end
        if ( frame ) then 
                frame:AddMessage(msg,r,g,b,id,unknown4th);
        else
                if ( DEFAULT_CHAT_FRAME ) then 
                        DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b,id,unknown4th);
                end
        end
end


function CooldownCount_CosmosColorNilFunc(u,b,c)
        if ( CosmosMasterFrame ) then
                CosmosMasterFrame:Show();
        end
end

function CooldownCount_CosmosOpacity()
        local alpha = OpacitySliderFrame:GetValue();
        CooldownCount_Set_Alpha(alpha);
end

function CooldownCount_NormalColorSetButton(notCosmos)
        ColorPickerFrame.func = CooldownCount_CosmosNormalColorSet;
        ColorPickerFrame.cancelFunc = CooldownCount_CosmosColorNilFunc;
        ColorPickerFrame.hasOpacity = false;
        --ColorPickerFrame.opacityFunc = CooldownCount_CosmosOpacity;
        local red, green, blue = unpack(CooldownCountOptions.color.normal);
        ColorPickerFrame:SetColorRGB(red, green, blue);
        ColorPickerFrame.previousValues = {r = red, g = green, b = blue, opacity = 1};
        if ( CosmosMasterFrame ) then
                CosmosMasterFrame:Hide();
        end
        ColorPickerFrame:Show();
end
function CooldownCount_NormalColorResetButton()
        local r, g, b = unpack(CooldownCountColorDefaultNormal);
        CooldownCountOptions.color.normal = { r, g, b};
end

function CooldownCount_NormalColorSet()
        local r,g,b = ColorPickerFrame:GetColorRGB();
        CooldownCountOptions.color.normal = { r, g, b};
end

function CooldownCount_CosmosNormalColorSet()
        CooldownCount_NormalColorSet();
        if(not ColorPickerFrame:IsVisible()) then
                if ( CosmosMasterFrame ) then
                        CosmosMasterFrame:Show();
                end
        end
end

function CooldownCount_FlashColorSetButton()
        ColorPickerFrame.func = CooldownCount_CosmosFlashColorSet;
        ColorPickerFrame.cancelFunc = CooldownCount_CosmosColorNilFunc;
        ColorPickerFrame.hasOpacity = false;
        local red, green, blue = unpack(CooldownCountOptions.color.flash);
        ColorPickerFrame:SetColorRGB(red, green, blue);
        ColorPickerFrame.previousValues = {r = red, g = green, b = blue, opacity = 1};
        if ( CosmosMasterFrame ) then
                CosmosMasterFrame:Hide();
        end
        ColorPickerFrame:Show();
end

function CooldownCount_FlashColorResetButton()
        local r, g, b = unpack(CooldownCountColorDefaultFlash);
        CooldownCountOptions.color.flash = { r, g, b};
end

function CooldownCount_FlashColorSet()
        local r,g,b = ColorPickerFrame:GetColorRGB();
        CooldownCountOptions.color.flash = { r, g, b};
end

function CooldownCount_CosmosFlashColorSet()
        CooldownCount_FlashColorSet();
        if(not ColorPickerFrame:IsVisible()) then
                if ( CosmosMasterFrame ) then
                        CosmosMasterFrame:Show();
                end
        end
end