UNPKG

calendar-month

Version:

vanillajs month data handler

131 lines (103 loc) 2.66 kB
function getDate(year, month, day) { return new Date(Date.UTC(year, month, day)); } function addPreviousDays (list, i, n, month, year) { for(; i <= n ; i++ ) list.push({ date: i, month: month, year: year, previous: true }); } function addNextDays (list, i, n, month, year) { for(; i <= n ; i++ ) list.push({ date: i, month: month, year: year, next: true }); } function monthInformation(year, month, m, start_day){ m = m || {}; var i, n, d = getDate(year, month, 1), previous_month_d = getDate(year, month, 0), month_last_day = getDate(year, month + 1, 0), next_month_d = getDate(year, month + 1, 1); start_day = start_day || 0; m.start_day = start_day; var last_day = previous_month_d.getUTCDate(); var last_week_day = previous_month_d.getUTCDay(); m.meta = { date: d, last_day: last_day, last_week_day: last_week_day, week_day: d.getUTCDay(), month_last_day: month_last_day }; m.year = d.getUTCFullYear(); m.month = d.getUTCMonth(); var list = [], lastMonthFirstWeekDay = last_day - last_week_day + start_day; // previous month days addPreviousDays( list, lastMonthFirstWeekDay, last_week_day - start_day + lastMonthFirstWeekDay, previous_month_d.getUTCMonth(), previous_month_d.getUTCFullYear() ); // current month days for( i = 1, n = month_last_day.getUTCDate() ; i <= n ; i++ ) list.push({ date: i, month: month, year: year, current: true }); // next month days addNextDays( list, 1, 42 - list.length, next_month_d.getUTCMonth(), next_month_d.getUTCFullYear() ); m.days = list; return m; } var default_start_day = 0; function Month (year, month, start_day) { if( month < 0 ) { month += 12; year -= 1; } else if( month > 11 ) { month -= 12; year += 1; } if( year instanceof Date ) { month = year.getUTCMonth(); year = year.getUTCFullYear(); } monthInformation(year, month, this, start_day || default_start_day); } Month.options = {}; Month.setFirstWeekDay = function (start_day) { default_start_day = start_day; }; Month.prototype.previous = function () { return new Month(this.year, this.month - 1, this.start_day); }; Month.prototype.next = function () { return new Month(this.year, this.month + 1, this.start_day); }; Month.prototype.getColumns = function() { var columns = [], column; for( var c = 0; c < 7; c++ ) { column = []; columns.push(column); for( var r = 0; r < 6; r++ ) { column.push( this.days[ r*7 + c ] ); } } return columns; }; module.exports = Month;