vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
function CalendarClassLimits_Open(pLimits, pTitle, pShowPriority, pSaveFunction)
        CalendarClassLimitsFrame.mSaveFunction = pSaveFunction;
        CalendarClassLimitsFrameTitle:SetText(pTitle);
        
        CalendarClassLimits_UpdateFields(pLimits);
        
        if pShowPriority then
                CalendarClassLimitsFramePriority:Show();
        else
                CalendarClassLimitsFramePriority:Hide();
        end
        
        CalendarClassLimitsFrame:Show();
end

function CalendarClassLimits_Done()
        if CalendarClassLimitsFrame.mSaveFunction then
                CalendarClassLimitsFrame.mSaveFunction(CalendarClassLimits_GetLimits());
        end
        
        CalendarClassLimitsFrame:Hide();
end

function CalendarClassLimits_Cancel()
        CalendarClassLimitsFrame:Hide();
end

function CalendarClassLimits_UpdateFields(pLimits)
        for vClassCode, vClassInfo in gGroupCalendar_ClassInfoByClassCode do
                local   vClassFieldName = "CalendarClassLimitsFrame"..vClassInfo.element;
                local   vClassMin = getglobal(vClassFieldName.."Min");
                local   vClassMax = getglobal(vClassFieldName.."Max");
                local   vClassLimit = nil;
                
                if pLimits
                and pLimits.mClassLimits then
                        vClassLimit = pLimits.mClassLimits[vClassCode];
                end
                
                if vClassLimit then
                        if vClassLimit.mMin then
                                vClassMin:SetText(vClassLimit.mMin);
                        else
                                vClassMin:SetText("");
                        end
                        
                        if vClassLimit.mMax then
                                vClassMax:SetText(vClassLimit.mMax);
                        else
                                vClassMax:SetText("");
                        end
                else
                        vClassMin:SetText("");
                        vClassMax:SetText("");
                end
        end
        
        if pLimits
        and pLimits.mMaxAttendance then
                CalendarDropDown_SetSelectedValue(CalendarClassLimitsFrameMaxPartySize, pLimits.mMaxAttendance);
        else
                CalendarDropDown_SetSelectedValue(CalendarClassLimitsFrameMaxPartySize, 0);
        end

        if pLimits
        and pLimits.mPriorityOrder then
                CalendarDropDown_SetSelectedValue(CalendarClassLimitsFramePriorityValue, pLimits.mPriorityOrder);
        else
                CalendarDropDown_SetSelectedValue(CalendarClassLimitsFramePriorityValue, "Date");
        end
end

function CalendarClassLimits_GetLimits()
        local   vLimits = {};
        
        for vClassCode, vClassInfo in gGroupCalendar_ClassInfoByClassCode do
                local   vClassFieldName = "CalendarClassLimitsFrame"..vClassInfo.element;
                local   vClassMin = tonumber(getglobal(vClassFieldName.."Min"):GetText());
                local   vClassMax = tonumber(getglobal(vClassFieldName.."Max"):GetText());
                
                if vClassMin or vClassMax then
                        if not vLimits.mClassLimits then
                                vLimits.mClassLimits = {};
                        end
                        
                        vLimits.mClassLimits[vClassCode] = {mMin = vClassMin, mMax = vClassMax};
                end
        end
        
        vLimits.mMaxAttendance = UIDropDownMenu_GetSelectedValue(CalendarClassLimitsFrameMaxPartySize);
        
        if vLimits.mMaxAttendance == 0 then
                vLimits.mMaxAttendance = nil;
        end
        
        vLimits.mPriorityOrder = UIDropDownMenu_GetSelectedValue(CalendarClassLimitsFramePriorityValue);
        
        if vLimits.mPriorityOrder == "Date" then
                vLimits.mPriorityOrder = nil;
        end
        
        -- See if the mLimits field should just be removed altogether
        
        if Calendar_ArrayIsEmpty(vLimits) then
                vLimits = nil;
        end
        
        -- Done
        
        return vLimits;
end

function CalendarClassLimits_ClassLimitsChanged(pOldLimits, pNewLimits)
        -- If there are no new limits then just see if there were old ones
        
        if not pNewLimits then
                return pOldLimits ~= nil;
        end
        
        -- If there were no limits previous then just notify that there are now
        
        if not pOldLimits then
                return true;
        end
        
        -- See if anything is different between the two
        
        if pNewLimits.mMaxAttendance ~= pOldLimits.mMaxAttendance then
                return true;
        end
        
        -- No differences if neither had class limits
        
        if not pNewLimits.mClassLimits
        and not pOldLimits.mClassLimits then
                return false;
        end
        
        -- New class limits if one has them when the other didn't
        
        if (pNewLimits.mClassLimits == nil)
        ~= (pOldLimits.mClassLimits == nil) then
                return true;
        end
        
        -- Compare the limits
        
        for vClassCode, vClassInfo in gGroupCalendar_ClassInfoByClassCode do
                local   vNewClassLimits = pNewLimits.mClassLimits[vClassCode];
                local   vOldClassLimits = pOldLimits.mClassLimits[vClassCode];
                
                if (vNewClassLimits == nil)
                ~= (vOldClassLimits == nil) then
                        return true;
                end
                
                if vNewClassLimits then
                        if vNewClassLimits.mMin ~= vOldClassLimits.mMin
                        or vNewClassLimits.mMax ~= vOldClassLimits.mMax then
                                return true;
                        end
                end
        end
        
        -- Done
        
        return false;
end

function CalendarClassLimits_OnShow(pAutoConfirmFrame)
        local   vFrameName = this:GetName();
        local   vPaladinsFrame = getglobal(vFrameName.."Paladin");
        local   vShamansFrame = getglobal(vFrameName.."Shaman");
        
        if gGroupCalendar_PlayerFactionGroup == "Alliance" then
                vPaladinsFrame:Show();
                vShamansFrame:Hide();
        else
                vPaladinsFrame:Hide();
                vShamansFrame:Show();
        end
        
        CalendarClassLimits_MinTotalChanged(pAutoConfirmFrame);
end

function CalendarClassLimits_MinTotalChanged(pAutoConfirmFrame)
        local   vMinTotal = nil;

        local   vChanged = false;
        
        for vClassCode, vClassInfo in gGroupCalendar_ClassInfoByClassCode do
                local   vClassFieldName = "CalendarClassLimitsFrame"..vClassInfo.element;
                local   vClassMin = tonumber(getglobal(vClassFieldName.."Min"):GetText());
                
                if vClassMin then
                        if not vMinTotal then
                                vMinTotal = vClassMin;
                        else
                                vMinTotal = vMinTotal + vClassMin;
                        end
                end
        end
        
        local   vMinTotalField = getglobal(pAutoConfirmFrame:GetName().."MaxPartySizeMin");
        
        if vMinTotal then
                vMinTotalField:SetText(vMinTotal);
        else
                vMinTotalField:SetText(GroupCalendar_cNoMinimum);
        end
        
        return vChanged;
end