// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download. 
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================
function CalendarPopup()
{
   var c;
   if(arguments.length > 0)
   {
      c = new PopupWindow(arguments[0]);
   }
   else 
   {
      c = new PopupWindow();
      c.setSize(150, 175);
   }
   c.offsetX = - 152;
   c.offsetY = 25;
   c.autoHide();
   c.monthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
   c.monthAbbreviations = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
   c.dayHeaders = new Array("S", "M", "T", "W", "T", "F", "S");
   c.returnFunction = "CP_tmpReturnFunction";
   c.returnMonthFunction = "CP_tmpReturnMonthFunction";
   c.returnQuarterFunction = "CP_tmpReturnQuarterFunction";
   c.returnYearFunction = "CP_tmpReturnYearFunction";
   c.weekStartDay = 0;
   c.isShowYearNavigation = false;
   c.displayType = "date";
   c.disabledWeekDays = new Object();
   c.disabledDatesExpression = "";
   c.yearSelectStartOffset = 2;
   c.currentDate = null;
   c.todayText = "Today";
   c.cssPrefix = "";
   c.isShowNavigationDropdowns = false;
   c.isShowYearNavigationInput = false;
   window.CP_targetInput = null;
   // TBR
   window.CP_targetInput2 = null;
   c.setSecondTargetInput = CP_setSecondTargetInput;
   // /TBR
   window.CP_dateFormat = "MM/dd/yyyy";
   c.setReturnFunction = CP_setReturnFunction;
   c.setReturnMonthFunction = CP_setReturnMonthFunction;
   c.setReturnQuarterFunction = CP_setReturnQuarterFunction;
   c.setReturnYearFunction = CP_setReturnYearFunction;
   c.setMonthNames = CP_setMonthNames;
   c.setMonthAbbreviations = CP_setMonthAbbreviations;
   c.setDayHeaders = CP_setDayHeaders;
   c.setWeekStartDay = CP_setWeekStartDay;
   c.setDisplayType = CP_setDisplayType;
   c.setDisabledWeekDays = CP_setDisabledWeekDays;
   c.addDisabledDates = CP_addDisabledDates;
   c.setYearSelectStartOffset = CP_setYearSelectStartOffset;
   c.setTodayText = CP_setTodayText;
   c.showYearNavigation = CP_showYearNavigation;
   c.showCalendar = CP_showCalendar;
   c.hideCalendar = CP_hideCalendar;
   c.getStyles = getCalendarStyles;
   c.refreshCalendar = CP_refreshCalendar;
   c.getCalendar = CP_getCalendar;
   c.select = CP_select;
   c.setCssPrefix = CP_setCssPrefix;
   c.showNavigationDropdowns = CP_showNavigationDropdowns;
   c.showYearNavigationInput = CP_showYearNavigationInput;
   return c;
}

// TBR
function CP_setSecondTargetInput(inputobj)
{
   if(inputobj.type != "text" && inputobj.type != "hidden" && inputobj.type != "textarea")
   {
      alert("calendar.select: Input object passed is not a valid form input object");
      window.CP_targetInput2 = null;
      return;
   }
   window.CP_targetInput2 = inputobj;
}

function CP_tmpReturnWeekFunction(y1, m1, d1, y2, m2, d2)
{
   if(window.CP_targetInput2 != null)
   {
      var dt2 = new Date(y2, m2 - 1, d2, 0, 0, 0);
      window.CP_targetInput2.value = formatDate(dt2, window.CP_dateFormat);
   }

   if(window.CP_targetInput != null)
   {
      var dt1 = new Date(y1, m1 - 1, d1, 0, 0, 0);
      if (window.CP_targetInput2 == null)
      {
	      var dt2 = new Date(y2, m2 - 1, d2, 0, 0, 0);
	      window.CP_targetInput.value = formatDate(dt1, window.CP_dateFormat) + "-" + formatDate(dt2, window.CP_dateFormat);
      }
      else
      {
    	  window.CP_targetInput.value = formatDate(dt1, window.CP_dateFormat);
      }
   }
}
// /TBR

function CP_tmpReturnFunction(y, m, d)
{
   if(window.CP_targetInput != null)
   {
      var dt = new Date(y, m - 1, d, 0, 0, 0);
      window.CP_targetInput.value = formatDate(dt, window.CP_dateFormat);
   }
   else 
   {
      alert('Use setReturnFunction() to define which function will get the clicked results!');
   }
}

function CP_tmpReturnMonthFunction(y, m)
{
   alert('Use setReturnMonthFunction() to define which function will get the clicked results!\nYou clicked: year=' + y + ' , month=' + m);
}

function CP_tmpReturnQuarterFunction(y, q)
{
   alert('Use setReturnQuarterFunction() to define which function will get the clicked results!\nYou clicked: year=' + y + ' , quarter=' + q);
}

function CP_tmpReturnYearFunction(y)
{
   alert('Use setReturnYearFunction() to define which function will get the clicked results!\nYou clicked: year=' + y);
}

function CP_setReturnFunction(name)
{
   this.returnFunction = name;
}

function CP_setReturnMonthFunction(name)
{
   this.returnMonthFunction = name;
}

function CP_setReturnQuarterFunction(name)
{
   this.returnQuarterFunction = name;
}

function CP_setReturnYearFunction(name)
{
   this.returnYearFunction = name;
}

function CP_setMonthNames()
{
   for(var i = 0; i < arguments.length; i++)
   {
      this.monthNames[i] = arguments[i];
   }
}

function CP_setMonthAbbreviations()
{
   for(var i = 0; i < arguments.length; i++)
   {
      this.monthAbbreviations[i] = arguments[i];
   }
}

function CP_setDayHeaders()
{
   for(var i = 0; i < arguments.length; i++)
   {
      this.dayHeaders[i] = arguments[i];
   }
}

function CP_setWeekStartDay(day)
{
   this.weekStartDay = day;
}

function CP_showYearNavigation()
{
   this.isShowYearNavigation =(arguments.length > 0) ? arguments[0] : true;
}

function CP_setDisplayType(type)
{
   if(type != "date" && type != "week-end" && type != "month" && type != "quarter" && type != "year"
// TBR
      && type != "week"
// /TBR
   )
   {
      alert("Invalid display type! Must be one of: date,week-end,month,quarter,year"
// TBR
	&& type != "week"
// /TBR
      );
      return false;
   }
   this.displayType = type;
}

function CP_setYearSelectStartOffset(num)
{
   this.yearSelectStartOffset = num;
}

function CP_setDisabledWeekDays()
{
   this.disabledWeekDays = new Object();
   for(var i = 0; i < arguments.length; i++)
   {
      this.disabledWeekDays[arguments[i]] = true;
   }
}

function CP_addDisabledDates(start, end)
{
   if(arguments.length == 1)
   {
      end = start;
   }
   if(start == null && end == null)
   {
      return;
   }
   if(this.disabledDatesExpression != "")
   {
      this.disabledDatesExpression += "||";
   }
   if(start != null)
   {
      start = parseDate(start);
      start = "" + start.getFullYear() + LZ(start.getMonth() + 1) + LZ(start.getDate());
   }
   if(end != null)
   {
      end = parseDate(end);
      end = "" + end.getFullYear() + LZ(end.getMonth() + 1) + LZ(end.getDate());
   }
   if(start == null)
   {
      this.disabledDatesExpression += "(ds<=" + end + ")";
   }
   else if(end == null)
   {
      this.disabledDatesExpression += "(ds>=" + start + ")";
   }
   else 
   {
      this.disabledDatesExpression += "(ds>=" + start + "&&ds<=" + end + ")";
   }
}

function CP_setTodayText(text)
{
   this.todayText = text;
}

function CP_setCssPrefix(val)
{
   this.cssPrefix = val;
}

function CP_showNavigationDropdowns()
{
   this.isShowNavigationDropdowns =(arguments.length > 0) ? arguments[0] : true;
}

function CP_showYearNavigationInput()
{
   this.isShowYearNavigationInput =(arguments.length > 0) ? arguments[0] : true;
}

function CP_hideCalendar()
{
   if(arguments.length > 0)
   {
      window.popupWindowObjects[arguments[0]].hidePopup();
   }
   else 
   {
      this.hidePopup();
   }
}

function CP_refreshCalendar(index)
{
   var calObject = window.popupWindowObjects[index];
   if(arguments.length > 1)
   {
      calObject.populate(calObject.getCalendar(arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]));
   }
   else 
   {
      calObject.populate(calObject.getCalendar());
   }
   calObject.refresh();
}

function CP_showCalendar(anchorname)
{
   if(arguments.length > 1)
   {
      if(arguments[1] == null || arguments[1] == "")
      {
         this.currentDate = new Date();
      }
      else 
      {
         this.currentDate = new Date(parseDate(arguments[1]));
      }
   }
   this.populate(this.getCalendar());
   this.showPopup(anchorname);
}

function CP_select(inputobj, linkname, format)
{
   var selectedDate =(arguments.length > 3) ? arguments[3] : null;
   if(!window.getDateFromFormat)
   {
      alert("calendar.select: To use this method you must also include 'date.js' for date formatting");
      return;
   }
   if(this.displayType != "date" && this.displayType != "week-end"
// TBR
      && this.displayType != "week"
// /TBR
   )
   {
      alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");
      return;
   }
   if(inputobj.type != "text" && inputobj.type != "hidden" && inputobj.type != "textarea")
   {
      alert("calendar.select: Input object passed is not a valid form input object");
      window.CP_targetInput = null;
      return;
   }
   window.CP_targetInput = inputobj;
   this.currentDate = null;
   var time = 0;
   if(selectedDate != null)
   {
      time = getDateFromFormat(selectedDate, format);
   }
   else if(inputobj.value != "")
   {
      time = getDateFromFormat(inputobj.value, format);
   }
   if(selectedDate != null || inputobj.value != "")
   {
      if(time == 0)
      {
         this.currentDate = null;
      }
      else 
      {
         this.currentDate = new Date(time);
      }
   }
   window.CP_dateFormat = format;
   this.showCalendar(linkname);
}

function getCalendarStyles()
{
   var result = "";
   var p = "";
   if(this != null && typeof(this.cssPrefix) != "undefined" && this.cssPrefix != null && this.cssPrefix != "")
   {
      p = this.cssPrefix;
   }
   result += "<STYLE>\n";
   result += "." + p + "cpYearNavigation,." + p + "cpMonthNavigation{background-color:#C0C0C0;text-align:center;vertical-align:center;text-decoration:none;color:#000000;font-weight:bold;}\n";
   result += "." + p + "cpDayColumnHeader, ." + p + "cpYearNavigation,." + p + "cpMonthNavigation,." + p + "cpCurrentMonthDate,." + p + "cpCurrentMonthDateDisabled,." + p + "cpOtherMonthDate,." + p + "cpOtherMonthDateDisabled,." + p + "cpCurrentDate,." + p + "cpCurrentDateDisabled,." + p + "cpTodayText,." + p + "cpTodayTextDisabled,." + p + "cpText{font-family:arial;font-size:8pt;}\n";
   result += "TD." + p + "cpDayColumnHeader{text-align:right;border:solid thin #C0C0C0;border-width:0 0 1 0;}\n";
   result += "." + p + "cpCurrentMonthDate, ." + p + "cpOtherMonthDate, ." + p + "cpCurrentDate{text-align:right;text-decoration:none;}\n";
   result += "." + p + "cpCurrentMonthDateDisabled, ." + p + "cpOtherMonthDateDisabled, ." + p + "cpCurrentDateDisabled{color:#D0D0D0;text-align:right;text-decoration:line-through;}\n";
   result += "." + p + "cpCurrentMonthDate, .cpCurrentDate{color:#000000;}\n";
   result += "." + p + "cpOtherMonthDate{color:#808080;}\n";
   result += "TD." + p + "cpCurrentDate{color:white;background-color: #C0C0C0;border-width:1;border:solid thin #800000;}\n";
   result += "TD." + p + "cpCurrentDateDisabled{border-width:1;border:solid thin #FFAAAA;}\n";
   result += "TD." + p + "cpTodayText, TD." + p + "cpTodayTextDisabled{border:solid thin #C0C0C0;border-width:1 0 0 0;}\n";
   result += "A." + p + "cpTodayText, SPAN." + p + "cpTodayTextDisabled{height:20px;}\n";
   result += "A." + p + "cpTodayText{color:black;}\n";
   result += "." + p + "cpTodayTextDisabled{color:#D0D0D0;}\n";
   result += "." + p + "cpBorder{border:solid thin #808080;}\n";
   result += "</STYLE>\n";
   return result;
}

function CP_getCalendar()
{
   var now = new Date();
   if(this.type == "WINDOW")
   {
      var windowref = "window.opener.";
   }
   else 
   {
      var windowref = "";
   }
   var result = "";
   if(this.type == "WINDOW")
   {
      result += "<HTML><HEAD><TITLE>Calendar</TITLE>" + this.getStyles() + "</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
      result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
   }
   else 
   {
      result += '<TABLE CLASS="' + this.cssPrefix + 'cpBorder" WIDTH=144 BORDER=1 BORDERWIDTH=1 CELLSPACING=0 CELLPADDING=1>\n';
      result += '<TR><TD ALIGN=CENTER>\n';
      result += '<CENTER>\n';
   }
   if(this.displayType == "date" || this.displayType == "week-end"
// TBR
      || this.displayType == "week"
// /TBR
   )
   {
      if(this.currentDate == null)
      {
         this.currentDate = now;
      }
      if(arguments.length > 0)
      {
         var month = arguments[0];
      }
      else 
      {
         var month = this.currentDate.getMonth() + 1;
      }
      if(arguments.length > 1 && arguments[1] > 0 && arguments[1] - 0 == arguments[1])
      {
         var year = arguments[1];
      }
      else 
      {
         var year = this.currentDate.getFullYear();
      }
      var daysinmonth = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
      if(((year % 4 == 0) &&(year % 100 != 0)) ||(year % 400 == 0))
      {
         daysinmonth[2] = 29;
      }
      var current_month = new Date(year, month - 1, 1);
      var display_year = year;
      var display_month = month;
      var display_date = 1;
      var weekday = current_month.getDay();
      var offset = 0;
      offset =(weekday >= this.weekStartDay) ? weekday - this.weekStartDay : 7 - this.weekStartDay + weekday;
      if(offset > 0)
      {
         display_month--;
         if(display_month < 1)
         {
            display_month = 12;
            display_year--;
         }
         display_date = daysinmonth[display_month] - offset + 1;
      }
      var next_month = month + 1;
      var next_month_year = year;
      if(next_month > 12)
      {
         next_month = 1;
         next_month_year++;
      }
      var last_month = month - 1;
      var last_month_year = year;
      if(last_month < 1)
      {
         last_month = 12;
         last_month_year--;
      }
      var date_class;
      if(this.type != "WINDOW")
      {
         result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
      }
      result += '<TR>\n';
      var refresh = windowref + 'CP_refreshCalendar';
      var refreshLink = 'javascript:' + refresh;
      if(this.isShowNavigationDropdowns)
      {
         result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="78" COLSPAN="3"><select CLASS="' + this.cssPrefix + 'cpMonthNavigation" name="cpMonth" onChange="' + refresh + '(' + this.index + ',this.options[this.selectedIndex].value-0,' +(year - 0) + ');">';
         for(var monthCounter = 1; monthCounter <= 12; monthCounter++)
         {
            var selected =(monthCounter == month) ? 'SELECTED' : '';
            result += '<option value="' + monthCounter + '" ' + selected + '>' + this.monthNames[monthCounter - 1] + '</option>';
         }
         result += '</select></TD>';
         result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';
         result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="56" COLSPAN="3"><select CLASS="' + this.cssPrefix + 'cpYearNavigation" name="cpYear" onChange="' + refresh + '(' + this.index + ',' + month + ',this.options[this.selectedIndex].value-0);">';
         for(var yearCounter = year - this.yearSelectStartOffset; yearCounter <= year + this.yearSelectStartOffset; yearCounter++)
         {
            var selected =(yearCounter == year) ? 'SELECTED' : '';
            result += '<option value="' + yearCounter + '" ' + selected + '>' + yearCounter + '</option>';
         }
         result += '</select></TD>';
      }
      else 
      {
         if(this.isShowYearNavigation)
         {
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + last_month + ',' + last_month_year + ');">&lt;</A></TD>';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="58"><SPAN CLASS="' + this.cssPrefix + 'cpMonthNavigation">' + this.monthNames[month - 1] + '</SPAN></TD>';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + next_month + ',' + next_month_year + ');">&gt;</A></TD>';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';
            result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="' + refreshLink + '(' + this.index + ',' + month + ',' +(year - 1) + ');">&lt;</A></TD>';
            if(this.isShowYearNavigationInput)
            {
               result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="36"><INPUT NAME="cpYear" CLASS="' + this.cssPrefix + 'cpYearNavigation" SIZE="4" MAXLENGTH="4" VALUE="' + year + '" onBlur="' + refresh + '(' + this.index + ',' + month + ',this.value-0);"></TD>';
            }
            else 
            {
               result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="36"><SPAN CLASS="' + this.cssPrefix + 'cpYearNavigation">' + year + '</SPAN></TD>';
            }
            result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="' + refreshLink + '(' + this.index + ',' + month + ',' +(year + 1) + ');">&gt;</A></TD>';
         }
         else 
         {
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + last_month + ',' + last_month_year + ');">&lt;&lt;</A></TD>\n';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="100"><SPAN CLASS="' + this.cssPrefix + 'cpMonthNavigation">' + this.monthNames[month - 1] + ' ' + year + '</SPAN></TD>\n';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + next_month + ',' + next_month_year + ');">&gt;&gt;</A></TD>\n';
         }
      }
      result += '</TR></TABLE>\n';
      result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=0 CELLPADDING=1 ALIGN=CENTER>\n';
      result += '<TR>\n';
      for(var j = 0; j < 7; j++)
      {
         result += '<TD CLASS="' + this.cssPrefix + 'cpDayColumnHeader" WIDTH="14%"><SPAN CLASS="' + this.cssPrefix + 'cpDayColumnHeader">' + this.dayHeaders[(this.weekStartDay + j) % 7] + '</TD>\n';
      }
      result += '</TR>\n';
      for(var row = 1; row <= 6; row++)
      {
         // TBR
         if (this.displayType == "week")
         {
			var datePlusOneWeek = display_date + 6;
			var monthPlusOneWeek = display_month;
			var yearPlusOneWeek = display_year;

         	if (datePlusOneWeek > daysinmonth[display_month])
            {
               datePlusOneWeek = datePlusOneWeek - daysinmonth[display_month];
               monthPlusOneWeek++;
            }
            if(monthPlusOneWeek > 12)
            {
               monthPlusOneWeek = 1;
               yearPlusOneWeek++;
            }
            
            result += '<TR onmouseover="this.className=\'cpMouseOver\';" onmouseout="this.className=\'cpMouseOut\';" onmousedown="' + windowref + 'CP_tmpReturnWeekFunction(' + display_year + ',' + display_month + ',' + display_date + ','+ yearPlusOneWeek + ',' + monthPlusOneWeek + ',' + datePlusOneWeek + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\')">\n';
         }
         else
         {
            result += '<TR>\n';
         }
         // /TBR
         for(var col = 1; col <= 7; col++)
         {
            var disabled = false;
            if(this.disabledDatesExpression != "")
            {
               var ds = "" + display_year + LZ(display_month) + LZ(display_date);
               eval("disabled=(" + this.disabledDatesExpression + ")");
            }
            var dateClass = "";
            if((display_month == this.currentDate.getMonth() + 1) &&(display_date == this.currentDate.getDate()) &&(display_year == this.currentDate.getFullYear())
// TBR
		      && this.displayType != "week"
// /TBR
            )
            {
               dateClass = "cpCurrentDate";
            }
            else if(display_month == month)
            {
               dateClass = "cpCurrentMonthDate";
            }
            else 
            {
               dateClass = "cpOtherMonthDate";
            }
            if(disabled || this.disabledWeekDays[col - 1])
            {
               result += '	<TD CLASS="' + this.cssPrefix + dateClass + '"><SPAN CLASS="' + this.cssPrefix + dateClass + 'Disabled">' + display_date + '</SPAN></TD>\n';
            }
            else 
            {
               var selected_date = display_date;
               var selected_month = display_month;
               var selected_year = display_year;
               if(this.displayType == "week-end")
               {
                  var d = new Date(selected_year, selected_month - 1, selected_date, 0, 0, 0, 0);
                  d.setDate(d.getDate() +(7 - col));
                  selected_year = d.getYear();
                  if(selected_year < 1000)
                  {
                     selected_year += 1900;
                  }
                  selected_month = d.getMonth() + 1;
                  selected_date = d.getDate();
               }
               // TBR
               result += '	<TD CLASS="' + this.cssPrefix + dateClass + '">';
               if(this.displayType != "week")
               {
	               result += '<A HREF="javascript:' + windowref + this.returnFunction + '(' + selected_year + ',' + selected_month + ',' + selected_date + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + this.cssPrefix + dateClass + '">';
               }
               result += display_date;
               if(this.displayType != "week")
               {
	               result += '</A>';
               }
               result += '</TD>\n';
               // /TBR
            }
            display_date++;
            if(display_date > daysinmonth[display_month])
            {
               display_date = 1;
               display_month++;
            }
            if(display_month > 12)
            {
               display_month = 1;
               display_year++;
            }
         }
         result += '</TR>';
      }
      var current_weekday = now.getDay() - this.weekStartDay;
      if(current_weekday < 0)
      {
         current_weekday += 7;
      }
      result += '<TR>\n';
      result += '	<TD COLSPAN=7 ALIGN=CENTER CLASS="' + this.cssPrefix + 'cpTodayText">\n';
      // TBR
      if (this.displayType != "week")
      {
      // TBR
	      if(this.disabledDatesExpression != "")
	      {
	         var ds = "" + now.getFullYear() + LZ(now.getMonth() + 1) + LZ(now.getDate());
	         eval("disabled=(" + this.disabledDatesExpression + ")");
	      }
	      if(disabled || this.disabledWeekDays[current_weekday + 1])
	      {
	         result += '		<SPAN CLASS="' + this.cssPrefix + 'cpTodayTextDisabled">' + this.todayText + '</SPAN>\n';
	      }
	      else 
	      {
	         result += '		<A CLASS="' + this.cssPrefix + 'cpTodayText" HREF="javascript:' + windowref + this.returnFunction + '(\'' + now.getFullYear() + '\',\'' +(now.getMonth() + 1) + '\',\'' + now.getDate() + '\');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');">' + this.todayText + '</A>\n';
	      }
      // TBR
      }
      // TBR
      result += '		<BR>\n';
      result += '	</TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';
   }
   if(this.displayType == "month" || this.displayType == "quarter" || this.displayType == "year")
   {
      if(arguments.length > 0)
      {
         var year = arguments[0];
      }
      else 
      {
         if(this.displayType == "year")
         {
            var year = now.getFullYear() - this.yearSelectStartOffset;
         }
         else 
         {
            var year = now.getFullYear();
         }
      }
      if(this.displayType != "year" && this.isShowYearNavigation)
      {
         result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
         result += '<TR>\n';
         result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' +(year - 1) + ');">&lt;&lt;</A></TD>\n';
         result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="100">' + year + '</TD>\n';
         result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' +(year + 1) + ');">&gt;&gt;</A></TD>\n';
         result += '</TR></TABLE>\n';
      }
   }
   if(this.displayType == "month")
   {
      result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
      for(var i = 0; i < 4; i++)
      {
         result += '<TR>';
         for(var j = 0; j < 3; j++)
         {
            var monthindex =((i * 3) + j);
            result += '<TD WIDTH=33% ALIGN=CENTER><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnMonthFunction + '(' + year + ',' +(monthindex + 1) + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">' + this.monthAbbreviations[monthindex] + '</A></TD>';
         }
         result += '</TR>';
      }
      result += '</TABLE></CENTER></TD></TR></TABLE>\n';
   }
   if(this.displayType == "quarter")
   {
      result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';
      for(var i = 0; i < 2; i++)
      {
         result += '<TR>';
         for(var j = 0; j < 2; j++)
         {
            var quarter =((i * 2) + j + 1);
            result += '<TD WIDTH=50% ALIGN=CENTER><BR><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnQuarterFunction + '(' + year + ',' + quarter + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">Q' + quarter + '</A><BR><BR></TD>';
         }
         result += '</TR>';
      }
      result += '</TABLE></CENTER></TD></TR></TABLE>\n';
   }
   if(this.displayType == "year")
   {
      var yearColumnSize = 4;
      result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
      result += '<TR>\n';
      result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="50%"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' +(year -(yearColumnSize * 2)) + ');">&lt;&lt;</A></TD>\n';
      result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="50%"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' +(year +(yearColumnSize * 2)) + ');">&gt;&gt;</A></TD>\n';
      result += '</TR></TABLE>\n';
      result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
      for(var i = 0; i < yearColumnSize; i++)
      {
         for(var j = 0; j < 2; j++)
         {
            var currentyear = year +(j * yearColumnSize) + i;
            result += '<TD WIDTH=50% ALIGN=CENTER><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnYearFunction + '(' + currentyear + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">' + currentyear + '</A></TD>';
         }
         result += '</TR>';
      }
      result += '</TABLE></CENTER></TD></TR></TABLE>\n';
   }
   if(this.type == "WINDOW")
   {
      result += "</BODY></HTML>\n";
   }
   return result;
}

