/*jslint indent: 2, maxlen: 80 */ // TODO // - Refactor the code; clean it up var $calendarYear = $('#year-calendar'); var $bookingForm = $('#booking-form'); var $mobileNavButton = $('.new-main-header__mobilenav-button'); var SELECTED = 'selected'; var SELSTART = 'select-start'; var SELEND = 'select-end'; var MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var TOTAL_CALENDAR_MONTHS = 48; function resetSelection() { $calendarYear.find('.' + SELECTED).removeClass(SELECTED); $calendarYear.find('.' + SELSTART).removeClass(SELSTART); $calendarYear.find('.' + SELEND).removeClass(SELEND); } function resetSelectedDays() { $calendarYear.find('.day.selected').removeClass(SELECTED); } function range(low, high) { var i, range_array = []; for (i = low; i <= high; i++) { range_array.push(i); } return range_array; } var stringifyDate = function (date) { function zeroPad(n) { return (n < 10 ? '0' : '') + n; } function stringize(year, month, date) { return year + '-' + zeroPad(month) + '-' + zeroPad(date); } return stringize(date.getFullYear(), date.getMonth() + 1, date.getDate()); }; function buildYearCalendar(year) { var populateMonth = function (year, month) { // Month range: 0-11 var content = ''; var buildWeek = function () { return [0, 0, 0, 0, 0, 0, 0]; }; var fillWeek = function (start_date) { start_date = start_date || 0; while (start_date < 7) { week[start_date] = month_date; month_date++; start_date++; if (month_date > days_in_month) { break; } } }; var today = stringifyDate(new Date()); var month_array; var month_date = 1; // Get the number of days for the month var days_in_month = new Date(year, month + 1, 0).getDate(); // Find which day the first day of the month falls on var date_value = new Date(year, month, 1); var first_day = date_value.getDay() - 1; //First day of week is Monday if(first_day === -1) { first_day = 6; } // Create first row of the week, based on the first day var week = buildWeek(); fillWeek(first_day); month_array = week; // thereafter, fill the days until the end of the month while (month_date <= days_in_month) { week = buildWeek(); fillWeek(); month_array = month_array.concat(week); } // Now create HTML content of the month content += ''; if (month_array.length) { for (var i = 0; i < month_array.length; i++) { if (i % 7 === 0) { if (i > 0) { content += ''; } content += ''; } if (month_array[i] > 0) { var string_date = stringifyDate(new Date(year, month, month_array[i])); var timeClass = ""; if (today == string_date) { timeClass = " today"; } if (string_date < today) { timeClass = " disabled" } content += '' + month_array[i] + ''; } else { content += ''; } } content += ''; } content += ''; return content; }; var setupTriggers = function () { $calendarYear.find('.day').not(".disabled").click(function () { dayClicked(this); }); }; var d = new Date(); d.setDate(1); var monthNames = $calendarYear.data("months"); // Build Content for Calender var calendarContent = ''; for (var month = 0; month < TOTAL_CALENDAR_MONTHS; month++) { var newm = d.getMonth(); calendarContent += '
' + monthNames[newm] + ' ' + year + '
'; calendarContent += ''; calendarContent += populateMonth(year, newm); calendarContent += '
'; calendarContent += '
'; if (newm == 11) { year++; } d.setMonth(d.getMonth() + 1); } $calendarYear.append(calendarContent); var tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); tomorrow = stringifyDate(tomorrow); $calendarYear.find(".today").addClass(SELSTART); $calendarYear.find(".day[data-yc-value='" + tomorrow +"']").addClass(SELEND); highlightRangeofDays(); setupTriggers(); } function toggleSelected(that) { $(that).toggleClass(SELECTED); } function getDateAtPosition(that) { return $calendarYear.find(that).data('yc-value'); } function getDateAtSelectStart() { return getDateAtPosition('.select-start'); } function getDateAtSelectEnd() { return getDateAtPosition('.select-end'); } function getDateAtClick(that) { return getDateAtPosition(that); } function disableDays($calendar) { var today = new Date(); var yesterday = new Date(today); yesterday.setDate(today.getDate() - 1); var yesterdayIndex = $calendar.find(".day").index($calendar.find("[data-yc-value='" + stringifyDate(yesterday) + "']")); var startDayIndex = $calendar.find(".day").index($calendar.find("." + SELSTART)); var disabledDays = $calendar.find(".day").slice(yesterdayIndex + 1, startDayIndex + 1); disabledDays.each(function (index, day) { if ($calendar.data("pickDeparture") === "1") { $(day).addClass("disabled"); } else { $(day).removeClass("disabled"); } }); } function dayClicked(dayElem) { var $calendar = $(dayElem).closest("#year-calendar"); if ($calendar.data("pickDeparture") == "1") { if (getDateAtSelectStart() < $(dayElem).data("yc-value")) { $calendar.find("." + SELEND).removeClass(SELEND); $(dayElem).addClass(SELEND); $calendar.data("pickDeparture", "0"); } } else { $calendar.find("." + SELSTART).removeClass(SELSTART); $(dayElem).addClass(SELSTART); $calendar.data("pickDeparture", "1"); $bookingForm.find(".clicked").removeClass("clicked"); $bookingForm.find(".new-main-header__teaser__booking-form__select-button.departure").addClass("clicked"); if (getDateAtSelectStart() >= getDateAtSelectEnd()) { $calendar.find("." + SELEND).removeClass(SELEND); } $(dayElem).next().addClass(SELEND); } disableDays($calendar); if (($calendar.data("pickDeparture") === "0") && (!$mobileNavButton.is(":visible"))) { $bookingForm.find(".new-main-header__teaser__booking-form__select-button.arrival").trigger("calendarTrigger", false); } var startDayIndex = $calendar.find(".day").index($calendar.find("." + SELSTART)); var endDayIndex = $calendar.find(".day").index($calendar.find("." + SELEND)); var days; if ((startDayIndex !== -1) && (endDayIndex !== -1)) { days = $calendar.find(".day").slice(startDayIndex, endDayIndex + 1); } resetSelectedDays(); if (days) { days.each(function (index, day) { $(day).addClass(SELECTED); }); } updateSelectedDates(); } function highlightRangeofDays() { var startDayIndex = $calendarYear.find(".day").index($calendarYear.find(".select-start")); var endDayIndex = $calendarYear.find(".day").index($calendarYear.find(".select-end")); var days; if ((startDayIndex !== -1) && (endDayIndex !== -1)) { days = $calendarYear.find(".day").slice(startDayIndex, endDayIndex + 1); } if (days) { days.each(function (index, day) { $(day).addClass(SELECTED); }); } updateSelectedDates(); } function updateSelectedDates() { var monthNames = $calendarYear.data("months"); var dayNames = $calendarYear.data("days"); var startDateRaw = getDateAtSelectStart(); var endDateRaw = getDateAtSelectEnd(); var start_date, end_date; if (startDateRaw) { start_date = new Date(startDateRaw); var formatStartDate = start_date.getDate() + "." + (start_date.getMonth() + 1) + "." + start_date.getFullYear(); $bookingForm.find('.arrival-date').text(formatStartDate); $bookingForm.find('#new-main-header__teaser__booking-form__inputArrive').val(startDateRaw); } else { $bookingForm.find('.arrival-date').text("--.--.----"); } if (endDateRaw) { end_date = new Date(endDateRaw); var formatEndDate = end_date.getDate() + "." + (end_date.getMonth() + 1) + "." + end_date.getFullYear(); $bookingForm.find('.departure-date').text(formatEndDate); $bookingForm.find('#new-main-header__teaser__booking-form__inputDepart').val(endDateRaw); } else { $bookingForm.find('.departure-date').text("--.--.----"); } if (startDateRaw && endDateRaw) { var formatNumRangeDate = "(" + start_date.getDate() + "." + (start_date.getMonth() + 1) + " - " + end_date.getDate() + "." + (end_date.getMonth() + 1) + ")"; $(".new-main-header__teaser__booking-form__confirm-button.calendar .numRangeDate").text(formatNumRangeDate); var formatStartDateMobile = start_date.getDate() + "." + monthNames[start_date.getMonth()].substring(0, 3); $bookingForm.find('.arrival-date-mobile').text(formatStartDateMobile); var formatEndDateMobile = end_date.getDate() + "." + monthNames[end_date.getMonth()].substring(0, 3); $bookingForm.find('.departure-date-mobile').text(formatEndDateMobile); var formatStartDateDayMobile = dayNames[start_date.getDay()].substring(0, 2); $bookingForm.find('.arrival-date-day-mobile').text(formatStartDateDayMobile); var formatEndDateDayMobile = dayNames[end_date.getDay()].substring(0, 2); $bookingForm.find('.departure-date-day-mobile').text(formatEndDateDayMobile); } $('.col-calendar').trigger('change'); } if ($calendarYear.length) { buildYearCalendar(new Date().getFullYear()); }