vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

assert( oRA, "oRA not found!")

------------------------------
--      Are you local?      --
------------------------------

local L = AceLibrary("AceLocale-2.2"):new("oRALResist")
local compost = AceLibrary:HasInstance("Compost-2.0") and AceLibrary("Compost-2.0")
local function getnewtable() return compost and compost:Acquire() or {} end
local function reclaimtable(t) if compost then compost:Reclaim(t) end end

----------------------------
--      Localization      --
----------------------------

L:RegisterTranslations("enUS", function() return {
        ["resist"] = true,
        ["resistleader"] = true,
        ["Options for resistance checks."] = true,
        ["Leader/Resist"] = true,
        ["Name"] = true,
        ["Fire"] = true,
        ["Nature"] = true,
        ["Frost"] = true,
        ["Shadow"] = true,
        ["Arcane"] = true,
        ["Resistance checks disabled."] = true,
        ["Resistances"] = true,
        ["Fr"] = true,
        ["Ft"] = true,
        ["N"] = true,
        ["A"] = true,
        ["S"] = true,
        ["Refresh"] = true,
        ["Close"] = true,
        ["check"] = true,
        ["Perform resistance check"] = true,
        ["Check the raid's resistances."] = true,
} end )

L:RegisterTranslations("koKR", function() return {

        ["Options for resistance checks."] = "공격대원 저항 확인 설정",
        ["Leader/Resist"] = "공격대장/저항",
        ["Name"] = "이름",
        ["Fire"] = "화염",
        ["Nature"] = "자연",
        ["Frost"] = "냉기",
        ["Shadow"] = "암흑",
        ["Arcane"] = "비전",
        ["Resistance checks disabled."] = "저항확인이 불가능합니다",
        ["Resistances"] = "저항",
        ["Fr"] = "화",
        ["Ft"] = "냉",
        ["N"] = "자",
        ["A"] = "비",
        ["S"] = "암",
        ["Refresh"] = "갱신",
        ["Close"] = "닫기",
        ["Perform resistance check"] = "저항 확인 실시",
        ["Check the raid's resistances."] = "공격대원의 저항을 확인합니다.",
} end )

L:RegisterTranslations("zhCN", function() return {
        ["resist"] = "抗性",
        ["resistleader"] = "resistleader",
        ["Options for resistance checks."] = "抗性助手选项",
        ["Leader/Resist"] = "Leader/Resist",
        ["Name"] = "姓名",
        ["Fire"] = "火焰",
        ["Nature"] = "自然",
        ["Frost"] = "冰霜",
        ["Shadow"] = "暗影",
        ["Arcane"] = "奥术",
        ["Resistance checks disabled."] = "禁止抗性检查",
        ["Resistances"] = "抗性",
        ["Fr"] = "火",
        ["Ft"] = "冰",
        ["N"] = "自",
        ["A"] = "奥",
        ["S"] = "暗",
        ["Refresh"] = "刷新",
        ["Close"] = "关闭",
        ["check"] = "检查",
        ["Perform resistance check"] = "进行抗性检查",
        ["Check the raid's resistances."] = "检查团队抗性",
} end )

L:RegisterTranslations("zhTW", function() return {
        ["resist"] = "抗性",
        ["resistleader"] = "resistleader",
        ["Options for resistance checks."] = "抗性助手選項",
        ["Leader/Resist"] = "領隊/抗性",
        ["Name"] = "姓名",
        ["Fire"] = "火焰",
        ["Nature"] = "自然",
        ["Frost"] = "冰霜",
        ["Shadow"] = "陰影",
        ["Arcane"] = "祕法",
        ["Resistance checks disabled."] = "已停用抗性檢查",
        ["Resistances"] = "抗性",
        ["Fr"] = "火",
        ["Ft"] = "冰",
        ["N"] = "自",
        ["A"] = "祕",
        ["S"] = "陰",
        ["Refresh"] = "更新",
        ["Close"] = "關閉",
        ["check"] = "檢查",
        ["Perform resistance check"] = "進行抗性檢查",
        ["Check the raid's resistances."] = "檢查團隊抗性",
} end )

L:RegisterTranslations("frFR", function() return {
        --["resist"] = true,
        --["resistleader"] = true,
        ["Options for resistance checks."] = "Options concernant les v\195\169rifications des r\195\169sistances.",
        ["Leader/Resist"] = "Chef/R\195\169sistances",
        ["Name"] = "Nom",
        ["Fire"] = "Feu",
        --["Nature"] = true,
        ["Frost"] = "Givre",
        ["Shadow"] = "Ombre",
        ["Arcane"] = "Arcanes",
        ["Resistance checks disabled."] = "V\195\169rifications des r\195\169sistances désactiv\195\169es.",
        ["Resistances"] = "R\195\169sistances",
        ["Fr"] = "F",
        ["Ft"] = "G",
        --["N"] = true,
        --["A"] = true,
        ["S"] = "O",
        ["Refresh"] = "Rafra\195\174chir",
        ["Close"] = "Fermer",
        --["check"] = true,
        ["Perform resistance check"] = "V\195\169rifier les r\195\169sistances",
        ["Check the raid's resistances."] = "V\195\169rifie les r\195\169sistances du raid.",
} end )

----------------------------------
--      Module Declaration      --
----------------------------------

oRALResist = oRA:NewModule(L["resistleader"])
oRALResist.defaults = {
}
oRALResist.participant = true
oRALResist.name = L["Leader/Resist"]
oRALResist.consoleCmd = L["resist"]
oRALResist.consoleOptions = {
        type = "group",
        desc = L["Options for resistance checks."],
        name = L["Resistances"],
        args = {
                [L["check"]] = {
                        type="execute", name = L["Perform resistance check"],
                        desc = L["Check the raid's resistances."],
                        func = function()
                                        oRALResist:PerformResistanceCheck()
                                end,
                        disabled = function() return not oRA:IsModuleActive(oRALResist) or not oRALResist:IsValidRequest() end,
                },

        }
}

------------------------------
--      Initialization      --
------------------------------

function oRALResist:OnEnable()
        self.resists = getnewtable()
        self.sorting = getnewtable()
        
        self.sorting[1] = L["Name"]
        self.sorting[2] = L["Fire"]
        self.sorting[3] = L["Nature"]
        self.sorting[4] = L["Frost"]
        self.sorting[5] = L["Shadow"]
        self.sorting[6] = L["Arcane"]

        self:RegisterCheck("RST", "oRA_ResistanceResponse")
        self:RegisterShorthand("raresist", function() self:PerformResistanceCheck() end )
        self:SetupFrames()
end

function oRALResist:OnDisable()
        reclaimtable(self.resists)
        self.resists = nil
        reclaimtable(self.sorting)
        self.sorting = nil
        self:UnregisterAllEvents()
        self:UnregisterCheck("RST")
        self:UnregisterShorthand("raresist")
end


-------------------------
--   Event Handlers    --
-------------------------

function oRALResist:oRA_ResistanceResponse( msg, author)
        msg = self:CleanMessage(msg)
        local _,_,requestby = string.find(msg, "^RST %-1 ([^%s]+)$")
        if requestby and requestby == UnitName("player") then
                self:Print( author .. " " .. L["Resistance checks disabled."])
        else
                local _,_, fire, nature, frost, shadow, arcane, requestby = string.find(msg, "^RST (%d+) (%d+) (%d+) (%d+) (%d+) ([^%s]+)$")
                if fire and requestby and requestby == UnitName("player") then
                        table.insert( self.resists, {author, tonumber(fire), tonumber(nature), tonumber(frost), tonumber(shadow), tonumber(arcane)})
                        self:UpdateScrollBar()
                end
        end
end

-------------------------
--  Utility Functions  --
-------------------------

function oRALResist:SetupFrames()
        local f, t, sframe, i, j

        f, _, _ = GameFontNormal:GetFont()

        self.frames = {}

        self.frames.main = CreateFrame("Frame", "oRAResistReportFrame", UIParent)
        self.frames.main:Hide()
        self.frames.main:SetWidth(325)
        self.frames.main:SetHeight(350)
        self.frames.main:EnableMouse(true)
        self.frames.main:SetMovable(true)
        self.frames.main:RegisterForDrag("LeftButton")
        self.frames.main:SetScript("OnDragStart", function() this:StartMoving() end)
        self.frames.main:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
        self.frames.main:SetBackdrop({
                bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16,
                edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 16,
                insets = {left = 4, right = 4, top = 4, bottom = 4},
                })
        self.frames.main:SetBackdropBorderColor(.5, .5, .5)
        self.frames.main:SetBackdropColor(0,0,0)
        self.frames.main:ClearAllPoints()
        self.frames.main:SetPoint("CENTER", WorldFrame, "CENTER", 0, 0)

        self.frames.fade = self.frames.main:CreateTexture(nil, "BORDER")
        self.frames.fade:SetWidth(319)
        self.frames.fade:SetHeight(25)
        self.frames.fade:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.fade:SetPoint("TOP", self.frames.main, "TOP", 0, -4)
        self.frames.fade:SetBlendMode("ADD")
        self.frames.fade:SetGradientAlpha("VERTICAL", .1, .1, .1, 0, .25, .25, .25, 1)
        self.frames.main.Fade = self.frames.fade

        self.frames.header = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.header:SetFont(f, 14)
        self.frames.header:SetWidth(300)
        self.frames.header:SetText(L["Resistances"])
        self.frames.header:SetTextColor(1, .8, 0)
        self.frames.header:ClearAllPoints()
        self.frames.header:SetPoint("TOP", self.frames.main, "TOP", 0, -10)

        self.frames.headername = CreateFrame("Button", nil, self.frames.main)
        self.frames.headername.owner = self
        self.frames.headername:SetWidth(130)
        self.frames.headername:SetHeight(16)
        self.frames.headername:SetPoint("TOPLEFT", self.frames.main, "TOPLEFT", 10, -35)
        self.frames.headername:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 1)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headernamehigh = self.frames.headername:CreateTexture(nil, "BORDER")
        self.frames.headernamehigh:SetWidth(130)
        self.frames.headernamehigh:SetHeight(16)
        self.frames.headernamehigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headernamehigh:SetAllPoints(self.frames.headername)
        self.frames.headernamehigh:SetBlendMode("ADD")
        self.frames.headernamehigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headername:SetHighlightTexture(self.frames.headernamehigh)

        self.frames.headernametext = self.frames.headername:CreateFontString(nil,"OVERLAY")
        self.frames.headernametext.owner = self
        self.frames.headernametext:SetFont(f, 14)
        self.frames.headernametext:SetWidth(130)
        self.frames.headernametext:SetText(L["Name"])
        self.frames.headernametext:SetTextColor(1, .8, 0)
        self.frames.headernametext:ClearAllPoints()
        self.frames.headernametext:SetJustifyH("LEFT")
        self.frames.headernametext:SetAllPoints(self.frames.headername)

        self.frames.headerfire = CreateFrame("Button", nil, self.frames.main)
        self.frames.headerfire.owner = self
        self.frames.headerfire:SetWidth(30)
        self.frames.headerfire:SetHeight(16)
        self.frames.headerfire:SetPoint("LEFT", self.frames.headername, "RIGHT")
        self.frames.headerfire:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 2)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headerfirehigh = self.frames.headerfire:CreateTexture(nil, "BORDER")
        self.frames.headerfirehigh:SetWidth(30)
        self.frames.headerfirehigh:SetHeight(16)
        self.frames.headerfirehigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headerfirehigh:SetAllPoints(self.frames.headerfire)
        self.frames.headerfirehigh:SetBlendMode("ADD")
        self.frames.headerfirehigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headerfire:SetHighlightTexture(self.frames.headerfirehigh)


        self.frames.headerfiretext = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.headerfiretext:SetFont(f, 14)
        self.frames.headerfiretext:SetWidth(30)
        self.frames.headerfiretext:SetText(L["Fr"])
        self.frames.headerfiretext:SetTextColor(1, 0, 0)
        self.frames.headerfiretext:ClearAllPoints()
        self.frames.headerfiretext:SetJustifyH("RIGHT")
        self.frames.headerfiretext:SetAllPoints(self.frames.headerfire)

        self.frames.headernature = CreateFrame("Button", nil, self.frames.main)
        self.frames.headernature.owner = self
        self.frames.headernature:SetWidth(30)
        self.frames.headernature:SetHeight(16)
        self.frames.headernature:SetPoint("LEFT", self.frames.headerfire, "RIGHT")
        self.frames.headernature:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 3)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headernaturehigh = self.frames.headernature:CreateTexture(nil, "BORDER")
        self.frames.headernaturehigh:SetWidth(30)
        self.frames.headernaturehigh:SetHeight(16)
        self.frames.headernaturehigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headernaturehigh:SetAllPoints(self.frames.headernature)
        self.frames.headernaturehigh:SetBlendMode("ADD")
        self.frames.headernaturehigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headernature:SetHighlightTexture(self.frames.headernaturehigh)


        self.frames.headernaturetext = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.headernaturetext.owner = self
        self.frames.headernaturetext:SetFont(f, 14)
        self.frames.headernaturetext:SetWidth(60)
        self.frames.headernaturetext:SetText(L["N"])
        self.frames.headernaturetext:SetTextColor(0, 1, 0)
        self.frames.headernaturetext:ClearAllPoints()
        self.frames.headernaturetext:SetJustifyH("RIGHT")
        self.frames.headernaturetext:SetAllPoints(self.frames.headernature)

        self.frames.headerfrost = CreateFrame("Button", nil, self.frames.main)
        self.frames.headerfrost.owner = self
        self.frames.headerfrost:SetWidth(30)
        self.frames.headerfrost:SetHeight(16)
        self.frames.headerfrost:SetPoint("LEFT", self.frames.headernature, "RIGHT")
        self.frames.headerfrost:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 4)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headerfrosthigh = self.frames.headerfrost:CreateTexture(nil, "BORDER")
        self.frames.headerfrosthigh:SetWidth(30)
        self.frames.headerfrosthigh:SetHeight(16)
        self.frames.headerfrosthigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headerfrosthigh:SetAllPoints(self.frames.headerfrost)
        self.frames.headerfrosthigh:SetBlendMode("ADD")
        self.frames.headerfrosthigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headerfrost:SetHighlightTexture(self.frames.headerfrosthigh)


        self.frames.headerfrosttext = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.headerfrosttext.owner = self
        self.frames.headerfrosttext:SetFont(f, 14)
        self.frames.headerfrosttext:SetWidth(60)
        self.frames.headerfrosttext:SetText(L["Ft"])
        self.frames.headerfrosttext:SetTextColor(.5, .5, 1)
        self.frames.headerfrosttext:ClearAllPoints()
        self.frames.headerfrosttext:SetJustifyH("RIGHT")
        self.frames.headerfrosttext:SetAllPoints(self.frames.headerfrost)

        self.frames.headershadow = CreateFrame("Button", nil, self.frames.main)
        self.frames.headershadow.owner = self
        self.frames.headershadow:SetWidth(30)
        self.frames.headershadow:SetHeight(16)
        self.frames.headershadow:SetPoint("LEFT", self.frames.headerfrost, "RIGHT")
        self.frames.headershadow:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 5)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headershadowhigh = self.frames.headershadow:CreateTexture(nil, "BORDER")
        self.frames.headershadowhigh:SetWidth(30)
        self.frames.headershadowhigh:SetHeight(16)
        self.frames.headershadowhigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headershadowhigh:SetAllPoints(self.frames.headershadow)
        self.frames.headershadowhigh:SetBlendMode("ADD")
        self.frames.headershadowhigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headershadow:SetHighlightTexture(self.frames.headershadowhigh)


        self.frames.headershadowtext = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.headershadowtext.owner = self
        self.frames.headershadowtext:SetFont(f, 14)
        self.frames.headershadowtext:SetWidth(60)
        self.frames.headershadowtext:SetText(L["S"])
        self.frames.headershadowtext:SetTextColor(.8, 0, 1)
        self.frames.headershadowtext:ClearAllPoints()
        self.frames.headershadowtext:SetJustifyH("RIGHT")
        self.frames.headershadowtext:SetAllPoints(self.frames.headershadow)

        self.frames.headerarcane = CreateFrame("Button", nil, self.frames.main)
        self.frames.headerarcane.owner = self
        self.frames.headerarcane:SetWidth(30)
        self.frames.headerarcane:SetHeight(16)
        self.frames.headerarcane:SetPoint("LEFT", self.frames.headershadow, "RIGHT")
        self.frames.headerarcane:SetScript("OnClick",
                        function()
                                this.owner:Sort(self.resists, 6)
                                this.owner:UpdateScrollBar()
                        end)

        self.frames.headerarcanehigh = self.frames.headerarcane:CreateTexture(nil, "BORDER")
        self.frames.headerarcanehigh:SetWidth(30)
        self.frames.headerarcanehigh:SetHeight(16)
        self.frames.headerarcanehigh:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
        self.frames.headerarcanehigh:SetAllPoints(self.frames.headerarcane)
        self.frames.headerarcanehigh:SetBlendMode("ADD")
        self.frames.headerarcanehigh:SetGradientAlpha("VERTICAL", .1, .08, 0, 0, .2, .16, 0, 1)
        self.frames.headerarcane:SetHighlightTexture(self.frames.headerarcanehigh)


        self.frames.headerarcanetext = self.frames.main:CreateFontString(nil,"OVERLAY")
        self.frames.headerarcanetext.owner = self
        self.frames.headerarcanetext:SetFont(f, 14)
        self.frames.headerarcanetext:SetWidth(60)
        self.frames.headerarcanetext:SetText(L["A"])
        self.frames.headerarcanetext:SetTextColor(1, 1, 1)
        self.frames.headerarcanetext:ClearAllPoints()
        self.frames.headerarcanetext:SetJustifyH("RIGHT")
        self.frames.headerarcanetext:SetAllPoints(self.frames.headerarcane)




        self.frames.leftbutton = CreateFrame("Button", nil, self.frames.main)
        self.frames.leftbutton.owner = self
        self.frames.leftbutton:SetWidth(125)
        self.frames.leftbutton:SetHeight(32)
        self.frames.leftbutton:SetPoint("BOTTOMRIGHT", self.frames.main, "BOTTOM", -10, 10)
        
        t = self.frames.leftbutton:CreateTexture()
        t:SetWidth(125)
        t:SetHeight(32)
        t:SetPoint("CENTER", self.frames.leftbutton, "CENTER")
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Up")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        self.frames.leftbutton:SetNormalTexture(t)

        t = self.frames.leftbutton:CreateTexture(nil, "BACKGROUND")
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Down")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        t:SetAllPoints(self.frames.leftbutton)
        self.frames.leftbutton:SetPushedTexture(t)
        
        t = self.frames.leftbutton:CreateTexture()
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Highlight")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        t:SetAllPoints(self.frames.leftbutton)
        t:SetBlendMode("ADD")
        self.frames.leftbutton:SetHighlightTexture(t)
        self.frames.leftbuttontext = self.frames.leftbutton:CreateFontString(nil,"OVERLAY")
        self.frames.leftbuttontext:SetFontObject(GameFontHighlight)
        self.frames.leftbuttontext:SetText(L["Refresh"])
        self.frames.leftbuttontext:SetAllPoints(self.frames.leftbutton)

        self.frames.leftbutton:SetScript("OnClick",
                        function()
                                this.owner:PerformResistanceCheck()
                        end)



        self.frames.rightbutton = CreateFrame("Button", nil, self.frames.main)
        self.frames.rightbutton.owner = self
        self.frames.rightbutton:SetWidth(125)
        self.frames.rightbutton:SetHeight(32)
        self.frames.rightbutton:SetPoint("BOTTOMLEFT", self.frames.main, "BOTTOM", 10, 10)
        
        t = self.frames.rightbutton:CreateTexture()
        t:SetWidth(125)
        t:SetHeight(32)
        t:SetPoint("CENTER", self.frames.rightbutton, "CENTER")
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Up")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        self.frames.rightbutton:SetNormalTexture(t)

        t = self.frames.rightbutton:CreateTexture(nil, "BACKGROUND")
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Down")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        t:SetAllPoints(self.frames.rightbutton)
        self.frames.rightbutton:SetPushedTexture(t)
        
        t = self.frames.rightbutton:CreateTexture()
        t:SetTexture("Interface\\Buttons\\UI-Panel-Button-Highlight")
        t:SetTexCoord(0, 0.625, 0, 0.6875)
        t:SetAllPoints(self.frames.rightbutton)
        t:SetBlendMode("ADD")
        self.frames.rightbutton:SetHighlightTexture(t)
        self.frames.rightbuttontext = self.frames.rightbutton:CreateFontString(nil,"OVERLAY")
        self.frames.rightbuttontext:SetFontObject(GameFontHighlight)
        self.frames.rightbuttontext:SetText(L["Close"])
        self.frames.rightbuttontext:SetAllPoints(self.frames.rightbutton)

        self.frames.rightbutton:SetScript("OnClick",
                        function()
                                this.owner.frames.main:Hide()
                        end)


        self.frames.entry = {}
        self.frames.entry[1] = self:ScrollEntryFrame(1)
        self.frames.entry[1]:SetPoint("TOPLEFT", self.frames.main, "TOPLEFT", 10, -55 )
        
        for i=2, 15 do
                j = i - 1
                self.frames.entry[i] = self:ScrollEntryFrame()
                self.frames.entry[i]:SetPoint("TOPLEFT", self.frames.entry[j], "BOTTOMLEFT")
        end


        self.frames.sframe = CreateFrame("ScrollFrame", "oRAResistScrollFrame", self.frames.main, "FauxScrollFrameTemplate")
        self.frames.sframe.owner = self
        self.frames.sframe:SetParent(self.frames.main)
        self.frames.sframe:SetWidth(285)
        self.frames.sframe:SetHeight(240)
        self.frames.sframe:SetPoint("TOPLEFT", self.frames.main, "TOPLEFT", 5, -55)

        self.frames.sframe:SetScript("OnVerticalScroll",
                        function()
                                FauxScrollFrame_OnVerticalScroll(16, function() this.owner:UpdateScrollBar() end)
                        end )

end

function oRALResist:ScrollEntryFrame()
        local f = CreateFrame("Button", nil, self.frames.main )
        f:SetWidth(240)
        f:SetHeight(16)

        f.textname = f:CreateFontString(nil,"ARTWORK")
        f.textname:SetFontObject(GameFontHighlight)
        f.textname:SetWidth(130)
        f.textname:SetHeight(16)
        f.textname:SetJustifyH("LEFT")
        f.textname:SetNonSpaceWrap(false)
        f.textname:ClearAllPoints()
        f.textname:SetPoint( "LEFT", f, "LEFT")
        f.textname:SetTextColor(1,1,1)
        f.textname:SetText("Name")

        f.textfire = f:CreateFontString(nil,"ARTWORK")
        f.textfire:SetFontObject(GameFontHighlight)
        f.textfire:SetWidth(30)
        f.textfire:SetHeight(16)
        f.textfire:SetJustifyH("RIGHT")
        f.textfire:SetNonSpaceWrap(false)
        f.textfire:ClearAllPoints()
        f.textfire:SetPoint("LEFT", f.textname, "RIGHT")
        f.textfire:SetTextColor(1,0,0)
        f.textfire:SetText("12")

        f.textnature = f:CreateFontString(nil,"ARTWORK")
        f.textnature:SetFontObject(GameFontHighlight)
        f.textnature:SetWidth(30)
        f.textnature:SetHeight(16)
        f.textnature:SetJustifyH("RIGHT")
        f.textnature:SetNonSpaceWrap(false)
        f.textnature:ClearAllPoints()
        f.textnature:SetPoint("LEFT", f.textfire, "RIGHT")
        f.textnature:SetTextColor(0,1,0)
        f.textnature:SetText("3")

        f.textfrost = f:CreateFontString(nil,"ARTWORK")
        f.textfrost:SetFontObject(GameFontHighlight)
        f.textfrost:SetWidth(30)
        f.textfrost:SetHeight(16)
        f.textfrost:SetJustifyH("RIGHT")
        f.textfrost:SetNonSpaceWrap(false)
        f.textfrost:ClearAllPoints()
        f.textfrost:SetPoint("LEFT", f.textnature, "RIGHT")
        f.textfrost:SetTextColor(.5,.5,1)
        f.textfrost:SetText("3")

        f.textshadow = f:CreateFontString(nil,"ARTWORK")
        f.textshadow:SetFontObject(GameFontHighlight)
        f.textshadow:SetWidth(30)
        f.textshadow:SetHeight(16)
        f.textshadow:SetJustifyH("RIGHT")
        f.textshadow:SetNonSpaceWrap(false)
        f.textshadow:ClearAllPoints()
        f.textshadow:SetPoint("LEFT", f.textfrost, "RIGHT")
        f.textshadow:SetTextColor(.8,0,1)
        f.textshadow:SetText("3")

        f.textarcane = f:CreateFontString(nil,"ARTWORK")
        f.textarcane:SetFontObject(GameFontHighlight)
        f.textarcane:SetWidth(30)
        f.textarcane:SetHeight(16)
        f.textarcane:SetJustifyH("RIGHT")
        f.textarcane:SetNonSpaceWrap(false)
        f.textarcane:ClearAllPoints()
        f.textarcane:SetPoint("LEFT", f.textshadow, "RIGHT")
        f.textarcane:SetTextColor(1,1,1)
        f.textarcane:SetText("3")

        return f
end

function oRALResist:UpdateScrollBar()
        local i,j
        local entries = table.getn(self.resists)
        FauxScrollFrame_Update(self.frames.sframe, entries, 15, 16)

        for i = 1, 15 do
                j = i + FauxScrollFrame_GetOffset(self.frames.sframe)

                if j <= entries then
                        self.frames.entry[i].textname:SetText(self.resists[j][1])
                        self.frames.entry[i].textfire:SetText(self.resists[j][2])
                        self.frames.entry[i].textnature:SetText(self.resists[j][3])
                        self.frames.entry[i].textfrost:SetText(self.resists[j][4])
                        self.frames.entry[i].textshadow:SetText(self.resists[j][5])
                        self.frames.entry[i].textarcane:SetText(self.resists[j][6])
                        self.frames.entry[i]:Show()
                else
                        self.frames.entry[i]:Hide()
                end
        end

end

----------------------
-- Command Handlers --
----------------------

function oRALResist:PerformResistanceCheck()
        if not self:IsPromoted() then return end
        reclaimtable(self.resists)
        self.resists = nil
        self.resists = getnewtable()
        self:SendMessage("RSTC")
        self.frames.main:Show()
        self:UpdateScrollBar()
end


function oRALResist:Sort(tbl, sortBy)
        table.sort(tbl,
                function(t1, t2)
                        if (t1[sortBy] == t2[sortBy] ) then
                                return t1[1] < t2[1]
                        else
                                return t1[sortBy] > t2[sortBy]
                        end
                end
        )
end