vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Bindings
BINDING_HEADER_ECASTINGBAR = "eCastingBar"
BINDING_NAME_ECASTINGBARDLG = "Toggle Configuration Window";
ECASTINGBAR_TITLE = "Configure eCastingBar"

-- Global constants
CASTING_BAR_MAJOR_VERSION = "1";
CASTING_BAR_MINOR_VERSION = "3";
CASTING_BAR_REVISION = "24";
CASTING_BAR_ALPHA_STEP = 0.05;
CASTING_BAR_FLASH_STEP = 0.2;
CASTING_BAR_HOLD_TIME = 1;
CASTING_BAR_WIDTH = 264;
CASTING_BAR_HEIGHT = 30;
CASTING_BAR_SLIDER_WIDTH_MIN = 100;
CASTING_BAR_SLIDER_WIDTH_MAX = 2000;
CASTING_BAR_SLIDER_HEIGHT_MIN = 20;
CASTING_BAR_SLIDER_HEIGHT_MAX = 60;
CASTING_BAR_DEFAULT_SPELL_LENGTH = -1     -- show all
CASTING_BAR_DEFAULT_SPELL_JUSTIFY = "Center"


-- Global variables
eCastingBar_Saved = {};
eCastingBar_Player = nil;
eCastingBar_Resolution = nil;
eCastingBar_ResolutionWidth = 0;
eCastingBar_ResolutionHeight = 0;
eCastingBar_MENU_SAVEDSETTINGS = nil;
eCastingBar_SETTINGS_INDEX = "";

-- Local Constants
local CASTING_BAR_DEFAULT_TEXTURE = "Interface\\TargetingFrame\\UI-StatusBar";
local CASTING_BAR_PERL_TEXTURE = "Interface\\AddOns\\eCastingBar\\Textures\\StatusBar.tga";
local CASTING_BAR_COLOR_TEXTURE = "Interface\\AddOns\\eCastingBar\\Textures\\RoundedLightSample.tga";
local CASTING_BAR_BACKGROUND_FILE = "Interface\\Tooltips\\UI-Tooltip-Background";
local CASTING_BAR_EDGE_FILE = "Interface\\Tooltips\\UI-Tooltip-Border";

local eCastingBar_SlotUsed = -1;

-- Casting Bar Frame Suffixes
local frameSuffixes = { "" }

local CASTING_BAR_DEFAULTS = {
  ["Locked"] = 0,
  ["Enabled"] = 1,
  ["UsePerlTexture"] = 1,
  ["ShowTime"] = 1,
  ["HideBorder"] = 0,
  ["ShowDelay"] = 1,
  ["ShowSpellRank"] = 0,
  ["UseFriendlyEnemy"] = 0,
  ["Width"] = CASTING_BAR_WIDTH,
  ["Height"] = CASTING_BAR_HEIGHT,
  ["Left"] = 300,
  ["Bottom"] = 300,
  ["SpellLength"] = CASTING_BAR_DEFAULT_SPELL_LENGTH,
  ["SpellJustify"] = CASTING_BAR_DEFAULT_SPELL_JUSTIFY,
  ["FontSize"] = 12,
  ["MirrorLocked"] = 0,
  ["MirrorEnabled"] = 1,
  ["MirrorUsePerlTexture"] = 1,
  ["MirrorShowTime"] = 1,
  ["MirrorHideBorder"] = 0,
  ["MirrorWidth"] = CASTING_BAR_WIDTH,
  ["MirrorHeight"] = CASTING_BAR_HEIGHT,
  ["MirrorLeft"] = 300,
  ["MirrorBottom"] = 400,
  ["MirrorSpellLength"] = CASTING_BAR_DEFAULT_SPELL_LENGTH,
  ["MirrorSpellJustify"] = CASTING_BAR_DEFAULT_SPELL_JUSTIFY,
  ["MirrorFontSize"] = 12
}

local CASTING_BAR_DEFAULT_COLORS = {
  ["SpellColor"] = {1.0, 0.7, 0.0, 1},
  ["ChannelColor"] = {0.3, 0.3, 1.0, 1},
  ["SuccessColor"] = {0.0, 1.0, 0.0, 1},
  ["FailedColor"] = {1.0, 0.0, 0.0, 1},
  ["FlashBorderColor"] = {1.0, 0.88, 0.25, 1},
  ["FeignDeathColor"] = {1.0, 0.7, 0.0, 1},
  ["ExhaustionColor"] = {1.0, 0.9, 0.0, 1},
  ["BreathColor"] = {0.0, 0.5, 1.0, 1},
  ["TimeColor"] = {1.0, 1.0, 1.0, 1},
  ["DelayColor"] = {1.0, 0.0, 0.0, 1},
  ["MirrorTimeColor"] = {1.0, 1.0, 1.0, 1},
  ["MirrorFlashBorderColor"] = {1.0, 0.88, 0.25, 1},
  ["FriendColor"] = {0.0, 0.0, 1.0, 1},
  ["EnemyColor"] = {1.0, 0.0, 0.0, 1}
}
-- local variables

local eCastingBar__FlashBorders = {
        "TOPLEFT",
        "TOP",
        "TOPRIGHT",
        "LEFT",
        "RIGHT",
        "BOTTOMLEFT",
        "BOTTOM",
        "BOTTOMRIGHT"   
}

local eCastingBar__Events = {
        "SPELLCAST_START",
        "SPELLCAST_STOP",
        "SPELLCAST_INTERRUPTED",
        "SPELLCAST_FAILED",
        "SPELLCAST_DELAYED",
        "SPELLCAST_CHANNEL_START",
        "SPELLCAST_CHANNEL_UPDATE",
        "SPELLCAST_CHANNEL_STOP",
  "MIRROR_TIMER_START"
}


local eCastingBar__CastTimeEvents = {
        "SPELLCAST_START",
        "SPELLCAST_STOP",
        "SPELLCAST_INTERRUPTED",
        "SPELLCAST_FAILED"
}

-- FlightMap vars
local eCB_FM_TakeTaxiNode = function() end;

function ECB_addChat(msg)
        DEFAULT_CHAT_FRAME:AddMessage(CASTINGBAR_HEADER.." "..msg)
end

function eCastingBar_Toggle()
        if eCastingBarConfigFrame:IsVisible() then
    eCastingBarConfigFrame:Hide()
        else
    eCastingBarConfigFrame:Show()
        end
end

--[[ onFoo stuff ]]--
function eCastingBar_OnLoad()

        -- load the new castingbar:
        eCastingBar:RegisterEvent("PLAYER_ENTERING_WORLD")
        eCastingBar:RegisterEvent("VARIABLES_LOADED")

  -- replace use action function
  --ECB_orig_UseAction = UseAction;
  --UseAction = eCastingBar_UseAction;
end

--[[ 
This function will check for the Flight Map Addon
If found, we will overwrite their OnEnter function with ours.
]]--
function eCastingBar_CheckFlightMapAddon()
        if (FlightMapFrame) then
    -- store the FlightPath TaxiNodeOnButtonEnter function
    eCB_FM_TakeTaxiNode = TakeTaxiNode
    -- hook our function up
    TakeTaxiNode = eCastingBar_TakeTaxiNode;
        end
end

function eCastingBar_TakeTaxiNode(id)
        -- first call the Flight Maps TakeTaxiNode
  eCB_FM_TakeTaxiNode(id)

  eCastingBar_SetTaxiInfo()
end

function eCastingBar_SetTaxiInfo()        
  -- now we will use the values for the taxi node for the casting bar
  if (FlightMapTimesFrame) then
        if (FlightMapTimesFrame:IsVisible()) then
      if (eCastingBar_Saved[eCastingBar_Player].Enabled == 1) then
        -- grab all the values for this casting bar
        local intDuration = nil

        if (FlightMapTimesFrame.endTime ~= nil) then
          intDuration = (FlightMapTimesFrame.endTime - FlightMapTimesFrame.startTime) * 1000
        end

        eCastingBar.OnTaxi = true;
        eCastingBar_SpellcastChannelStart( "", intDuration , FlightMapTimesFrame.endPoint )

        -- store the flight map position
        eCastingBar_Saved[eCastingBar_Player].FlightMapX = FlightMapTimesFrame:GetLeft()
        eCastingBar_Saved[eCastingBar_Player].FlightMapY = FlightMapTimesFrame:GetBottom()

        -- now move the frame off the screen
        FlightMapTimesFrame:ClearAllPoints()
        FlightMapTimesFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", -2000, 2000 )
      end
        end
  end
end

--[[ Registers "frame" (passed as a string) to spellcast events. ]]--
function eCastingBar_Register( frmFrame, strEvent )

        -- register event.
        getglobal( frmFrame ):RegisterEvent( strEvent ) 

end

--[[ Unregisters "frame" (passed as a string) from spellcast events. ]]--
function eCastingBar_Unregister( frmFrame, strEvent )

        -- ungregister event.
        getglobal( frmFrame ):UnregisterEvent( strEvent )       

end

--[[ Handles all the mods' events. ]]--
function eCastingBar_OnEvent( frame )
        if event == "PLAYER_ENTERING_WORLD" then
        
                -- inform the user we are starting loading .
                ECB_addChat( CASTINGBAR_LOADED )

                eCastingBar:UnregisterEvent( event )
                
                eCastingBar_Player = UnitName( "player" ).. " - " ..GetRealmName( )

    -- hide all bars
    for index, option in frameSuffixes do
      getglobal("eCastingBar"..option):Hide();
    end

                --is the save empty or broken?
                if not eCastingBar_Saved[eCastingBar_Player]  or eCastingBar_Saved[eCastingBar_Player] == 1 then
      eCastingBar_Saved[eCastingBar_Player] = {}

                        --yes, inform the user we are loaing defaults
                        ECB_addChat( "  First Load or broken save, Loading defaults." )
                        
                        --set it to defaults
      eCastingBar_ResetSettings()
                end
                
    eCastingBar_CheckSettings()

                eCastingBar_LoadVariables()

    -- check for FlightMap Addon
    eCastingBar_CheckFlightMapAddon()

        end

    --if( event == "VARIABLES_LOADED" ) then
        
                -- load the variables

        --end
        
        if( event == "SPELLCAST_START" ) then

                -- arg1 = Spell Name
                -- arg2 = Duration (in milliseconds)
                eCastingBar_SpellcastStart( frame, arg1, arg2 )
                
        elseif( event == "SPELLCAST_STOP" ) then
        
                eCastingBar_SpellcastStop( frame )
                
        elseif( event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED" ) then
        
                eCastingBar_SpellcastFailed( frame )

        elseif( event == "SPELLCAST_DELAYED" ) then
        
                -- arg1 = Disruption Time(in milliseconds)
                eCastingBar_SpellcastDelayed( frame, arg1 )

        elseif( event == "SPELLCAST_CHANNEL_START" ) then

                -- arg1 = Duration (in milliseconds)
                -- arg2 = Spell Name
                eCastingBar_SpellcastChannelStart( frame, arg1, arg2 )
                
        elseif( event == "SPELLCAST_CHANNEL_UPDATE" ) then
          
    -- won't fire now
                -- arg1 = Remaining Duration (in milliseconds)
    eCastingBar_SpellcastChannelUpdate( frame, arg1 ) 
  elseif ( event == "SPELLCAST_CHANNEL_STOP" ) then
    eCastingBar_SpellcastChannelStop( frame ) 
        end

  -- check for mirros
  if( event == "MIRROR_TIMER_START" ) then
    if (eCastingBar_Saved[eCastingBar_Player].MirrorEnabled == 1) then 
      -- if we are not using Blizzards timers we should hide it.
      if (eCastingBar_Saved[eCastingBar_Player].MirrorEnabled == 1) then
        hideBlizzardMirrorFrame(arg1)
      else
        -- else make sure its shown
        showBlizzardMirrorFrame(arg1)
      end
      eCastingBarMirror_Show(arg1, arg2, arg3, arg4, arg5, arg6)
    end
  end
end

function hideBlizzardMirrorFrame(timer)
        -- hide the Blizzard frame
  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    local frame = getglobal("MirrorTimer"..index)
    if (frame.timer == timer) then
      frame:Hide()
    end
  end
end

function showBlizzardMirrorFrame(timer)
        -- hide the Blizzard frame
  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    local frame = getglobal("MirrorTimer"..index)
    if (frame.timer == timer) then
      frame:Show()
    end
  end
end

function hideAllBlizzardMirrorFrames()
        -- hide the Blizzard frame
  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    local frame = getglobal("MirrorTimer"..index)
    local frame2 = getglobal("eCastingBarMirror"..index)
    
    if (frame2.timer ~= nil) then
        frame:Hide()
      frame2:Show()
    end
  end
end


function showAllBlizzardMirrorFrames()
        -- hide the Blizzard frame
  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    local frame = getglobal("MirrorTimer"..index)
    local frame2 = getglobal("eCastingBarMirror"..index)
    if (frame.timer ~= nil) then
      frame:Show()
      frame2:Hide()
    end
  end
end

function eCastingBar_ResetSettings()
  ECB_addChat("Resetting Default Settings")
  eCastingBar_Saved[eCastingBar_Player] = {}
  -- Reset General Options
  for option in CASTING_BAR_DEFAULTS do
     eCastingBar_Saved[eCastingBar_Player][option] = CASTING_BAR_DEFAULTS[option]
  end
  
  -- Reset Colors
  for color in CASTING_BAR_DEFAULT_COLORS do
     eCastingBar_Saved[eCastingBar_Player][color] = CASTING_BAR_DEFAULT_COLORS[color]
  end

  
  setup()
end

function eCastingBar_CheckSettings()
  -- Reset General Options
  for option in CASTING_BAR_DEFAULTS do
     if (eCastingBar_Saved[eCastingBar_Player][option] == nil) then
       eCastingBar_Saved[eCastingBar_Player][option] = CASTING_BAR_DEFAULTS[option]
     end
  end

  -- check for nil colors
  for color in CASTING_BAR_DEFAULT_COLORS do
    if (eCastingBar_Saved[eCastingBar_Player][color] == nil) then
      eCastingBar_Saved[eCastingBar_Player][color] = CASTING_BAR_DEFAULT_COLORS[color]
    end
  end
end

function setup()
  eCastingBar_checkEnabled()
  eCastingBar_checkLocked()
  eCastingBar_checkBorders()
  eCastingBar_checkTimeColors( )
  eCastingBar_setDelayColor()
  eCastingBar_SetSize()
  eCastingBar_checkFlashBorderColors()
  eCastingBar_checkTextures()
end

--[[ Iniitialization ]]--
function eCastingBar_LoadVariables( )   
    setup()
    eCastingBar_SetSavedSettingsMenu()

                -- set the loaded variables
                
                -- make the casting bar link to the movable button
                eCastingBar:SetPoint("TOPLEFT", "eCastingBar_Outline", "TOPLEFT", 0, 0 )

    -- make the mirror casting bar link to the movable button
                eCastingBarMirror1:SetPoint("TOPLEFT", "eCastingBarMirror_Outline", "TOPLEFT", 0, 0 )
                
                -- reset variables
    for index, option in frameSuffixes do
      getglobal("eCastingBar"..option).casting = nil
      getglobal("eCastingBar"..option).holdTime = 0
    end
                
                        -- code used if no cosmos is present

                -- make the slash commands
                SlashCmdList["ECASTINGBAR"] = eCastingBar_SlashHandler
                SLASH_ECASTINGBAR1 = "/eCastingBar"
                SLASH_ECASTINGBAR2 = "/eCB"

    -- resolution
    SetResolution(GetScreenResolutions())
    local i,j = string.find(eCastingBar_Resolution, "x")

    --eCastingBar_ResolutionWidth = tonumber(string.sub(eCastingBar_Resolution, 0, i - 1))
    --eCastingBar_ResolutionHeight = tonumber(string.sub(eCastingBar_Resolution, i + 1, string.len(eCastingBar_Resolution)))

    -- override these for now until I can figure out why blizzard is jacked up
    eCastingBar_ResolutionWidth = 2000
    eCastingBar_ResolutionHeight = 2000

    setupConfigFrame()
    setupDefaultConfigFrame()
    setupColorsConfigFrame()
end

function setupConfigFrame()
        -- set all text values --
  eCastingBarGeneralsSelect:SetText(CASTINGBAR_GENERAL_BUTTON)
  eCastingBarMirrorSelect:SetText(CASITINGBARMIRROR_BUTTON)
  eCastingBarColorsSelect:SetText(CASTINGBAR_COLOR_BUTTON)
  eDefaultsConfigButton:SetText(CASTINGBAR_DEFAULTS_BUTTON)
  eCloseConfigButton:SetText(CASTINGBAR_CLOSE_BUTTON)
  eCastingBarSaveSettingsButton:SetText(CASTINGBAR_SAVE_BUTTON)
  eCastingBarLoadSettingsButton:SetText(CASTINGBAR_LOAD_BUTTON)
  eCastingBarDeleteSettingsButton:SetText(CASTINGBAR_DELETE_BUTTON)
end

function setupDefaultConfigFrame()
  -- set all text values --
  for option in CASTING_BAR_BUTTONS do
    local btnText = getglobal("eCastingBar"..option.."Text")
    btnText:SetText(CASTING_BAR_BUTTONS[option])
  end

  eCastingBarSpellLength:SetNumber(eCastingBar_Saved[eCastingBar_Player].SpellLength)
  eCastingBarSpellLengthText:SetText(CASTINGBAR_SPELL_LENGTH_TEXT)
  eCastingBarSpellJustify_Label:SetText(CASTINGBAR_SPELL_JUSTIFY_TEXT)
  eCastingBarSpellJustify_Setting:SetText(eCastingBar_Saved[eCastingBar_Player].SpellJustify)  
  eCastingBarText:SetJustifyH(eCastingBar_Saved[eCastingBar_Player].SpellJustify)
  
  eCastingBarMirrorSpellLength:SetNumber(eCastingBar_Saved[eCastingBar_Player].MirrorSpellLength)
  eCastingBarMirrorSpellLengthText:SetText(CASTINGBARMIRROR_SPELL_LENGTH_TEXT)
  eCastingBarMirrorSpellJustify_Label:SetText(CASTINGBARMIRROR_SPELL_JUSTIFY_TEXT)
  eCastingBarMirrorSpellJustify_Setting:SetText(eCastingBar_Saved[eCastingBar_Player].MirrorSpellJustify)  

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    getglobal("eCastingBarMirror"..index.."StatusBarText"):SetJustifyH(eCastingBar_Saved[eCastingBar_Player].MirrorSpellJustify)
  end

  -- set all checks
  for option in CASTING_BAR_BUTTONS do
    local btn = getglobal("eCastingBar"..option)
    btn:SetChecked(eCastingBar_Saved[eCastingBar_Player][option])
  end
  
  local slider, sliderText, low, high, width, height

  local optionTabs = { "", "Mirror" }

  for index, option in optionTabs do
        -- setup the width slider
    slider = getglobal("eCastingBar"..option.."WidthSlider")
    sliderText = getglobal("eCastingBar"..option.."WidthSliderText")
    low = getglobal("eCastingBar"..option.."WidthSliderLow")
    high = getglobal("eCastingBar"..option.."WidthSliderHigh")

    slider:SetMinMaxValues(CASTING_BAR_SLIDER_WIDTH_MIN, eCastingBar_ResolutionWidth)
    slider:SetValueStep(1)
    slider:SetValue(eCastingBar_Saved[eCastingBar_Player][option.."Width"])
    sliderText:SetText(CASTINGBAR_SLIDER_WIDTH_TEXT)
    low:SetText(CASTING_BAR_SLIDER_WIDTH_MIN)
    high:SetText(eCastingBar_ResolutionWidth)

    -- setup the height slider
    slider = getglobal("eCastingBar"..option.."HeightSlider")
    sliderText = getglobal("eCastingBar"..option.."HeightSliderText")
    low = getglobal("eCastingBar"..option.."HeightSliderLow")
    high = getglobal("eCastingBar"..option.."HeightSliderHigh")


    slider:SetMinMaxValues(CASTING_BAR_SLIDER_HEIGHT_MIN, CASTING_BAR_SLIDER_HEIGHT_MAX)
    slider:SetValueStep(1)
    slider:SetValue(eCastingBar_Saved[eCastingBar_Player][option.."Height"])
    sliderText:SetText(CASTINGBAR_SLIDER_HEIGHT_TEXT)
    low:SetText(CASTING_BAR_SLIDER_HEIGHT_MIN)
    high:SetText(CASTING_BAR_SLIDER_HEIGHT_MAX)

    -- setup the x slider
    slider = getglobal("eCastingBar"..option.."LeftSlider")
    sliderText = getglobal("eCastingBar"..option.."LeftSliderText")
    low = getglobal("eCastingBar"..option.."LeftSliderLow")
    high = getglobal("eCastingBar"..option.."LeftSliderHigh")

    if (option == "Mirror") then
      width = tonumber(string.format("%.0f", getglobal("eCastingBarMirror1"):GetWidth()))
      height = tonumber(string.format("%.0f", getglobal("eCastingBarMirror1"):GetHeight()))
    else
      width = tonumber(string.format("%.0f", getglobal("eCastingBar"..option):GetWidth()))
      height = tonumber(string.format("%.0f", getglobal("eCastingBar"..option):GetHeight()))
    end

    slider:SetMinMaxValues(-1000, eCastingBar_ResolutionWidth)
    slider:SetValueStep(1)
    slider:SetValue(eCastingBar_Saved[eCastingBar_Player][option.."Left"])
    sliderText:SetText(CASTINGBAR_SLIDER_LEFT_TEXT)
    low:SetText(-1000)
    high:SetText(eCastingBar_ResolutionWidth)

    -- setup the y slider
    slider = getglobal("eCastingBar"..option.."BottomSlider")
    sliderText = getglobal("eCastingBar"..option.."BottomSliderText")
    low = getglobal("eCastingBar"..option.."BottomSliderLow")
    high = getglobal("eCastingBar"..option.."BottomSliderHigh")

    slider:SetMinMaxValues(-1000, eCastingBar_ResolutionHeight)
    slider:SetValueStep(1)
    slider:SetValue(eCastingBar_Saved[eCastingBar_Player][option.."Bottom"])
    sliderText:SetText(CASTINGBAR_SLIDER_BOTTOM_TEXT)
    low:SetText(-1000)
    high:SetText(eCastingBar_ResolutionHeight)

    -- setup the font slider
    slider = getglobal("eCastingBar"..option.."FontSlider")
    sliderText = getglobal("eCastingBar"..option.."FontSliderText")
    low = getglobal("eCastingBar"..option.."FontSliderLow")
    high = getglobal("eCastingBar"..option.."FontSliderHigh")

    slider:SetMinMaxValues(8, 40)
    slider:SetValueStep(1)
    slider:SetValue(eCastingBar_Saved[eCastingBar_Player][option.."FontSize"])
    sliderText:SetText(CASTINGBAR_SLIDER_FONT_TEXT)
    low:SetText(8)
    high:SetText(40)
  end
end

function setupColorsConfigFrame()
  -- set the textures --
  for color in CASTINGBAR_COLOR_LABEL do
    local btnColor = getglobal("btn"..color.."Texture")

    -- set the texture
    btnColor:SetTexture(CASTING_BAR_COLOR_TEXTURE)

    -- set the vertex color
    btnColor:SetVertexColor(unpack(eCastingBar_Saved[eCastingBar_Player][color]))

    -- set the label
    getglobal("lbl"..color.."Text"):SetText(CASTINGBAR_COLOR_LABEL[color])
  end
end

function SetResolution(...)
  local iRes = GetCurrentResolution()

  for i=1, arg.n, 1 do
    if (iRes == i) then
        eCastingBar_Resolution = arg[i]
    end
  end
end


--[[ Handles all the slash commands if cosmos isn't present. ]]--
function eCastingBar_SlashHandler( strMessage )
  local command, param
        -- make it it all lower case to be sure
        strMessage = string.lower( strMessage )

  if(index) then
                command = string.sub(strMessage, 1, (index - 1))
                param = string.sub(strMessage, (index + 1)  )
        else
                command = strMessage
        end
                        
        if( command == CASTINGBAR_CHAT_C1 ) then 
                -- show the config window
    getglobal("eCastingBarConfigFrame"):Show()
  
  -- no, did they type: help?
  elseif ( command == CASTINGBAR_CHAT_C2) then
    -- call for help
    eCastingBar_ChatHelp()

        -- no: do default
        else

    -- show the config window
    getglobal("eCastingBarConfigFrame"):Show()
                
        end     

  setupDefaultConfigFrame()
  setupColorsConfigFrame()
        
end

--[[ Handles chat help messages. ]]--
function eCastingBar_ChatHelp( )

        local intIndex = 0
        local strMessage = ""
        
        -- prints each line in CASTINGBAR_HELP = { }
        for intIndex, strMessage in CASTINGBAR_HELP do
        
                ECB_addChat( strMessage )
                
        end
        
end


--[[ Replaces the UseAction function ]]--
function eCastingBar_UseAction(slot, checkCursor, onSelf)
  eCastingBar_SlotUsed = slot;
  return ECB_orig_UseAction(slot, checkCursor, onSelf)
end

function ECB_GetActionSpell(slot)
        ECB_TooltipTextLeft1:SetText();
        ECB_TooltipTextRight1:SetText();
        ECB_Tooltip:SetAction(slot);
        local start, stop, name, rank;
        name = ECB_TooltipTextLeft1:GetText();
        rank = ECB_TooltipTextRight1:GetText();
        start, stop, rank = string.find((rank or ""), "(%d+)");
        rank = (rank or 1) / 1.0;
        return (name or ""), rank;
end

function eCastingBar_IsSpell(spell, rank)
  local i = 1
  
  rank = "Rank "..tonumber(rank);

  while true do
    local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL)

    if not spellName then
      do break end
    end

    if (spell == spellName and rank == spellRank) then
      return 1;
    end
     
    i = i + 1
  end

  return 0;
end

--[[ Handles the SPELLCAST_START event. ]]--
function eCastingBar_SpellcastStart( fraFrame, strSpellName, intDuration ) 
  local spell = "";
  local rank = "";
  
  -- try to find the current action
  for slot = 1, 200, 1 do
    if (HasAction(slot) == 1 and IsCurrentAction(slot) == 1) then
      spell, rank = ECB_GetActionSpell(slot);
      
      -- go through the spellbook and see if this is an actual spell
      if (eCastingBar_IsSpell(spell, rank) == 0) then
        spell = "";
        rank = "";
      end
      break;
    end
  end

  if (eCastingBar_Saved[eCastingBar_Player].ShowSpellRank == 1) then
    if (spell ~= "") then
      strSpellName = spell.." (Rank "..rank..")"        
    end
  end
  
        -- set the bar color
  -- check for friendly or enemy player
  local Red, Green, Blue, Alpha
  
  if (eCastingBar_CurrentSpell ~= "" and eCastingBar_Saved[eCastingBar_Player].UseFriendlyEnemy == 1) then
    if (UnitIsFriend("player","target") and (UnitName("target") ~= UnitName("player"))) then
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].FriendColor)
    elseif (UnitIsEnemy("player","target")) then
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].EnemyColor)
    else
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].SpellColor)
    end
  else
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].SpellColor)
  end
  

  
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetStatusBarColor( Red, Green, Blue, Alpha )
        
        -- show the spark
        getglobal("eCastingBar"..fraFrame.."Spark"):Show( )
        
        -- set the start and max time
        getglobal("eCastingBar"..fraFrame).startTime = GetTime( )
  getglobal("eCastingBar"..fraFrame).initStartTime = GetTime( )

  -- if the duration is nil set it to 10 minutes.  Nothing should last this long
  if (intDuration == nil) then
        intDuration = 600000
  end
        getglobal("eCastingBar"..fraFrame).maxValue = getglobal("eCastingBar"..fraFrame).startTime + ( intDuration / 1000 )
        
        -- set the bar minium and maxium accordingly (basicly it will grow as time passes)
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetMinMaxValues( getglobal("eCastingBar"..fraFrame).startTime, getglobal("eCastingBar"..fraFrame).maxValue )
        
        -- set the bar to empty
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetValue( getglobal("eCastingBar"..fraFrame).startTime )
        
        -- set the text to the spell name
  -- figure out how much to show
  if ( eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] == -1 ) then
    -- show all
        getglobal("eCastingBar"..fraFrame.."Text"):SetText( strSpellName )
  elseif ( eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] == 0) then
    -- dont show it
    getglobal("eCastingBar"..fraFrame.."Text"):SetText( "" ) 
  else
    -- if the size of the name is less than or equal to the max size, just show it all
    if ( string.len(strSpellName) <= eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] ) then
        getglobal("eCastingBar"..fraFrame.."Text"):SetText( strSpellName )
    else
      getglobal("eCastingBar"..fraFrame.."Text"):SetText( string.sub(strSpellName , 1, eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"]) )
    end
  end
        
        -- set the bar to fully opaque
        getglobal("eCastingBar"..fraFrame):SetAlpha( 1.0 )
        
        -- start the casting state, and make sure everything else is reset
        getglobal("eCastingBar"..fraFrame).holdTime = 0
        getglobal("eCastingBar"..fraFrame).casting = 1
        getglobal("eCastingBar"..fraFrame).fadeOut = nil
  getglobal("eCastingBar"..fraFrame).delay = 0
        getglobal("eCastingBar"..fraFrame):Show( )
        getglobal("eCastingBar"..fraFrame).mode = "casting"
  
end

--[[ Handles the SPELLCAST_STOP event. ]]--
function eCastingBar_SpellcastStop( fraFrame )

        -- NOTE: not sure why but certain things in here keep getting called everytime channeling updates
        --      first the green bar colored used for success, forced channeling green also (no matter what i did)
        -- so don't put anything in here that will fuck w/ channeling, unless you use if( eCastingBar.channeling == nil)

                -- test

        -- make sure we aren't channeling first
        if( getglobal("eCastingBar"..fraFrame).channeling == nil ) then
                -- set the bar color
    local Red, Green, Blue, Alpha
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].SuccessColor)
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetStatusBarColor( Red, Green, Blue, Alpha )
                getglobal("eCastingBar"..fraFrame.."Spark"):Hide( )
                
        end
                
        -- is the bar still visiable?
        if ( not getglobal("eCastingBar"..fraFrame):IsVisible( ) ) then
        
                -- yes, we are done casting, so hide it
                getglobal("eCastingBar"..fraFrame):Hide( )
                
        end
        
        -- is the bar still shown? ( not sure what the difference between this and :IsVisible, but there is (figure it out!) )
        if ( getglobal("eCastingBar"..fraFrame):IsShown( ) ) then
        
                -- set the bar to max value (visually helps the user see)
                getglobal("eCastingBar"..fraFrame.."StatusBar"):SetValue( getglobal("eCastingBar"..fraFrame).maxValue )
                
                -- start the flash state
                getglobal("eCastingBar"..fraFrame.."Flash"):SetAlpha( 0.0 )
                getglobal("eCastingBar"..fraFrame.."Flash"):Show( )
                getglobal("eCastingBar"..fraFrame).casting = nil
    getglobal("eCastingBar"..fraFrame).OnTaxi = nil
    getglobal("eCastingBar"..fraFrame).flying = nil
    getglobal("eCastingBar"..fraFrame).delay = 0
                getglobal("eCastingBar"..fraFrame).flash = 1
                getglobal("eCastingBar"..fraFrame).fadeOut = 1
                getglobal("eCastingBar"..fraFrame).mode = "flash"
                
        end

end

--[[ Handles the SPELLCAST_FAILED and SPELLCAST_INTERRUPTED events. ]]--
function eCastingBar_SpellcastFailed( fraFrame )
  -- first make sure we are not flying.  if so, just ignore this
  if (getglobal("eCastingBar"..fraFrame).flying) then return; end

        -- is the bar still shown? ( not sure what the difference between this and :IsVisiable, but there is (figure it out!) )
        if ( getglobal("eCastingBar"..fraFrame):IsShown( ) ) then
        
                -- set the bar to max (visually helps the user see)
                getglobal("eCastingBar"..fraFrame.."StatusBar"):SetValue( getglobal("eCastingBar"..fraFrame).maxValue )
                
                -- set the bar color
    local Red, Green, Blue, Alpha
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].FailedColor)
    getglobal("eCastingBar"..fraFrame.."StatusBar"):SetStatusBarColor( Red, Green, Blue, Alpha )
                
                -- hide the spark, we dont need it anymore
                getglobal("eCastingBar"..fraFrame.."Spark"):Hide( )
                
                -- was the called event: spell failed?
                if ( event == "SPELLCAST_FAILED" ) then
                
                        -- yes, set the text accordingly
                        getglobal("eCastingBar"..fraFrame.."Text"):SetText( FAILED )
                        
                else
                
                        -- no, it must have been interupted instead, set the text accordingly
                        getglobal("eCastingBar"..fraFrame.."Text"):SetText( INTERRUPTED )
                        
                end
                
                -- end the casting state, start the fadeout state
                getglobal("eCastingBar"..fraFrame).casting = nil
    getglobal("eCastingBar"..fraFrame).delay = 0
                getglobal("eCastingBar"..fraFrame).fadeOut = 1
                getglobal("eCastingBar"..fraFrame).holdTime = GetTime() + CASTING_BAR_HOLD_TIME
        end

end

--[[ Handles the SPELLCAST_DELAYED event. ]]--
function eCastingBar_SpellcastDelayed( fraFrame, intDisruptionTime )

        -- is the bar still shown? ( not sure what the difference between this and :IsVisiable, but there is (figure it out!) )
        if( getglobal("eCastingBar"..fraFrame):IsShown( ) ) then
        
                -- set the start and max time according to how much it was disrupted
                getglobal("eCastingBar"..fraFrame).startTime = getglobal("eCastingBar"..fraFrame).startTime + ( intDisruptionTime / 1000 )
                getglobal("eCastingBar"..fraFrame).maxValue = getglobal("eCastingBar"..fraFrame).maxValue + ( intDisruptionTime / 1000 )
                
                -- set the bar accordingly (basicly stricking it according to how much it was disrupted)
                getglobal("eCastingBar"..fraFrame.."StatusBar"):SetMinMaxValues( getglobal("eCastingBar"..fraFrame).startTime, getglobal("eCastingBar"..fraFrame).maxValue )

    if (getglobal("eCastingBar"..fraFrame).delay == nil) then
        getglobal("eCastingBar"..fraFrame).delay = 0
    end

    getglobal("eCastingBar"..fraFrame).delay = getglobal("eCastingBar"..fraFrame).delay + (intDisruptionTime / 1000)
                
        end

end

--[[ Handles the SPELLCAST_CHANNEL_START event. ]]--
function eCastingBar_SpellcastChannelStart( fraFrame, intDuration, strSpellName )
  local spell = "";
  local rank = "";

  -- try to find the current action
  for slot = 1, 200, 1 do
    if (HasAction(slot) == 1 and IsCurrentAction(slot) == 1) then
      spell, rank = ECB_GetActionSpell(slot);
      
      -- go through the spellbook and see if this is an actual spell
      if (eCastingBar_IsSpell(spell, rank) == 0) then
        spell = "";
        rank = "";
      end
      break;
    end
  end

  if (eCastingBar_Saved[eCastingBar_Player].ShowSpellRank == 1) then
    if (spell ~= "") then
      strSpellName = spell.." (Rank "..rank..")"        
    end
  end

  if (eCastingBar_CurrentSpell ~= "" and eCastingBar_Saved[eCastingBar_Player].UseFriendlyEnemy == 1) then
    if (UnitIsFriend("player","target") and (UnitName("target") ~= UnitName("player"))) then
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].FriendColor)
    elseif (UnitIsEnemy("player","target")) then
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].EnemyColor)
    else
      Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].ChannelColor)
    end
  else
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].ChannelColor)
  end

  getglobal("eCastingBar"..fraFrame.."StatusBar"):SetStatusBarColor( Red, Green, Blue, Alpha )
        -- show the spark
        getglobal("eCastingBar"..fraFrame.."Spark"):Show( )
        
        -- set the bar to max
        getglobal("eCastingBar"..fraFrame).maxValue = 1

  -- set the delay
  getglobal("eCastingBar"..fraFrame).delay = 0
        
        -- set the start and end times
        getglobal("eCastingBar"..fraFrame).startTime = GetTime( )
  getglobal("eCastingBar"..fraFrame).initStartTime = GetTime( )
  getglobal("eCastingBar"..fraFrame).duration = intDuration / 1000

  -- if the duration is nil set it to 10 minutes.  Nothing should last this long
  if (intDuration == nil) then
        intDuration = 600000
  end
        getglobal("eCastingBar"..fraFrame).endTime = getglobal("eCastingBar"..fraFrame).startTime + ( intDuration / 1000 )
        
        -- set the bar minium and maxium values
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetMinMaxValues( getglobal("eCastingBar"..fraFrame).startTime, getglobal("eCastingBar"..fraFrame).endTime )
        
        -- set the bar length visually to reflex the new time
        getglobal("eCastingBar"..fraFrame.."StatusBar"):SetValue( getglobal("eCastingBar"..fraFrame).endTime )
        
        -- set the text to the spell name
  -- figure out how much to show
  if ( eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] == -1 ) then
    -- show all
        getglobal("eCastingBar"..fraFrame.."Text"):SetText( strSpellName )
  elseif ( eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] == 0) then
    -- dont show it
    getglobal("eCastingBar"..fraFrame.."Text"):SetText( "" ) 
  else
    -- if the size of the name is less than or equal to the max size, just show it all
    if ( string.len(strSpellName) <= eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"] ) then
        getglobal("eCastingBar"..fraFrame.."Text"):SetText( strSpellName )
    else
      getglobal("eCastingBar"..fraFrame.."Text"):SetText( string.sub(strSpellName , 1, eCastingBar_Saved[eCastingBar_Player][fraFrame.."SpellLength"]) )
    end
  end
        
        -- set the bar to fully opaque
        getglobal("eCastingBar"..fraFrame):SetAlpha( 1.0 )
        
        -- reset various valuses used to hide the bar, also make sure its channeling not casting
        getglobal("eCastingBar"..fraFrame).holdTime = 0
        getglobal("eCastingBar"..fraFrame).casting = nil
        getglobal("eCastingBar"..fraFrame).channeling = 1
        getglobal("eCastingBar"..fraFrame).fadeOut = nil
        getglobal("eCastingBar"..fraFrame):Show( )
        getglobal("eCastingBar"..fraFrame).mode = "channeling"
end

--[[ Handles the SPELLCAST_CHANNEL_UPDATE event. ]]--
-- won't fire now
function eCastingBar_SpellcastChannelUpdate( fraFrame, intRemainingDuration )

        -- is the remaining time zero?
        if( intRemainingDuration == 0 ) then
        
                        -- yes, we aren't channeling anymore
                        getglobal("eCastingBar"..fraFrame).channeling = nil
                
        -- no, is the bar still shown? ( not sure what the difference between this and :IsVisiable, but there is (figure it out!) )
        elseif( getglobal("eCastingBar"..fraFrame):IsShown( ) ) then
                                        
                -- set the original duration
                local intOriginalDuration = getglobal("eCastingBar"..fraFrame).endTime - getglobal("eCastingBar"..fraFrame).startTime

    -- set the delay
    local elapsedTime = GetTime() - getglobal("eCastingBar"..fraFrame).startTime;
    local losttime = intOriginalDuration*1000 - elapsedTime*1000 - arg1;
    getglobal("eCastingBar"..fraFrame).delay = getglobal("eCastingBar"..fraFrame).delay + (losttime / 1000);

                -- set the start and end time
                getglobal("eCastingBar"..fraFrame).endTime = GetTime( ) + ( intRemainingDuration / 1000 )
                getglobal("eCastingBar"..fraFrame).startTime = getglobal("eCastingBar"..fraFrame).endTime - intOriginalDuration
                
                -- set the bar length reflect the new state (basicly decreases the start time as time passes, thus shrinking the bar)
                getglobal("eCastingBar"..fraFrame.."StatusBar"):SetMinMaxValues( getglobal("eCastingBar"..fraFrame).startTime, getglobal("eCastingBar"..fraFrame).endTime ) 
                
                -- test to see visually when it fires... and it doesn't fire much.
                --ECB_addChat( "SPELLCAST_CHANNELING_UPDATE" )
                
        end

end

--[[ Handles the SPELLCAST_CHANNEL_UPDATE event. ]]--
function eCastingBar_SpellcastChannelStop( fraFrame )
  getglobal("eCastingBar"..fraFrame).channeling = nil

  -- set the bar to max value (visually helps the user see)
  getglobal("eCastingBar"..fraFrame.."StatusBar"):SetValue( getglobal("eCastingBar"..fraFrame).maxValue )
  
  local failed = 0;

  if (getglobal("eCastingBar"..fraFrame).endTime ~= nil) then
        if ( (getglobal("eCastingBar"..fraFrame).endTime - GetTime()) > 0.5 ) then
      failed = 1;
      eCastingBar_SpellcastFailed (fraFrame)
    end
  end

  if (failed == 0) then
    -- start the flash state
    getglobal("eCastingBar"..fraFrame.."Flash"):SetAlpha( 0.0 )
    getglobal("eCastingBar"..fraFrame.."Flash"):Show( )
    getglobal("eCastingBar"..fraFrame).casting = nil
    getglobal("eCastingBar"..fraFrame).OnTaxi = nil
    getglobal("eCastingBar"..fraFrame).flying = nil
    getglobal("eCastingBar"..fraFrame).delay = 0
    getglobal("eCastingBar"..fraFrame).flash = 1
    getglobal("eCastingBar"..fraFrame).fadeOut = 1
    getglobal("eCastingBar"..fraFrame).mode = "flash"
  end

  
end

--[[ Handles all updates. ]]--
function eCastingBar_OnUpdate( frame )

  -- check if we were on a taxi.
    -- Added for FlightMap support
  if ( getglobal("eCastingBar"..frame).OnTaxi ) then
    if (not getglobal("eCastingBar"..frame).flying) then
      if UnitOnTaxi("player") then getglobal("eCastingBar"..frame).flying = true; end
      return;
    end

    -- are we on a taxi?  
    -- Did we just get off?
    if (not UnitOnTaxi("player")) then
      getglobal("eCastingBar"..frame).flying = nil
      eCastingBar_SpellcastStop( "" )
    end
  end

  -- are we casting?
  if( getglobal("eCastingBar"..frame).casting ) then    
    -- yes:
    local intCurrentTime = GetTime()
    local intSparkPosition = 0
    
    -- update the casting time
    --eCastingBar_Time:SetText( string.sub( math.max( eCastingBar.maxValue - intCurrentTime, 0.00 ), 1,4 ) )
    
    -- Thanks to wbb at Cursed for the lovely formating
    if ( eCastingBar_Saved[eCastingBar_Player][frame.."ShowTime"] == 1) then
      getglobal("eCastingBar"..frame.."_Time"):SetText( string.format( "%.1f", math.max( getglobal("eCastingBar"..frame).maxValue - intCurrentTime, 0.0 ) ) )
    else
      getglobal("eCastingBar"..frame.."_Time"):SetText("")
    end

    local bDelay = false

    if ( eCastingBar_Saved[eCastingBar_Player][frame.."ShowDelay"] == 1) then  
      if (getglobal("eCastingBar"..frame).delay ~= 0) then
        bDelay = true
      end
    end

    if (bDelay) then
      getglobal("eCastingBar"..frame.."_Delay"):SetText("+"..string.format( "%.1f", eCastingBar.delay ) )
    else
      getglobal("eCastingBar"..frame.."_Delay"):SetText("")
    end
    
    -- is the status > than the max?
    if( intCurrentTime > getglobal("eCastingBar"..frame).maxValue ) then
    
      -- yes, set it to max (not sure how it would get that way, but again blizzard is safe)
      intCurrentTime = getglobal("eCastingBar"..frame).maxValue
      
    end
    
    -- update the bar length
    getglobal("eCastingBar"..frame.."StatusBar"):SetValue( intCurrentTime )
    
    --reset the flash to hidden
    getglobal("eCastingBar"..frame.."Flash"):Hide( )

    -- updates the spark
    local width = getglobal("eCastingBar"..frame.."StatusBar"):GetWidth()
    intSparkPosition = ( ( intCurrentTime - getglobal("eCastingBar"..frame).startTime ) / ( getglobal("eCastingBar"..frame).maxValue - getglobal("eCastingBar"..frame).startTime ) ) * width
    if( intSparkPosition < 0 ) then             
      intSparkPosition = 0                      
    end
    
    -- set the spark to the end of the current barsize
    getglobal("eCastingBar"..frame.."Spark"):SetPoint( "CENTER", "eCastingBarStatusBar", "LEFT", intSparkPosition, 0 )
    
  -- no, are we channeling?     
  elseif ( getglobal("eCastingBar"..frame).channeling ) then
  
    -- yes:
    local intTimeLeft = GetTime( )
    local intBarValue = 0
    local intSparkPosition = getglobal("eCastingBar"..frame).endTime
    
    -- update the channeling time
    --eCastingBar_Time:SetText( string.sub( math.max( eCastingBar.endTime - intTimeLeft, 0.00 ), 1 , 4 ) )
    
    -- Thanks to wbb at Cursed for the lovely formating
    if (eCastingBar_Saved[eCastingBar_Player][frame.."ShowTime"] == 1) then     
      -- if we are over 1 minute, do minute:seconds
      local timeLeft = math.max( getglobal("eCastingBar"..frame).endTime - intTimeLeft, 0.0 )
      local timeMsg = nil

      local minutes = 0
      local seconds = 0

      if (timeLeft > 60) then
        minutes = math.floor( ( timeLeft  / 60 ))
        local seconds = math.ceil( timeLeft - ( 60 * minutes ))

        if (seconds == 60) then
          minutes = minutes + 1
          seconds = 0
        end
        timeMsg = format("%s:%s", minutes, getFormattedNumber(seconds))
      else
        timeMsg = string.format( "%.1f", timeLeft )
      end

      --format(COOLDOWNCOUNT_MINUTES_SECONDS_FORMAT, minutes, CooldownCount_GetFormattedNumber(seconds))
      getglobal("eCastingBar"..frame.."_Time"):SetText( timeMsg )
    else
      getglobal("eCastingBar"..frame.."_Time"):SetText("")
    end

    local bDelay = false

    if (eCastingBar_Saved[eCastingBar_Player][frame.."ShowDelay"] == 1) then  
      if (getglobal("eCastingBar"..frame).delay ~= 0) then
        bDelay = true
      end
    end
    
    if (bDelay) then
      getglobal("eCastingBar"..frame.."_Delay"):SetText("-"..string.format( "%.1f", eCastingBar.delay ) )
    else
      getglobal("eCastingBar"..frame.."_Delay"):SetText("")
    end         
    
    -- is the time left greater than channeling end time?
    if( intTimeLeft > getglobal("eCastingBar"..frame).endTime ) then
    
      -- yes, set it to the channeling end time (this will happen if you get delayed longer than the time left on channeling)
      intTimeLeft = getglobal("eCastingBar"..frame).endTime
      
    end
    
    -- are the times equal?
    if( intTimeLeft == getglobal("eCastingBar"..frame).endTime ) then
    
      -- yes, we finished channeling, so start the fadeout process and exit
      getglobal("eCastingBar"..frame).channeling = nil
      getglobal("eCastingBar"..frame).fadeOut = 1
      return
      
    end
    
    -- update the bar length
    intBarValue = getglobal("eCastingBar"..frame).startTime + ( getglobal("eCastingBar"..frame).endTime - intTimeLeft )
    getglobal("eCastingBar"..frame.."StatusBar"):SetValue( intBarValue )
    
    --reset the flash to hidden
    getglobal("eCastingBar"..frame.."Flash"):Hide( )
    
    -- updates the spark
    local width = getglobal("eCastingBar"..frame.."Background"):GetWidth()
    intSparkPosition = ( ( intBarValue - getglobal("eCastingBar"..frame).startTime ) / ( getglobal("eCastingBar"..frame).endTime - getglobal("eCastingBar"..frame).startTime ) ) * width
    getglobal("eCastingBar"..frame.."Spark"):SetPoint( "CENTER", "eCastingBar"..frame.."StatusBar", "LEFT", intSparkPosition, 0 )
    
  -- no,  is the current time < the hold time?
  elseif( GetTime( ) < getglobal("eCastingBar"..frame).holdTime ) then
  
    -- yes, exit, we aren't doing anything
    return
  
  -- no, are we in flash mode?
  elseif( getglobal("eCastingBar"..frame).flash ) then
  
    -- yes, sest the flash alpha
    local intAlpha = getglobal("eCastingBar"..frame.."Flash"):GetAlpha( ) + CASTING_BAR_FLASH_STEP
    
    -- reset the text
    getglobal("eCastingBar"..frame.."_Time"):SetText( "" )
    
    -- is the flash alpha < 1?
    if( intAlpha < 1 ) then
    
      -- yes, step it up
      getglobal("eCastingBar"..frame.."Flash"):SetAlpha( intAlpha )
      
    else
    
      -- no, which means its 1 or greater, and we are at full alpha and done.
      getglobal("eCastingBar"..frame).flash = nil
      
    end
    
  -- no, are we fading out now?
  elseif ( getglobal("eCastingBar"..frame).fadeOut ) then
  
    --yes, set the CastingBar alpha
    local intAlpha = getglobal("eCastingBar"..frame):GetAlpha( ) - CASTING_BAR_ALPHA_STEP
    
    -- is the bar alpha > 0?
    if( intAlpha > 0 ) then
    
      -- step it down
      getglobal("eCastingBar"..frame):SetAlpha( intAlpha )
      
    else
    
      -- no, which means its 0 or larger, and we are at fully transparent so we are done and hide the bar.
      getglobal("eCastingBar"..frame).fadeOut = nil
      getglobal("eCastingBar"..frame):Hide( )
      
    end
  end
end

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

--[[ Starts moving the frame. ]]--
function eCastingBar_MouseUp( strButton, frmFrame, frameType )

        if( eCastingBar_Saved[eCastingBar_Player][frameType.."Locked"] == 0 ) then
                getglobal( frmFrame ):StopMovingOrSizing( )
    eCastingBar_Saved[eCastingBar_Player][frameType.."Left"] = getglobal(frmFrame):GetLeft()
    eCastingBar_Saved[eCastingBar_Player][frameType.."Bottom"] = getglobal(frmFrame):GetBottom()
    
    getglobal("eCastingBar"..frameType.."LeftSlider"):SetValue(eCastingBar_Saved[eCastingBar_Player][frameType.."Left"])
    getglobal("eCastingBar"..frameType.."BottomSlider"):SetValue(eCastingBar_Saved[eCastingBar_Player][frameType.."Bottom"])
        end
end

--[[ Stops moving the frame. ]]--
function eCastingBar_MouseDown( strButton, frmFrame, frameType )
        if( strButton == "LeftButton" and (eCastingBar_Saved[eCastingBar_Player][frameType.."Locked"] == 0 ) ) then
                getglobal( frmFrame ):StartMoving( )
        end
end

function eCastingBarGeneral_MouseUp( strButton, frmFrame )
                getglobal( frmFrame ):StopMovingOrSizing( )
end

--[[ Stops moving the frame. ]]--
function eCastingBarGeneral_MouseDown( strButton, frmFrame, frameType )
        if( strButton == "LeftButton") then
                getglobal( frmFrame ):StartMoving( )
        end
end

function eCastingBar_getShowDelay()
        return eCastingBar_Saved[eCastingBar_Player].ShowDelay
end

function eCastingBar_setShowDelay( intShowDelay )
        eCastingBar_Saved[eCastingBar_Player].ShowDelay = intShowDelay
end

function eCastingBar_checkBorders()

  for index, option in frameSuffixes do
    if (eCastingBar_Saved[eCastingBar_Player][option.."HideBorder"] == 1) then
      getglobal("eCastingBar"..option):SetBackdrop(nil)
    else
      getglobal("eCastingBar"..option):SetBackdrop({bgFile = CASTING_BAR_BACKGROUND_FILE, edgeFile = CASTING_BAR_EDGE_FILE, tile = true, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) 
      getglobal("eCastingBar"..option):SetBackdropColor(0,0,0,0.5)
    end
  end

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    if (eCastingBar_Saved[eCastingBar_Player].MirrorHideBorder == 1) then
      getglobal("eCastingBarMirror"..index):SetBackdrop(nil)
    else
      getglobal("eCastingBarMirror"..index):SetBackdrop({bgFile = CASTING_BAR_BACKGROUND_FILE, edgeFile = CASTING_BAR_EDGE_FILE, tile = true, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) 
      getglobal("eCastingBarMirror"..index):SetBackdropColor(0,0,0,0.5)
    end
  end
end

--[[-------------------------------------------
        Functions for Locked State
-------------------------------------------]]--

function eCastingBar_checkLocked()
  for index, option in frameSuffixes do
    -- only show the outline if we are enabled
    if (eCastingBar_Saved[eCastingBar_Player][option.."Enabled"] == 1 and
          eCastingBar_Saved[eCastingBar_Player][option.."Locked"] == 0) then
      getglobal("eCastingBar"..option.."_Outline"):Show()
    else
      getglobal("eCastingBar"..option.."_Outline"):Hide()
    end
  end

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    -- only show the outline if we are enabled
    if (eCastingBar_Saved[eCastingBar_Player].MirrorEnabled == 1 and 
          eCastingBar_Saved[eCastingBar_Player].MirrorLocked == 0) then
      getglobal("eCastingBarMirror_Outline"):Show()
    else
      getglobal("eCastingBarMirror_Outline"):Hide()
    end
  end
end


--[[-------------------------------------------
        Functions for Enabled State
-------------------------------------------]]--

--[[ Disables the frame. ]]--
function eCastingBar_Disable( fraFrame )
  eCastingBar_Saved[eCastingBar_Player][fraFrame.."Enabled"] = 0

        local intIndex = 0
        local strEvent = ""
        
        -- for each border in eCastingBar__Events register event.
  if (fraFrame == "") then      
    for intIndex, strEvent in eCastingBar__Events do
    
      -- make sure old casting bar is registered
      eCastingBar_Register( "CastingBarFrame", strEvent )
        
      -- now unregister our casting bar
      eCastingBar_Unregister( "eCastingBar", strEvent )
      
    end
  
        -- CastTime mod exist 
    if( CastTimeFrame ) then
    
      -- for each event in eCastingBar__CastTimeEvents register event.
      for intIndex, strEvent in eCastingBar__CastTimeEvents do
      
        -- make sure CastTime mod is enabled also bar is registered
        eCastingBar_Register( "CastTimeFrame", strEvent )
        
      end

    end
  end
                
        -- is the frame unlocked?
        if( eCastingBar_Saved[eCastingBar_Player][fraFrame.."Locked"] == 0 ) then
        
                -- yes, lets hide the outline
                getglobal("eCastingBar"..fraFrame.."_Outline"):Hide( )
                
        end

  

  -- Check for FlightMap
  if (FlightMapFrame) then
    if (eCastingBar_Saved[eCastingBar_Player].FlightMapX and eCastingBar_Saved[eCastingBar_Player].FlightMapY) then
      FlightMapTimesFrame:ClearAllPoints()
      FlightMapTimesFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", eCastingBar_Saved[eCastingBar_Player].FlightMapX, eCastingBar_Saved[eCastingBar_Player].FlightMapY )
    end
  end
end

--[[ Enables the frame. ]]--
function eCastingBar_Enable( fraFrame )
  eCastingBar_Saved[eCastingBar_Player][fraFrame.."Enabled"] = 1

        local intIndex = 0
        local strEvent = ""
        
  if (fraFrame == "") then
    -- for each border in eCastingBar__Events register event.
    for intIndex, strEvent in eCastingBar__Events do
    
      -- make sure our bar is registered
      eCastingBar_Register( "eCastingBar", strEvent )
      
      -- now unregister blizzard bar
      eCastingBar_Unregister( "CastingBarFrame", strEvent )
      
    end
    
    -- CastTime mod exist 
    if( CastTimeFrame ) then
    
      -- for each event in eCastingBar__CastTimeEvents register event.
      for intIndex, strEvent in eCastingBar__CastTimeEvents do
      
        -- make sure CastTime mod is enabled also bar is registered
        eCastingBar_Unregister( "CastTimeFrame", strEvent )
        
      end

    end
  end
        
        -- is the frame unlocked?
        if( eCastingBar_Saved[eCastingBar_Player][fraFrame.."Locked"] == 0 ) then
        
                -- yes, lets show the outline
                getglobal("eCastingBar"..fraFrame.."_Outline"):Show( )
                
        end
end

--[[ Toggle enabled state. ]]--
function eCastingBar_checkEnabled()
  for index, option in frameSuffixes do
        if (eCastingBar_Saved[eCastingBar_Player][option.."Enabled"] == 1) then
                eCastingBar_Enable(option, 1)
    else
      eCastingBar_Disable(option, 0)
        end
  end   

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    if (eCastingBar_Saved[eCastingBar_Player].MirrorEnabled == 1) then
                if( eCastingBar_Saved[eCastingBar_Player].MirrorLocked == 0 ) then      
        -- yes, lets show the outline
        getglobal("eCastingBarMirror_Outline"):Show()        
      end               
    else
      if( eCastingBar_Saved[eCastingBar_Player].MirrorLocked == 0 ) then
        -- yes, lets hide the outline
        getglobal("eCastingBarMirror_Outline"):Hide()
      end
        end
  end
end


--[[-------------------------------------------
        Functions for using the Texture 
-------------------------------------------]]--

--[[ Toggle enabled state. ]]--
function eCastingBar_checkTextures()

  for index, option in frameSuffixes do
    if ( eCastingBar_Saved[eCastingBar_Player][option.."UsePerlTexture"] == 1) then
        getglobal("eCastingBar"..option.."Texture"):SetTexture( CASTING_BAR_PERL_TEXTURE )
    else
      getglobal("eCastingBar"..option.."Texture"):SetTexture( CASTING_BAR_DEFAULT_TEXTURE )
    end

    getglobal("eCastingBar"..option.."Texture"):SetWidth(20)
    getglobal("eCastingBar"..option.."Texture"):SetHeight(10)

  end

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    if ( eCastingBar_Saved[eCastingBar_Player].MirrorUsePerlTexture == 1) then
        getglobal("eCastingBarMirror"..index.."StatusBarTexture"):SetTexture( CASTING_BAR_PERL_TEXTURE )
    else
      getglobal("eCastingBarMirror"..index.."StatusBarTexture"):SetTexture( CASTING_BAR_DEFAULT_TEXTURE )
    end

    getglobal("eCastingBarMirror"..index.."StatusBarTexture"):SetWidth(20)
    getglobal("eCastingBarMirror"..index.."StatusBarTexture"):SetHeight(10)
  end
        
end


function eCastingBar_checkTimeColors()
  local Red, Green, Blue, Alpha
  
  for index, option in frameSuffixes do
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player][option.."TimeColor"])
    getglobal("eCastingBar"..option.."_Time"):SetTextColor(Red,Green,Blue, Alpha )
  end

  Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].MirrorTimeColor)

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    getglobal("eCastingBarMirror"..index.."StatusBar_Time"):SetTextColor(Red,Green,Blue, Alpha )
  end
end

function eCastingBar_setDelayColor()
  local Red, Green, Blue, Alpha
  Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].DelayColor)
  eCastingBar_Delay:SetTextColor(Red,Green,Blue, Alpha )
end

--[[ sets up the flash to look cool ]]--
--      (thanks goes to kaitlin for the code used while resting). 
function eCastingBar_checkFlashBorderColors()

        local frmFrame = "eCastingBarFlash"
        local intIndex = 0
        local strBorder = ""

  local Red, Green, Blue, Alpha

  for index, option in frameSuffixes do
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player][option.."FlashBorderColor"])

    -- for each border in eCastingBar__FlashBorders set the color to gold.
    for intIndex, strBorder in eCastingBar__FlashBorders do
      getglobal( "eCastingBar"..option.."Flash_"..strBorder ):SetVertexColor( Red, Green, Blue, Alpha ) 
    end
  end
        
  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    Red, Green, Blue, Alpha = unpack(eCastingBar_Saved[eCastingBar_Player].MirrorFlashBorderColor)
    for intIndex, strBorder in eCastingBar__FlashBorders do
      getglobal( "eCastingBarMirror"..index.."Flash_"..strBorder ):SetVertexColor( Red, Green, Blue, Alpha )    
    end
  end
end


-- Sets the width and height of the casting bar
function eCastingBar_SetSize()
  local width, height, bottom, left, bar

  for index, option in frameSuffixes do
    -- check boundaries
    if (eCastingBar_Saved[eCastingBar_Player][option.."Width"] < CASTING_BAR_SLIDER_WIDTH_MIN) then
      width = CASTING_BAR_SLIDER_WIDTH_MIN
    elseif (eCastingBar_Saved[eCastingBar_Player][option.."Width"] > CASTING_BAR_SLIDER_WIDTH_MAX ) then
      width = CASTING_BAR_SLIDER_WIDTH_MAX
    else
      width = eCastingBar_Saved[eCastingBar_Player][option.."Width"]
    end
    
    if (eCastingBar_Saved[eCastingBar_Player][option.."Height"] > CASTING_BAR_SLIDER_HEIGHT_MAX) then
      height = CASTING_BAR_SLIDER_HEIGHT_MAX
    elseif (eCastingBar_Saved[eCastingBar_Player][option.."Height"] < CASTING_BAR_SLIDER_HEIGHT_MIN ) then
      height = CASTING_BAR_SLIDER_HEIGHT_MIN
    else
      height = eCastingBar_Saved[eCastingBar_Player][option.."Height"]
    end

    --if (eCastingBar_Saved[eCastingBar_Player][option.."Left"] < 0) then
    --  left = 0
    --else
      left = eCastingBar_Saved[eCastingBar_Player][option.."Left"]
    --end


    --if (eCastingBar_Saved[eCastingBar_Player][option.."Bottom"] < 0 ) then
    --  bottom = 0
    --else
      bottom = eCastingBar_Saved[eCastingBar_Player][option.."Bottom"]
    --end
    
    getglobal("eCastingBar"..option):SetWidth(width)
    getglobal("eCastingBar"..option):SetHeight(height)

    getglobal("eCastingBar"..option.."Background"):SetWidth(width - 9)
    getglobal("eCastingBar"..option.."Background"):SetHeight(height - 8)

    getglobal("eCastingBar"..option.."Flash"):SetWidth(width)
    getglobal("eCastingBar"..option.."Flash"):SetHeight(height)

    getglobal("eCastingBar"..option.."StatusBar"):SetWidth(width - 9)
    getglobal("eCastingBar"..option.."StatusBar"):SetHeight(height - 10)

    getglobal("eCastingBar"..option.."_Outline"):SetWidth(width)
    getglobal("eCastingBar"..option.."_Outline"):SetHeight(height)
    getglobal("eCastingBar"..option.."_Outline"):ClearAllPoints()
    getglobal("eCastingBar"..option.."_Outline"):SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", left, bottom )



    getglobal("eCastingBar"..option.."Flash_TOP"):SetWidth(width - 24)
    getglobal("eCastingBar"..option.."Flash_BOTTOM"):SetWidth(width - 24)
    getglobal("eCastingBar"..option.."Flash_LEFT"):SetHeight(height - 24)
    getglobal("eCastingBar"..option.."Flash_RIGHT"):SetHeight(height - 24)

    getglobal("eCastingBar"..option.."Spark"):SetHeight(height + 13)

    getglobal("eCastingBar"..option.."Text"):SetWidth(width - 49)
    getglobal("eCastingBar"..option.."Text"):SetHeight(height + 13)

    -- set the font size
    eCastingBarText:SetTextHeight(eCastingBar_Saved[eCastingBar_Player][option.."FontSize"])
    eCastingBar_Time:SetTextHeight(eCastingBar_Saved[eCastingBar_Player][option.."FontSize"])
  end

  for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
    
    -- check boundaries
    if (eCastingBar_Saved[eCastingBar_Player].MirrorWidth < CASTING_BAR_SLIDER_WIDTH_MIN) then
      width = CASTING_BAR_SLIDER_WIDTH_MIN
    elseif (eCastingBar_Saved[eCastingBar_Player].MirrorWidth > CASTING_BAR_SLIDER_WIDTH_MAX ) then
      width = CASTING_BAR_SLIDER_WIDTH_MAX
    else
      width = eCastingBar_Saved[eCastingBar_Player].MirrorWidth
    end
    
    if (eCastingBar_Saved[eCastingBar_Player].MirrorHeight > CASTING_BAR_SLIDER_HEIGHT_MAX) then
      height = CASTING_BAR_SLIDER_HEIGHT_MAX
    elseif (eCastingBar_Saved[eCastingBar_Player].MirrorHeight < CASTING_BAR_SLIDER_HEIGHT_MIN ) then
      height = CASTING_BAR_SLIDER_HEIGHT_MIN
    else
      height = eCastingBar_Saved[eCastingBar_Player].MirrorHeight
    end

    --if (eCastingBar_Saved[eCastingBar_Player].MirrorLeft < 0) then
    --  left = 0
    --else
      left = eCastingBar_Saved[eCastingBar_Player].MirrorLeft
    --end


    --if (eCastingBar_Saved[eCastingBar_Player].MirrorBottom < 0 ) then
    --  bottom = 0
    --else
      bottom = eCastingBar_Saved[eCastingBar_Player].MirrorBottom
    --end
    
    getglobal("eCastingBarMirror"..index):SetWidth(width)
    getglobal("eCastingBarMirror"..index):SetHeight(height)

    getglobal("eCastingBarMirror"..index.."Background"):SetWidth(width - 9)
    getglobal("eCastingBarMirror"..index.."Background"):SetHeight(height - 8)

    getglobal("eCastingBarMirror"..index.."Flash"):SetWidth(width)
    getglobal("eCastingBarMirror"..index.."Flash"):SetHeight(height)

    getglobal("eCastingBarMirror"..index.."StatusBar"):SetWidth(width - 9)
    getglobal("eCastingBarMirror"..index.."StatusBar"):SetHeight(height - 10)

    getglobal("eCastingBarMirror_Outline"):SetWidth(width)
    getglobal("eCastingBarMirror_Outline"):SetHeight(height)
    getglobal("eCastingBarMirror_Outline"):ClearAllPoints()
    getglobal("eCastingBarMirror_Outline"):SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", left, bottom )


    getglobal("eCastingBarMirror"..index.."Flash_TOP"):SetWidth(width - 24)
    getglobal("eCastingBarMirror"..index.."Flash_BOTTOM"):SetWidth(width - 24)
    getglobal("eCastingBarMirror"..index.."Flash_LEFT"):SetHeight(height - 24)
    getglobal("eCastingBarMirror"..index.."Flash_RIGHT"):SetHeight(height - 24)

    getglobal("eCastingBarMirror"..index.."StatusBarSpark"):SetHeight(height + 13)

    getglobal("eCastingBarMirror"..index.."StatusBarText"):SetWidth(width - 49)
    getglobal("eCastingBarMirror"..index.."StatusBarText"):SetHeight(height + 13)

    -- set the font size
    getglobal("eCastingBarMirror"..index.."StatusBarText"):SetTextHeight(eCastingBar_Saved[eCastingBar_Player].MirrorFontSize)
    getglobal("eCastingBarMirror"..index.."StatusBar_Time"):SetTextHeight(eCastingBar_Saved[eCastingBar_Player].MirrorFontSize)
  end
end




function eCastingBar_Copy_Table(src, dest)
        for index, value in src do
                if (type(value) == "table") then
                        dest[index] = {};
                        eCastingBar_Copy_Table(value, dest[index]);
                else
                        dest[index] = value;
                end
        end
end





------------------- MIRROR -------------------


function eCastingBarMirror_OnLoad()
        this:RegisterEvent("MIRROR_TIMER_PAUSE");
        this:RegisterEvent("MIRROR_TIMER_STOP");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this.timer = nil;
end

Generated by GNU Enscript 1.6.5.90.