Source: models/calendar.js

class Calendar {

    /**
     * constructor
     */
    constructor() {
        this.month = new Date().getMonth()+1;
        console.log('init: month: ' + this.month);
        this.year = new Date().getFullYear();
    }

    set month(month) {
        this._month = month;
    }

    get month() {
        return this._month;
    }

    get monthName() {
        var monthReturn = '';
        switch (this._month) {
            case 1:
                monthReturn = 'Januar';
                break;
            case 2:
                monthReturn = 'Februar';
                break;
            case 3:
                monthReturn = 'März';
                break;
            case 4:
                monthReturn = 'April';
                break;
            case 5:
                monthReturn = 'Mai';
                break;
            case 6:
                monthReturn = 'Juni';
                break;
            case 7:
                monthReturn = 'Juli';
                break;
            case 8:
                monthReturn = 'August';
                break;
            case 9:
                monthReturn = 'September';
                break;
            case 10:
                monthReturn = 'Oktober';
                break;
            case 11:
                monthReturn = 'November';
                break;
            case 12:
                monthReturn = 'Dezember';
                break;
        }
        return monthReturn;
    }

    getGridFor() {
        var month = this.month;
        var year = this.year;
        var html = '';

        // get number of days in month
        var daysInMonth = this.getDaysInMonth(month, year);

        // get number of days in last month
        var lastMonth = month - 1;
        var lastYear = year;
        if (lastMonth < 1) {
            lastMonth = 12;
            lastYear = year - 1;
        }
        var daysInLastMonth = this.getDaysInMonth(lastMonth, lastYear);
        console.log('days in last month: ' + daysInLastMonth);

        // get weekday of first day in month
        var weekDayStart = this.getWeekdayMonthStartsWith(month, year);
        console.log('weekDayStart: ' + weekDayStart);

        // render preleading days of last month
        if (weekDayStart > 1) {
            var startOffsetDays = weekDayStart - 1;
            var i;
            for (i = 0; i < startOffsetDays; i++) {
                html += ' <div class="day day--disabled">' + (daysInLastMonth - i) + '</div>';
            }
        }

        // render days of month
        var i;
        for (i = 1; i <= daysInMonth; i++) {
            html += '<div class="day">' + i + '</div>'
        }


        // get weekday of first day in month
        var weekDayEnd = this.getWeekdayMonthEndsWith(month, year);

        // render trailing days of following month
        if (weekDayEnd < 7) {
            var endOffsetDays = 7 - weekDayEnd;
            var i;
            for (i = 0; i < endOffsetDays; i++) {
                html += ' <div class="day day--disabled">' + (i+1) + '</div>';
            }
        }

        return html;
    }

    addEntry(title, col, row) {
        var html = '<section class="task task--danger" style="grid-column: ' + col + ' / span 1; grid-row: ' + row + ';">' + title + '</section>';
        return html;
    }

    /**
     * Returns number of days of month in year
     */
    getDaysInMonth() {
        return new Date(this.year, this.month, 0).getDate();
    }

    /**
     * Returns weekday a month starts with
     */
    getWeekdayMonthStartsWith() {
        var day = new Date(this.year + "-" + this.month + "-01").getDay();
        if (day === 0) day = 7;
        return day;
    }

    getWeekdayMonthEndsWith() {
        var day = new Date(this.year + "-" + this.month + "-" + this.getDaysInMonth(this.month, this.year)).getDay();
        return day;
    }

    getDaysInLastMonth() {
        return this.getWeekdayMonthStartsWith() - 1;
    }

    /**
     * returns row in calendar for day
     * @param {integer} day 
     */
    getRowForDay(day) {
        if (typeof day === 'string') {
            day = parseInt(day);
        }
        var base = day + this.getDaysInLastMonth();
        
        var rowFloat = base / 7;
       
        var row = 0;
        if (rowFloat <= 1) {
            row = 1;
        } else if (rowFloat <= 2) {
            row = 2;
        } else if (rowFloat <= 3) {
            row = 3;
        } else if (rowFloat <= 4) {
            row = 4;
        } else if (rowFloat <= 5) {
            row = 5;
        } else if (rowFloat <= 6) {
            row = 6;
        } else if (rowFloat <= 7) {
            row = 7;
        } 
        return row;
    }

    /**
     * Returns column for given day in month
     * @param {integer} day 
     */
    getColumnForDay(day) {
        if (typeof day === 'string') {
            day = parseInt(day);
        }

        var column = 1;

        var endCol1 = 7 - this.getDaysInLastMonth();
        var endCol2 = (7*2) - this.getDaysInLastMonth();
        var endCol3 = (7*3) - this.getDaysInLastMonth();
        var endCol4 = (7*4) - this.getDaysInLastMonth();
        var endCol5 = (7*5) - this.getDaysInLastMonth();


        if (day <= endCol1) {
            column = 7-(endCol1 - day);
        } else if (day <= endCol2) {
            column = 7-(endCol2 - day);
        } else if (day <= endCol3) {
            column = 7-(endCol3 - day);
        } else if (day <= endCol4) {
            column = 7-(endCol4 - day);
        } else if (day <= endCol5) {
            column = 7-(endCol5 - day);
        } 



        return column;
    }

    

}

module.exports = Calendar;