//check the console for date click event //Fixed day highlight //Added previous month and next month view function CalendarControl() { const calendar = new Date(); const calendarControl = { localDate: new Date(), prevMonthLastDate: null, calWeekDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], calMonthName: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], daysInMonth: function (month, year) { return new Date(year, month, 0).getDate(); }, firstDay: function () { return new Date(calendar.getFullYear(), calendar.getMonth(), 1); }, lastDay: function () { return new Date(calendar.getFullYear(), calendar.getMonth() + 1, 0); }, firstDayNumber: function () { return calendarControl.firstDay().getDay() + 1; }, lastDayNumber: function () { return calendarControl.lastDay().getDay() + 1; }, getPreviousMonthLastDate: function () { let lastDate = new Date( calendar.getFullYear(), calendar.getMonth(), 0 ).getDate(); return lastDate; }, navigateToPreviousMonth: function () { calendar.setMonth(calendar.getMonth() - 1); calendarControl.attachEventsOnNextPrev(); }, navigateToNextMonth: function () { calendar.setMonth(calendar.getMonth() + 1); calendarControl.attachEventsOnNextPrev(); }, navigateToCurrentMonth: function () { let currentMonth = calendarControl.localDate.getMonth(); let currentYear = calendarControl.localDate.getFullYear(); calendar.setMonth(currentMonth); calendar.setYear(currentYear); calendarControl.attachEventsOnNextPrev(); }, displayYear: function () { let yearLabel = document.querySelector(".calendar .calendar-year-label"); yearLabel.innerHTML = calendar.getFullYear(); }, displayMonth: function () { let monthLabel = document.querySelector( ".calendar .calendar-month-label" ); monthLabel.innerHTML = calendarControl.calMonthName[calendar.getMonth()]; }, selectDate: function (e) { console.log( `${e.target.textContent} ${ calendarControl.calMonthName[calendar.getMonth()] } ${calendar.getFullYear()}` ); }, plotSelectors: function () { document.querySelector( ".calendar" ).innerHTML += `
-
Today: ${calendarControl.calWeekDays[calendarControl.localDate.getDay()]}, ${calendarControl.localDate.getDate()}, ${calendarControl.calMonthName[calendarControl.localDate.getMonth()]} ${calendarControl.localDate.getFullYear()}
`; }, plotDayNames: function () { for (let i = 0; i < calendarControl.calWeekDays.length; i++) { document.querySelector( ".calendar .calendar-body" ).innerHTML += `
${calendarControl.calWeekDays[i]}
`; } }, plotDates: function () { document.querySelector(".calendar .calendar-body").innerHTML = ""; calendarControl.plotDayNames(); calendarControl.displayMonth(); calendarControl.displayYear(); let count = 1; let prevDateCount = 0; calendarControl.prevMonthLastDate = calendarControl.getPreviousMonthLastDate(); let prevMonthDatesArray = []; let calendarDays = calendarControl.daysInMonth( calendar.getMonth() + 1, calendar.getFullYear() ); // dates of current month for (let i = 1; i < calendarDays; i++) { if (i < calendarControl.firstDayNumber()) { prevDateCount += 1; document.querySelector( ".calendar .calendar-body" ).innerHTML += `
`; prevMonthDatesArray.push(calendarControl.prevMonthLastDate--); } else { document.querySelector( ".calendar .calendar-body" ).innerHTML += `
${count++}
`; } } //remaining dates after month dates for (let j = 0; j < prevDateCount + 1; j++) { document.querySelector( ".calendar .calendar-body" ).innerHTML += `
${count++}
`; } calendarControl.highlightToday(); calendarControl.plotPrevMonthDates(prevMonthDatesArray); calendarControl.plotNextMonthDates(); }, attachEvents: function () { let prevBtn = document.querySelector(".calendar .calendar-prev a"); let nextBtn = document.querySelector(".calendar .calendar-next a"); let todayDate = document.querySelector(".calendar .calendar-today-date"); let dateNumber = document.querySelectorAll(".calendar .dateNumber"); prevBtn.addEventListener( "click", calendarControl.navigateToPreviousMonth ); nextBtn.addEventListener("click", calendarControl.navigateToNextMonth); todayDate.addEventListener( "click", calendarControl.navigateToCurrentMonth ); for (var i = 0; i < dateNumber.length; i++) { dateNumber[i].addEventListener( "click", calendarControl.selectDate, false ); } }, highlightToday: function () { let currentMonth = calendarControl.localDate.getMonth() + 1; let changedMonth = calendar.getMonth() + 1; let currentYear = calendarControl.localDate.getFullYear(); let changedYear = calendar.getFullYear(); if ( currentYear === changedYear && currentMonth === changedMonth && document.querySelectorAll(".number-item") ) { document .querySelectorAll(".number-item") [calendar.getDate() - 1].classList.add("calendar-today"); } }, plotPrevMonthDates: function(dates){ dates.reverse(); for(let i=0;i 42 ) { let diff = 49 - childElemCount; calendarControl.loopThroughNextDays(diff); } //6 lines if(childElemCount > 35 && childElemCount <= 42 ) { let diff = 42 - childElemCount; calendarControl.loopThroughNextDays(42 - childElemCount); } }, loopThroughNextDays: function(count) { if(count > 0) { for(let i=1;i<=count;i++) { document.querySelector('.calendar-body').innerHTML += `
${i}
`; } } }, attachEventsOnNextPrev: function () { calendarControl.plotDates(); calendarControl.attachEvents(); }, init: function () { calendarControl.plotSelectors(); calendarControl.plotDates(); calendarControl.attachEvents(); } }; calendarControl.init(); } const calendarControl = new CalendarControl();