//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 += ``;
}
}
//remaining dates after month dates
for (let j = 0; j < prevDateCount + 1; j++) {
document.querySelector(
".calendar .calendar-body"
).innerHTML += ``;
}
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();