calendardateinput.js
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:42k
源码类别:

网络

开发平台:

Unix_Linux

  1. /***********************************************
  2.  Fool-Proof Date Input Script with DHTML Calendar
  3.  by Jason Moon - calendar@moonscript.com
  4.  ************************************************/
  5. /***********************************************
  6. * Jason's Date Input Calendar- By Jason Moon http://calendar.moonscript.com/dateinput.cfm
  7. * Script featured on and available at http://www.dynamicdrive.com
  8. * Keep this notice intact for use.
  9. ***********************************************/
  10. // CB: changed a few customizations below and search for 'CB' for changes below.
  11. // Customizable variables
  12. var cbcalDefaultDateFormat = 'MM/DD/YYYY'; // If no date format is supplied, this will be used instead
  13. var cbcalHideWait = 4; // Number of seconds before the calendar will disappear
  14. var cbcalY2kPivotPoint = 76; // 2-digit years before this point will be created in the 21st century
  15. var cbcalUnselectedMonthText = ''; // Text to display in the 1st month list item when the date isn't required
  16. var cbcalFontSize = 11; // In pixels
  17. var cbcalFontSizeDay = 14; // In pixels
  18. var cbcalFontFamily = 'Tahoma';
  19. var cbcalCellWidth = 26; //18
  20. var cbcalCellHeight = 24; //16
  21. var cbcalImageURL = cbTemplateDir + 'calendar_icon.jpg';
  22. var cbcalNextURL = cbTemplateDir + 'calendar_next.gif';
  23. var cbcalPrevURL = cbTemplateDir + 'calendar_prev.gif';
  24. var cbcalCalBGColor = '#F4F4F4';
  25. var cbcalTopRowBGColor = '#DDD';
  26. var cbcalDayBGColor = '#CCCCFF';
  27. // Global variables
  28. var cbcalZCounter = 100;
  29. var cbcalToday = new Date();
  30. // var cbcalWeekDays = new Array('S','M','T','W','T','F','S');
  31. var cbcalWeekDays = Calendar._SDN;
  32. var cbcalMonthDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  33. // var cbcalMonthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
  34. var cbcalMonthNames = Calendar._MN;
  35. // Write out the stylesheet definition for the calendar
  36. with (document) {
  37.    writeln('<style>');
  38.    writeln('td.calendarDateInput {letter-spacing:normal;line-height:normal;font-family:' + cbcalFontFamily + ',Sans-Serif;font-size:' + cbcalFontSize + 'px;text-align:center;vertical-align:middle;margin:0px;padding:0px;}');
  39.    writeln('td.calendarDayInput {letter-spacing:normal;line-height:normal;font-family:' + cbcalFontFamily + ',Sans-Serif;font-size:' + cbcalFontSizeDay + 'px;text-align:center;vertical-align:middle;}');
  40.    writeln('select.calendarDateInput {letter-spacing:.06em;font-family:Verdana,Sans-Serif;font-size:11px;}');
  41.    writeln('input.calendarDateInput {letter-spacing:.06em;font-family:Verdana,Sans-Serif;font-size:11px;}');
  42.    writeln('#cb_datetestb_Current_ID {text-align:center;}');
  43.    writeln('</style>');
  44. }
  45. // Only allows certain keys to be used in the date field
  46. function cbcalYearDigitsOnly(e) {
  47.    var KeyCode = (e.keyCode) ? e.keyCode : e.which;
  48.    return ((KeyCode == 8) // backspace
  49.         || (KeyCode == 9) // tab
  50.         || (KeyCode == 37) // left arrow
  51.         || (KeyCode == 39) // right arrow
  52.         || (KeyCode == 46) // delete
  53.         || ((KeyCode > 47) && (KeyCode < 58)) // 0 - 9
  54.    );
  55. }
  56. // Gets the absolute pixel position of the supplied element
  57. function cbcalGetTagPixels(StartTag, Direction) {
  58.    var PixelAmt = (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;
  59.    while ((StartTag.tagName != 'BODY') && (StartTag.tagName != 'HTML')) {
  60.       StartTag = StartTag.offsetParent;
  61.       PixelAmt += (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;
  62.    }
  63.    return PixelAmt;
  64. }
  65. // Is the specified select-list behind the calendar?
  66. function cbcalBehindCal(SelectList, CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY) {
  67.    var ListLeftX = cbcalGetTagPixels(SelectList, 'LEFT');
  68.    var ListRightX = ListLeftX + SelectList.offsetWidth;
  69.    var ListBottomY = ListTopY + SelectList.offsetHeight;
  70.    return (((ListTopY < CalBottomY) && (ListBottomY > CalTopY)) && ((ListLeftX < CalRightX) && (ListRightX > CalLeftX)));
  71. }
  72. // For IE, hides any select-lists that are behind the calendar
  73. function cbcalFixSelectLists(Over) {
  74.    if (navigator.appName == 'Microsoft Internet Explorer') {
  75.       var CalDiv = this.getCalendar();
  76.       var CalLeftX = CalDiv.offsetLeft;
  77.       var CalRightX = CalLeftX + CalDiv.offsetWidth;
  78.       var CalTopY = CalDiv.offsetTop;
  79.       var CalBottomY = CalTopY + (cbcalCellHeight * 9);
  80.       var FoundCalInput = false;
  81.       formLoop :
  82.       for (var j=this.formNumber;j<document.forms.length;j++) {
  83.          for (var i=0;i<document.forms[j].elements.length;i++) {
  84.             if (typeof document.forms[j].elements[i].type == 'string') {
  85.                if ((document.forms[j].elements[i].type == 'hidden') && (document.forms[j].elements[i].name == this.hiddenFieldName)) {
  86.                   FoundCalInput = true;
  87.                   i += 3; // 3 elements between the 1st hidden field and the last year input field
  88.                }
  89.                if (FoundCalInput) {
  90.                   if (document.forms[j].elements[i].type.substr(0,6) == 'select') {
  91.                      ListTopY = cbcalGetTagPixels(document.forms[j].elements[i], 'TOP');
  92.                      if (ListTopY < CalBottomY) {
  93.                         if (cbcalBehindCal(document.forms[j].elements[i], CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY)) {
  94.                            document.forms[j].elements[i].style.visibility = (Over) ? 'hidden' : 'visible';
  95.                         }
  96.                      }
  97.                      else break formLoop;
  98.                   }
  99.                }
  100.             }
  101.          }
  102.       }
  103.    }
  104. }
  105. // Displays a message in the status bar when hovering over the calendar days
  106. function cbcalDayCellHover(Cell, Over, Color, HoveredDay) {
  107.    Cell.style.backgroundColor = (Over) ? cbcalDayBGColor : Color;
  108.    if (Over) {
  109.       if ((this.yearValue == cbcalToday.getFullYear()) && (this.monthIndex == cbcalToday.getMonth()) && (HoveredDay == cbcalToday.getDate())) self.status = 'Click to select today';
  110.       else {
  111.          var Suffix = HoveredDay.toString();
  112.          switch (Suffix.substr(Suffix.length - 1, 1)) {
  113.             case '1' : Suffix += (HoveredDay == 11) ? 'th' : 'st'; break;
  114.             case '2' : Suffix += (HoveredDay == 12) ? 'th' : 'nd'; break;
  115.             case '3' : Suffix += (HoveredDay == 13) ? 'th' : 'rd'; break;
  116.             default : Suffix += 'th'; break;
  117.          }
  118.          self.status = 'Click to select ' + this.monthName + ' ' + Suffix;
  119.       }
  120.    }
  121.    else self.status = '';
  122.    return true;
  123. }
  124. // Sets the form elements after a day has been picked from the calendar
  125. function cbcalPickDisplayDay(ClickedDay) {
  126.    this.show();
  127.    var MonthList = this.getMonthList();
  128.    var DayList = this.getDayList();
  129.    var YearField = this.getYearField();
  130.    var SpaceForBlank = ( ( DayList.options[0].value == '' ) ? 1 : 0 );
  131.    cbcalFixDayList(DayList, cbcalGetDayCount(this.displayed.yearValue, this.displayed.monthIndex));
  132.    // Select the month and day in the lists
  133.    for (var i=0;i<MonthList.length;i++) {
  134.       if (MonthList.options[i].value == this.displayed.monthIndex) MonthList.options[i].selected = true;
  135.    }
  136.    for (var j=1;j<=(DayList.length-SpaceForBlank);j++) {
  137.       if (j == ClickedDay) DayList.options[j-1+SpaceForBlank].selected = true;
  138.    }
  139.    this.setPicked(this.displayed.yearValue, this.displayed.monthIndex, ClickedDay);
  140.    // Change the year, if necessary
  141.    YearField.value = this.picked.yearPad;
  142.    YearField.defaultValue = YearField.value;
  143.    this.hideElements(false); //CBB added
  144. }
  145. // Builds the HTML for the calendar days
  146. function cbcalBuildCalendarDays() {
  147.    var Rows = 5;
  148.    if (((this.displayed.dayCount == 31) && (this.displayed.firstDay > 4)) || ((this.displayed.dayCount == 30) && (this.displayed.firstDay == 6))) Rows = 6;
  149.    else if ((this.displayed.dayCount == 28) && (this.displayed.firstDay == 0)) Rows = 4;
  150.    var HTML = '<table width="' + (cbcalCellWidth * 7) + '" cellspacing="0" cellpadding="1" style="cursor:default">';
  151.    for (var j=0;j<Rows;j++) {
  152.       HTML += '<tr>';
  153.       for (var i=1;i<=7;i++) {
  154.          Day = (j * 7) + (i - this.displayed.firstDay);
  155.          if ((Day >= 1) && (Day <= this.displayed.dayCount)) {
  156.             if ((this.displayed.yearValue == this.picked.yearValue) && (this.displayed.monthIndex == this.picked.monthIndex) && (Day == this.picked.day)) {
  157.                TextStyle = 'color:white;font-weight:bold;';
  158.                BackColor = cbcalDayBGColor;
  159.             }
  160.             else {
  161.                TextStyle = 'color:black;';
  162.                BackColor = cbcalCalBGColor;
  163.             }
  164.             if ((this.displayed.yearValue == cbcalToday.getFullYear()) && (this.displayed.monthIndex == cbcalToday.getMonth()) && (Day == cbcalToday.getDate())) TextStyle += 'border:1px solid darkred;padding:0px;';
  165.             HTML += '<td align="center" class="calendarDayInput" style="cursor:default;height:' + cbcalCellHeight + 'px;width:' + cbcalCellWidth + 'px;' + TextStyle + ';background-color:' + BackColor + '" onClick="' + this.objName + '.pickDay(' + Day + ')" onMouseOver="return ' + this.objName + '.displayed.dayHover(this,true,'' + BackColor + '',' + Day + ')" onMouseOut="return ' + this.objName + '.displayed.dayHover(this,false,'' + BackColor + '')">' + Day + '</td>';
  166.          }
  167.          else HTML += '<td class="calendarDateInput" style="height:' + cbcalCellHeight + '">&nbsp;</td>';
  168.       }
  169.       HTML += '</tr>';
  170.    }
  171.    return HTML += '</table>';
  172. }
  173. // Determines which century to use (20th or 21st) when dealing with 2-digit years
  174. function cbcalGetGoodYear(YearDigits) {
  175.    if (YearDigits > 100 ) {
  176.     return YearDigits;
  177.    } else {
  178.       var YearLastDigits = parseInt(YearDigits,10) % 100;
  179.       var Millennium = (YearLastDigits < cbcalY2kPivotPoint) ? 2000 : 1900;
  180.       return Millennium + YearLastDigits;
  181.    }
  182. }
  183. // Returns the number of days in a month (handles leap-years)
  184. function cbcalGetDayCount(SomeYear, SomeMonth) {
  185.    return ((SomeMonth == 1) && ((SomeYear % 400 == 0) || ((SomeYear % 4 == 0) && (SomeYear % 100 != 0)))) ? 29 : cbcalMonthDays[SomeMonth];
  186. }
  187. // Highlights the buttons
  188. function cbcalVirtualButton(Cell, ButtonDown) {
  189.    if (ButtonDown) {
  190.       Cell.style.borderLeft = 'buttonshadow 1px solid';
  191.       Cell.style.borderTop = 'buttonshadow 1px solid';
  192.       Cell.style.borderBottom = 'buttonhighlight 1px solid';
  193.       Cell.style.borderRight = 'buttonhighlight 1px solid';
  194.    }
  195.    else {
  196.       Cell.style.borderLeft = 'buttonhighlight 1px solid';
  197.       Cell.style.borderTop = 'buttonhighlight 1px solid';
  198.       Cell.style.borderBottom = 'buttonshadow 1px solid';
  199.       Cell.style.borderRight = 'buttonshadow 1px solid';
  200.    }
  201. }
  202. // Mouse-over for the previous/next month buttons
  203. function cbcalNeighborHover(Cell, Over, DateObj) {
  204.    if (Over) {
  205.       cbcalVirtualButton(Cell, false);
  206.       self.status = 'Click to view ' + DateObj.fullName;
  207.    }
  208.    else {
  209.       Cell.style.border = 'buttonface 1px solid';
  210.       self.status = '';
  211.    }
  212.    return true;
  213. }
  214. // Adds/removes days from the day list, depending on the month/year
  215. function cbcalFixDayList(DayList, NewDays) {
  216.    var SpaceForBlank = ( ( DayList.options[0].value == '' ) ? 1 : 0 );
  217.    var DayPick = DayList.selectedIndex + 1 - SpaceForBlank;
  218.    if (DayPick == 0) {
  219.       DayPick = 1;
  220.       DayList.options[DayPick-1+SpaceForBlank].selected = true;
  221.    }
  222.    if (NewDays != ( DayList.length - SpaceForBlank )) {
  223.       var OldSize = DayList.length - SpaceForBlank;
  224.       for (var k=Math.min(NewDays,OldSize);k<Math.max(NewDays,OldSize);k++) {
  225.          (k >= NewDays) ? DayList.options[NewDays+SpaceForBlank] = null : DayList.options[k+SpaceForBlank] = new Option(k+1, k+1);
  226.       }
  227.       DayPick = Math.min(DayPick, NewDays);
  228.       DayList.options[DayPick-1+SpaceForBlank].selected = true;
  229.    }
  230.    return DayPick;
  231. }
  232. // Adds/removes days from the day list, depending on the month/year
  233. function cbcalFixYearList(YearList, pickedYearValue) {
  234. var SpaceForBlank = ( ( YearList.options[0].value == '' ) ? 1 : 0 );
  235. if ( YearList.options[1].value < 100 ) {
  236. pickedYearValue = pickedYearValue % 100;
  237. }
  238. var YearPick = YearList.options[YearList.selectedIndex].value;
  239. for (var k=SpaceForBlank;k<YearList.options.length;k++) {
  240. if ( YearList.options[k].value == pickedYearValue ) {
  241. YearPick = pickedYearValue;
  242. break;
  243. }
  244. }
  245. if ( k < YearList.options.length ) {
  246. YearList.options[k].selected = true;
  247. }
  248. return YearPick;
  249. }
  250. // Resets the year to its previous valid value when something invalid is entered
  251. function FixYearInput(YearField) {
  252.    var YearRE = new RegExp('\d{' + YearField.defaultValue.length + '}');
  253.    if (!YearRE.test(YearField.value)) YearField.value = YearField.defaultValue;
  254. }
  255. // Displays a message in the status bar when hovering over the calendar icon
  256. function cbcalCalIconHover(Over) {
  257.    var Message = (this.isShowing()) ? 'hide' : 'show';
  258.    self.status = (Over) ? 'Click to ' + Message + ' the calendar' : '';
  259.    return true;
  260. }
  261. // Starts the timer over from scratch
  262. function cbcalCalTimerReset() {
  263.    eval('clearTimeout(' + this.timerID + ')');
  264.    eval(this.timerID + '=setTimeout('' + this.objName + '.show()',' + (cbcalHideWait * 1000) + ')');
  265. }
  266. // The timer for the calendar
  267. function cbcalDoTimer(CancelTimer) {
  268.    if (CancelTimer) eval('clearTimeout(' + this.timerID + ')');
  269.    else {
  270.       eval(this.timerID + '=null');
  271.       this.resetTimer();
  272.    }
  273. }
  274. // Show or hide the calendar
  275. function cbcalShowCalendar() {
  276.    if (this.isShowing()) {
  277.       var StopTimer = true;
  278.       this.getCalendar().style.zIndex = --cbcalZCounter;
  279.       this.getCalendar().style.visibility = 'hidden';
  280.       this.fixSelects(false);
  281.    }
  282.    else {
  283.       var StopTimer = false;
  284.       this.fixSelects(true);
  285.       this.getCalendar().style.zIndex = ++cbcalZCounter;
  286.       this.getCalendar().style.visibility = 'visible';
  287.    }
  288.    this.handleTimer(StopTimer);
  289.    self.status = '';
  290. }
  291. // Hides the input elements when the "blank" month is selected
  292. function cbcalSetElementStatus(Hide) {
  293.    // this.getDayList().style.visibility = (Hide) ? 'hidden' : 'visible';
  294.    if ( this.yeardropdownstop == '' ) {
  295.    this.getYearField().style.visibility = (Hide) ? 'hidden' : 'visible';
  296.    }
  297. /*
  298.    if (Hide) {
  299.       this.getYearField().value = '';
  300.    } else {
  301.       this.getYearField().style.visibility = (Hide) ? 'hidden' : 'visible';
  302.    }
  303. */
  304.    // this.getCalendarLink().style.visibility = (Hide) ? 'hidden' : 'visible';
  305. }
  306. // Sets the date, based on the year selected (in case year is a drop-down)
  307. function cbcalCheckYearChange(YearList) {
  308.    var DayList = this.getDayList();
  309.    var MonthList = this.getMonthList();
  310.    if (YearList.options[YearList.selectedIndex].value == '') {
  311.       var DayPick = cbcalFixDayList(DayList, 31);
  312.       DayList.selectedIndex = 0;
  313.       MonthList.selectedIndex = 0;
  314.       this.hideElements(true);
  315.       this.setHidden('');
  316.    } else {
  317.       this.hideElements(false);
  318.       if (this.isShowing()) {
  319.          this.resetTimer(); // Gives the user more time to view the calendar with the newly-selected month
  320.          this.getCalendar().style.zIndex = ++cbcalZCounter; // Make sure this calendar is on top of any other calendars
  321.       }
  322.       if ( MonthList.selectedIndex == 0 ) {
  323.         MonthList.selectedIndex = 1;
  324.       }
  325.       var DayPick = cbcalFixDayList(DayList, cbcalGetDayCount(cbcalGetGoodYear(YearList.options[YearList.selectedIndex].value), MonthList.options[MonthList.selectedIndex].value));
  326.       this.setPicked(YearList.options[YearList.selectedIndex].value, MonthList.options[MonthList.selectedIndex].value, DayPick);
  327.    }
  328. }
  329. // Sets the date, based on the month selected
  330. function cbcalCheckMonthChange(MonthList) {
  331.    var DayList = this.getDayList();
  332.    var YearList = this.getYearField();
  333.    if (MonthList.options[MonthList.selectedIndex].value == '') {
  334.       var DayPick = cbcalFixDayList(DayList, 31);
  335.       if (this.yeardropdownstop != '') {
  336.       YearList.selectedIndex = 0;
  337.       }
  338.       MonthList.selectedIndex = 0;
  339.       DayList.selectedIndex = 0;
  340.       this.hideElements(true);
  341.       this.setHidden('');
  342.    } else {
  343.       this.hideElements(false);
  344.       if (this.isShowing()) {
  345.          this.resetTimer(); // Gives the user more time to view the calendar with the newly-selected month
  346.          this.getCalendar().style.zIndex = ++cbcalZCounter; // Make sure this calendar is on top of any other calendars
  347.       }
  348.       var DayPick = cbcalFixDayList(DayList, cbcalGetDayCount(this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value));
  349.       this.setPicked(this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value, DayPick);
  350.       if ((this.yeardropdownstop != '') && (YearList.selectedIndex == 0)) {
  351.         var YearPick = cbcalFixYearList(YearList, this.picked.yearValue);
  352.       }
  353.    }
  354. }
  355. // Sets the date, based on the day selected
  356. function cbcalCheckDayChange(DayList) {
  357.    var SpaceForBlank = ( ( DayList.options[0].value == '' ) ? 1 : 0 );
  358.    var MonthList = this.getMonthList();
  359.    var YearList = this.getYearField();
  360.    if (DayList.options[DayList.selectedIndex].value == '') {
  361.       var DayPick = cbcalFixDayList(DayList, 31);
  362.       if (this.yeardropdownstop != '') {
  363.       YearList.selectedIndex = 0;
  364.       }
  365.       MonthList.selectedIndex = 0;
  366.       DayList.selectedIndex = 0;
  367.       this.hideElements(true);
  368.       this.setHidden('');
  369.    } else {
  370.       this.hideElements(false);
  371.       if (this.isShowing()) {
  372.          this.resetTimer(); // Gives the user more time to view the calendar with the newly-selected month
  373.          this.getCalendar().style.zIndex = ++cbcalZCounter; // Make sure this calendar is on top of any other calendars
  374.          // this.show();
  375.       }
  376.       if ( MonthList.selectedIndex == 0 ) {
  377.         MonthList.selectedIndex = 1;
  378.       }
  379. //   if (this.isShowing()) this.show();
  380.       var DayPick = cbcalFixDayList(DayList, cbcalGetDayCount(this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value));
  381.       this.setPicked(this.picked.yearValue, this.picked.monthIndex, DayList.options[DayList.selectedIndex].value); //DayList.selectedIndex + 1 - SpaceForBlank);
  382.       if ((this.yeardropdownstop != '') && (YearList.selectedIndex == 0)) {
  383.         var YearPick = cbcalFixYearList(YearList, this.picked.yearValue);
  384.       }
  385.    }
  386. }
  387. // Changes the date when a valid year has been entered
  388. function cbcalCheckYearInput(YearField) {
  389.    if ((YearField.value.length == YearField.defaultValue.length) && (YearField.defaultValue != YearField.value)) {
  390.       if (this.isShowing()) {
  391.          this.resetTimer(); // Gives the user more time to view the calendar with the newly-entered year
  392.          this.getCalendar().style.zIndex = ++cbcalZCounter; // Make sure this calendar is on top of any other calendars
  393.       }
  394.       var NewYear = cbcalGetGoodYear(YearField.value);
  395.       var MonthList = this.getMonthList();
  396.       var NewDay = cbcalFixDayList(this.getDayList(), cbcalGetDayCount(NewYear, MonthList.options[MonthList.selectedIndex].value));
  397.       this.setPicked(NewYear, MonthList.options[MonthList.selectedIndex].value, NewDay);
  398.       YearField.defaultValue = YearField.value;
  399.    }
  400. }
  401. // OBJECTS:
  402. // ========
  403. // Holds characteristics about a date
  404. function cbcalDateObject() {
  405.    if (Function.call) { // Used when 'call' method of the Function object is supported
  406.       var ParentObject = this;
  407.       var ArgumentStart = 0;
  408.    }
  409.    else { // Used with 'call' method of the Function object is NOT supported
  410.       var ParentObject = arguments[0];
  411.       var ArgumentStart = 1;
  412.    }
  413.    ParentObject.date = (arguments.length == (ArgumentStart+1)) ? new Date(arguments[ArgumentStart+0]) : new Date(cbcalGetGoodYear(arguments[ArgumentStart+0]), arguments[ArgumentStart+1], arguments[ArgumentStart+2]);
  414.    ParentObject.yearValue = ParentObject.date.getFullYear();
  415.    ParentObject.monthIndex = ParentObject.date.getMonth();
  416.    ParentObject.monthName = cbcalMonthNames[ParentObject.monthIndex];
  417.    ParentObject.fullName = ParentObject.monthName + ' ' + ParentObject.yearValue;
  418.    ParentObject.day = ParentObject.date.getDate();
  419.    ParentObject.dayCount = cbcalGetDayCount(ParentObject.yearValue, ParentObject.monthIndex);
  420.    var FirstDate = new Date(ParentObject.yearValue, ParentObject.monthIndex, 1);
  421.    ParentObject.firstDay = FirstDate.getDay();
  422. }
  423. // Keeps track of the date that goes into the hidden field
  424. function cbcalStoredMonthObject(DateFormat, DateYear, DateMonth, DateDay) {
  425.    (Function.call) ? cbcalDateObject.call(this, DateYear, DateMonth, DateDay) : cbcalDateObject(this, DateYear, DateMonth, DateDay);
  426.    this.yearPad = this.yearValue.toString();
  427.    this.monthPad = (this.monthIndex < 9) ? '0' + String(this.monthIndex + 1) : this.monthIndex + 1;
  428.    this.dayPad = (this.day < 10) ? '0' + this.day.toString() : this.day;
  429.    this.monthShort = this.monthName.substr(0,3).toUpperCase();
  430.    // Formats the year with 2 digits instead of 4
  431.    if (DateFormat.indexOf('YYYY') == -1) this.yearPad = this.yearPad.substr(2);
  432.    // Define the date-part delimiter
  433.    if (DateFormat.indexOf('/') >= 0) var Delimiter = '/';
  434.    else if (DateFormat.indexOf('-') >= 0) var Delimiter = '-';
  435.    else if (DateFormat.indexOf('.') >= 0) var Delimiter = '.'; // CB: added line
  436.    else var Delimiter = '';
  437.    // Determine the order of the months and days
  438.    if (/DD?.?((MON)|(MM?M?))/.test(DateFormat)) {
  439.       this.formatted = this.dayPad + Delimiter;
  440.       this.formatted += (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;
  441.    }
  442.    else if (/((MON)|(MM?M?))?.?DD?/.test(DateFormat)) {
  443.       this.formatted = (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;
  444.       this.formatted += Delimiter + this.dayPad;
  445.    }
  446.    // Either prepend or append the year to the formatted date
  447.    this.formatted = (DateFormat.substr(0,2) == 'YY') ? this.yearPad + Delimiter + this.formatted : this.formatted + Delimiter + this.yearPad;
  448. }
  449. // Object for the current displayed month
  450. function cbcalDisplayMonthObject(ParentObject, DateYear, DateMonth, DateDay) {
  451.    (Function.call) ? cbcalDateObject.call(this, DateYear, DateMonth, DateDay) : cbcalDateObject(this, DateYear, DateMonth, DateDay);
  452.    this.displayID = ParentObject.hiddenFieldName + '_Current_ID';
  453.    this.getDisplay = new Function('return document.getElementById(this.displayID)');
  454.    this.dayHover = cbcalDayCellHover;
  455.    this.goCurrent = new Function(ParentObject.objName + '.getCalendar().style.zIndex=++cbcalZCounter;' + ParentObject.objName + '.setDisplayed(cbcalToday.getFullYear(),cbcalToday.getMonth());');
  456.    if (ParentObject.formNumber >= 0) this.getDisplay().innerHTML = this.fullName;
  457. }
  458. // Object for the previous/next buttons
  459. function cbcalNeighborMonthObject(ParentObject, IDText, DateMS) {
  460.    (Function.call) ? cbcalDateObject.call(this, DateMS) : cbcalDateObject(this, DateMS);
  461.    this.buttonID = ParentObject.hiddenFieldName + '_' + IDText + '_ID';
  462.    this.hover = new Function('C','O','cbcalNeighborHover(C,O,this)');
  463.    this.getButton = new Function('return document.getElementById(this.buttonID)');
  464.    this.go = new Function(ParentObject.objName + '.getCalendar().style.zIndex=++cbcalZCounter;' + ParentObject.objName + '.setDisplayed(this.yearValue,this.monthIndex);');
  465.    if (ParentObject.formNumber >= 0) this.getButton().title = this.monthName;
  466. }
  467. // Sets the currently-displayed month object
  468. function cbcalSetDisplayedMonth(DispYear, DispMonth) {
  469.    this.displayed = new cbcalDisplayMonthObject(this, DispYear, DispMonth, 1);
  470.    // Creates the previous and next month objects
  471.    this.previous = new cbcalNeighborMonthObject(this, 'Previous', this.displayed.date.getTime() - 86400000);
  472.    this.next = new cbcalNeighborMonthObject(this, 'Next', this.displayed.date.getTime() + (86400000 * (this.displayed.dayCount + 1)));
  473.    // Creates the HTML for the calendar
  474.    if (this.formNumber >= 0) this.getDayTable().innerHTML = this.buildCalendar();
  475. }
  476. // Sets the current selected date
  477. function cbcalSetPickedMonth(PickedYear, PickedMonth, PickedDay) {
  478.    this.picked = new cbcalStoredMonthObject(this.format, PickedYear, PickedMonth, PickedDay);
  479.    this.setHidden(this.picked.formatted);
  480.    this.setDisplayed(PickedYear, PickedMonth);
  481. }
  482. // The calendar object
  483. function cbcalCalendarObject(DateName, DateFormat, DefaultDate, YearDropDownStop) {
  484.    /* Properties */
  485.    this.hiddenFieldName = DateName;
  486.    this.monthListID = DateName + '_Month_ID';
  487.    this.dayListID = DateName + '_Day_ID';
  488.    this.yearFieldID = DateName + '_Year_ID';
  489.    this.monthDisplayID = DateName + '_Current_ID';
  490.    this.calendarID = DateName + '_ID';
  491.    this.dayTableID = DateName + '_DayTable_ID';
  492.    this.calendarLinkID = this.calendarID + '_Link';
  493.    this.timerID = this.calendarID + '_Timer';
  494.    this.objName = DateName + '_Object';
  495.    this.format = DateFormat;
  496.    this.formNumber = -1;
  497.    this.picked = null;
  498.    this.displayed = null;
  499.    this.previous = null;
  500.    this.next = null;
  501.    this.yeardropdownstop = YearDropDownStop;
  502.    /* Methods */
  503.    this.setPicked = cbcalSetPickedMonth;
  504.    this.setDisplayed = cbcalSetDisplayedMonth;
  505.    this.checkYear = cbcalCheckYearInput;
  506.    this.fixYear = FixYearInput;
  507.    this.changeYear = cbcalCheckYearChange;
  508.    this.changeMonth = cbcalCheckMonthChange;
  509.    this.changeDay = cbcalCheckDayChange;
  510.    this.resetTimer = cbcalCalTimerReset;
  511.    this.hideElements = cbcalSetElementStatus;
  512.    this.show = cbcalShowCalendar;
  513.    this.handleTimer = cbcalDoTimer;
  514.    this.iconHover = cbcalCalIconHover;
  515.    this.buildCalendar = cbcalBuildCalendarDays;
  516.    this.pickDay = cbcalPickDisplayDay;
  517.    this.fixSelects = cbcalFixSelectLists;
  518.    this.setHidden = new Function('D','if (this.formNumber >= 0) this.getHiddenField().value=D');
  519.    // Returns a reference to these elements
  520.    this.getHiddenField = new Function('return document.forms[this.formNumber].elements[this.hiddenFieldName]');
  521.    this.getMonthList = new Function('return document.getElementById(this.monthListID)');
  522.    this.getDayList = new Function('return document.getElementById(this.dayListID)');
  523.    this.getYearField = new Function('return document.getElementById(this.yearFieldID)');
  524.    this.getCalendar = new Function('return document.getElementById(this.calendarID)');
  525.    this.getDayTable = new Function('return document.getElementById(this.dayTableID)');
  526.    this.getCalendarLink = new Function('return document.getElementById(this.calendarLinkID)');
  527.    this.getMonthDisplay = new Function('return document.getElementById(this.monthDisplayID)');
  528.    this.isShowing = new Function('return !(this.getCalendar().style.visibility != 'visible')');
  529.    /* Constructor */
  530.    // Functions used only by the constructor
  531.    function getMonthIndex(MonthAbbr) { // Returns the index (0-11) of the supplied month abbreviation
  532.       for (var MonPos=0;MonPos<cbcalMonthNames.length;MonPos++) {
  533.          if (cbcalMonthNames[MonPos].substr(0,3).toUpperCase() == MonthAbbr.toUpperCase()) break;
  534.       }
  535.       return MonPos;
  536.    }
  537.    function SetGoodDate(CalObj, Notify) { // Notifies the user about their bad default date, and sets the current system date
  538.       CalObj.setPicked(cbcalToday.getFullYear(), cbcalToday.getMonth(), cbcalToday.getDate());
  539.       if (Notify) alert('WARNING: The supplied date is not in valid '' + DateFormat + '' format: ' + DefaultDate + '.nTherefore, the current system date will be used instead: ' + CalObj.picked.formatted);
  540.    }
  541.    // Main part of the constructor
  542.    if (DefaultDate != '') {
  543.       if ((this.format == 'YYYYMMDD') && (/^(d{4})(d{2})(d{2})$/.test(DefaultDate))) this.setPicked(RegExp.$1, parseInt(RegExp.$2,10)-1, RegExp.$3);
  544.       else {
  545.          // Get the year
  546.          if ((this.format.substr(0,2) == 'YY') && (/^(d{2,4})(-|/|.)/.test(DefaultDate))) { // Year is at the beginning
  547.             var YearPart = cbcalGetGoodYear(RegExp.$1);
  548.             // Determine the order of the months and days
  549.             if (/(-|/|.)(w{1,3})(-|/|.)(w{1,3})$/.test(DefaultDate)) {
  550.                var MidPart = RegExp.$2;
  551.                var EndPart = RegExp.$4;
  552.                if (/D$/.test(this.format)) { // Ends with days
  553.                   var DayPart = EndPart;
  554.                   var MonthPart = MidPart;
  555.                }
  556.                else {
  557.                   var DayPart = MidPart;
  558.                   var MonthPart = EndPart;
  559.                }
  560.                MonthPart = (/d{1,2}/i.test(MonthPart)) ? parseInt(MonthPart,10)-1 : getMonthIndex(MonthPart);
  561.                this.setPicked(YearPart, MonthPart, DayPart);
  562.             }
  563.             else SetGoodDate(this, true);
  564.          }
  565.          else if (/(-|/|.)(d{2,4})$/.test(DefaultDate)) { // Year is at the end
  566.             var YearPart = cbcalGetGoodYear(RegExp.$2);
  567.             // Determine the order of the months and days
  568.             if (/^(w{1,3})(-|/|.)(w{1,3})(-|/|.)/.test(DefaultDate)) {
  569.                if (this.format.substr(0,1) == 'D') { // Starts with days
  570.                   var DayPart = RegExp.$1;
  571.                   var MonthPart = RegExp.$3;
  572.                }
  573.                else { // Starts with months
  574.                   var MonthPart = RegExp.$1;
  575.                   var DayPart = RegExp.$3;
  576.                }
  577.                MonthPart = (/d{1,2}/i.test(MonthPart)) ? parseInt(MonthPart,10)-1 : getMonthIndex(MonthPart);
  578.                this.setPicked(YearPart, MonthPart, DayPart);
  579.             }
  580.             else SetGoodDate(this, true);
  581.          }
  582.          else SetGoodDate(this, true);
  583.       }
  584.    }
  585. }
  586. // CB: added month, day, year functions:
  587. function cbcalHtmlMonth( DateName, Required, DefaultDate, InitialStatus ) {
  588. // var r = '<span>';
  589. var r = '';
  590. r += '<select class="inputbox" id="' + DateName + '_Month_ID" onChange="' + DateName + '_Object.changeMonth(this)">'; // changed class from calendarDateInput to inputbox
  591. if (!Required) {
  592. var NoneSelected = (DefaultDate == '') ? ' selected' : '';
  593. r += '<option value=""' + NoneSelected + '>' + cbcalUnselectedMonthText + '</option>';
  594. }
  595. for (var i=0;i<12;i++) {
  596. var MonthSelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.monthIndex') == i)) ? ' selected' : '';
  597. r += '<option value="' + i + '"' + MonthSelected + '>' + cbcalMonthNames[i] /* .substr(0,3) */ + '</option>';
  598. }
  599. // r += '</select></span>';
  600. r += '</select>';
  601. return r;
  602. }
  603. function cbcalHtmlDay( DateName, Required, DefaultDate, InitialStatus ) {
  604. // var r = '<span><select' /*CBB uncomment this to hide select by default: + InitialStatus */ + ' class="inputbox" id="' + DateName + '_Day_ID" onChange="' + DateName + '_Object.changeDay(this)">'; // changed class from calendarDateInput to inputbox
  605. var r = '<select' /*CBB uncomment this to hide select by default: + InitialStatus */ + ' class="inputbox" id="' + DateName + '_Day_ID" onChange="' + DateName + '_Object.changeDay(this)">'; // changed class from calendarDateInput to inputbox
  606. if (!Required) {
  607. var NoneSelected = (DefaultDate == '') ? ' selected' : '';
  608. r += '<option value=""' + NoneSelected + '>' + cbcalUnselectedMonthText + '</option>';
  609. }
  610. for (var j=1;j<=eval(DateName + '_Object.picked.dayCount');j++) {
  611. var DaySelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.day') == j)) ? ' selected' : '';
  612. r += '<option value="' + j + '"' + DaySelected + '>' + j + '</option>';
  613. }
  614. // r += '</select></span>';
  615. r += '</select>';
  616. return r;
  617. }
  618. function cbcalHtmlYearDropDown( DateName, Required, DefaultDate, InitialStatus, YearDropDownStop, YearMin, YearMax ) {
  619. // var r = '<span><select' /*CBB uncomment this to hide select by default: + InitialStatus */ + ' class="inputbox" id="' + DateName + '_Year_ID" onChange="' + DateName + '_Object.changeYear(this)">'; // changed class from calendarDateInput to inputbox
  620. var r = '<select' /*CBB uncomment this to hide select by default: + InitialStatus */ + ' class="inputbox" id="' + DateName + '_Year_ID" onChange="' + DateName + '_Object.changeYear(this)">'; // changed class from calendarDateInput to inputbox
  621. if (!Required) {
  622. var NoneSelected = (DefaultDate == '') ? ' selected' : '';
  623. r += '<option value=""' + NoneSelected + '>' + cbcalUnselectedMonthText + '</option>';
  624. }
  625. var digits = eval(DateName + '_Object.picked.yearPad.length');
  626. var defaultYear = eval(DateName + '_Object.picked.yearPad');
  627. var yearsToShow, modulo,y;
  628. modulo = 10000;
  629. if ( YearMin === null && YearMax === null ) {
  630. yearsToShow = 220;
  631. y = defaultYear - 107;
  632. } else {
  633. yearsToShow = YearMax - YearMin + 1;
  634. y = YearMin;
  635. }
  636. if (digits == 2) {
  637. if ( yearsToShow > 100 ) {
  638. yearsToShow = 100;
  639. }
  640. modulo = 100;
  641. if ( YearMin === null && YearMax === null ) {
  642. y = cbcalY2kPivotPoint;
  643. } else {
  644. y = YearMin % modulo;
  645. }
  646. }
  647. for (var j=0;j<yearsToShow;j++) {
  648. var YearSelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.yearPad') == y)) ? ' selected' : '';
  649. var yy = (y < 10 ? '0':'') + y;
  650. r += '<option value="' + yy + '"' + YearSelected + '>' + yy + '</option>';
  651. y = (y + 1) % modulo;
  652. }
  653. // r += '</select></span>';
  654. r += '</select>';
  655. return r;
  656. }
  657. function cbcalHtmlYear( DateName, Required, DefaultDate, InitialStatus ) {
  658. // return '<span><input' + InitialStatus + ' class="inputbox" type="text" id="' + DateName + '_Year_ID" size="' + eval(DateName + '_Object.picked.yearPad.length') + '" maxlength="' + eval(DateName + '_Object.picked.yearPad.length') + '" title="Year" value="' + eval(DateName + '_Object.picked.yearPad') + '" onKeyPress="return cbcalYearDigitsOnly(event)" onKeyUp="' + DateName + '_Object.checkYear(this)" onBlur="' + DateName + '_Object.fixYear(this)" /></span>';
  659. return '<input' + InitialStatus + ' class="inputbox" type="text" id="' + DateName + '_Year_ID" size="' + eval(DateName + '_Object.picked.yearPad.length') + '" maxlength="' + eval(DateName + '_Object.picked.yearPad.length') + '" title="Year" value="' + eval(DateName + '_Object.picked.yearPad') + '" onKeyPress="return cbcalYearDigitsOnly(event)" onKeyUp="' + DateName + '_Object.checkYear(this)" onBlur="' + DateName + '_Object.fixYear(this)" />';
  660. // changed class from calendarDateInput to inputbox
  661. }
  662. function cbcalHtmlYmdReplace( DateName, Required, DateFormat, DefaultDate, InitialStatus, YearDropDownStop, YearMin, YearMax ) {
  663. var m = cbcalHtmlMonth( DateName, Required, DefaultDate, InitialStatus );
  664. var d = cbcalHtmlDay(   DateName, Required, DefaultDate, InitialStatus );
  665. if ( YearDropDownStop == '' ) {
  666. var y = cbcalHtmlYear(  DateName, Required, DefaultDate, InitialStatus );
  667. } else {
  668. var y = cbcalHtmlYearDropDown(  DateName, Required, DefaultDate, InitialStatus, YearDropDownStop, YearMin, YearMax );
  669. }
  670. var c = 0;
  671. var formatted = DateFormat.replace(/(Y{2,4})|((MON)|(MM?M?))|(DD?)/g,
  672. function(thematch) {
  673. var r = '';
  674. if (/(Y{2,4})/g.test(thematch) ) {
  675. r = y;
  676. } else if (/((MON)|(MM?M?))/.test(thematch) ) {
  677. r = m;
  678. } else if (/(DD?)/.test(thematch) ) {
  679. r = d;
  680. }
  681. if (c++) {
  682. r = '&nbsp;&nbsp;' + r;
  683. }
  684. r += '&nbsp;';
  685. return r;
  686. }
  687. );
  688. return formatted;
  689. }
  690. // Main function that creates the form elements: CB: added last optional argument to handle arrays
  691. function cbcalDateInput(DateName, Required, DateFormat, DefaultDate, DateFieldName, AdditionalInputAttributes, YearDropDownStop, YearMin, YearMax) {
  692.    if (arguments.length == 0) document.writeln('<span style="color:red;font-size:' + cbcalFontSize + 'px;font-family:' + cbcalFontFamily + ';">ERROR: Missing required parameter in call to 'DateInput': [name of hidden date field].</span>');
  693.    else {
  694.       // Handle DateFormat
  695.       if (arguments.length < 3) { // The format wasn't passed in, so use default
  696.          DateFormat = cbcalDefaultDateFormat;
  697.          if (arguments.length < 2) Required = false;
  698.       }
  699.       else if (/^(Y{2,4}(-|/|.)?)?((MON)|(MM?M?)|(DD?))(-|/|.)?((MON)|(MM?M?)|(DD?))((-|/|.)Y{2,4})?$/i.test(DateFormat)) DateFormat = DateFormat.toUpperCase(); // CB: added '.'
  700.       else { // Passed-in DateFormat was invalid, use default format instead
  701.          var AlertMessage = 'WARNING: The supplied date format for the '' + DateName + '' field is not valid: ' + DateFormat + 'nTherefore, the default date format will be used instead: ' + cbcalDefaultDateFormat;
  702.          DateFormat = cbcalDefaultDateFormat;
  703.          if (arguments.length == 4) { // DefaultDate was passed in with an invalid date format
  704.             var CurrentDate = new cbcalStoredMonthObject(DateFormat, cbcalToday.getFullYear(), cbcalToday.getMonth(), cbcalToday.getDate());
  705.             AlertMessage += 'nnThe supplied date (' + DefaultDate + ') cannot be interpreted with the invalid format.nTherefore, the current system date will be used instead: ' + CurrentDate.formatted;
  706.             DefaultDate = CurrentDate.formatted;
  707.          }
  708.          alert(AlertMessage);
  709.       }
  710.       // Define the current date if it wasn't set already
  711.       if (!CurrentDate) var CurrentDate = new cbcalStoredMonthObject(DateFormat, cbcalToday.getFullYear(), cbcalToday.getMonth(), cbcalToday.getDate());
  712.       // Handle DefaultDate
  713.       if ((arguments.length < 4) || (DefaultDate=='') ) { // The date wasn't passed in   CB: added the or statement to allow also empty string as default
  714.          DefaultDate = (Required) ? CurrentDate.formatted : ''; // If required, use today's date
  715.       }
  716.       // CB 6 lines: Handle DateFieldName and Attrs:
  717.       if (arguments.length < 5) { // The DateFieldName wasn't passed in
  718.          DateFieldName = DateName;
  719.       }
  720.       if (arguments.length < 6) { // The AdditionalInputAttributes wasn't passed in
  721.          AdditionalInputAttributes = '';
  722.       }
  723.       if (arguments.length < 7) { // The YearDropDownStop wasn't passed in
  724.          YearDropDownStop = '1';
  725.       }
  726.       if (arguments.length < 8) { // The YearMin wasn't passed in
  727.          YearMin = '1';
  728.       }
  729.       if (arguments.length < 9) { // The YearMax wasn't passed in
  730.          YearMax = '1';
  731.       }
  732.       // Creates the calendar object!
  733.       eval(DateName + '_Object=new cbcalCalendarObject('' + DateName + '','' + DateFormat + '','' + DefaultDate + '','' + YearDropDownStop + '')');
  734.       // Determine initial viewable state of day, year, and calendar icon
  735.       if ((Required) || ( (arguments.length >= 4) && (DefaultDate!=''))) {
  736.          var InitialStatus = '';
  737.          var InitialDate = eval(DateName + '_Object.picked.formatted');
  738.       }
  739.       else {
  740.          var InitialStatus = ' style="visibility:hidden"';
  741.          var InitialDate = '';
  742.          eval(DateName + '_Object.setPicked(' + cbcalToday.getFullYear() + ',' + cbcalToday.getMonth() + ',' + cbcalToday.getDate() + ')');
  743.       }
  744.       // Create the form elements
  745.       with (document) {
  746.          write('<input type="hidden" name="' + DateFieldName + '" id="' + DateName + '" value="' + InitialDate + '" ' + AdditionalInputAttributes + ' />'); //CB: Changed DateName to DateFieldName and added id and AdditionalInputAttributes.
  747.          // Find this form number
  748.          for (var f=0;f<forms.length;f++) {
  749.             for (var e=0;e<forms[f].elements.length;e++) {
  750.                if (typeof forms[f].elements[e].type == 'string') {
  751.                   if ((forms[f].elements[e].type == 'hidden') && (forms[f].elements[e].id == DateName)) { //CB: changed .name to .id
  752.                      eval(DateName + '_Object.formNumber='+f);
  753.                      break;
  754.                   }
  755.                }
  756.             }
  757.          }
  758.          // CB: changed below table to spans and added ordering:
  759.          write( cbcalHtmlYmdReplace( DateName, Required, DateFormat, DefaultDate, InitialStatus, YearDropDownStop, YearMin, YearMax ) );
  760.  // calendar icon:
  761.          write('<span style="white-space:nowrap;">' + '<a' /*CBB uncomment to hide calendar icon by default: + InitialStatus */ + ' id="' + DateName + '_ID_Link" href="javascript:' + DateName + '_Object.show()" onMouseOver="return ' + DateName + '_Object.iconHover(true)" onMouseOut="return ' + DateName + '_Object.iconHover(false)"><img src="' + cbcalImageURL + '" align="baseline" title="Calendar" border="0" width="16px" height="15px" /></a>&nbsp;');
  762.          writeln('<span style="position:absolute;"><span id="' + DateName + '_ID" style="position:absolute;visibility:hidden;width:' + (cbcalCellWidth * 7) + 'px;background-color:' + cbcalCalBGColor + ';border:1px solid dimgray;" onMouseOver="' + DateName + '_Object.handleTimer(true)" onMouseOut="' + DateName + '_Object.handleTimer(false)">');
  763.          writeln('<table width="' + (cbcalCellWidth * 7) + '" cellspacing="0" cellpadding="1">' + String.fromCharCode(13) + '<tr style="background-color:' + cbcalTopRowBGColor + ';">');
  764.          writeln('<td id="' + DateName + '_Previous_ID" style="cursor:default" align="center" class="calendarDateInput" style="height:' + cbcalCellHeight + '" onClick="' + DateName + '_Object.previous.go()" onMouseDown="cbcalVirtualButton(this,true)" onMouseUp="cbcalVirtualButton(this,false)" onMouseOver="return ' + DateName + '_Object.previous.hover(this,true)" onMouseOut="return ' + DateName + '_Object.previous.hover(this,false)" title="' + eval(DateName + '_Object.previous.monthName') + '"><img src="' + cbcalPrevURL + '" /></td>');
  765.          writeln('<td id="' + DateName + '_Current_ID" style="cursor:pointer" align="center" class="calendarDateInput" style="height:' + cbcalCellHeight + '" colspan="5" onClick="' + DateName + '_Object.displayed.goCurrent()" onMouseOver="self.status='Click to view ' + CurrentDate.fullName + '';return true;" onMouseOut="self.status='';return true;" title="Show Current Month">' + eval(DateName + '_Object.displayed.fullName') + '</td>');
  766.          writeln('<td id="' + DateName + '_Next_ID" style="cursor:default" align="center" class="calendarDateInput" style="height:' + cbcalCellHeight + '" onClick="' + DateName + '_Object.next.go()" onMouseDown="cbcalVirtualButton(this,true)" onMouseUp="cbcalVirtualButton(this,false)" onMouseOver="return ' + DateName + '_Object.next.hover(this,true)" onMouseOut="return ' + DateName + '_Object.next.hover(this,false)" title="' + eval(DateName + '_Object.next.monthName') + '"><img src="' + cbcalNextURL + '" /></td></tr>' + String.fromCharCode(13) + '<tr>');
  767.          for (var w=0;w<7;w++) writeln('<td width="' + cbcalCellWidth + '" align="center" class="calendarDateInput" style="height:' + cbcalCellHeight + ';width:' + cbcalCellWidth + 'px;font-weight:bold;border-top:1px solid dimgray;border-bottom:1px solid dimgray;">' + cbcalWeekDays[w] + '</td>');
  768.          writeln('</tr>' + String.fromCharCode(13) + '</table>' + String.fromCharCode(13) + '<span id="' + DateName + '_DayTable_ID">' + eval(DateName + '_Object.buildCalendar()') + '</span>' + String.fromCharCode(13) + '</span></span>' + String.fromCharCode(13) + '</span>');
  769.       }
  770.    }
  771. }