﻿/********************************   HC Plugin Calendar *************************************/

var pageCalendars = new Array();
var pageCalendarSettings = new Array();

// Function to initialize calendar on page. Use SearchBoxUI methods generating javascript calls instead on calling it directly in code 
function CreateHcCalendar(containerId, positionType) {

    var calendar1Id = containerId + '_Checkin';
    var calendar2Id = containerId + '_Checkout';
    var checkinDateString =CheckinValueFromCookieVariable == '' ? null: formatDate(Date.fromString(CheckinValueFromCookieVariable, DefaultShortDatePatternVariable), ShortDatePatternVariable);
    var checkoutDateString = CheckoutValueFromCookieVariable == '' ? null : formatDate(Date.fromString(CheckoutValueFromCookieVariable, DefaultShortDatePatternVariable), ShortDatePatternVariable);
    if (checkinDateString == '' || checkinDateString == null
     || checkoutDateString == '' || checkoutDateString == null) {
        checkinDateString = '';
        checkoutDateString = '';
    }
    var newCalendar = $('#' + containerId).hcCalendar(
            {
                calendar1Id: calendar1Id,
                calendar2Id: calendar2Id,
                selectedDate1String: checkinDateString,
                selectedDate2String: checkoutDateString,
                containerId: containerId,
                positionType: positionType
            });
            var newCalendarRef = {
                containerId: containerId,
                calendar: newCalendar
            };
            pageCalendars.push(newCalendarRef);
}
//hides all calendars on page
hideCalendar = function() {
    for (i = 0; i < pageCalendars.length; i++) {
        $('#' + pageCalendars[i].containerId).hide();
        var ttOverlay = document.getElementById(pageCalendars[i].containerId + 'TtOverlay')
        ttOverlay.style.display = 'none';
   
    }
    
}

$(document).click(function(e) {
    if (e.target.id.indexOf('searchBox') != -1) {
        return false;
    }

    var inspectElement = e.target.parentNode;

    do {
        if (inspectElement.id != null && inspectElement.id.indexOf('searchBox') != -1) {
            return false;
        }
        inspectElement = inspectElement.parentNode;
    } while (inspectElement != null);

    hideCalendar();
});

// We need to reposition calendar popup when window size changed
$(window).resize(function(e) {

    for (i = 0; i < pageCalendars.length; i++) {
        if ($('#' + pageCalendars[i].containerId)[0].style.display == 'block') {
            var parts = $('#' + pageCalendars[i].containerId)[0].children[0].id.split('-');
            var clendarInputId = parts[0];
            var pos = findPos(document.getElementById(clendarInputId));
            $(".ttCalendarOverlay").css({ top: pos.y + 20, left: pos.x });
            $('#' + pageCalendars[i].containerId).css({
                top: pos.y + 20, left: pos.x
            });
            break;
        }

    }
});

var calendarSettingsArr = new Array();
(function($) {

    var MyHcCalendar = function(element, options) {

        element = $(element);
        //Set the default values, use comma to separate the settings  
        var defaults = {
            padding: 20,
            mouseOverColor: '#CFF0FF',
            mouseOutColor: '#fff',
            selectedBackgroundColor: '#F7860D',
            otherCalSelectedDateBackgroundColor: '#d3f2fa',
            defaultColor: '#3377DD',
            canNavigateMonthAhead: 12,
            minDate: null,
            maxDate: null,
            selectedDateCalPosition: 0,
            firstDayOfWeek: parseInt(FirstDayOfWeekVariable),
            individualCalSettings: null,
            containerId: ''
        };
        var todaydate = new Date();
        var sourceElementId = element[0].id;
        // Merge options with defaults and convert strings to dates
        pageCalendarSettings[sourceElementId] = $.extend(defaults, options);
        pageCalendarSettings[sourceElementId].containerId = sourceElementId;
        settings = pageCalendarSettings[sourceElementId];
        if (settings.positionType == null || settings.positionType == '') {
            settings.positionType = 'absolute';
        }
        //settings are used to store calendar properties.individualCalSettings - speciific to individual calendar properties e.g. cheching and checkout calendars
        settings.individualCalSettings = new Array();
        var individualCalSettings = settings.individualCalSettings;
        var dateCookiesExist = false;
        if (HC.Common.Cookies.getCookie("checkin") != '' && HC.Common.Cookies.getCookie("checkout") != '') {
            dateCookiesExist = true;
        }
        if (dateCookiesExist && $("#" + settings.calendar1Id + "Value").val() != '')
            settings.selectedDate1String = $("#" + settings.calendar1Id + "Value").val();
        var selectedDate1 = (settings.selectedDate1String == null || settings.selectedDate1String == '' || SearchBoxPrepopulatedVariable == "0" ? null : Date.fromString(settings.selectedDate1String, Date.format))
        individualCalSettings[settings.calendar1Id] = {
            selectedDateCalPosition: 0,
            selectedDate: selectedDate1,
            currentMonth: selectedDate1 == null ? 0 : selectedDate1.getMonth(),
            currentYear: selectedDate1 == null ? 0 : selectedDate1.getFullYear(),
            id: settings.calendar1Id

        };
        if (dateCookiesExist && $("#" + settings.calendar2Id + "Value").val() != '')
            settings.selectedDate2String = $("#" + settings.calendar2Id + "Value").val();
        var selectedDate2 = (settings.selectedDate2String == null || settings.selectedDate2String == '' || SearchBoxPrepopulatedVariable == "0" ? null : Date.fromString(settings.selectedDate2String, Date.format));
        individualCalSettings[settings.calendar2Id] = {
            selectedDateCalPosition: 0,
            selectedDate: selectedDate2,
            currentMonth: selectedDate2 == null ? 0 : selectedDate2.getMonth(),
            currentYear: selectedDate2 == null ? 0 : selectedDate2.getFullYear(),
            id: settings.calendar2Id

        };
        var minDate = todaydate.addDays(-1);
        //eliminate time segment in date
        settings.minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
        settings.maxDate = new Date(settings.minDate.getFullYear() + 1, settings.minDate.getMonth(), settings.minDate.getDate());

        if (individualCalSettings[settings.calendar1Id].selectedDate != null) {
            $('#' + settings.calendar1Id).val(formatDate(individualCalSettings[settings.calendar1Id].selectedDate, Date.format));
        }
        else {
            $('#' + settings.calendar1Id).val('');
        }
        if (individualCalSettings[settings.calendar2Id].selectedDate != null) {
            $('#' + settings.calendar2Id).val(formatDate(individualCalSettings[settings.calendar2Id].selectedDate, Date.format));
        }
        else {
            $('#' + settings.calendar2Id).val('');
        }
        if (SearchBoxPrepopulatedVariable == "0") {
            $('#' + settings.containerId + '_Guests')[0].selectedIndex = 0;
            $('#' + settings.containerId + '_Rooms')[0].selectedIndex = 0;
        }
        var $format1 = $("#" + settings.calendar1Id + "Format");

        if ($('#' + settings.calendar1Id).val() == '') {
            $format1.html(ShortDatePatternVariable);
        }
        else {
            $format1.html(formatDate(individualCalSettings[settings.calendar1Id].selectedDate, LongDatePatternVariable));
        }

        var $format2 = $("#" + settings.calendar2Id + "Format");

        if ($('#' + settings.calendar2Id).val() == '') {
            $format2.html(ShortDatePatternVariable);
        }
        else {
            $format2.html(formatDate(individualCalSettings[settings.calendar2Id].selectedDate, LongDatePatternVariable));
        }

        setSelectedDate = function(year, month, date, id) {
            var settings = pageCalendarSettings[getContainerIdFromInput(id)];
            var individualCalSettings = pageCalendarSettings[getContainerIdFromInput(id)].individualCalSettings;
            individualCalSettings[id].selectedDate = new Date(year, month, date);

            $('#' + id).val(formatDate(new Date(year, month, date), Date.format, settings.firstDayOfWeek));
            $('#' + id + 'Value').val(formatDate(individualCalSettings[id].selectedDate, Date.format, settings.firstDayOfWeek));
            $('#' + id + 'Format').html(formatDate(individualCalSettings[id].selectedDate, LongDatePatternVariable, settings.firstDayOfWeek));

            if (id == settings.calendar1Id) {
                if (individualCalSettings[settings.calendar2Id].selectedDate != null && individualCalSettings[settings.calendar1Id].selectedDate > individualCalSettings[settings.calendar2Id].selectedDate) {
                    $('#' + settings.calendar2Id).val('');
                    $('#' + settings.calendar2Id + 'Value').val('');
                    individualCalSettings[settings.calendar2Id].selectedDate = null;
                    $('#' + settings.calendar2Id + 'Format').html(ShortDatePatternVariable);

                }
            }
            else if (id == settings.calendar2Id) {
                if (individualCalSettings[settings.calendar1Id].selectedDate != null && individualCalSettings[settings.calendar2Id].selectedDate < individualCalSettings[settings.calendar1Id].selectedDate) {
                    $('#' + settings.calendar1Id).val('');
                    $('#' + settings.calendar1Id + 'Value').val('');
                    individualCalSettings[settings.calendar1Id].selectedDate = null;
                    $('#' + settings.calendar1Id + 'Format').html(ShortDatePatternVariable);

                }
            }

            hideCalendar();

        };

        prevMonth = function(el, e) {
            var containerId = getContainerIdFromInput(el.id);
            var settings = pageCalendarSettings[containerId];
            var individualCalSettings = pageCalendarSettings[containerId].individualCalSettings;

            var parameters = el.id.split('-');
            individualCalSettings[parameters[0]].currentMonth;
            if (--individualCalSettings[parameters[0]].currentMonth == 0) {
                individualCalSettings[parameters[0]].currentMonth = 12;
                individualCalSettings[parameters[0]].currentYear--;
            }

            updateCalendar(parameters[0], individualCalSettings[parameters[0]].currentMonth, individualCalSettings[parameters[0]].currentYear);

        };
        nextMonth = function(el, e) {
            var containerId = getContainerIdFromInput(el.id);
            var settings = pageCalendarSettings[containerId];
            var individualCalSettings = pageCalendarSettings[containerId].individualCalSettings;

            var parameters = el.id.split('-');

            if (++individualCalSettings[parameters[0]].currentMonth == 13) {
                individualCalSettings[parameters[0]].currentMonth = 1;
                individualCalSettings[parameters[0]].currentYear++;
            }

            updateCalendar(parameters[0], individualCalSettings[parameters[0]].currentMonth, individualCalSettings[parameters[0]].currentYear);

        };

        updateCalendar = function(inputId, theMonth, theYear) {

            var containerId = getContainerIdFromInput(inputId);
            var calendarHTML1 = buildCalendar(inputId, theMonth, theYear, "hc_main", "month", "daysofweek", "days", 0, 0);
            if (++theMonth == 13) {
                theMonth = 1;
                theYear++;
            }
            var calendarHTML2 = buildCalendar(inputId, theMonth, theYear, "hc_main", "month", "daysofweek", "days", 0, 1)
            $('#' + containerId)[0].innerHTML = (calendarHTML1 + calendarHTML2);
        };

        dayClick = function(el) {
            var parameters = el.parentNode.parentNode.parentNode.parentNode.id.split('-'); ;
            var date = el.innerHTML;
            var containerId = getContainerIdFromInput(parameters[0]);
            var settings = pageCalendarSettings[containerId];

            //store selected date calendar position in settings
            settings.selectedDateCalPosition = parameters[4];
            setSelectedDate(parameters[2], parameters[1], date, parameters[0]);
        };

        dayMouseOver = function(el) {
            var parameters = el.parentNode.parentNode.parentNode.parentNode.id.split('-');
            el.style.backgroundColor = settings.mouseOverColor;
            el.style.color = '#000';
        };
        
        daysMouseOut = function(el) {
            var parameters = el.parentNode.parentNode.parentNode.parentNode.id.split('-'); ;
            if (el.className.indexOf('selected') != -1) {
                el.style.backgroundColor = settings.selectedBackgroundColor;
                el.style.color = '#fff';
            }
            else if (el.className.indexOf('today') != -1) {
                el.style.backgroundColor = settings.mouseOutColor;
                el.style.color = '#000';
            }
            else if (el.className.indexOf('otherCalDate') != -1) {
                el.style.backgroundColor = settings.otherCalSelectedDateBackgroundColor;
                el.style.color = settings.defaultColor;
            }
            else {
                el.style.backgroundColor = settings.mouseOutColor;
                el.style.color = settings.defaultColor;
            }
        };

        // Function to build calendar HTML
        buildCalendar = function(id, month, year, monthElClass, headerClass, dayNamesClass, daysClass, border, pos, containerId) {
            var dim = [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

            var settings = pageCalendarSettings[getContainerIdFromInput(id)];
            var individualCalSettings = pageCalendarSettings[getContainerIdFromInput(id)].individualCalSettings;

            var oD = new Date(year, month - 1, 1);
            var oDMax = new Date(year, month, 1);
            oD.od = oD.getDay() + 1;
            var canNavigateBack = oD > settings.minDate;
            var canNavigateForward = oDMax < settings.maxDate;
            var todayDate = new Date();
            var scanForToday = (year == todayDate.getFullYear() && month == todayDate.getMonth() + 1) ? todayDate.getDate() : 0;
            var scanForSelectedDate = (individualCalSettings[id].selectedDate != null && year == individualCalSettings[id].selectedDate.getFullYear() && month == individualCalSettings[id].selectedDate.getMonth() + 1) ? individualCalSettings[id].selectedDate.getDate() : 0;
            var scanForCheckinSelectedDate = null;
            if (individualCalSettings[id].id == settings.calendar2Id) {
                scanForCheckinSelectedDate = (individualCalSettings[settings.calendar1Id].selectedDate != null && year == individualCalSettings[settings.calendar1Id].selectedDate.getFullYear() && month == individualCalSettings[settings.calendar1Id].selectedDate.getMonth() + 1) ? individualCalSettings[settings.calendar1Id].selectedDate.getDate() : null;
                //this is second calendar. make sure you highlight first calendar selected date in it
            }
            var canNavigateBackwardLink = (pos == 0 && canNavigateBack ? '<a href="#" id="' + id + '-prev" onclick="return false;"    onmouseup="prevMonth(this, event);event.returnValue = false;return false;" class="navPrev">«</a>' : pos == 0 ? '<a href="#" id="' + id + '-prev"  class="navPrev disabled">«</a>' : '');
            var navigateForwardLink = '';
            if (pos == 1) {
                navigateForwardLink = '<a href="#"  onclick="return false;"  onmouseup="hideCalendar()" id="' + id + 'Close" class="closeCalendar">x</a>';
            }
            navigateForwardLink += (pos == 1 && canNavigateForward ? '<a href="#" id="' + id + '-next" onclick="return false;"  onmouseup="nextMonth(this, event);event.returnValue = false;return false;" class="navNext">»</a>' : pos == 1 ? '<a href="#" id="' + id + '-next"  class="navNext disabled">«</a>' : '');


            dim[1] = (((oD.getFullYear() % 100 != 0) && (oD.getFullYear() % 4 == 0)) || (oD.getFullYear() % 400 == 0)) ? 29 : 28;
            var t = '<div id="' + id + '-' + ((month - 1) + '-' + year + '-HcCalendar') + '-' + pos + '-' + containerId +
            '" class="' + monthElClass + '"><table class="' + monthElClass + '" cols="7" cellpadding="0" border="' + border + '" cellspacing="0"><tr align="center">';
            t += '<td class="' + headerClass + '">' + canNavigateBackwardLink + '</td><td colspan="4" align="center" class="' + headerClass + '">' + Date.monthNames[month - 1] + ' - ' + year + '</td><td colspan="2" class="' + headerClass + '">'
                + navigateForwardLink + '</td></tr><tr align="center">';


            var firstDayOfWeek = settings.firstDayOfWeek;
            for (s = 0; s < 7; s++) {
                var dayIndex = s;
                if (firstDayOfWeek > 0) {
                    dayIndex = (s + firstDayOfWeek) > 6 ? (s + firstDayOfWeek) - 7 : (s + firstDayOfWeek);
                }
                t += '<td class="' + dayNamesClass + '">' + Date.abbrDayNames[dayIndex] + '</td>';
            }
            t += '</tr><tr align="center">';
            var lowerIndex = 1 + firstDayOfWeek;
            var upperIndex = 42 + firstDayOfWeek;
            for (i = lowerIndex; i <= upperIndex; i++) {
                var dayIndex = i;
                if (firstDayOfWeek > 0) {
                    //dayIndex = (i + firstDayOfWeek - 4) > 42 ? (i + firstDayOfWeek - 4) - 42 : (i + firstDayOfWeek - 4);
                    dayIndex = i > upperIndex ? i - upperIndex : i;
                }
                var startDayIndex = oD.od - firstDayOfWeek < firstDayOfWeek ? oD.od + 7 : oD.od;
                var x = ((dayIndex - startDayIndex >= 0) && (dayIndex - startDayIndex < dim[month - 1])) ? dayIndex - startDayIndex + 1 : '&nbsp;';
                var empty = x == '&nbsp;';
                var cellDate = new Date(year, month - 1, dayIndex - oD.od + 1);
                var cellClickable = (empty || settings.minDate > cellDate || settings.maxDate < cellDate ? '' : ' onmouseup="dayClick(this)" onmouseover="dayMouseOver(this)" onmouseout="daysMouseOut(this)"');
                if (empty) {
                    daysClass = 'empty';
                }
                else {
                    daysClass = 'days';
                }
                if (settings.minDate > cellDate) {
                    daysClass += ' disabled';
                }
                if (settings.maxDate < cellDate) {
                    daysClass += ' disabled';
                }

                if (x == scanForToday)
                    daysClass += ' today';
                if (x == scanForSelectedDate)
                    daysClass += ' selected';
                if (x == scanForCheckinSelectedDate) {
                    daysClass += ' otherCalDate';
                }
                t += '<td class="' + daysClass + '" ' + cellClickable + '>' + x + '</td>';

                if (((i - firstDayOfWeek) % 7 == 0) && (i - firstDayOfWeek < 36)) t += '</tr><tr align="center">';


            }
            return t += '</tr></table></div>';

        }


        $('#' + settings.calendar1Id + 'Image').click(function(e) {
            var inputId = this.id.replace('Image', '');
            showCalendar(inputId, e);

        });
        $('#' + settings.calendar2Id + 'Image').click(function(e) {
            var inputId = this.id.replace('Image', '');
            showCalendar(inputId, e);

        });

        $('#' + settings.calendar1Id).click(function(e) {
            showCalendar(this.id, e);
        });
        $('#' + settings.calendar2Id).click(function(e) {
            showCalendar(this.id, e);
        });

        getContainerIdFromInput = function(inputId) {
            var inputIdParts = inputId.split('_');
            return inputIdParts[0];

        };
        showCalendar = function(inputId, e) {
            var containerId = getContainerIdFromInput(inputId);
            var settings = pageCalendarSettings[containerId];
            var individualCalSettings = pageCalendarSettings[containerId].individualCalSettings;
            var input = document.getElementById(inputId);
            var pos = findPos(input);
            //this is for IE 6 issue with popups over drop downs
            var ttOverlay = document.getElementById(containerId + 'TtOverlay')
            ttOverlay.style.display = 'block';
            ttOverlay.style.top = (pos.y + 20) + "px";
            ttOverlay.style.left = (pos.x) + "px";

            //alert('pos.x=' + pos.x + ' pos.y=' + pos.y);
            var calPosition = 0;
            var noSelection = false;
            var dateToDisplay = individualCalSettings[inputId].selectedDate;
            if (dateToDisplay == null) {
                if (inputId == settings.calendar1Id) {
                    dateToDisplay = individualCalSettings[settings.calendar2Id].selectedDate;
                }
                else {
                    dateToDisplay = individualCalSettings[settings.calendar1Id].selectedDate;
                }
                if (dateToDisplay == null) {
                    dateToDisplay = new Date();
                    noSelection = true;
                }
            }
            var theMonth = individualCalSettings[inputId].currentMonth = dateToDisplay.getMonth() + 1;
            var theYear = individualCalSettings[inputId].currentYear = dateToDisplay.getFullYear();
            //this calendar has no selectd date suggest display month from other calendar
            if ($('#' + inputId).val() == '' && !noSelection) {
                if (settings.selectedDateCalPosition == 1) {
                    if (--theMonth == 0) {
                        theMonth = 12;
                        theYear--;
                    }
                }
            }
            var calendarHTML1 = buildCalendar(inputId, theMonth, theYear, "hc_main", "month", "daysofweek", "days", 0, calPosition++);
            if (++theMonth == 13) {
                theMonth = 1;
                theYear++;
            }
            //TODO: dodgy hack -  should do it properly
            var width = '438px';
            // IE6, older browsers
            if (typeof document.body.style.maxHeight == "undefined") {
                width = '450px';
            }

            var calendarHTML2 = buildCalendar(inputId, theMonth, theYear, "hc_main", "month", "daysofweek", "days", 0, calPosition)
            $('#' + containerId)[0].innerHTML = (calendarHTML1 + calendarHTML2);
            $('#' + containerId).css({ position: settings.positionType,
                marginLeft: 0, marginTop: 0,
                top: pos.y + 20, left: pos.x, width: width
            });


            $('#' + containerId).show();


        };
    };

    $.fn.hcCalendar = function(options) {
        return this.each(function() {
            var element = $(this);

            // Return early if this element already has a plugin instance
            if (element.data('myhccalendar')) return;

            var myHcCalendar = new MyHcCalendar(this, options);

            // Store plugin object in this element's data
            element.data('myhccalendar', myHcCalendar);


        });
    };
})(jQuery);

// Returns whether the popup calendar will be appearing in a modal parent container or not..
function inModalContainer(obj) {
    if ($(obj).parents("#hc_popupSearch").length != 0) {
        return true;
    } else {
        return false;
    }
}

// Function to find absolute position for given element
function findPos(obj) {
    // if need to use relative to container positioning (eg. in a model fixed position popup),
    // then use findpos2 instead of findpos.
    if (inModalContainer(obj)) {
        return findPos2(obj);
    }
    // else use this function for finding position as jquery has problems..
	var curleft = curtop = 0;
	if (obj.offsetParent) {
	    do {
	        curleft += obj.offsetLeft;
	        curtop += obj.offsetTop;
	    } while (obj = obj.offsetParent);
	}
    return { x: curleft, y: curtop };
}
// Bad jquery!.. fixed this method below using one above.
function findPos2(obj) {
    var curleft = $(obj).position().left;
    var curtop = $(obj).position().top;
    curtop += 37;
    curleft += 10;
    return { x: curleft, y: curtop };
}

function LZ(x) { return (x < 0 || x > 9 ? "" : "0") + x } 1

function formatDate(date, format, firtsDayOfTheWeek) {
//    if (isNaN(firtsDayOfTheWeek) || firtsDayOfTheWeek == null) {
//        firtsDayOfTheWeek = 0;
//    }
    format = format + "";
    var result = "";
    var i_format = 0;
    var c = "";
    var token = "";
    var y = date.getFullYear() + "";
    var M = date.getMonth();
    var dw = date.getDay();
    dw = dw > 6 ? dw - 7 : dw;
    var d = date.getDate();
    var yyyy, yy, MMM, MM, dd;
    // Convert real date parts into formatted versions
    var value = new Object();
    if (y.length < 4) { y = "" + (y - 0 + 1900); }
    value["y"] = "" + y;
    value["yyyy"] = y;
    //value["yy"] = y.substring(2,4);
    value["yy"] = y;
    value["M"] = M + 1;
    value["MM"] = LZ(M + 1);
    value["MMM"] = Date.abbrMonthNames[M];
    value["MMMM"] = Date.monthNames[M];
    value["m"] = M + 1;
    value["mm"] = LZ(M + 1);
    value["mmm"] = Date.abbrMonthNames[M];
    value["mmmm"] = Date.monthNames[M];
    value["NNN"] = Date.monthNames[M + 11];
    value["d"] = d;
    value["dd"] = LZ(d);
    value["dddd"] = Date.dayNames[dw];


    while (i_format < format.length) {
        c = format.charAt(i_format);
        token = "";
        while ((format.charAt(i_format) == c) && (i_format < format.length)) {
            token += format.charAt(i_format++);
        }
        if (value[token] != null) { result = result + value[token]; }
        else { result = result + token; }
    }
    return result;
}

function stopEvent(e) {
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;

    if (e.preventDefault) e.preventDefault();
    else e.returnValue = false;
}
