﻿var PluginSupport = new function() {



    this.ShowAgeBoxes = function() {

        oChildren = document.getElementById('ddlChildren');
        var iChildren = oChildren.value;

        document.getElementById('spChildAges').className = (iChildren > 0 ? 'hasChildren' : '');

        for (i = 1; i <= 6; i++) {
            document.getElementById('txtChildAge' + i).style.display = i <= iChildren ? '' : 'none';
        }
    }




    this.ValidateSubmit = function() {

        var oDuration = document.getElementById('ddlNights');
        var oCheckInDay = document.getElementById('ddlCheckInDay');
        var oCheckInMonth = document.getElementById('ddlCheckInMonth');
        var oCheckOutDay = document.getElementById('ddlCheckOutDay');
        var oCheckOutMonth = document.getElementById('ddlCheckOutMonth');
        var dCheckInDate = new Date(oCheckInMonth.value.split('#')[1], oCheckInMonth.value.split('#')[0] - 1, oCheckInDay.value);
        var dCheckOutDate = new Date(oCheckOutMonth.value.split('#')[1], oCheckOutMonth.value.split('#')[0] - 1, oCheckOutDay.value);
        var iDuration = PluginSupport.DateDiff(dCheckInDate, dCheckOutDate) - 1;
        var dNow = new Date();
        var dCurrentDate = new Date(dNow.getFullYear(), dNow.getMonth(), dNow.getDate());
        var sWarn = '';

        if (document.getElementById('sddPropertyID')) {
            if (document.getElementById('sddPropertyID').value == '0') sWarn += 'Please choose a property from the list\n';
        }

        if (oCheckInMonth.value=='') sWarn += 'please choose your check in and check out dates\n';

        //check arrival date is not before today
        if (dCheckInDate < dCurrentDate) {
            sWarn += 'The check in date cannot be earlier than today\'s date\n';
            oCheckInDay.className = 'error';
            oCheckInMonth.className = 'error';
        } else {
            oCheckInDay.className = '';
            oCheckInMonth.className = '';
        }



        //check duration is not > 21
        if (iDuration > 21) {
            sWarn += 'The number of nights cannot exceed 21\n';
            oCheckOutDay.className = 'error';
            oCheckOutMonth.className = 'error';
        } else {
            oCheckOutDay.className = '';
            oCheckOutMonth.className = '';
        }

        //check child ages are set
        var iChildren = document.getElementById('ddlChildren').value;
        var bChildAge = 0
        for (i = 1; i <= iChildren; i++) {
            var oChild = document.getElementById('txtChildAge' + i);
            if (oChild.value == '') {
                oChild.className = 'childAge error'
                bChildAge = 1;
            }
        }
        if (bChildAge == 1) {
            sWarn += 'Please make sure all child ages are set\n'
        }


        //pop up the warnings if there are any else submit the form
        if (sWarn == '') {
            document.getElementById('frmBooking').submit();
            //alert('submit');
        } else {
            document.getElementById('divWarning').innerHTML = sWarn;
            document.getElementById('divWarning').style.display = '';
        }

    }



    this.CheckValidMonthDay = function(sType) {

        var oDay = document.getElementById('ddlCheck' + sType + 'Day');
        var oMonth = document.getElementById('ddlCheck' + sType + 'Month');
        var iDay = oDay.value;
        var iMonth = oMonth.value.split('#')[0];
        var iYear = oMonth.value.split('#')[1];
        var bOk;

        if (iMonth == 1 && PluginSupport.CheckLeapYear(iYear) && iDay > 29) {
            bOk = false;
        } else if (iMonth == 2 && PluginSupport.CheckLeapYear(iYear) == false && iDay > 28) {
            bOk = false;
        } else if ((iMonth == 3 || iMonth == 5 || iMonth == 8 || iMonth == 10) && iDay == 31) {
            bOk = false;
        } else {
            bOk = true;
        }

        //if it's an invalid date then take one off and call the function again
        if (bOk == false) {
            oDay.value = parseInt(oDay.value) - 1;
            PluginSupport.CheckValidMonthDay(sType);
        }
    }



    this.SetDateDropDown = function(sType, dDate) {

        var oDay = document.getElementById('ddlCheck' + sType + 'Day');
        var oMonthYear = document.getElementById('ddlCheck' + sType + 'Month');

        oDay.value = dDate.getDate();
        oMonthYear.value = parseInt(dDate.getMonth() + 1) + '#' + dDate.getFullYear();
    }




    this.CalculateCheckOutDate = function() {

        var oDuration = document.getElementById('ddlNights');
        var oCheckInDay = document.getElementById('ddlCheckInDay');
        var oCheckInMonth = document.getElementById('ddlCheckInMonth');
        var oCheckOutDay = document.getElementById('ddlCheckOutDay');
        var oCheckOutMonth = document.getElementById('ddlCheckOutMonth');

        var dCheckInDate = new Date(oCheckInMonth.value.split('#')[1], oCheckInMonth.value.split('#')[0] - 1, oCheckInDay.value);

        var dCheckOutDate = dCheckInDate;
        var iDuration = parseInt(oDuration.value);
        dCheckOutDate.setDate(dCheckOutDate.getDate() + iDuration);
        PluginSupport.SetDateDropDown('Out', dCheckOutDate);

    }



    this.CalculateCheckInDate = function() {

        var oDuration = document.getElementById('ddlNights');
        var oCheckInDay = document.getElementById('ddlCheckInDay');
        var oCheckInMonth = document.getElementById('ddlCheckInMonth');
        var oCheckOutDay = document.getElementById('ddlCheckOutDay');
        var oCheckOutMonth = document.getElementById('ddlCheckOutMonth');

        var dCheckOutDate = new Date(oCheckOutMonth.value.split('#')[1], oCheckOutMonth.value.split('#')[0] - 1, oCheckOutDay.value);

        var dCheckInDate = dCheckOutDate;
        var iDuration = parseInt(oDuration.value);
        dCheckInDate.setDate(dCheckInDate.getDate() - iDuration);
        PluginSupport.SetDateDropDown('In', dCheckInDate);

    }



    this.HasMonth = function(oDropDown, dDate) {

        var sMonthYear = dDate.getMonth() + '#' + dDate.getFullYear();
        var bHasMonth = false;
        for (var i = 0; i < oDropDown.options.length; i++) {
            if (oDropDown.options[i].value == sMonthYear) {
                bHasMonth = true;
                continue;
            }
        }

        return bHasMonth;
    }



    this.CalculateNewDuration = function() {

        var oDuration = document.getElementById('ddlNights');
        var oCheckInDay = document.getElementById('ddlCheckInDay');
        var oCheckInMonth = document.getElementById('ddlCheckInMonth');
        var oCheckOutDay = document.getElementById('ddlCheckOutDay');
        var oCheckOutMonth = document.getElementById('ddlCheckOutMonth');
        var dCheckInDate = new Date(oCheckInMonth.value.split('#')[1], oCheckInMonth.value.split('#')[0], oCheckInDay.value);
        var dCheckOutDate = new Date(oCheckOutMonth.value.split('#')[1], oCheckOutMonth.value.split('#')[0], oCheckOutDay.value);

        //work out the new duration
        var iDuration = PluginSupport.DateDiff(dCheckInDate, dCheckOutDate) - 1;
        var sWarning = '';

        if (sWarning != '') {
            var iDuration = parseInt(oDuration.value);
            var dCheckOut = new Date(dCheckInDate);
            dCheckOut.setDate(dCheckOut.getDate() + iDuration);
            PluginSupport.SetDateDropDown('Out', dCheckOut);
            alert(sWarning);
        } else {
            oDuration.value = iDuration;
        }

    }



    this.DateDiff = function(sStartDate, sEndDate) {

        var dStartDate = new Date(sStartDate);
        var dEndDate = new Date(sEndDate);
        var iStartYear;
        var iEndYear;
        var iStartDayOfYear;
        var iEndDayOfYear;
        var iDiff;

        //get the years and day of years, if end date is before start date then swap them round
        if (dStartDate <= dEndDate) {
            iStartYear = dStartDate.getYear();
            iEndYear = dEndDate.getYear();
            iStartDayOfYear = this.DayOfYear(dStartDate);
            iEndDayOfYear = this.DayOfYear(dEndDate);
        } else {
            iStartYear = dEndDate.getYear();
            iEndYear = dStartDate.getYear();
            iStartDayOfYear = this.DayOfYear(dEndDate);
            iEndDayOfYear = this.DayOfYear(dStartDate);
        }


        //2 possibilities, same year, different years
        if (iStartYear == iEndYear) {

            iDiff = iEndDayOfYear - iStartDayOfYear;

        } else {

            //one or more years apart starts with same calculation
            iDiff = iEndDayOfYear + (365 - iStartDayOfYear);

            //if it's a leap year and next year is different then add
            if (this.CheckLeapYear(iStartYear) == 1 && iEndYear != iStartYear) {
                iDiff += 1;
            }

            //now loop through all (if any years inbetween)
            for (var iLoop = iStartYear + 1; iLoop < iEndYear; iLoop++) {

                //add 365 for a normal year, 366 for a leap year
                if (this.CheckLeapYear(iLoop) == 1) {
                    iDiff += 366;
                } else {
                    iDiff += 365;
                }
            }
        }

        // add one to the datediff as this is an inclusive function
        iDiff += 1;

        // if start date > end date invert the difference
        if (dStartDate > dEndDate) {
            iDiff = iDiff * (-1);
        }

        return iDiff;
    }




    this.CheckLeapYear = function(iYear) {
        return (((iYear % 4 == 0) && (iYear % 100 != 0)) || (iYear % 400 == 0)) ? 1 : 0;
    }




    this.DayOfYear = function(dDate) {

        //start with current day of month and then add on preivous mointh days
        var iDayOfYear = dDate.getDate();
        var iMonth = dDate.getMonth();
        var iYear = dDate.getYear();

        //if it's a leap year and we are past Februrary then add 1
        if ((this.CheckLeapYear(iYear) == 1) && (iMonth >= 2)) {
            iDayOfYear++;
        }

        //now do a huge ugly if statement adding the rest on for the months
        if (iMonth == 1) {
            iDayOfYear += 31;
        } else if (iMonth == 2) {
            iDayOfYear += 59;
        } else if (iMonth == 3) {
            iDayOfYear += 90;
        } else if (iMonth == 4) {
            iDayOfYear += 120;
        } else if (iMonth == 5) {
            iDayOfYear += 151;
        } else if (iMonth == 6) {
            iDayOfYear += 181;
        } else if (iMonth == 7) {
            iDayOfYear += 212;
        } else if (iMonth == 8) {
            iDayOfYear += 243;
        } else if (iMonth == 9) {
            iDayOfYear += 273;
        } else if (iMonth == 10) {
            iDayOfYear += 304;
        } else if (iMonth == 11) {
            iDayOfYear += 334;
        }

        return iDayOfYear;
    }
}
