/*

HomepageTabswitcher & Calendar View
VERSION 2
AUTHOR BD

DEPENDENCIES:
- jQuery 1.4.2

TODO:
-
	
NOTES:
- jQuery is running in no-conflict mode to co-exist with PrototypeJS. (jQuery is used instead of $)

*/

var date = new Date();
var currentDate = new Date(date);
var calendarDataArray = new Array();

jQuery(document).ready(function () {

    /* Initialize... */
    jQuery('ul.triggers li').show();
    jQuery('#homepageTabswitcher > ul > li:first-child').addClass('active');
    jQuery('#homepageCalendar > ul > li:first-child').addClass('active').show();
    jQuery('#viewFullCalendar').hide();

    jQuery('ul.triggers li').click(toggleTabs);

    jQuery('#calendarTab').click(function () {
        jQuery('#currentMonth').hide();
        switchMonths();
    });

    jQuery('#prev').click(prevMonthClick);
    jQuery('#next').click(nextMonthClick);

    jQuery('#selectedPerformances').delegate('.roundButtonBlue', 'mouseover', function () {
        jQuery(this).find('.metPhoneNumber').show();
    });

    jQuery('#selectedPerformances').delegate('.roundButtonBlue', 'mouseout', function () {
        jQuery(this).find('.metPhoneNumber').hide();
    });

});

function toggleTabs() {
    if (!jQuery(this).hasClass('active')) {
        jQuery('ul.tabs > li.active').removeClass('active').siblings().addClass('active');
        jQuery('ul.triggers li').removeClass('active');
        jQuery(this).addClass('active');
    }
    return false;
}

var calendarFadeOutComplete = false;
var ajaxCallInProgress = false;
function switchMonths() {
    togglePrev();

    calendarFadeOutComplete = false;
    ajaxCallInProgress = false;
    getCalendarData();
    jQuery('#viewFullCalendar').fadeOut(250);
    jQuery('#currentMonth').fadeOut(250, function () {
        clearCalendar();
        calendarFadeOutComplete = true;
        if (!ajaxCallInProgress) {
            getCalendarData();
        }
    });
}

function clearCalendar() {
    var i = 0;
    var j = 0;
    for (i = 1; i <= 6; i++) {
        var weekSelector = '#week' + i;
        jQuery(weekSelector).removeAttr('style');
        var tdSelector = weekSelector + ' td';
        jQuery(tdSelector).removeClass('noPerf').removeClass('currentDate').removeClass('selectedDay').html('');
    }
}

function prevMonthClick() {
    if (!jQuery(this).hasClass('disabled')) {
        if (date.getMonth() == 0) {
            date.setFullYear(date.getFullYear() - 1, 11);
        } else {
            date.setMonth(date.getMonth() - 1);
        }
        switchMonths();
    }
}

function nextMonthClick() {
    if (!jQuery(this).hasClass('disabled')) {
        jQuery(this).addClass('disabled');
        if (date.getMonth() == 11) {
            date.setFullYear(date.getFullYear() + 1, 0);
        } else {
            date.setMonth(date.getMonth() + 1);
        }
        switchMonths();
    }
}

function togglePrev() {
    if (date.getFullYear() == currentDate.getFullYear() && date.getMonth() == currentDate.getMonth()) {
        jQuery('a#prev').addClass('disabled');
    } else {
        jQuery('a#prev').removeClass('disabled');
    }
}

function getCalendarData() {
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    if (calendarDataArray[month + '.' + year]) {
        if (calendarFadeOutComplete) {
            renderCalendar(calendarDataArray[month + '.' + year]);
        }
    } else {
        ajaxCallInProgress = true;
        jQuery.ajax({
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            url: '../_svc/HomepageData.asmx/GetCalendarData',
            data: "{ 'year': " + year + ", 'month': " + month + " }",
            dataType: 'json',
            success: ajaxSuccess
        });
    }
}

function ajaxSuccess(response) {
    var calendarData = response.d;
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    calendarDataArray[month + '.' + year] = calendarData;

    ajaxCallInProgress = false;
    if (calendarFadeOutComplete) {
        renderCalendar(calendarData);
    }
}

function renderCalendar(calendarData) {
    toggleNext(calendarData);
    var i = 0;
    var j = 0;
    var dayOfMonth = 1;
    jQuery('#currentMonth h4').text(calendarData.FormattedMonth);
    for (i = 1; i <= 6; i++) {
        var weekSelector = '#week' + i;
        var weekTd = jQuery(weekSelector + ' td');
        if (dayOfMonth <= calendarData.DaysInMonth) {
            for (j = 1; j <= 7; j++) {
                if (i == 1 && j < calendarData.StartDayOfWeek) {
                    continue;
                }
                if (dayOfMonth <= calendarData.DaysInMonth) {
                    if (calendarData.DaysWithEvents.indexOf(dayOfMonth) > -1) {
                        var dayHtml = '<a id="day' + dayOfMonth + '" href="javascript:showDay(' + dayOfMonth + ');">' + dayOfMonth + '</a>';
                        jQuery(weekTd[j - 1]).html(dayHtml);
                    } else {
                        jQuery(weekTd[j - 1]).addClass('noPerf').html(dayOfMonth);
                    }
                    dayOfMonth++;
                }
            }
        } else {
            jQuery(weekSelector).attr('style', 'display:none;');
        }
    }
    var currentDay = currentDate.getDate();
    var currentDayHasPerformances = false;
    if (date.getFullYear() == currentDate.getFullYear() && date.getMonth() == currentDate.getMonth()) {
        jQuery('#currentMonth table td').each(function () {
            if (jQuery(this).text() == currentDay) {
                jQuery(this).addClass('currentDate');
                if (calendarData.DaysWithEvents.indexOf(currentDay) > -1) {
                    currentDayHasPerformances = true;
                }
            }
        });
    }
    if (currentDayHasPerformances) {
        showDay(currentDay);
    }
    jQuery('#currentMonth, #viewFullCalendar').fadeIn(250);
}

function showDay(dayOfMonth) {
    jQuery('#currentMonth table td').removeClass('selectedDay');
    jQuery('#day' + dayOfMonth).parent().addClass('selectedDay');
    jQuery('#selectedPerformances .roundButtonBlue .metPhoneNumber').remove();

    var first = true;

    var year = date.getFullYear();
    var month = date.getMonth() + 1;

    var i = 0;
    for (i = 0; i < calendarDataArray[month + '.' + year].EventData.length; i++) {
        var eventData = calendarDataArray[month + '.' + year].EventData[i];
        if (eventData.EventDay == dayOfMonth) {
            if (first) {
                jQuery('#selectedEvents h4').text(eventData.FormattedDate);
                jQuery('li#firstPerformance h5 a').attr('href', eventData.EventUrl).html(eventData.EventName);
                jQuery('li#firstPerformance span.time').text(eventData.EventTime);
                jQuery('li#firstPerformance a.roundButtonBlue strong').text(eventData.ButtonText);
                jQuery('li#firstPerformance a.roundButtonBlue').attr('href', eventData.EventUrl);
                first = false;
            } else {
                jQuery('li#secondPerformance h5 a').attr('href', eventData.EventUrl).html(eventData.EventName);
                jQuery('li#secondPerformance span.time').text(eventData.EventTime);
                jQuery('li#secondPerformance a.roundButtonBlue strong').text(eventData.ButtonText);
                jQuery('li#secondPerformance a.roundButtonBlue').attr('href', eventData.EventUrl);
                first = true;
                break;
            }
        }
    }
    if (!first) {
        jQuery('li#secondPerformance').attr('style', 'display:none;');
    } else {
        jQuery('li#secondPerformance').removeAttr('style');
    }
    jQuery('#selectedPerformances li a.roundButtonBlue').each(function () {
        if (jQuery(this).find('strong').text() == 'call us') {
            if (jQuery(this).find('.metPhoneNumber').length == 0) {
                jQuery(this).append('<span class="metPhoneNumber">212-362-6000</span>');
            }
        }
    });
    jQuery('#nextPerformance').hide();
    jQuery('#selectedPerformances').show();
}

function toggleNext(calendarData) {
    if (calendarData.IsLastVisibleMonth) {
        jQuery('a#next').addClass('disabled');
    } else {
        jQuery('a#next').removeClass('disabled');
    }
}

// fix for IE (doesn't support indexOf method)
if (!Array.indexOf) {
    Array.prototype.indexOf = function (obj) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] == obj) {
                return i;
            }
        }
        return -1;
    }
}

