/*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());
}