vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
gCalendarEventViewer_ShowScheduleEditor = false;
gCalendarEventViewer_Active = false;

gCalendarEventViewer_Database = nil;
gCalendarEventViewer_Event = nil;
gCalendarEventViewer_SelectedPlayerDatabase = nil;

gCalendarEventViewer_PanelFrames =
{
        "CalendarEventViewerEventFrame",
        "CalendarEventViewerAttendanceFrame",
};

gCalendarEventViewer_CurrentPanel = 1;

function CalendarEventViewer_ViewEvent(pDatabase, pEvent)
        gCalendarEventViewer_Database = pDatabase;
        gCalendarEventViewer_Event = pEvent;
        gCalendarEventViewer_SelectedPlayerDatabase = gGroupCalendar_UserDatabase;
        
        CalendarAttendanceList_SetEvent(CalendarEventViewerAttendance, pDatabase, pEvent);
        CalendarEventViewer_UpdateControlsFromEvent(gCalendarEventViewer_Event, false);
        
        ShowUIPanel(CalendarEventViewerFrame);
        
        CalendarEventTitle:SetFocus();
        CalendarEventTitle:HighlightText(0, 100);
        
        gCalendarEventViewer_ShowScheduleEditor = false;
        gCalendarEventViewer_Active = true;
end

function CalendarEventViewer_DoneViewing()
        if not gCalendarEventViewer_Active then
                return;
        end
        
        CalendarEventViewer_Close(true);
end

function CalendarEventViewer_ScheduleChanged(pDate)
        if gCalendarEventViewer_Active
        and gCalendarEventViewer_Event.mDate == pDate then
                CalendarAttendanceList_EventChanged(CalendarEventViewerAttendance, gCalendarEventViewer_Database, gCalendarEventViewer_Event);
                CalendarEventViewer_UpdateControlsFromEvent(gCalendarEventViewer_Event, true);
        end
end

function CalendarEventViewer_MajorDatabaseChange()
        if gCalendarEventViewer_Active then
                CalendarAttendanceList_EventChanged(CalendarEventViewerAttendance, gCalendarEventViewer_Database, gCalendarEventViewer_Event);
                CalendarEventViewer_UpdateControlsFromEvent(gCalendarEventViewer_Event, true);
        end
end

function CalendarEventViewer_Save()
        -- Save attendance feedback
        
        if EventDatabase_EventTypeUsesAttendance(gCalendarEventViewer_Event.mType)
        and EventDatabase_PlayerIsQualifiedForEvent(gCalendarEventViewer_Event, gCalendarEventViewer_SelectedPlayerDatabase.PlayerLevel) then
                local   vPendingRSVP = EventDatabase_FindRSVPRequestData(gCalendarEventViewer_SelectedPlayerDatabase, gCalendarEventViewer_Database.UserName, gCalendarEventViewer_Event.mID);
                local   vEventRSVP = EventDatabase_FindEventRSVP(gCalendarEventViewer_Database.UserName, gCalendarEventViewer_Event, gCalendarEventViewer_SelectedPlayerDatabase.UserName);
                local   vChanged = false;
                local   vHasResponse = false;
                local   vStatus;
                local   vComment;
                
                if not vPendingRSVP then
                        if vEventRSVP then
                                vStatus = vEventRSVP.mStatus;
                                vComment = vEventRSVP.mComment;
                        else
                                vStatus = nil;
                                vComment = "";
                        end
                else
                        vStatus = vPendingRSVP.mStatus;
                        vComment = vPendingRSVP.mComment;
                end
                
                if not vComment then
                        vComment = "";
                end
                
                -- Update the status
                
                if CalendarEventViewerYes:GetChecked() then
                        vHasResponse = true;
                        
                        if vStatus ~= "Y" then
                                vStatus = "Y";
                                vChanged = true;
                        end
                elseif CalendarEventViewerNo:GetChecked() then
                        vHasResponse = true;
                        
                        if vStatus ~= "N" then
                                vStatus = "N";
                                vChanged = true;
                        end
                --[[
                elseif vStatus ~= nil
                and vStatus ~= "-" then
                        vStatus = "-";
                        vChanged = true;
                ]]
                end
                
                -- Update the comment
                
                if vHasResponse then
                        local   vNewComment = Calendar_EscapeString(CalendarEventViewerComment:GetText());
                        
                        if vComment ~= vNewComment then
                                vComment = vNewComment;
                                vChanged = true;
                        end
                end
                
                -- Add a new RSVP if it's changed
                
                if vChanged then
                        local   vRSVP = EventDatabase_CreatePlayerRSVP(
                                                                        gCalendarEventViewer_Database,
                                                                        gCalendarEventViewer_Event,
                                                                        gCalendarEventViewer_SelectedPlayerDatabase.UserName,
                                                                        gCalendarEventViewer_SelectedPlayerDatabase.PlayerRaceCode,
                                                                        gCalendarEventViewer_SelectedPlayerDatabase.PlayerClassCode,
                                                                        gCalendarEventViewer_SelectedPlayerDatabase.PlayerLevel,
                                                                        vStatus,
                                                                        vComment,
                                                                        gGroupCalendar_PlayerGuild,
                                                                        gGroupCalendar_PlayerGuildRank,
                                                                        gGroupCalendar_PlayerCharacters);
                        
                        EventDatabase_AddRSVP(gCalendarEventViewer_SelectedPlayerDatabase, vRSVP);
                        
                        -- Update the UI
                        
                        CalendarAttendanceList_EventChanged(CalendarEventViewerAttendance, gCalendarEventViewer_Database, gCalendarEventViewer_Event);
                        CalendarEventViewer_UpdateControlsFromEvent(gCalendarEventViewer_Event, false);
                end
        end
end

function CalendarEventViewer_Close(pShowScheduleEditor)
        gCalendarEventViewer_ShowScheduleEditor = pShowScheduleEditor;
        HideUIPanel(CalendarEventViewerFrame);
end

function CalendarEventViewer_OnLoad()
        -- Tabs
        
        PanelTemplates_SetNumTabs(this, table.getn(gCalendarEventViewer_PanelFrames));
        CalendarEventViewerFrame.selectedTab = gCalendarEventViewer_CurrentPanel;
        PanelTemplates_UpdateTabs(this);
        
        CalendarEventViewerCharacterMenu.ChangedValueFunc = CalendarEventViewer_SelectedCharacterChanged;
end

function CalendarEventViewer_OnShow()
        PlaySound("igCharacterInfoOpen");
        
        CalendarEventViewer_ShowPanel(1); -- Always switch to the event view when showing the window
end

function CalendarEventViewer_OnHide()
        PlaySound("igCharacterInfoClose");
        
        CalendarEventViewer_Save();
        
        if not gCalendarEventViewer_ShowScheduleEditor then
                HideUIPanel(CalendarEditorFrame);
        end
        
        gCalendarEventViewer_Database = nil;
        gCalendarEventViewer_Event = nil;
        
        gCalendarEventViewer_Active = false;
end

function CalendarEventViewer_SelectedCharacterChanged(pMenuFrame, pValue)
        gCalendarEventViewer_SelectedPlayerDatabase = EventDatabase_GetDatabase(pValue, false);
        CalendarEventViewer_UpdateControlsFromEvent(gCalendarEventViewer_Event, false);
end

function CalendarEventViewer_UpdateControlsFromEvent(pEvent, pSkipAttendanceFields)
        -- Update the title
        
        CalendarEventViewerEventFrameEventTitle:SetText(EventDatabase_GetEventDisplayName(pEvent));
        
        -- Update the date and time
        
        if pEvent.mTime ~= nil then
                local           vTime;
                local           vDate = pEvent.mDate;
                
                if gGroupCalendar_Settings.ShowEventsInLocalTime then
                        vDate, vTime = Calendar_GetLocalDateTimeFromServerDateTime(pEvent.mDate, pEvent.mTime);
                else
                        vTime = pEvent.mTime;
                end
                
                -- Set the date
                
                CalendarEventViewerEventFrameDate:SetText(Calendar_GetLongDateString(vDate));
                
                --
                
                local           vTimeString;
                
                if pEvent.mDuration ~= nil
                and pEvent.mDuration ~= 0 then
                        local   vEndTime = math.mod(vTime + pEvent.mDuration, 1440);
                        
                        vTimeString = string.format(
                                                                GroupCalendar_cTimeRangeFormat,
                                                                Calendar_GetShortTimeString(vTime),
                                                                Calendar_GetShortTimeString(vEndTime));
                        
                else
                        vTimeString = Calendar_GetShortTimeString(vTime);
                end

                CalendarEventViewerEventFrameTime:SetText(vTimeString);
                CalendarEventViewerEventFrameTime:Show();
        else
                CalendarEventViewerEventFrameDate:SetText(Calendar_GetLongDateString(pEvent.mDate));
                CalendarEventViewerEventFrameTime:Hide();
        end
        
        -- Update the level range
        
        if EventDatabase_EventTypeUsesLevelLimits(pEvent.mType) then
                if pEvent.mMinLevel ~= nil then
                        if pEvent.mMaxLevel ~= nil then
                                if pEvent.mMinLevel == pEvent.mMaxLevel then
                                        CalendarEventViewerEventFrameLevels:SetText(string.format(CalendarEventViewer_cSingleLevel, pEvent.mMinLevel));
                                else
                                        CalendarEventViewerEventFrameLevels:SetText(string.format(CalendarEventViewer_cLevelRangeFormat, pEvent.mMinLevel, pEvent.mMaxLevel));
                                end
                        else
                                if pEvent.mMinLevel == 60 then
                                        CalendarEventViewerEventFrameLevels:SetText(string.format(CalendarEventViewer_cSingleLevel, pEvent.mMinLevel));
                                else
                                        CalendarEventViewerEventFrameLevels:SetText(string.format(CalendarEventViewer_cMinLevelFormat, pEvent.mMinLevel));
                                end
                        end
                        
                        CalendarEventViewerEventFrameLevels:Show();
                else
                        if pEvent.mMaxLevel ~= nil then
                                CalendarEventViewerEventFrameLevels:SetText(string.format(CalendarEventViewer_cMaxLevelFormat, pEvent.mMaxLevel));
                        else
                                CalendarEventViewerEventFrameLevels:SetText(CalendarEventViewer_cAllLevels);
                        end
                        
                        CalendarEventViewerEventFrameLevels:Show();
                end
                
                if EventDatabase_PlayerIsQualifiedForEvent(gCalendarEventViewer_Event, gCalendarEventViewer_SelectedPlayerDatabase.PlayerLevel) then
                        CalendarEventViewerEventFrameLevels:SetTextColor(1.0, 0.82, 0);
                else
                        CalendarEventViewerEventFrameLevels:SetTextColor(1.0, 0.2, 0.2);
                end
        else
                CalendarEventViewerEventFrameLevels:Hide();
        end
        
        -- Update the description
        
        if pEvent.mDescription then
                CalendarEventViewerDescText:SetText(Calendar_UnescapeString(pEvent.mDescription));
                CalendarEventViewerDescText:Show();
        else
                CalendarEventViewerDescText:Hide();
        end
        
        -- Update the attendance
        
        if EventDatabase_EventTypeUsesAttendance(pEvent.mType) then
                local   vIsAttending = false;
                local   vIsNotAttending = false;
                local   vAttendanceComment = "";
                
                CalendarEventViewer_SetAttendanceVisible(true);
                
                if not pSkipAttendanceFields then
                        CalendarDropDown_SetSelectedValue(CalendarEventViewerCharacterMenu, gCalendarEventViewer_SelectedPlayerDatabase.UserName);
                        
                        if EventDatabase_PlayerIsQualifiedForEvent(gCalendarEventViewer_Event, gCalendarEventViewer_SelectedPlayerDatabase.PlayerLevel) then
                                CalendarEventViewer_SetAttendanceEnabled(true);
                                
                                local   vPendingRSVP = EventDatabase_FindRSVPRequestData(gCalendarEventViewer_SelectedPlayerDatabase, gCalendarEventViewer_Database.UserName, gCalendarEventViewer_Event.mID);
                                local   vEventRSVP = EventDatabase_FindEventRSVP(gCalendarEventViewer_Database.UserName, gCalendarEventViewer_Event, gCalendarEventViewer_SelectedPlayerDatabase.UserName);
                                local   vRSVP;
                                
                                if vPendingRSVP then
                                        vRSVP = vPendingRSVP;
                                else
                                        vRSVP = vEventRSVP;
                                end
                                
                                if vRSVP then
                                        vIsAttending = vRSVP.mStatus == "Y" or vRSVP.mStatus == "S";
                                        vIsNotAttending = vRSVP.mStatus == "N";
                                        
                                        if vRSVP.mComment then
                                                vAttendanceComment = Calendar_UnescapeString(vRSVP.mComment);
                                        end
                                end
                                
                                CalendarEventViewer_SetResponseStatus(vPendingRSVP, vEventRSVP);
                        else
                                CalendarEventViewer_SetAttendanceEnabled(false);
                        end
                        
                        CalendarEventViewerYes:SetChecked(vIsAttending);
                        CalendarEventViewerNo:SetChecked(vIsNotAttending);
                        CalendarEventViewerComment:SetText(vAttendanceComment);
                        
                        CalendarEventViewer_UpdateCommentEnable();
                end -- if not skipAttendance
        else
                CalendarEventViewer_SetAttendanceVisible(false);
        end
        
        if pEvent.mType ~= nil then
                CalendarEventViewerEventBackground:SetTexture(Calendar_GetEventTypeIconPath(pEvent.mType));
                if pEvent.mType == "Birth" then
                        CalendarEventViewerEventBackground:SetVertexColor(1, 1, 1, 0.8);
                else
                        CalendarEventViewerEventBackground:SetVertexColor(1, 1, 1, 0.19);
                end
        else
                CalendarEventViewerEventBackground:SetTexture("");
        end
end

function CalendarEventViewer_UpdateCommentEnable()
        local   vEnable = CalendarEventViewerYes:GetChecked() or CalendarEventViewerNo:GetChecked();
        
        Calendar_SetEditBoxEnable(CalendarEventViewerComment, vEnable);
end

function CalendarEventViewer_SetAttendanceEnabled(pEnable)
        Calendar_SetCheckButtonEnable(CalendarEventViewerYes, pEnable);
        Calendar_SetCheckButtonEnable(CalendarEventViewerNo, pEnable);
        Calendar_SetEditBoxEnable(CalendarEventViewerComment, pEnable);
        
        if pEnable then
                CalendarEventViewerEventFrameStatus:Show();
        else
                CalendarEventViewerEventFrameStatus:Hide();
        end
end

function CalendarEventViewer_SetAttendanceVisible(pVisible)
        if pVisible then
                CalendarEventViewerCharacter:Show();
                CalendarEventViewerYes:Show();
                CalendarEventViewerNo:Show();
                CalendarEventViewerComment:Show();
                CalendarEventViewerEventFrameStatus:Show();
                CalendarEventViewerFrameTab2:Show();
        else
                CalendarEventViewerCharacter:Hide();
                CalendarEventViewerYes:Hide();
                CalendarEventViewerNo:Hide();
                CalendarEventViewerComment:Hide();
                CalendarEventViewerEventFrameStatus:Hide();
                CalendarEventViewerFrameTab2:Hide();
        end
end

function CalendarEventViewer_CalculateResponseStatus(pPendingRSVP, pEventRSVP)
        if pPendingRSVP then
                return 2;
        elseif pEventRSVP then
                return 3;
        else
                return 1;
        end
end

function CalendarEventViewer_SetResponseStatus(pPendingRSVP, pEventRSVP)
        local   vStatus = CalendarEventViewer_CalculateResponseStatus(pPendingRSVP, pEventRSVP);
        CalendarEventViewerEventFrameStatus:SetText(CalendarEventViewer_cResponseMessage[vStatus]);
end

function CalendarEventViewer_ShowPanel(pPanelIndex)
        if gCalendarEventViewer_CurrentPanel > 0
        and gCalendarEventViewer_CurrentPanel ~= pPanelIndex then
                CalendarEventViewer_HidePanel(gCalendarEventViewer_CurrentPanel);
        end
        
        -- NOTE: Don't check for redundant calls since this function
        -- will be called to reset the field values as well as to 
        -- actuall show the panel when it's hidden
        
        gCalendarEventViewer_CurrentPanel = pPanelIndex;
        
        -- Update the control values
        
        if pPanelIndex == 1 then
                -- Event panel

                CalendarEventViewerParchment:Show();
                
        elseif pPanelIndex == 2 then
                -- Attendance panel
                
                CalendarEventViewerParchment:Hide();
                
                if EventDatabase_IsQuestingEventType(gCalendarEventViewer_Event.mType) then
                        CalendarAttendanceList_SetClassTotalsVisible(CalendarEventViewerAttendance, true, false);
                else
                        CalendarAttendanceList_SetClassTotalsVisible(CalendarEventViewerAttendance, false, false);
                end
        else
                Calendar_DebugMessage("CalendarEventViewer_ShowPanel: Unknown index ("..pPanelIndex..")");
        end
        
        getglobal(gCalendarEventViewer_PanelFrames[pPanelIndex]):Show();
        
        PanelTemplates_SetTab(CalendarEventViewerFrame, pPanelIndex);
end

function CalendarEventViewer_HidePanel(pFrameIndex)
        if gCalendarEventViewer_CurrentPanel ~= pFrameIndex then
                return;
        end
        
        CalendarEventViewer_Save();
        
        getglobal(gCalendarEventViewer_PanelFrames[pFrameIndex]):Hide();
        gCalendarEventViewer_CurrentPanel = 0;
end