File diff 85eae7afbbd1 → 6b0577b5052d
www/conservancy/static/admin-media/js/calendar.js
Show inline comments
 
new file 100644
 
/*
 
calendar.js - Calendar functions by Adrian Holovaty
 
*/
 

	
 
function removeChildren(a) { // "a" is reference to an object
 
    while (a.hasChildNodes()) a.removeChild(a.lastChild);
 
}
 

	
 
// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
 
function quickElement() {
 
    var obj = document.createElement(arguments[0]);
 
    if (arguments[2] != '' && arguments[2] != null) {
 
        var textNode = document.createTextNode(arguments[2]);
 
        obj.appendChild(textNode);
 
    }
 
    var len = arguments.length;
 
    for (var i = 3; i < len; i += 2) {
 
        obj.setAttribute(arguments[i], arguments[i+1]);
 
    }
 
    arguments[1].appendChild(obj);
 
    return obj;
 
}
 

	
 
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
 
var CalendarNamespace = {
 
    monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
 
    daysOfWeek: gettext('S M T W T F S').split(' '),
 
    isLeapYear: function(year) {
 
        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
 
    },
 
    getDaysInMonth: function(month,year) {
 
        var days;
 
        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
 
            days = 31;
 
        }
 
        else if (month==4 || month==6 || month==9 || month==11) {
 
            days = 30;
 
        }
 
        else if (month==2 && CalendarNamespace.isLeapYear(year)) {
 
            days = 29;
 
        }
 
        else {
 
            days = 28;
 
        }
 
        return days;
 
    },
 
    draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
 
        month = parseInt(month);
 
        year = parseInt(year);
 
        var calDiv = document.getElementById(div_id);
 
        removeChildren(calDiv);
 
        var calTable = document.createElement('table');
 
        quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
 
        var tableBody = quickElement('tbody', calTable);
 

	
 
        // Draw days-of-week header
 
        var tableRow = quickElement('tr', tableBody);
 
        for (var i = 0; i < 7; i++) {
 
            quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
 
        }
 

	
 
        var startingPos = new Date(year, month-1, 1).getDay();
 
        var days = CalendarNamespace.getDaysInMonth(month, year);
 

	
 
        // Draw blanks before first of month
 
        tableRow = quickElement('tr', tableBody);
 
        for (var i = 0; i < startingPos; i++) {
 
            var _cell = quickElement('td', tableRow, ' ');
 
            _cell.style.backgroundColor = '#f3f3f3';
 
        }
 

	
 
        // Draw days of month
 
        var currentDay = 1;
 
        for (var i = startingPos; currentDay <= days; i++) {
 
            if (i%7 == 0 && currentDay != 1) {
 
                tableRow = quickElement('tr', tableBody);
 
            }
 
            var cell = quickElement('td', tableRow, '');
 
            quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
 
            currentDay++;
 
        }
 

	
 
        // Draw blanks after end of month (optional, but makes for valid code)
 
        while (tableRow.childNodes.length < 7) {
 
            var _cell = quickElement('td', tableRow, ' ');
 
            _cell.style.backgroundColor = '#f3f3f3';
 
        }
 

	
 
        calDiv.appendChild(calTable);
 
    }
 
}
 

	
 
// Calendar -- A calendar instance
 
function Calendar(div_id, callback) {
 
    // div_id (string) is the ID of the element in which the calendar will
 
    //     be displayed
 
    // callback (string) is the name of a JavaScript function that will be
 
    //     called with the parameters (year, month, day) when a day in the
 
    //     calendar is clicked
 
    this.div_id = div_id;
 
    this.callback = callback;
 
    this.today = new Date();
 
    this.currentMonth = this.today.getMonth() + 1;
 
    this.currentYear = this.today.getFullYear();
 
}
 
Calendar.prototype = {
 
    drawCurrent: function() {
 
        CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
 
    },
 
    drawDate: function(month, year) {
 
        this.currentMonth = month;
 
        this.currentYear = year;
 
        this.drawCurrent();
 
    },
 
    drawPreviousMonth: function() {
 
        if (this.currentMonth == 1) {
 
            this.currentMonth = 12;
 
            this.currentYear--;
 
        }
 
        else {
 
            this.currentMonth--;
 
        }
 
        this.drawCurrent();
 
    },
 
    drawNextMonth: function() {
 
        if (this.currentMonth == 12) {
 
            this.currentMonth = 1;
 
            this.currentYear++;
 
        }
 
        else {
 
            this.currentMonth++;
 
        }
 
        this.drawCurrent();
 
    },
 
    drawPreviousYear: function() {
 
        this.currentYear--;
 
        this.drawCurrent();
 
    },
 
    drawNextYear: function() {
 
        this.currentYear++;
 
        this.drawCurrent();
 
    }
 
}