web/static/admin/js/calendar.js
author ymh <ymh.work@gmail.com>
Thu, 10 Jun 2010 19:16:17 +0200
changeset 14 3373a0dad50f
parent 0 ecdfc63274bf
permissions -rw-r--r--
correct synscript
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/*
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
calendar.js - Calendar functions by Adrian Holovaty
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
*/
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
function removeChildren(a) { // "a" is reference to an object
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
    while (a.hasChildNodes()) a.removeChild(a.lastChild);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
}
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
function quickElement() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    var obj = document.createElement(arguments[0]);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    if (arguments[2] != '' && arguments[2] != null) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
        var textNode = document.createTextNode(arguments[2]);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
        obj.appendChild(textNode);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    var len = arguments.length;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    for (var i = 3; i < len; i += 2) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
        obj.setAttribute(arguments[i], arguments[i+1]);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    arguments[1].appendChild(obj);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    return obj;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
}
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
var CalendarNamespace = {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    daysOfWeek: gettext('S M T W T F S').split(' '),
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    isLeapYear: function(year) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    getDaysInMonth: function(month,year) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        var days;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            days = 31;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        else if (month==4 || month==6 || month==9 || month==11) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
            days = 30;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        else if (month==2 && CalendarNamespace.isLeapYear(year)) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
            days = 29;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        else {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            days = 28;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        return days;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        var today = new Date();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        var todayDay = today.getDate();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        var todayMonth = today.getMonth()+1;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        var todayYear = today.getFullYear();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        var todayClass = '';
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        month = parseInt(month);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        year = parseInt(year);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        var calDiv = document.getElementById(div_id);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        removeChildren(calDiv);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        var calTable = document.createElement('table');
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        var tableBody = quickElement('tbody', calTable);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        // Draw days-of-week header
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        var tableRow = quickElement('tr', tableBody);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        for (var i = 0; i < 7; i++) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
            quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        var days = CalendarNamespace.getDaysInMonth(month, year);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        // Draw blanks before first of month
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        tableRow = quickElement('tr', tableBody);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        for (var i = 0; i < startingPos; i++) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            var _cell = quickElement('td', tableRow, ' ');
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            _cell.style.backgroundColor = '#f3f3f3';
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        // Draw days of month
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        var currentDay = 1;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        for (var i = startingPos; currentDay <= days; i++) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
            if (i%7 == 0 && currentDay != 1) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
                tableRow = quickElement('tr', tableBody);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
            }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
            if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                todayClass='today';
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
            } else {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                todayClass='';
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            var cell = quickElement('td', tableRow, '', 'class', todayClass);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            currentDay++;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        // Draw blanks after end of month (optional, but makes for valid code)
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        while (tableRow.childNodes.length < 7) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            var _cell = quickElement('td', tableRow, ' ');
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            _cell.style.backgroundColor = '#f3f3f3';
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        calDiv.appendChild(calTable);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
}
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
// Calendar -- A calendar instance
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
function Calendar(div_id, callback) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    // div_id (string) is the ID of the element in which the calendar will
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    //     be displayed
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    // callback (string) is the name of a JavaScript function that will be
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    //     called with the parameters (year, month, day) when a day in the
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    //     calendar is clicked
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    this.div_id = div_id;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    this.callback = callback;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    this.today = new Date();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    this.currentMonth = this.today.getMonth() + 1;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    this.currentYear = this.today.getFullYear();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
}
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
Calendar.prototype = {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
    drawCurrent: function() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    drawDate: function(month, year) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        this.currentMonth = month;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        this.currentYear = year;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        this.drawCurrent();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    drawPreviousMonth: function() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        if (this.currentMonth == 1) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
            this.currentMonth = 12;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
            this.currentYear--;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        else {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
            this.currentMonth--;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        this.drawCurrent();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    drawNextMonth: function() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        if (this.currentMonth == 12) {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
            this.currentMonth = 1;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
            this.currentYear++;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        else {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
            this.currentMonth++;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        this.drawCurrent();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    drawPreviousYear: function() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        this.currentYear--;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
        this.drawCurrent();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    },
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    drawNextYear: function() {
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        this.currentYear++;
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        this.drawCurrent();
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
    }
ecdfc63274bf first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
}