calendar.js 5.3 KB

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