function removeChildren(a){while(a.hasChildNodes())a.removeChild(a.lastChild);}
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;}
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(' '),firstDayOfWeek:parseInt(get_format('FIRST_DAY_OF_WEEK')),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){var today=new Date();var todayDay=today.getDate();var todayMonth=today.getMonth()+1;var todayYear=today.getFullYear();var todayClass='';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);var tableRow=quickElement('tr',tableBody);for(var i=0;i<7;i++){quickElement('th',tableRow,CalendarNamespace.daysOfWeek[(i+CalendarNamespace.firstDayOfWeek)%7]);}
var startingPos=new Date(year,month-1,1-CalendarNamespace.firstDayOfWeek).getDay();var days=CalendarNamespace.getDaysInMonth(month,year);tableRow=quickElement('tr',tableBody);for(var i=0;i<startingPos;i++){var _cell=quickElement('td',tableRow,' ');_cell.style.backgroundColor='#f3f3f3';}
var currentDay=1;for(var i=startingPos;currentDay<=days;i++){if(i%7==0&&currentDay!=1){tableRow=quickElement('tr',tableBody);}
if((currentDay==todayDay)&&(month==todayMonth)&&(year==todayYear)){todayClass='today';}else{todayClass='';}
var cell=quickElement('td',tableRow,'','class',todayClass);quickElement('a',cell,currentDay,'href','javascript:void('+callback+'('+year+','+month+','+currentDay+'));');currentDay++;}
while(tableRow.childNodes.length<7){var _cell=quickElement('td',tableRow,' ');_cell.style.backgroundColor='#f3f3f3';}
calDiv.appendChild(calTable);}}
function Calendar(div_id,callback){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();}}/*
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(' '),
    firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
    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
        var today = new Date();
        var todayDay = today.getDate();
        var todayMonth = today.getMonth()+1;
        var todayYear = today.getFullYear();
        var todayClass = '';

        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 + CalendarNamespace.firstDayOfWeek) % 7]);
        }

        var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).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);
            }
            if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) {
                todayClass='today';
            } else {
                todayClass='';
            }
            var cell = quickElement('td', tableRow, '', 'class', todayClass);

            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();
    }
}
