vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

-- array holding bars
SW_Bars = {};

SW_BARSEPX = 5;
SW_BARSEPY = 3;

function SW_BarRegister(oB)

        local pName = oB:GetParent():GetName();
        
        if SW_Bars[pName] == nil then SW_Bars[pName] = {}; end
        
        table.insert(SW_Bars[pName], oB);
end

function SW_SelOpt(optButton)
        local wasShown = false;
        if SW_BarSettingsFrameV2:IsVisible() then
                wasShown= true;
                SW_BarSettingsFrameV2:Hide();
                if ColorPickerFrame:IsVisible() then 
                        ColorPickerFrame:Hide();
                end
        end
        local cont = optButton:GetParent():GetParent():GetName();
        
        SW_Settings["BarFrames"][cont]["Selected"] = optButton.optID;
        SW_OptUpdateText(cont);
        SW_BarsLayout(cont, true);
        if wasShown then
                getglobal("SW_BarSettingsFrameV2"):Show();
        end
end
function SW_ToggleReport(frameP)
        local frame = getglobal("SW_BarReportFrame")
        if(  frame:IsVisible() ) then
                frame:Hide();
        else
                frame.caller = frameP;
                frame:Show();
        end
end
function SW_ToggleSync()
        local frame = getglobal("SW_BarSyncFrame")
        if(  frame:IsVisible() ) then
                frame:Hide();
        else
                frame:Show();
        end
end
function SW_UpdateSyncChanText(newChan)
        if tonumber(newChan) then
                StaticPopup_Show("SW_InvalidChan");
        end
end

function SW_OptUpdateText(pName)
        local selOpt =  SW_Settings["BarFrames"][pName]["Selected"];
        local bSet = SW_GetBarSettings(pName);
        local b = getglobal(pName.."_Selector_Opt"..selOpt);
        local txtOpt = "";
        local txtFrame = "";
        if bSet["OT"] == nil then
                txtOpt = selOpt;
        else
                txtOpt = bSet["OT"];
        end
        b.NormalText:SetText(txtOpt);
        b.HighlightText:SetText(txtOpt);
        if bSet["OTF"] == nil then
                txtFrame = selOpt;
        else
                txtFrame = bSet["OTF"];
        end
        getglobal(pName.."_Title_Text"):SetText(txtFrame);
end
function SW_SetOptTxt(opt)
        local bS = SW_Settings["InfoSettings"][opt.optID];
        if bS == nil then return; end
        local oc = bS["OC"];
        local txt = "";
        if bS == nil or bS["OT"] == nil then
                txt = opt.optID;
        else
                txt = bS["OT"];
        end
        opt.NormalText:SetText(txt);
        opt.HighlightText:SetText(txt);
        --old version check
        if oc == nil or (oc[1] == 1 and oc[2] == 0 and oc[3] == 0 and oc[4] == 1) then
                oc = SW_Settings["Colors"]["TitleBars"]
        end
        
        opt.NormalT:SetVertexColor(unpack(oc));
        opt.HighlightT:SetVertexColor(unpack(oc));
        
end

function SW_GetBarSettings(pName)
        if SW_Settings["BarFrames"] == nil then
                SW_Settings["BarFrames"] = {};
        end
        
        if SW_Settings["BarFrames"][pName] == nil then
                SW_Settings["BarFrames"][pName] = {};
                SW_Settings["BarFrames"][pName]["Selected"] = 1;
                SW_Settings["BarFrames"][pName]["Docked"] = {1};
        end
        -- older version stored other stuff here
        if SW_Settings["BarFrames"][pName]["Selected"] == nil then
                SW_Settings["BarFrames"][pName] = {};
                SW_Settings["BarFrames"][pName]["Selected"] = 1;
                SW_Settings["BarFrames"][pName]["Docked"] = {1};
        end
        return SW_GetInfoSettings(SW_Settings["BarFrames"][pName]["Selected"]);
end
function SW_UpdateOptVis(reset)
        local nShow = SW_Settings["QuickOptCount"];
        local pre = "SW_BarFrame1_Selector_Opt";
        local toSelect = 1;
        if reset ~= nil then
                if nShow > 0 then
                        if SW_Settings["BarFrames"] ~= nil and SW_Settings["BarFrames"]["SW_BarFrame1"] ~= nil then
                                toSelect = SW_Settings["BarFrames"]["SW_BarFrame1"]["Selected"];
                                if toSelect == nil then
                                        toSelect = 1;
                                end
                        end
                        if toSelect > nShow then
                                SW_SelOpt(getglobal(pre..nShow));
                        end
                else
                        SW_SelOpt(getglobal(pre.."1"));
                end
        end
        for i= 1, SW_OPT_COUNT do
                if i <= nShow then
                        getglobal(pre..i):Show();
                else
                        getglobal(pre..i):Hide();
                end
        end
end
function SW_SelectFilter(fName)
        getglobal("SW_Filter_NPC"):SetChecked(0);
        getglobal("SW_Filter_PC"):SetChecked(0);
        getglobal("SW_Filter_Group"):SetChecked(0);
        getglobal("SW_Filter_EverGroup"):SetChecked(0);
        getglobal("SW_Filter_None"):SetChecked(0);
        getglobal(fName):SetChecked(1);
end
function SW_GetInfoSettings(infoNr)
        if SW_Settings["InfoSettings"] == nil then
                SW_Settings["InfoSettings"] = {}
        end
        local iS = SW_Settings["InfoSettings"][infoNr];
        
        
        if iS == nil then
                SW_Settings["InfoSettings"][infoNr] = {}
                iS = SW_Settings["InfoSettings"][infoNr];
                for k,v in pairs(SW_DefaultBar) do 
                        if type(v) ~= "table" then
                                iS[k] = v;
                        else
                                iS[k] = {};
                                for si, sv in ipairs(v) do
                                        table.insert(iS[k], sv);
                                end
                        end
                end
        else
                -- 1.4.2 merging removed bar width and adden colum count
                if iS["COLC"] == nil then
                        iS["BW"] = nil;
                        iS["COLC"] = 1;
                end
        end
        return iS;
end
-- 1.5 added pausing of data collection
function SW_ToggleRunning(doCollection)
        if SW_Settings["SYNCLastChan"]~=nil and SW_SyncCheckInChan(SW_Settings["SYNCLastChan"]) then
                doCollection = true;
        end
        
        local chkRunnig = getglobal("SW_OptChk_Running");
        local stateChanged = (doCollection ~= SW_Settings["IsRunning"]);
        
        
        if doCollection then
                chkRunnig:SetChecked(1);
                SW_Settings["IsRunning"] = true;
        else
                chkRunnig:SetChecked(0);
                SW_Settings["IsRunning"] = false;
        end
        
        if stateChanged then
                if (doCollection) then
                        -- turn on stuff
                        SW_UnpauseEvents();
                else
                        -- turn off stuff
                        SW_PauseEvents();
                        -- stop CastTrack Pending
                        SW_Timed_Calls:StopPending();
                        -- stop DPS timer
                        SW_CombatTimeInfo.awaitingStart = false;
                        SW_CombatTimeInfo.awaitingEnd = false;
                end
        end
end
function SW_UpdateColor(pName)
        local bs = SW_Bars[pName];
        local barSettings = SW_GetBarSettings(pName);
        local bc = barSettings["BC"];
        local bfc = barSettings["BFC"];
        local oc = barSettings["OC"];
        
        local selOpt =  SW_Settings["BarFrames"][pName]["Selected"];
        local b = getglobal(pName.."_Selector_Opt"..selOpt);
        -- old version check
        
        if oc == nil or (oc[1] == 1 and oc[2] == 0 and oc[3] == 0 and oc[4] == 1) then
                oc = SW_Settings["Colors"]["TitleBars"]
        end
        b.NormalT:SetVertexColor(unpack(oc));
        b.HighlightT:SetVertexColor(unpack(oc));
        
        for i,b in ipairs(bs) do
                getglobal(b:GetName().."_Texture"):SetVertexColor(bc[1],bc[2],bc[3],bc[4]);
                getglobal(b:GetName().."_Text"):SetVertexColor(bfc[1],bfc[2],bfc[3],bfc[4]);
                getglobal(b:GetName().."_TextVal"):SetVertexColor(bfc[1],bfc[2],bfc[3],bfc[4]);
        end
end
function SW_BarsLayout(pName, changeAll)
        local bs = SW_Bars[pName];
        if bs == nil then return; end
        
        local bSet = SW_GetBarSettings(pName);
        local startX, startY, fWidth, fHeight;
        local bHeight, bWidth, fontSize;
        local colPos=1; local rowPos=1;
        local colCount=bSet["COLC"];
        local oTmp;
        local posX = 0;
        local posY = 0;
        local oP = getglobal(pName);
        
        
        local changeWidth = false;
        local changeHeight = false;
        local changeFont = false;
        
        startX = oP.swoBarX;
        startY = oP.swoBarY;
        fWidth = oP:GetWidth();
        fHeight = oP:GetHeight();
        
        bAutoWidth = math.floor(((fWidth - 10 - ((colCount - 1) * SW_BARSEPX))  / colCount));
        for i,b in ipairs(bs) do
                if oP.lastTexture == nil or oP.lastTexture ~= bSet["BT"] or changeAll then
                        b:SetStatusBarTexture("Interface\\AddOns\\SW_Stats\\images\\b"..bSet["BT"]);
                end
                if i == 1 then
                        fontSize = b:GetFontSize();
                        if fontSize ~= bSet["BFS"] or changeAll then
                                fontSize = bSet["BFS"];
                                b:SetFontSize(fontSize);
                                changeFont = true;
                        end
                        bHeight = b:GetHeight();
                        if bHeight ~= bSet["BH"] or changeAll then
                                bHeight = bSet["BH"];
                                b:SetHeight(bHeight);
                                changeHeight = true;
                        end
                        bWidth = b:GetWidth();
                        if bWidth ~= bAutoWidth or changeAll then
                                bWidth = bAutoWidth;
                                b:SetWidth(bWidth);
                                changeWidth = true;
                        end
                        
                        b:Show();
                        b:SetPoint("TOPLEFT",pName,"TOPLEFT",startX,startY);
                        --colCount = math.floor(((fWidth - 10)  / (SW_BARSEPX + bWidth)));
                        rowCount = math.floor(((fHeight - 30) / (SW_BARSEPY + bHeight)));
                        rowPos = rowPos + 1;
                        b.canBeSeen = true;
                else
                        if rowPos > rowCount then
                                rowPos = 1;
                                colPos = colPos + 1;    
                        end
                        posX =  ((colPos -1) * SW_BARSEPX) + startX + ((colPos -1) * bWidth);
                        posY =  startY -(((rowPos -1) * SW_BARSEPY) + ((rowPos -1) * bHeight));
                        -- update
                        if changeWidth then
                                b:SetWidth(bWidth);
                        end
                        if changeHeight then
                                b:SetHeight(bHeight);
                        end
                        if changeFont then
                                b:SetFontSize(fontSize);
                        end
                        b:SetPoint("TOPLEFT",pName,"TOPLEFT",posX,posY);
                        
                        rowPos = rowPos + 1;
                        if posX + bWidth > fWidth then
                                b:Hide();
                                b.canBeSeen = false;
                        else
                                b:Show();
                                b.canBeSeen = true;
                        end
                        
                end
        end
        
        if changeAll then
                SW_UpdateColor(pName);
        end
        --this forces the ui to create new font objects -> text is clear
        if changeFont then
                local tmpScale = oP:GetScale();
                oP:SetScale(tmpScale + 0.01);
                oP:SetScale(tmpScale);
        end
        
        oP.lastTexture = bSet["BT"];
        
end
function SW_OptKey(num)
        if not getglobal("SW_BarFrame1"):IsVisible() then
                getglobal("SW_BarFrame1"):Show()
        end
        SW_SelOpt(getglobal("SW_BarFrame1_Selector_Opt"..num));
end
function SW_BarLayoutRegisterd()
        for f,_ in pairs(SW_Bars) do
                SW_BarsLayout(f);
                SW_UpdateColor(f);
                SW_OptUpdateText(f);
        end
end
function SW_BarLayoutRegisterdOnResize()
        for f,_ in pairs(SW_Bars) do 
                if getglobal(f).isResizing then
                        SW_BarsLayout(f);
                end
        end
end
function SW_InitBarFrameBar(b)
        local scTarget = b:GetName().."_Texture";
        getglobal(scTarget):SetVertexColor(0,0.8,0,1);
        b:SetMinMaxValues(0,100); 
        b:SetValue(100);
        SW_BarRegister(this);
        b.LText = getglobal(b:GetName().."_Text");
        b.RText = getglobal(b:GetName().."_TextVal");
        b.SelfBar = this;
        b.canBeSeen = false;
        function b:SetBarText(text)
                if text == nil then
                        self.LText:SetText(" ");
                        self.SelfBar:Hide();
                else
                        self.LText:SetText(text);
                        self.SelfBar:Show();
                end
        end
        function b:SetValText(text)
                self.RText:SetText(text);
        end
        function b:GetFontSize()
                return math.floor(self.LText:GetHeight() + 0.5);
        end
        function b:SetFontSize(h)
                -- this distorts text check SW_BarsLayout() for fix
                self.LText:SetTextHeight(h);
                self.RText:SetTextHeight(h);
        end
end

function SW_SetBarColor(what)
        local R,G,B = ColorPickerFrame:GetColorRGB();
        local A = 1 - OpacitySliderFrame:GetValue();
        local bfc;
        
        if what == "DIRECT" then
                bfc = ColorPickerFrame.SWColorTable
        else
                local barSettings = SW_GetBarSettings(ColorPickerFrame.SWBarFrame);
                bfc = barSettings[what];
        end 
        
        
        bfc[1] = R; bfc[2] = G; bfc[3] = B; bfc[4] = A;
        
        if what == "DIRECT" then
                if ColorPickerFrame.SWCallOnUpdate then
                        ColorPickerFrame.SWCallOnUpdate(bfc);
                end
        else
                SW_UpdateColor(ColorPickerFrame.SWBarFrame);
        end
        if ColorPickerFrame.SWCSName ~= nil then
                getglobal(ColorPickerFrame.SWCSName):SetColor(bfc);
        end
end
function SW_CancelBarColor(oldVals, what)
        local bfc;
        
        if what == "DIRECT" then
                bfc = ColorPickerFrame.SWColorTable
        else
                local barSettings = SW_GetBarSettings(ColorPickerFrame.SWBarFrame);
                bfc = barSettings[what];
        end 
        
        bfc[1] = oldVals[1]; bfc[2] = oldVals[2];
        bfc[3] = oldVals[3]; bfc[4] = oldVals[4];
        if what == "DIRECT" then
                if ColorPickerFrame.SWCallOnUpdate then
                        ColorPickerFrame.SWCallOnUpdate(bfc);
                end
        else
                SW_UpdateColor(ColorPickerFrame.SWBarFrame);
        end
        if ColorPickerFrame.SWCSName ~= nil then
                getglobal(ColorPickerFrame.SWCSName):SetColor(bfc);
        end
end
-- 1.5.3 TODO Low Prio I should redo this sometime the color picker thing is getting messy
-- probably could just reduce it to "DIRECT" color and callOnUpdate
function SW_DoColorPicker(targetFrame, what, csName, callOnUpdate)
        if ColorPickerFrame:IsVisible() then return; end
        local bfc;
        
        if what == "DIRECT" then
                bfc = targetFrame;
                ColorPickerFrame.SWBarFrame = "SW_BarFrame1";
                ColorPickerFrame.SWColorTable = targetFrame;
                ColorPickerFrame.SWCallOnUpdate = callOnUpdate;
                
        else
                
                local barSettings = SW_GetBarSettings(targetFrame);

                bfc = barSettings[what];
                if bfc == nil then
                        barSettings[what] = {1,0,0,1};
                        bfc = barSettings[what];
                end
                
                
                if bfc[1]==1 and bfc[2]==0 and bfc[3]==0 and bfc[4]==1 then
                        bfc = SW_Settings["Colors"]["TitleBars"];
                        
                end
                
                ColorPickerFrame.SWBarFrame = targetFrame;
                ColorPickerFrame.SWColorTable = nil;
        end
        
        ColorPickerFrame.SWCSName = csName;
        ColorPickerFrame.opacityFunc = function() SW_SetBarColor(what); end
        ColorPickerFrame.func = function() SW_SetBarColor(what); end
        ColorPickerFrame.cancelFunc = function(oldVals) SW_CancelBarColor(oldVals, what); end
        ColorPickerFrame.hasOpacity = true;
        ColorPickerFrame.opacity = 1 - bfc[4];
        ColorPickerFrame.previousValues = {bfc[1], bfc[2], bfc[3], bfc[4]};
        ColorPickerFrame:SetColorRGB(bfc[1], bfc[2], bfc[3]);
        ColorPickerFrame:Show();
end
function SW_UpdateClassColorAlpha(newColor)
        local alpha = newColor[4];
        SW_Settings["Colors"]["DRUID"][4] = alpha;
        SW_Settings["Colors"]["HUNTER"][4] = alpha;
        SW_Settings["Colors"]["MAGE"][4] = alpha;
        SW_Settings["Colors"]["PALADIN"][4] = alpha;
        SW_Settings["Colors"]["PRIEST"][4] = alpha;
        SW_Settings["Colors"]["ROGUE"][4] = alpha;
        SW_Settings["Colors"]["SHAMAN"][4] = alpha;
        SW_Settings["Colors"]["WARLOCK"][4] = alpha;
        SW_Settings["Colors"]["WARRIOR"][4] = alpha;
end
function SW_UpdateFrameBackdrops(newColor)
        local tmpTarget;
        for i, k in ipairs(SW_Registerd_BF_Titles) do
                tmpTarget = getglobal(k):GetParent();
                tmpTarget:SetBackdropBorderColor(unpack(newColor));
        end
        local tmpCol = {unpack(newColor)};
        tmpCol[4] = 1;
        
        --for SW_TabbedFrameInfo[pName][oTab:GetName()]
        for k, v in pairs(SW_TabbedFrameInfo) do
                for k2, v2 in pairs(v) do
                        tmpTarget = getglobal(k2);
                        if tmpTarget.IsSelectedTab then
                                tmpTarget:SetBackdropBorderColor(unpack(tmpCol));
                                getglobal(k2.."_Text"):SetTextColor(unpack(tmpCol));
                        end
                end
        end     
end
function SW_LockFrames(isLocked)
        if isLocked then
                SW_Settings["BFLocked"] = true;
        else
                SW_Settings["BFLocked"] = nil;
        end
        for i, k in ipairs(SW_Registerd_BF_Titles) do
                getglobal(k):GetParent().isLocked = isLocked;
        end
end
function SW_UpdateMainWinBack(newColor)
        SW_BarFrame1:SetBackdropColor(unpack(SW_Settings["Colors"]["MainWinBack"])) 
end
function SW_UpdateTitleColor(newColor)
        local tmpTarget;
        local regEx = "SW_BarFrame1_Selector_Opt(%d+)"
        local oc;
        
        for i, k in ipairs(SW_Registerd_BF_Titles) do
                tmpTarget = getglobal(k .. "_Texture");
                tmpTarget:SetVertexColor(unpack(newColor));
        end
        
        for i, k in ipairs(SW_Registered_BF_TitleButtons) do
                s,e, id = string.find(k, regEx);
                oc = nil;
                if id ~= nil then
                        id = tonumber(id);
                        
                        if SW_Settings["InfoSettings"] and SW_Settings["InfoSettings"][id] then
                                oc = SW_Settings["InfoSettings"][id]["OC"];     
                        end
                        if not oc or (oc[1] == 1 and oc[2] == 0 and oc[3] == 0 and oc[4] == 1) then
                                --oc = SW_Settings["Colors"]["TitleBars"]
                                tmpTarget = getglobal(k);
                                tmpTarget.NormalT:SetVertexColor(unpack(newColor));
                                tmpTarget.HighlightT:SetVertexColor(unpack(newColor));
                        end
                else
                        tmpTarget = getglobal(k);
                        tmpTarget.NormalT:SetVertexColor(unpack(newColor));
                        tmpTarget.HighlightT:SetVertexColor(unpack(newColor));
                end
                
                
        end
        
        
end
function SW_UpdateTitleTextColor(newColor)
        local tmpTarget;
        local regEx = "SW_BarFrame1_Selector_Opt(%d+)"
        local id = 0;
        for i, k in ipairs(SW_Registerd_BF_Titles) do
                tmpTarget = getglobal(k .. "_Text");
                tmpTarget:SetVertexColor(unpack(newColor));
        end
        local barSettings = SW_GetBarSettings("SW_BarFrame1");
        
        for i, k in ipairs(SW_Registered_BF_TitleButtons) do
                s,e, id = string.find(k, regEx)
                if not id then
                        tmpTarget = getglobal(k);
                        tmpTarget.NormalText:SetVertexColor(unpack(newColor));
                        tmpTarget.NormalText:SetVertexColor(unpack(newColor));
                end
        end

end

function SW_BarsCheckFilters(name, SF, CF, PF)
        local selFil = "";
        local charFil = "";
        local cType = nil;
        local petFil = nil;
        
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end
        
        -- only if the pet filters are set to inactive
        -- add pets here, else they are handeled after this
        if petFil.Inactive then
                petFil = true;
        else
                if SW_PetInfo["PET_OWNER"][name] == nil then
                        -- this isn't, and never was a pet
                        petFil = true;
                else
                        if SW_S_Details[name] ~= nil and SW_S_Details[name]["UTYPE"] == "GPET" then
                                petFil = false;
                        else
                                petFil = true;
                        end
                end
        end
        
        if not petFil then return false; end
        
        if SW_S_Details[name] == nil then return false; end
        if SF == nil then
                selFil = getglobal("SW_Filter_None").SW_Filter;
        else
                selFil = getglobal(SF).SW_Filter;
        end
        if CF == nil then
                charFil = SW_ClassFilters[1]
        else
                charFil = SW_ClassFilters[ CF ]
        end
        if selFil == "NONE" and charFil == "NONE" then
                return true;
        end
        
        if selFil == "NONE" then
                selFil = true;
        else
                --1.5 filters added EGROUP types added GPET GPC
                if selFil == "GROUP" then
                        if SW_Friends[name] == nil then
                                 selFil = SW_PetHasOwner(name);
                        else
                                selFil = true;
                        end
                elseif selFil == "EGROUP" then
                        cType = SW_S_Details[name]["UTYPE"];
                        selFil = (cType == "GPC" or cType == "GPET");
                elseif selFil == "PC" then
                        cType = SW_S_Details[name]["UTYPE"];
                        selFil = (cType == "GPC" or cType == "GPET" or cType == "PC");
                else
                        selFil = (selFil == SW_S_Details[name]["UTYPE"]);
                end
        end
        if charFil == "NONE" then
                charFil = true;
        else
                charFil = (charFil == SW_S_Details[name]["CLASSE"]);
        end
        if selFil and charFil then
                return true;
        else
                return false;
        end
end
--SW_EntityBarColor
function SW_EBC(ent, bs)
        
        if bs["UCC"] then
                if SW_Friends[ent] == nil or SW_Friends[ent]["CLASSE"] == nil then
                        if SW_S_Details[ent] == nil or SW_S_Details[ent]["CLASSE"] == nil then
                                return bs["BC"];
                        else
                                return SW_Settings["Colors"][ SW_S_Details[ent]["CLASSE"] ];
                        end
                else
                        return SW_Settings["Colors"][ SW_S_Details[ent]["CLASSE"] ];
                end
        else
                return nil;
        end
end
function SW_AddLatePetInfo(vals, petFil, type, index, bSet)
        
        local SF = bSet["SF"];
        local CF = bSet["CF"];
        local PF = "SW_PF_Inactive";
        
        if petFil.Active then
                for k,v in pairs(SW_PetInfo["PET_OWNER"]) do
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                tmpVal = v[type][index];
                                if tmpVal >0 then
                                        table.insert(vals, {SW_STR_PET_PREFIX..k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        elseif petFil.Current then
                -- for EGROUP filter just do the same as active, it just makes more sense
                -- from a user perspective current pets in in ever group..oO nah
                local selFil;
                if SF ~= nil then
                        selFil = getglobal(SF).SW_Filter;
                end
                if selFil == "EGROUP" then
                        for k,v in pairs(SW_PetInfo["PET_OWNER"]) do
                                if SW_BarsCheckFilters(k, SF, CF, PF) then
                                        tmpVal = v[type][index];
                                        if tmpVal >0 then
                                                table.insert(vals, {SW_STR_PET_PREFIX..k,tmpVal,SW_EBC(k,bSet)});
                                        end
                                end
                        end
                else
                        for k,v in pairs(SW_PetInfo["PET_OWNER"]) do
                                if SW_PetHasOwner(k) then
                                        tmpVal = v[type][index];
                                        if tmpVal > 0 then
                                                table.insert(vals, {SW_STR_PET_PREFIX..k,tmpVal,SW_EBC(k,bSet)});
                                        end
                                end
                        end
                end
        elseif petFil.VPP then
                for k,v in pairs(SW_PetInfo["OWNER_PET"]) do
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                tmpVal = v[type][index];
                                if tmpVal > 0 then
                                        table.insert(vals, {SW_STR_VPP_PREFIX..k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        elseif petFil.VPR then
                tmpVal = 0;
                for k,v in pairs(SW_PetInfo["PET_OWNER"]) do
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                tmpVal = tmpVal + v[type][index];
                        end
                end
                if tmpVal >0 then
                        table.insert(vals, {SW_STR_VPR,tmpVal,SW_EBC(k,bSet)});
                end
        --elseif petFil.Ignore then -- well nothing to do here
        end
end
function SW_GetDeathInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        
        -- ignore pet filter here
        for k,v in pairs(SW_S_Details) do
                tmpVal = v[SW_PRINT_ITEM_DEATHS];
                if tmpVal ~= nil then
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                                table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;    
end

function SW_GetDmgInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local petFil = nil;
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end
        
        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][1];
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                if (petFil.MM or petFil.MB) and SW_PetInfo["OWNER_PET"][k] ~= nil then
                                        tmpVal = tmpVal + SW_PetInfo["OWNER_PET"][k][SW_PRINT_ITEM_TOTAL_DONE][1];
                                end
                                if tmpVal >0 then
                                        table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        end
        
        if petFil.latePets then
                SW_AddLatePetInfo(vals, petFil, SW_PRINT_ITEM_TOTAL_DONE, 1, bSet);
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
        
        return vals;    
end
function SW_GetDmgInfoDPS(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local petFil = nil;
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end
        
        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][1];
                        if SW_BarsCheckFilters(k, "SW_Filter_EverGroup", CF, PF) then
                                if (petFil.MM or petFil.MB) and SW_PetInfo["OWNER_PET"][k] ~= nil then
                                        tmpVal = tmpVal + SW_PetInfo["OWNER_PET"][k][SW_PRINT_ITEM_TOTAL_DONE][1];
                                end
                                if tmpVal >0 then
                                        table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        end
        
        if petFil.latePets then
                SW_AddLatePetInfo(vals, petFil, SW_PRINT_ITEM_TOTAL_DONE, 1, bSet);
        end
        local secs = SW_RPS.currentSecs + SW_RPS.totalSecs;
        for k, v in ipairs(vals) do
                --SW_printStr(v[2]..".."..secs);
                v[2] = math.floor( (v[2] / secs) * 100 + 0.5) / 100;
        end
        
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
        
        return vals;    
end
function SW_GetDmgGotInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local petFil = nil;
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end

        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_RECIEVED] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_RECIEVED][1];
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                if (petFil.MR or petFil.MB) and SW_PetInfo["OWNER_PET"][k] ~= nil then
                                        tmpVal = tmpVal + SW_PetInfo["OWNER_PET"][k][SW_PRINT_ITEM_RECIEVED][1];
                                end
                                if tmpVal >0 then
                                        table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        end
        if petFil.latePets then
                SW_AddLatePetInfo(vals, petFil, SW_PRINT_ITEM_RECIEVED, 1, bSet);
        end
        
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);   
        return vals;    
end

function SW_GetHealGotInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local petFil = nil;
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end

        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_RECIEVED] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_RECIEVED][2];
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                if (petFil.MR or petFil.MB) and SW_PetInfo["OWNER_PET"][k] ~= nil then
                                        tmpVal = tmpVal + SW_PetInfo["OWNER_PET"][k][SW_PRINT_ITEM_RECIEVED][2];
                                end
                                if tmpVal >0 then
                                        table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        end

        if petFil.latePets then
                SW_AddLatePetInfo(vals, petFil, SW_PRINT_ITEM_RECIEVED, 2, bSet);
        end
        
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                
        return vals;    
end
function SW_GetDamageManaInfo(SF, CF, PF, bSet)
        local vals = {};
        local ratio;
        local dmg;
        
        for k,v in pairs(SW_S_Details) do
                if SW_S_ManaUsage[k] ~= nil and SW_S_ManaUsage[k][1] > 0 then
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                                -- filter out hunters
                                -- hm would have to filter out palas and shamans aswell
                                --if v["CLASSE"] ~= "HUNTER" then
                                        if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                                                dmg = v[SW_PRINT_ITEM_TOTAL_DONE][1];
                                                if dmg > 0 then
                                                        ratio = math.floor( (dmg / SW_S_ManaUsage[k][1]) * 1000 + 0.5) / 1000;
                                                        table.insert(vals, {k,ratio,SW_EBC(k,bSet)});
                                                end
                                        end
                                --end
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
        return vals;
end
function SW_GetEffectiveHealManaInfo(SF, CF, PF, bSet)
        local vals = {};
        local eHeal;
        local ratio;
        
        for k,v in pairs(SW_S_Details) do
                if SW_S_ManaUsage[k] ~= nil and SW_S_ManaUsage[k][2] > 0 then
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                        
                                eHeal = SW_GetEffectiveHealInfoFor(k);
                                if eHeal > 0 then
                                        ratio = math.floor( (eHeal / SW_S_ManaUsage[k][2]) * 1000 + 0.5) / 1000;
                                        table.insert(vals, {k,ratio,SW_EBC(k,bSet)});
                                end
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);   
        return vals;
end
function SW_GetEffectiveHealInfoFor(name)
        local tmpVal;
        local eHeal;
        local k = name;
        
        local v = SW_S_Details[k];
        if v == nil then
                return 0;
        end

        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][2];
        
        if tmpVal >0 then
                if SW_S_Healed[k] ~= nil and SW_S_Healed[k][SW_OVERHEAL] ~= nil then
                        eHeal = tmpVal - SW_S_Healed[k][SW_OVERHEAL];
                        if eHeal > 0 then
                                return eHeal;
                        end
                else
                        return tmpVal;
                end
        end

        return 0;
        
end

function SW_GetEffectiveHealInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local eHeal;
        
        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][2];
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                                if tmpVal >0 then
                                        if SW_S_Healed[k] ~= nil and SW_S_Healed[k][SW_OVERHEAL] ~= nil then
                                                eHeal = tmpVal - SW_S_Healed[k][SW_OVERHEAL];
                                                if eHeal > 0 then
                                                        table.insert(vals, {k,eHeal,SW_EBC(k,bSet)});
                                                end
                                        else
                                                table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                        end
                                end
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);           
        return vals;
end
function SW_GetHealInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local petFil = nil;
        if PF == nil then
                petFil = getglobal("SW_PF_Inactive").petFil;
        else
                petFil = getglobal(PF).petFil;
        end
        
        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][2];
                        if SW_BarsCheckFilters(k, SF, CF, PF) then
                                if (petFil.MM or petFil.MB) and SW_PetInfo["OWNER_PET"][k] ~= nil then
                                        tmpVal = tmpVal + SW_PetInfo["OWNER_PET"][k][SW_PRINT_ITEM_TOTAL_DONE][2];
                                end
                                if tmpVal >0 then
                                        table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)});
                                end
                        end
                end
        end

        if petFil.latePets then
                SW_AddLatePetInfo(vals, petFil, SW_PRINT_ITEM_TOTAL_DONE, 2, bSet);
        end
        
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);           
        return vals;    
end
function SW_GetOverHealInfo(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local pOh;
        
        for k,v in pairs(SW_S_Details) do
                if v[SW_PRINT_ITEM_TOTAL_DONE] ~= nil then
                        tmpVal = v[SW_PRINT_ITEM_TOTAL_DONE][2];
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                                if tmpVal >0 then
                                        if SW_S_Healed[k] ~= nil and SW_S_Healed[k][SW_OVERHEAL] then
                                                pOh = math.floor((SW_S_Healed[k][SW_OVERHEAL]/ tmpVal) * 1000 +0.5)/10;
                                                table.insert(vals, {k.." ("..pOh.."%)",SW_S_Healed[k][SW_OVERHEAL], SW_EBC(k,bSet)});
                                        end
                                end
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;    
end
function SW_GetHealInfoHealer(whoName)
        local vals = {};
        local who = SW_S_Healed[ whoName ];
        
        if who == nil then return {}; end;
        local bSet = SW_GetBarSettings("SW_BarFrame1");
        
        for k,v in pairs(who) do
                if v > 0 and k ~= SW_OVERHEAL then
                        table.insert(vals, {k,v,SW_EBC(k,bSet)});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);   
        return vals;
end

function SW_GetDetailsPerTick(whoName)
local who = SW_S_Details[ whoName ];
        local val ="";
        local vMax = "";
        
        if who == nil then return {}; end;
        
        local vals = {};
        
        local dCol = SW_Settings["Colors"]["Damage"];
        local hCol = SW_Settings["Colors"]["Heal"];
        
        for k,v in pairs(who) do
                if k == SW_PRINT_ITEM_RECIEVED then
                        
                elseif k == SW_PRINT_ITEM_TYPE then
                        
                elseif k == SW_PRINT_ITEM_TOTAL_DONE then
                        
                elseif k == "UTYPE" then
                        
                elseif k == "CLASSE" then
                
                elseif k == SW_PRINT_ITEM_DEATHS then
                
                else
                        if v[1] > 0 then
                                table.insert(vals, {k.." "..SW_STR_EVENTCOUNT..v[4].." - "..(math.floor((v[6]/v[4]) *1000 + 0.5)/10).."%",math.floor((v[1]/v[4])*10)/10,dCol,1});
                        end
                        if v[2] > 0 then
                                table.insert(vals, {k.." "..SW_STR_EVENTCOUNT..v[4].." - "..(math.floor((v[7]/v[4]) *1000 + 0.5)/10).."%",math.floor((v[2]/v[4])*10)/10,hCol,2});
                        end
                end
                
        end
        table.sort(vals, 
                function(a,b)
                        if a[4] == b[4] then
                                return a[2] > b[2];
                        else
                                return a[4] < b[4];
                        end
                end);
        return vals;
end
function SW_PowerGainInfo(whoName)
        local who = SW_S_Details[ whoName ];
        local val ="";
        local vMax = "";
        
        if who == nil then return {}; end;
        local bSet = SW_GetBarSettings("SW_BarFrame1");
        local vals = {};
        
        for k,v in pairs(who) do
                if k == SW_PRINT_ITEM_RECIEVED then
                        -- SW_printStr(LIGHTYELLOW_FONT_COLOR_CODE..k..FONT_COLOR_CODE_CLOSE..":  "..string.format(SW_PRINT_INFO_RECIEVED, v[1], v[2]), 1);                     
                elseif k == SW_PRINT_ITEM_TYPE then
                        -- ignore in this printout
                elseif k == SW_PRINT_ITEM_TOTAL_DONE then
                        --ignored for now
                elseif k == "UTYPE" then
                        --PC or NPC ignore
                elseif k == "CLASSE" then
                
                elseif k == SW_PRINT_ITEM_DEATHS then
                
                else
                        if v[1] == 0 and v[2] == 0 and v[4] ~= 0 then
                                table.insert(vals, {k,v[4],SW_EBC(k,bSet)});
                        end
                end
        end
        table.sort(vals, 
                        function(a,b)
                                if a[4] == b[4] then
                                        return a[2] > b[2];
                                else
                                        return a[4] < b[4];
                                end
                        end);
        return vals;
end
function SW_DecurseCountInfo(SF, CF, PF, bSet)
        local vals = {};
        
        for k,v in pairs(SW_S_SpellInfo) do
                if v[SW_DECURSEDUMMY] ~= nil and v[SW_DECURSEDUMMY]["total"] ~= nil then
                        
                        if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                                table.insert(vals, {k,v[SW_DECURSEDUMMY]["total"],SW_EBC(k,bSet)});
                        end
                end
        end

        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);   
        return vals;
end
function SW_GetManaRatio(whoName)
        if SW_S_SpellInfo[SW_SELF_STRING] == nil or whoName ~= SW_SELF_STRING then
                return {};
        end
        
        local who = SW_S_Details[ whoName ];
        local val ="";
        local vMax = "";
        
        if who == nil then return {}; end;
        
        local vals = {};

        local dCol = SW_Settings["Colors"]["Damage"];
        local hCol = SW_Settings["Colors"]["Heal"];
        
        local manaUsed = 0;
        local ratio = 0;
        
        for k,v in pairs(who) do
                if k == SW_PRINT_ITEM_RECIEVED then
                        -- SW_printStr(LIGHTYELLOW_FONT_COLOR_CODE..k..FONT_COLOR_CODE_CLOSE..":  "..string.format(SW_PRINT_INFO_RECIEVED, v[1], v[2]), 1);                     
                elseif k == SW_PRINT_ITEM_TYPE then
                        -- ignore in this printout
                elseif k == SW_PRINT_ITEM_TOTAL_DONE then
                        -- ignored for now
                elseif k == "UTYPE" then
                        --PC or NPC ignore
                elseif k == "CLASSE" then
                
                elseif k == SW_PRINT_ITEM_DEATHS then
                
                else
                        if SW_S_SpellInfo[SW_SELF_STRING][k] ~= nil then
                                manaUsed = SW_S_SpellInfo[SW_SELF_STRING][k][2];
                                if manaUsed > 0 then
                                        
                                        if v[1] > 0 then
                                                ratio = math.floor( (v[1] / manaUsed) * 100 + 0.5) / 100;
                                                table.insert(vals, {k.." #"..SW_S_SpellInfo[SW_SELF_STRING][k][1],ratio,dCol,1});       
                                        end
                                                
                                        if v[2] > 0 then
                                                ratio = math.floor( (v[2] / manaUsed) * 100 + 0.5) / 100;
                                                table.insert(vals, {k.." #"..SW_S_SpellInfo[SW_SELF_STRING][k][1],ratio,hCol,2});
                                                --table.insert(vals, {k.." ("..v[3]..")",v[2],hCol,2});
                                        end
                                end
                        end
                end
        end
        table.sort(vals, 
                function(a,b)
                        if a[4] == b[4] then
                                return a[2] > b[2];
                        else
                                return a[4] < b[4];
                        end
                end);
        
        return vals;
end

function SW_GetTopHealDelta()
        return SW_GetTopDelta("TOPDELTAH");
end
function SW_GetTopDmgDelta()
        return SW_GetTopDelta("TOPDELTAD");
end

function SW_GetTopDelta(what)
        local vals = {};
        for k, v in pairs (SW_Sync_MsgTrack) do
                if v[what] > 0 then
                        table.insert(vals, {k, v[what]});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);   
        return vals;
end
function SW_GetRaidPS()
        local vals = {};
        
        local dps = SW_RPS:getVals();
        
        if dps[1] > 0 then
                table.insert(vals, {SW_RDPS_STRS["CURR"], dps[1], nil});
        end
        if dps[2] > 0 then
                table.insert(vals, {SW_RDPS_STRS["ALL"], dps[2], nil});
        end
        if dps[3] > 0 then
                table.insert(vals, {SW_RDPS_STRS["LAST"], dps[3], nil});
        end
        if dps[4] and dps[4] > 0.1 then
                table.insert(vals, {SW_RDPS_STRS["TOTAL"], dps[4], nil});
        end
        
        if SW_RPS.maxDPS > 0 then
                table.insert(vals, {SW_RDPS_STRS["MAX"], SW_RPS.maxDPS, nil});
        end
        
        table.sort(vals, 
                function(a,b)
                                return a[2] > b[2];
                end);
        
        return vals;
end

-- 1.5.3.beta.1 note to self make this more efficient for the next data model, a good number to use in cheat protection
function SW_GetMaxHit(whoName, checkHeal)
        local who = SW_S_Details[ whoName ];
        local vMax = 0;
        local tmpVal = 0;
        if who == nil then return 0; end;
        for k,v in pairs(who) do
                if k == SW_PRINT_ITEM_RECIEVED then
                elseif k == SW_PRINT_ITEM_TYPE then
                elseif k == SW_PRINT_ITEM_TOTAL_DONE then
                elseif k == "UTYPE" then
                elseif k == "CLASSE" then
                elseif k == SW_PRINT_ITEM_DEATHS then
                else
                        if checkHeal then
                                tmpVal = v[5];
                        else
                                tmpVal = v[3];
                        end
                        if tmpVal > vMax then
                                vMax = tmpVal;
                        end
                end
        end
        return vMax;
end
function SW_GetMaxHitList(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        
        for k,v in pairs(SW_S_Details) do
                if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                        tmpVal = SW_GetMaxHit(k);
                        if tmpVal > 0 then
                                table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)})
                        end
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;
end
function SW_GetMaxHealList(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        
        for k,v in pairs(SW_S_Details) do
                if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                        tmpVal = SW_GetMaxHit(k, true);
                        if tmpVal > 0 then
                                table.insert(vals, {k,tmpVal,SW_EBC(k,bSet)})
                        end
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;
end
function SW_GetDetails(whoName)
        local who = SW_S_Details[ whoName ];
        local val ="";
        local vMax = "";
        
        if who == nil then return {}; end;
        
        local vals = {};

        local dCol = SW_Settings["Colors"]["Damage"];
        local hCol = SW_Settings["Colors"]["Heal"];
        
        for k,v in pairs(who) do
                if k == SW_PRINT_ITEM_RECIEVED then
                        -- SW_printStr(LIGHTYELLOW_FONT_COLOR_CODE..k..FONT_COLOR_CODE_CLOSE..":  "..string.format(SW_PRINT_INFO_RECIEVED, v[1], v[2]), 1);                     
                elseif k == SW_PRINT_ITEM_TYPE then
                        -- ignore in this printout
                elseif k == SW_PRINT_ITEM_TOTAL_DONE then
                        --ignored for now
                elseif k == "UTYPE" then
                        --PC or NPC ignore
                elseif k == "CLASSE" then
                
                elseif k == SW_PRINT_ITEM_DEATHS then
                
                else
                        if v[1] > 0 then
                                table.insert(vals, {k.." ("..v[3].." - "..(math.floor((v[6]/v[4]) *1000 + 0.5)/10).."%)",v[1],dCol,1});
                        end
                        if v[2] > 0 then
                                table.insert(vals, {k.." ("..v[5].." - "..(math.floor((v[7]/v[4]) *1000 + 0.5)/10).."%)",v[2],hCol,2});
                        end
                end
        end
        -- 1.5 added pet details
        who = SW_PetInfo["OWNER_PET"][whoName];
        if who ~= nil then
                who = who["pets"];
                
                for k,v in pairs(who) do
                        if v[SW_PRINT_ITEM_TOTAL_DONE][1] > 0 then
                                table.insert(vals, {SW_STR_PET_PREFIX..k,v[SW_PRINT_ITEM_TOTAL_DONE][1],dCol,1});
                        end
                        if v[SW_PRINT_ITEM_TOTAL_DONE][2] > 0 then
                                table.insert(vals, {SW_STR_PET_PREFIX..k,v[SW_PRINT_ITEM_TOTAL_DONE][2],hCol,2});
                        end
                end
        end
        table.sort(vals, 
                        function(a,b)
                                if a[4] == b[4] then
                                        return a[2] > b[2];
                                else
                                        return a[4] < b[4];
                                end
                        end);
        return vals;
end
function SW_GetHealInfoTarget(whoName)
        local vals = {};
        local tmpVal;
        local bSet = SW_GetBarSettings("SW_BarFrame1");
        
        for k,v in pairs(SW_S_Healed) do
                
                if v[whoName] ~= nil then
                        table.insert(vals, {k,v[whoName], SW_EBC(k,bSet)});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);           
        return vals;    
end
function SW_GetSchoolMadeSummary(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local summVals = {};
        
        for k,v in pairs(SW_S_Details) do
                if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                        if SW_S_Details[k][SW_PRINT_ITEM_TYPE] ~= nil then
                                for t,nums in pairs(SW_S_Details[k][SW_PRINT_ITEM_TYPE]) do
                                        if summVals[t] == nil then
                                                summVals[t] = nums[1];
                                        else
                                                summVals[t] = summVals[t] + nums[1];
                                        end
                                end
                        end
                end
        end
        for k,v in pairs(summVals) do
                if v > 0 then
                        table.insert(vals, {k,v});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;    
end
function SW_GetSchoolGotSummary(SF, CF, PF, bSet)
        local vals = {};
        local tmpVal;
        local summVals = {};
        
        for k,v in pairs(SW_S_Details) do
                if SW_BarsCheckFilters(k, SF, CF, "SW_PF_Inactive") then
                        if SW_S_Details[k][SW_PRINT_ITEM_TYPE] ~= nil then
                                for t,nums in pairs(SW_S_Details[k][SW_PRINT_ITEM_TYPE]) do
                                        if summVals[t] == nil then
                                                summVals[t] = nums[4];
                                        else
                                                summVals[t] = summVals[t] + nums[4];
                                        end
                                end
                        end
                end
        end
        for k,v in pairs(summVals) do
                if v > 0 then
                        table.insert(vals, {k,v});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;
end
function SW_GetSchoolMade(whoName)
        local vals = {};
        local tmpVal;
        if SW_S_Details[whoName] == nil then return vals; end
        if SW_S_Details[whoName][SW_PRINT_ITEM_TYPE] == nil then return vals; end
        for k,v in pairs(SW_S_Details[whoName][SW_PRINT_ITEM_TYPE]) do
                if v[1] ~= 0 then
                        table.insert(vals, {k,v[1]});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;    
end
function SW_GetSchoolGot(whoName)
        local vals = {};
        local tmpVal;
        if SW_S_Details[whoName] == nil then return vals; end
        if SW_S_Details[whoName][SW_PRINT_ITEM_TYPE] == nil then return vals; end
        for k,v in pairs(SW_S_Details[whoName][SW_PRINT_ITEM_TYPE]) do
                if v[4] ~= 0 then
                        table.insert(vals, {k,v[4]});
                end
        end
        table.sort(vals, 
                        function(a,b)
                                return a[2] > b[2];
                        end);
                        
        return vals;    
end
function SW_UpdateBars()
        local f = getglobal("SW_BarFrame1");
        local bSet = SW_GetBarSettings("SW_BarFrame1");
        local last;
        local valText = "";
        
        --1.3.1 added DPS to Window title
        --1.3.2 changed this to extra counter and added an option
        --SW_OptUpdateText(pName)
        local selOpt =  SW_Settings["BarFrames"]["SW_BarFrame1"]["Selected"];
        if SW_Settings["OPT_ShowMainWinDPS"] ~= nil then
                local t = getglobal ("SW_BarFrame1_Title_Text");
                if SW_DPS_Dmg > 0 and SW_CombatTime > 5 then
                        local dps = math.floor( (SW_DPS_Dmg / SW_CombatTime) * 10 + 0.5) / 10;
                        local otf = bSet["OTF"];
                        if  otf ~= nil then
                                t:SetText(otf.." (DPS:"..dps..")");
                        else
                                t:SetText(selOpt.." (DPS:"..dps..")");
                        end
                else
                        local otf = bSet["OTF"];
                        if  otf ~= nil then
                                t:SetText(otf);
                        else
                                t:SetText(selOpt);
                        end
                end
        else
                local otf = bSet["OTF"];
                local t = getglobal ("SW_BarFrame1_Title_Text");
                if  otf ~= nil then
                        t:SetText(otf);
                else
                        t:SetText(selOpt);
                end
        end
        --1.2.4 Added this to lessen the "funkyness" of filters
        -- also moved "class copy" here no need to check it in SW_BarsCheckFilters
        -- 1.5 added "GPC" and "GPET" pets and PCs ever in group
        -- do pets first, an MC'd party member will show up as pet
        -- will be overwritten when checking SW_Friends
        for k,v in pairs(SW_PetInfo["PET_OWNER"]) do
                if SW_S_Details[k] ~= nil then
                        -- don't mark MC'd mobs as gpet
                        if SW_S_Details[k]["UTYPE"] ~= "NPC" then
                                SW_S_Details[k]["UTYPE"] = "GPET";
                        end
                        if SW_S_Details[k]["CLASSE"] == nil then
                                SW_S_Details[k]["CLASSE"] = v["CLASSE"];
                        end
                end
        end
        for k,v in pairs(SW_Friends) do
                --1.5.1 added Details init for filters to work even with 0 dmg/heal
                if SW_S_Details[k] == nil then
                        SW_S_Details[k] = {};
                        SW_S_Details[k][SW_PRINT_ITEM_TOTAL_DONE] = {0,0};  --first = dmg; sec = heal
                        SW_S_Details[k][SW_PRINT_ITEM_RECIEVED] = {0,0};  --first = dmg; sec = heal
                end
                
                SW_S_Details[k]["UTYPE"] = "GPC";
                if SW_S_Details[k]["CLASSE"] == nil then
                        SW_S_Details[k]["CLASSE"] = SW_Friends[k]["CLASSE"];
                end     
        end
        
        
        --vals[1] = text [2]= value [3]= reserved (colorBar) [4] sort order num 
        if f:IsVisible() then
                local vals;
                local total = {};
                
                if bSet["IN"] == nil then
                        bSet["IN"] = 1;
                end
                local inf = SW_InfoTypes[ bSet["IN"] ];
                if inf["varType"] == "TEXT" then
                        vals = inf["f"](bSet["TV"]);
                elseif inf["varType"] == "SELF" then
                        vals = inf["f"](SW_SELF_STRING);
                elseif inf["varType"] == "PETONLY" then
                        vals = inf["f"](nil, nil, bSet["PF"], bSet);
                else
                        vals = inf["f"](bSet["SF"], bSet["CF"], bSet["PF"], bSet);
                end
        
                if bSet["ShowPercent"] ~= nil then
                        for i, v in ipairs(vals) do
                                if v[4] == nil then
                                        v[4] = 1;
                                end
                                
                                if total[ v[4] ] == nil then total[ v[4] ] = 0; end
                                total[ v[4] ] = total[ v[4] ] + v[2];
                                
                                
                        end
                end
                
                if vals[1] == nil then 
                        
                        for i, v in ipairs(SW_Bars["SW_BarFrame1"]) do
                                if not v.toWide and v.canBeSeen then
                                        v:SetValText(" ");
                                        v:SetValue(100);
                                        v:SetBarText();
                                end
                        end
                        return; 
                end
                local p1 = vals[1][2] / 100; 
                local lastSortIndex = vals[1][4];
                for i, v in ipairs(SW_Bars["SW_BarFrame1"]) do
                        
                        if not v.toWide and v.canBeSeen then
                                if vals[i] ~= nil then
                                        
                                        if bSet["ShowRank"] ~= nil then
                                                v:SetBarText(i.."   "..vals[i][1]);
                                        else
                                                v:SetBarText(vals[i][1]);
                                        end
                                        if bSet["ShowNumber"] ~= nil then
                                                valText = vals[i][2];
                                        else
                                                valText = "";
                                        end
                                        if bSet["ShowPercent"] ~= nil then
                                                v:SetValText(valText.." ("..(math.floor((vals[i][2]/total[ vals[i][4] ]) *1000 + 0.5)/10).."%)");
                                        else
                                                v:SetValText(valText);
                                        end
                                        if lastSortIndex ~= nil then
                                                if vals[i][4] ~= lastSortIndex then
                                                        lastSortIndex = vals[i][4];
                                                        p1 = vals[i][2] / 100;
                                                end
                                        end
                                        v:SetValue( vals[i][2] /p1);
                                        if vals[i][3] ~= nil then
                                                getglobal(v:GetName().."_Texture"):SetVertexColor(unpack(vals[i][3]));
                                                
                                        end
                                else
                                        v:SetBarText();
                                end
                        end
                        
                end
        end
end

function SW_SendRepLine(outStr, sVar)
        local sTarget = getglobal(SW_Settings["RepTarget"]).SW_TargetChat;
        if sTarget == "WHISPER" or sTarget == "CHANNEL" then
                if sVar == nil or sVar == "" then return; end
                if sTarget == "CHANNEL" then
                        sVar = GetChannelName(sVar);
                end
                SendChatMessage(outStr, sTarget, nil, sVar);
        elseif sTarget == "CLIP" then
                local outWin = getglobal("SW_TextWindow");
                if outWin.txtBuffer == nil then
                        outWin.txtBuffer = "";
                end
                outWin.txtBuffer = outWin.txtBuffer.."\r\n"..outStr;
        else
                SendChatMessage(outStr, sTarget);
        end
end


function SW_BuildTextReportData(caller)
        local bSet = SW_GetBarSettings(caller);
        local tw = getglobal("SW_TextWindow");
        tw.repMeta = {};
        tw.repData = {};
        
        local vals;
        local metaData = tw.repMeta;
        
        local inf = SW_InfoTypes[ bSet["IN"] ];
        if inf["varType"] == "TEXT" then
                vals = inf["f"](bSet["TV"]);
                metaData["InfoFor"] = bSet["TV"];
        elseif inf["varType"] == "SELF" then
                vals = inf["f"](SW_SELF_STRING);
                metaData["InfoFor"] = SW_SELF_STRING;
        else
                vals = inf["f"](bSet["SF"], bSet["CF"], bSet["PF"], bSet);
        end
        
        
        metaData["InfoTypeString"] = inf["t"];
        metaData["InfoTypeNum"] = bSet["IN"];
        
        if bSet["SF"] == nil then
                metaData["SelectedFilter"] = getglobal("SW_Filter_None").SW_Filter;
        else
                metaData["SelectedFilter"] = getglobal(bSet["SF"]).SW_Filter;
        end
        
        local classF;
        if bSet["CF"] == nil then
                classF = SW_ClassFilters[1];
        else
                classF = SW_ClassFilters[ bSet["CF"] ];
        end
        
        metaData["ClassFilter"] = classF;
        
        metaData["ClassFilterLocalized"] = SW_ClassNames[classF];
        if metaData["ClassFilterLocalized"] == "" then 
                metaData["ClassFilterLocalized"] = classF;
        end
        
        
        if bSet["ShowPercent"] == nil then
                metaData["ShowPercent"] = false;
        else
                metaData["ShowPercent"] = true;
        end
        if bSet["ShowRank"] == nil then
                metaData["ShowRank"] = false;
        else
                metaData["ShowRank"] = true;
        end
        if bSet["ShowNumber"] == nil then
                metaData["ShowNumber"] = false;
        else
                metaData["ShowNumber"] = true;
        end
        metaData["ReportAmount"] = SW_Settings["ReportAmount"];
        
        if vals[1] == nil then 
                return; 
        end
        
        local total = {};
        for i, v in ipairs(vals) do
                if v[4] == nil then
                        v[4] = 1;
                end
                if total[ v[4] ] == nil then total[ v[4] ] = 0; end
                total[ v[4] ] = total[ v[4] ] + v[2];
        end
        for i, v in ipairs(vals) do
                
                v[5] = (math.floor((v[2]/total[ v[4] ]) *1000 + 0.5)/10);
                
        end     
        tw.repData = vals;
        
end

function SW_SendReportOld(caller, sVar)
        if SW_Settings["RepTarget"] == nil then return; end
        
        if getglobal(SW_Settings["RepTarget"]).SW_TargetChat == "CLIP" then 
                SW_BuildTextReportData(caller);
                getglobal("SW_TextWindow"):Show();
                return;
        end
        if not SW_PostCheck(getglobal(SW_Settings["RepTarget"]).SW_TargetChat) then
                StaticPopup_Show("SW_PostFail");
                return;
        end
        
        local bSet = SW_GetBarSettings(caller);
        local vals;
        local useMultiLines = false
        if SW_Settings["RE_Multiline"] ~= nil then
                useMultiLines = true;
        end
        if bSet["IN"] == nil then
                bSet["IN"] = 1;
        end
        local inf = SW_InfoTypes[ bSet["IN"] ];
        if inf["varType"] == "TEXT" then
                vals = inf["f"](bSet["TV"]);
        elseif inf["varType"] == "SELF" then
                vals = inf["f"](SW_SELF_STRING);
        else
                vals = inf["f"](bSet["SF"], bSet["CF"], bSet["PF"], bSet);
        end
        
        if vals[1] == nil then 
                return; 
        end
        
        local outStr=inf["t"].." ";
        if inf["varType"] == "TEXT" then
                outStr = outStr..bSet["TV"].." ";
        end
        if bSet["CF"]~= nil and bSet["CF"] ~= 1 then
                outStr = outStr..SW_ClassNames[ SW_ClassFilters[ bSet["CF"] ] ].." ";
        end
        local tmpLen =string.len(outStr);
        local tmpStr;
        local total = {};
        if bSet["ShowPercent"] ~= nil then
                for i, v in ipairs(vals) do
                        if v[4] == nil then
                                v[4] = 1;
                        end
                        
                        if total[ v[4] ] == nil then total[ v[4] ] = 0; end
                        total[ v[4] ] = total[ v[4] ] + v[2];
                        
                        
                end
        end
        if useMultiLines then
                SW_SendRepLine(outStr, sVar);
                outStr = "";
        end
        
        for i=1, SW_Settings["ReportAmount"] do
                if vals[i] ~= nil then
                        
                        if bSet["ShowRank"] ~= nil then
                                tmpStr = "["..i..".";
                        else
                                tmpStr = "[";
                        end
                        tmpStr = tmpStr..vals[i][1];
                        
                        if bSet["ShowNumber"] ~= nil then
                                tmpStr = tmpStr.." "..vals[i][2];
                        end
                        if bSet["ShowPercent"] ~= nil then
                                tmpStr = tmpStr.." "..(math.floor((vals[i][2]/total[ vals[i][4] ]) *1000 + 0.5)/10).."%";
                        end
                        tmpStr = tmpStr.."]  ";
                else
                        break;
                end
                if useMultiLines then
                        SW_SendRepLine(tmpStr, sVar);
                else
                        tmpLen = tmpLen + string.len(tmpStr);
                        if tmpLen < 256 then
                                outStr = outStr..tmpStr;
                        else
                                break;
                        end
                end
        end
        
        if not useMultiLines then
                SW_SendRepLine(outStr, sVar);
        end
        
        --[[
        if getglobal(SW_Settings["RepTarget"]).SW_TargetChat == "CLIP" then 
                local outWin = getglobal("SW_TextWindow");
                local outBox = getglobal("SW_TextWindow_EditBox");
                outBox:SetText( outWin.txtBuffer );
                outWin.txtBuffer = "";
                outBox:HighlightText();
                outWin:Show();
                return; 
        end
        --]]
end
function SW_SendReport(caller, sVar)
        if SW_Settings["RepTarget"] == nil then return; end
        
        if getglobal(SW_Settings["RepTarget"]).SW_TargetChat == "CLIP" then 
                SW_BuildTextReportData(caller);
                getglobal("SW_TextWindow"):Show();
                return;
        end
        if not SW_PostCheck(getglobal(SW_Settings["RepTarget"]).SW_TargetChat) then
                StaticPopup_Show("SW_PostFail");
                return;
        end
        
        local bSet = SW_GetBarSettings(caller);
        local vals;
        local useMultiLines = false
        if SW_Settings["RE_Multiline"] ~= nil then
                useMultiLines = true;
        end
        if bSet["IN"] == nil then
                bSet["IN"] = 1;
        end
        local inf = SW_InfoTypes[ bSet["IN"] ];
        if inf["varType"] == "TEXT" then
                vals = inf["f"](bSet["TV"]);
        elseif inf["varType"] == "SELF" then
                vals = inf["f"](SW_SELF_STRING);
        else
                vals = inf["f"](bSet["SF"], bSet["CF"], bSet["PF"], bSet);
        end
        
        if vals[1] == nil then 
                return; 
        end
        
        local outStr=" -------- "..inf["t"].." ";
        if inf["varType"] == "TEXT" then
                outStr = outStr..":: "..bSet["TV"].." ";
        end
        if bSet["CF"]~= nil and bSet["CF"] ~= 1 then
                outStr = outStr..SW_ClassNames[ SW_ClassFilters[ bSet["CF"] ] ].." ";
        end
        local tmpLen =string.len(outStr);
        local tmpStr ="";
        local total = {};
        if bSet["ShowPercent"] ~= nil then
                for i, v in ipairs(vals) do
                        if v[4] == nil then
                                v[4] = 1;
                        end
                        
                        if total[ v[4] ] == nil then total[ v[4] ] = 0; end
                        total[ v[4] ] = total[ v[4] ] + v[2];
                        
                        
                end
        end
        outStr=outStr.." -------- ";
        if useMultiLines then
                SW_SendRepLine(outStr, sVar);
                outStr = "";
        end
        
        for i=1, SW_Settings["ReportAmount"] do
                if vals[i] ~= nil then
                        
                        if i < 10 then
                                tmpStr = "  #0"..i..":  ";
                        else
                                tmpStr = "  #"..i..":  ";
                        end

                        tmpStr = tmpStr..vals[i][1];
                        
                        if bSet["ShowNumber"] ~= nil then
                                tmpStr = tmpStr.."  -  "..vals[i][2];
                        end
                        if bSet["ShowPercent"] ~= nil then
                                tmpStr = tmpStr.."  -  "..(math.floor((vals[i][2]/total[ vals[i][4] ]) *1000 + 0.5)/10).."%";
                        end
                else
                        break;
                end
                if useMultiLines then
                        SW_SendRepLine(tmpStr, sVar);
                else
                        tmpLen = tmpLen + string.len(tmpStr);
                        if tmpLen < 256 then
                                outStr = outStr..tmpStr;
                        else
                                break;
                        end
                end
        end
        
        if not useMultiLines then
                SW_SendRepLine(outStr, sVar);
        end
        
        --[[
        if getglobal(SW_Settings["RepTarget"]).SW_TargetChat == "CLIP" then 
                local outWin = getglobal("SW_TextWindow");
                local outBox = getglobal("SW_TextWindow_EditBox");
                outBox:SetText( outWin.txtBuffer );
                outWin.txtBuffer = "";
                outBox:HighlightText();
                outWin:Show();
                return; 
        end
        --]]
end

Generated by GNU Enscript 1.6.5.90.