﻿// JScript File
function CalendarDataObj(thirdPartyUserName, hasConnectedPeviously, isConnected, calendarMeetingBlocks, allDayCalendarMeetings, isOrganizer, organizerCalendarMeetingBlocks, inviteeCalendarMeetingBlocks, calendarsMeetingDataArr, resourcesMeetingDataArr, consolidateCalendarMeetingsBlocks, consolidateAllDayCalendarMeetings, consolidateResourceMeetingsBlocks, consolidateAllDayResourceMeetings)
{
    this.thirdPartyUserName = thirdPartyUserName;
    this.hasConnectedPeviously = hasConnectedPeviously;
    this.isConnected = isConnected;
    this.calendarMeetingBlocks = calendarMeetingBlocks;
    this.allDayCalendarMeetings = allDayCalendarMeetings;
    this.isOrganizer = isOrganizer;
    this.organizerCalendarMeetingBlocks = organizerCalendarMeetingBlocks;
    this.inviteeCalendarMeetingBlocks = inviteeCalendarMeetingBlocks;
    this.lastFetchedMeetingUpperBoundaryDate = null;
    this.calendarsMeetingDataArr = calendarsMeetingDataArr;
    this.resourcesMeetingDataArr = resourcesMeetingDataArr;
    this.consolidateCalendarMeetingsBlocks = consolidateCalendarMeetingsBlocks;
    this.consolidateAllDayCalendarMeetings = consolidateAllDayCalendarMeetings;
    this.consolidateResourceMeetingsBlocks = consolidateResourceMeetingsBlocks;
    this.consolidateAllDayResourceMeetings = consolidateAllDayResourceMeetings;
    this.scheduleCalendarObjs = null;
    this.useScheduledCalendar = '1';
    this.resourcesApiError = '0';
    //this.resetCalendarList = true;
}

var curCalendarData = new CalendarDataObj();

CalendarDataObj.prototype.ChangeCalendarSelection = function (disable)
{
    if (this.calendarsMeetingDataArr != null)
    {
        var len = this.calendarsMeetingDataArr.length;
        for (var i=0; i<len; i++)
        {
            var calendarId = this.calendarsMeetingDataArr[i].calendarObj.calendarId;
            var element = document.getElementById(calendarId);
            if (element)
            {
                element.disabled = disable;
            }
        }
    }
    if (this.resourcesMeetingDataArr != null)
    {
        var len = this.resourcesMeetingDataArr.length;
        for (var i=0; i<len; i++)
        {
            var calendarId = this.resourcesMeetingDataArr[i].calendarObj.calendarId;
            var element = document.getElementById(calendarId);
            if (element)
            {
                element.disabled = disable;
            }
        }
    }
}

CalendarDataObj.prototype.ConsolidateMultiCalendarMeetings = function (selectedCalendarIds)
{
    selectedCalendarIds = new Array();
    if (this.calendarsMeetingDataArr != null)
    {
        var retArray = this.ConsolidateCalendarMeetings(selectedCalendarIds, this.consolidateCalendarMeetingsBlocks, this.consolidateAllDayCalendarMeetings, this.calendarsMeetingDataArr);
        selectedCalendarIds = retArray[0];
        this.consolidateCalendarMeetingsBlocks = retArray[1];
        this.consolidateAllDayCalendarMeetings = retArray[2];
        this.calendarMeetingBlocks = this.consolidateCalendarMeetingsBlocks;
        this.allDayCalendarMeetings = this.consolidateAllDayCalendarMeetings;
    }
    if (this.resourcesMeetingDataArr != null)
    {
        var retArray = this.FindInterSectionResourceMeetings(selectedCalendarIds, this.consolidateResourceMeetingsBlocks, this.consolidateAllDayResourceMeetings, this.resourcesMeetingDataArr);
       selectedCalendarIds = retArray[0];
        this.consolidateResourceMeetingsBlocks = retArray[1];
        this.consolidateAllDayResourceMeetings = retArray[2]; 
    }
    return selectedCalendarIds;
}


CalendarDataObj.prototype.ConsolidateCalendarMeetings = function (selectedCalendarIds, consolidateCalendarMeetingsBlocks, consolidateAllDayCalendarMeetings, calendarsMeetingDataArr)
{
    consolidateCalendarMeetingsBlocks = null;
    consolidateAllDayCalendarMeetings = new Array();
    var len = calendarsMeetingDataArr.length;
    for (var i=0; i<len; i++)
    {
        aCalendarObj = calendarsMeetingDataArr[i].calendarObj;
        if (aCalendarObj.selected)
        {
            selectedCalendarIds[selectedCalendarIds.length] = aCalendarObj.calendarId;
            if (consolidateCalendarMeetingsBlocks == null)
            {
                consolidateCalendarMeetingsBlocks = calendarsMeetingDataArr[i].calendarMeetingBlocks;
            }
            else
            {
               consolidateCalendarMeetingsBlocks = this.MergeCalendarMeetingBlocks(consolidateCalendarMeetingsBlocks, calendarsMeetingDataArr[i].calendarMeetingBlocks);
            }
            consolidateAllDayCalendarMeetings = consolidateAllDayCalendarMeetings.concat(calendarsMeetingDataArr[i].allDayCalendarMeetings);
        }
        
    }
    var retArray = new Array(3);
    retArray[0] = selectedCalendarIds;
    retArray[1] = consolidateCalendarMeetingsBlocks;
    retArray[2] = consolidateAllDayCalendarMeetings;
    return retArray;
}

CalendarDataObj.prototype.FindInterSectionResourceMeetings = function (selectedCalendarIds, consolidateCalendarMeetingsBlocks, consolidateAllDayCalendarMeetings, calendarsMeetingDataArr)
{
    consolidateCalendarMeetingsBlocks = null;
    consolidateAllDayCalendarMeetings = new Array();
    var len = calendarsMeetingDataArr.length;
    for (var i=0; i<len; i++)
    {
        aCalendarObj = calendarsMeetingDataArr[i].calendarObj;
        if (aCalendarObj.selected)
        {
            selectedCalendarIds[selectedCalendarIds.length] = aCalendarObj.calendarId;
            if (consolidateCalendarMeetingsBlocks == null)
            {
                consolidateAllDayCalendarMeetings = calendarsMeetingDataArr[i].allDayCalendarMeetings;
                consolidateCalendarMeetingsBlocks = calendarsMeetingDataArr[i].calendarMeetingBlocks;
            }
            else
            {
               consolidateCalendarMeetingsBlocks = this.CalculateIntersectionCalendarMeetingBlocks(consolidateCalendarMeetingsBlocks, calendarsMeetingDataArr[i].calendarMeetingBlocks);
               consolidateAllDayCalendarMeetings = this.CalculateIntersectionAllDayCalendarMeeting( consolidateAllDayCalendarMeetings, calendarsMeetingDataArr[i].allDayCalendarMeetings);
            }
        }
    }
    var retArray = new Array(3);
    retArray[0] = selectedCalendarIds;
    retArray[1] = consolidateCalendarMeetingsBlocks;
    retArray[2] = consolidateAllDayCalendarMeetings;
    return retArray;
}

CalendarDataObj.prototype.MergeCalendarMeetingBlocks = function (consolidateCalendarMeetingsBlocks, calendarsMeetingBlocks)
{
    var retCalendarMeetingsBlocks = new Array();
    var aCount = 0;
    var bCount = 0;
    var aLength = consolidateCalendarMeetingsBlocks.length;
    var bLength = calendarsMeetingBlocks.length;
    while (aCount < aLength || bCount < bLength)
    {
        var consumed = false;
        if (!(aCount < aLength))
        {
            if (retCalendarMeetingsBlocks.length > 0)
            {
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                if (currCalendarMeetingsBlock.endTime >= calendarsMeetingBlocks[bCount].startTime)
                {
                    consumed = true;
                    if (currCalendarMeetingsBlock.endTime < calendarsMeetingBlocks[bCount].endTime)
                    {
                        currCalendarMeetingsBlock.endTime = calendarsMeetingBlocks[bCount].endTime;
                    }
                    currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(calendarsMeetingBlocks[bCount].meetings)
                    bCount++;
                }
            }
            if (!consumed)
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = calendarsMeetingBlocks[bCount];
                bCount++;  
            }
        }
        else if (!(bCount < bLength))
        {
            if (retCalendarMeetingsBlocks.length > 0)
            {
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                if (currCalendarMeetingsBlock.endTime >= consolidateCalendarMeetingsBlocks[aCount].startTime)
                {
                    consumed = true;
                    if (currCalendarMeetingsBlock.endTime < consolidateCalendarMeetingsBlocks[aCount].endTime)
                    {
                        currCalendarMeetingsBlock.endTime = consolidateCalendarMeetingsBlocks[aCount].endTime;
                    }
                    currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(consolidateCalendarMeetingsBlocks[aCount].meetings)
                    aCount++;
                }
            }
            if (!consumed)
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = consolidateCalendarMeetingsBlocks[aCount];
                aCount++;  
            }
        }
        else
        {   
            if (retCalendarMeetingsBlocks.length > 0)
            {
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                if (consolidateCalendarMeetingsBlocks[aCount].startTime < calendarsMeetingBlocks[bCount].startTime)
                {
                    if (currCalendarMeetingsBlock.endTime >= consolidateCalendarMeetingsBlocks[aCount].startTime)
                    {
                        consumed = true;
                        if (currCalendarMeetingsBlock.endTime < consolidateCalendarMeetingsBlocks[aCount].endTime)
                        {
                            currCalendarMeetingsBlock.endTime = consolidateCalendarMeetingsBlocks[aCount].endTime;
                        }
                        currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(consolidateCalendarMeetingsBlocks[aCount].meetings)
                        aCount++;
                    }                    
                }
                else
                {
                    if (currCalendarMeetingsBlock.endTime >= calendarsMeetingBlocks[bCount].startTime)
                    {
                        consumed = true;
                        if (currCalendarMeetingsBlock.endTime < calendarsMeetingBlocks[bCount].endTime)
                        {
                            currCalendarMeetingsBlock.endTime = calendarsMeetingBlocks[bCount].endTime;
                        }
                        currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(calendarsMeetingBlocks[bCount].meetings)
                        bCount++;
                    }
                }
            }
            if (!consumed)
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = new CalendarMeetingBlock();
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                if (calendarsMeetingBlocks[bCount].startTime < consolidateCalendarMeetingsBlocks[aCount].startTime)
                {
                    currCalendarMeetingsBlock.startTime = calendarsMeetingBlocks[bCount].startTime;
                    currCalendarMeetingsBlock.endTime = calendarsMeetingBlocks[bCount].endTime;
                    currCalendarMeetingsBlock.meetings = calendarsMeetingBlocks[bCount].meetings;
                    if (calendarsMeetingBlocks[bCount].endTime >= consolidateCalendarMeetingsBlocks[aCount].startTime)
                    {
                        if (currCalendarMeetingsBlock.endTime < consolidateCalendarMeetingsBlocks[aCount].endTime)
                        {
                            currCalendarMeetingsBlock.endTime = consolidateCalendarMeetingsBlocks[aCount].endTime;
                        } 
                        currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(consolidateCalendarMeetingsBlocks[aCount].meetings);
                        aCount++;
                            
                    }
                    bCount++;
                }
                else
                {
                    currCalendarMeetingsBlock.startTime = consolidateCalendarMeetingsBlocks[aCount].startTime;
                    currCalendarMeetingsBlock.endTime = consolidateCalendarMeetingsBlocks[aCount].endTime;
                    currCalendarMeetingsBlock.meetings = consolidateCalendarMeetingsBlocks[aCount].meetings;
                    if (consolidateCalendarMeetingsBlocks[aCount].endTime >= calendarsMeetingBlocks[bCount].startTime)
                    {
                        if (currCalendarMeetingsBlock.endTime < calendarsMeetingBlocks[bCount].endTime)
                        {
                            currCalendarMeetingsBlock.endTime = calendarsMeetingBlocks[bCount].endTime;
                        } 
                        currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(calendarsMeetingBlocks[bCount].meetings);
                        bCount++;
                    }
                    aCount++;
                }
                               
            }
                   
        }
    }
    return retCalendarMeetingsBlocks;
}


CalendarDataObj.prototype.CalculateIntersectionCalendarMeetingBlocks = function (aCalendarMeetingsBlocks, bCalendarsMeetingBlocks)
{
    var retCalendarMeetingsBlocks = new Array();
    var aCount = 0;
    var bCount = 0;
    var aLength = aCalendarMeetingsBlocks.length;
    var bLength = bCalendarsMeetingBlocks.length;
    while (aCount < aLength && bCount < bLength)
    {
        var aBlock = aCalendarMeetingsBlocks[aCount];
        var bBlock = bCalendarsMeetingBlocks[bCount];
        var aStartTime = aBlock.startTime;
        var aEndTime = aBlock.endTime;
        var bStartTime = bBlock.startTime;
        var bEndTime = bBlock.endTime;
        if (aStartTime < bStartTime)
        {
            if (aEndTime <= bStartTime)
            {
                aCount ++;
            }
            else if (aEndTime <= bEndTime)
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = new CalendarMeetingBlock();
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                currCalendarMeetingsBlock.startTime = bStartTime;
                currCalendarMeetingsBlock.endTime = aEndTime;
                currCalendarMeetingsBlock.meetings = aBlock.meetings;
                currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(bBlock.meetings);
                
                aCount++;
            }
            else
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = new CalendarMeetingBlock();
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                currCalendarMeetingsBlock.startTime = bStartTime;
                currCalendarMeetingsBlock.endTime = bEndTime;
                currCalendarMeetingsBlock.meetings = aBlock.meetings;
                currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(bBlock.meetings);
                bCount++;
            }
        }
        else
        {
            if (bEndTime <= aStartTime)
            {
                bCount ++;
            }
            else if (bEndTime <= aEndTime)
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = new CalendarMeetingBlock();
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                currCalendarMeetingsBlock.startTime = aStartTime;
                currCalendarMeetingsBlock.endTime = bEndTime;
                currCalendarMeetingsBlock.meetings = aBlock.meetings;
                currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(bBlock.meetings);
                
                bCount++;
            }
            else
            {
                retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length] = new CalendarMeetingBlock();
                var currCalendarMeetingsBlock = retCalendarMeetingsBlocks[retCalendarMeetingsBlocks.length - 1];
                currCalendarMeetingsBlock.startTime = aStartTime;
                currCalendarMeetingsBlock.endTime = aEndTime;
                currCalendarMeetingsBlock.meetings = aBlock.meetings;
                currCalendarMeetingsBlock.meetings = currCalendarMeetingsBlock.meetings.concat(bBlock.meetings);
                
                aCount++;
            }
        }
        
    }
    return retCalendarMeetingsBlocks;
}


CalendarDataObj.prototype.CalculateIntersectionAllDayCalendarMeeting = function (aAllDayCalendarMeetings, bAllDayCalendarMeetings)
{
    var retAllCalendarMeetings = new Array();
    var aCount = 0;
    var bCount = 0;
    var aLength = aAllDayCalendarMeetings.length;
    var bLength = bAllDayCalendarMeetings.length;
    for (aCount = 0; aCount < aLength; aCount++)
    {
        var aMeeting = aAllDayCalendarMeetings[aCount];
        var aStartTime = aMeeting.startTime;
        for (bCount = 0; bCount < bLength; bCount++)
        {
           var bMeeting = bAllDayCalendarMeetings[aCount];
           var bStartTime = bMeeting.startTime;
           if (aStartTime.getUTCFullYear() == bStartTime.getUTCFullYear())
           {
               if (aStartTime.getUTCMonth() == bStartTime.getUTCMonth())
               {
                   if (aStartTime.getUTCDate() == bStartTime.getUTCDate())
                   {
                        retAllCalendarMeetings[retAllCalendarMeetings.length] = aMeeting;
                        break;
                   }
                
               }
           }
        }
    }
    return retAllCalendarMeetings;
}