// ProtoTypes

Date.prototype.addDate = addDate;
Date.prototype.addMonth = addMonth;
Date.prototype.getCMonth = getCMonth;
Date.prototype.getDOW = getDOW;

// Variables

var poWindow = 0;

function addDate(tnOffset)
{
  return this.setDate(this.getDate() + tnOffset);
}


function addMonth(tnOffset)
{
  return this.setMonth(this.getMonth() + tnOffset);
}


function getCMonth(tnLength)
{
  var laMonth;
  var lcMonth;

// Initial settings

  laMonth = new Array(
    "January", "February", "March", "April", "May"," June",
    "July", "August", "September", "October", "November", "December");
                                        // List of months

// Get day of week

  lcMonth = laMonth [this.getMonth()]; 
  if (tnLength > 0)
    lcMonth.substring(0, tnLength);

  return lcMonth
}


function getDOW(tnLength)
{
  var laDOW;
  var lcDOW;

// Initial settings

  laDOW = new Array(
    "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
                                        // List of days in week

// Get day of week

  lcDOW = laDOW [this.getDay()]; 
  if (tnLength > 0)
    lcDOW = lcDOW.substring(0, tnLength);

  return lcDOW
}


function plsSpace(tnLength)
{
  var lcString;
  var lnLoop1;

// Initial settings

  lcString = "";

// Create blank string

  for (lnLoop1 = 0; lnLoop1 < tnLength; ++lnLoop1)
    lcString += " ";

  return lcString;
}


function CalendarChange(tnForm, tnField, tnYear, tnMonth, tdToday, tnLower, tnUpper)
{
  with (poWindow.document)
  {
    close();
    open();
    write(CalendarShow(
      tnForm, tnField, new Date(tnYear, tnMonth, 1), new Date(tdToday), tnLower, tnUpper));
  }
}

function CalendarClose()
{
  PlsWindowClose(poWindow);
}


function CalendarGet(tnForm, tnField, tdStart, tnLower, tnUpper)
{
  var ldStart;

  ldStart = new Date(tdStart.getFullYear(), tdStart.getMonth(), tdStart.getDate());
  poWindow = window.open('', 'winCalendar', 'width=280,height=230');
  poWindow.document.write(CalendarShow(tnForm, tnField, ldStart, ldStart, tnLower, tnUpper));

  if (poWindow.opener == null)
     poWindow.opener = self;
}


function CalendarShow(tnForm, tnField, tdStart, tdToday, tnLower, tnUpper)
{
  var lcPl, lcOnChange;
  var ldEnd, ldLoop1, ldStart
  var lnLoop1, lnMonth, lnYear

// Initial settings

  lcPl = "";
  lcOnChange = "opener.CalendarChange(" + tnForm + ", " + tnField + ", " +
    "document.frmCalendar.nYear.options [document.frmCalendar.nYear.selectedIndex].value, " +
    "document.frmCalendar.nMonth.options [document.frmCalendar.nMonth.selectedIndex].value, " +
    "'" + PlsDateFormat(tdToday.toString()) + "', " + tnLower + ", " + tnUpper + ")";
  lnMonth = tdStart.getMonth();
  lnYear = tdStart.getFullYear();
  ldStart = new Date(lnYear, lnMonth, 1);
  ldStart.addDate(-ldStart.getDay());
  ldEnd = new Date(lnYear, lnMonth + 1, 0);
  ldEnd.addDate(6 - ldEnd.getDay());

// Create calendar

  lcPl += plsSpace(0) + '<HTML>\n';
  lcPl += plsSpace(0) + '<HEAD><TITLE>Calendar<\/TITLE><\/HEAD>\n';
  lcPl += plsSpace(0) + '<BODY>\n';
  lcPl += plsSpace(0) + '<FORM NAME="frmCalendar">\n';
  lcPl += plsSpace(2) + '<TABLE BORDER=0>\n';
  lcPl += plsSpace(4) + '<TR>\n';
  lcPl += plsSpace(6) + '<TD>\n';
  lcPl += plsSpace(8) + '<SELECT NAME="nMonth" onchange="' + lcOnChange + '">\n';

  for (ldLoop1 = new Date(2002, 0, 1); ldLoop1.getFullYear() == 2002; ldLoop1.addMonth(1))
    lcPl += plsSpace(10) + '<OPTION VALUE="' + ldLoop1.getMonth() + '"' +
      (ldLoop1.getMonth() == lnMonth ? ' SELECTED' : '') + '>' + ldLoop1.getCMonth(0) +
        '<\/OPTION>\n';

  lcPl += plsSpace(8) + '<\/SELECT>\n';
  lcPl += plsSpace(6) + '<\/TD>\n';
  lcPl += plsSpace(6) + '<TD ALIGN="Right">\n';
  lcPl += plsSpace(8) + '<SELECT NAME="nYear" onChange="' + lcOnChange + '">\n';

  for (lnLoop1 = lnYear - tnLower; lnLoop1 <= lnYear + tnUpper; ++lnLoop1)
    lcPl += plsSpace(10) + '<OPTION VALUE="' + lnLoop1 + '"' +
      (lnLoop1 == lnYear ? ' SELECTED' : '') + '>' + lnLoop1 + '<\/OPTION>\n';

  lcPl += plsSpace(8) + '<\/SELECT>\n';
  lcPl += plsSpace(6) + '<\/TD>\n';
  lcPl += plsSpace(4) + '<\/TR>\n';
  lcPl += plsSpace(4) + '<TR>\n';
  lcPl += plsSpace(6) + '<TD COLSPAN=2>\n';
  lcPl += plsSpace(8) + '<TABLE BORDER=1 BORDERCOLORDARK="#FFFFFF" BORDERCOLORLIGHT="#C0C0C0">\n';
  lcPl += plsSpace(10) + '<TR>\n';

  for (ldLoop1 = new Date(2002, 8, 1); ldLoop1.getDate() <= 7; ldLoop1.addDate(1))
  {
    lcPl += plsSpace(12) + '<TD ALIGN="Center" WIDTH=30>\n'
    lcPl += plsSpace(14) + '<FONT COLOR="#006400">' + ldLoop1.getDOW(3) + '<\/B><\/FONT>\n';
    lcPl += plsSpace(12) + '<\/TD>\n';
  }

  lcPl += plsSpace(10) + '<\/TR>\n';
  for (ldLoop1 = ldStart; ldLoop1 <= ldEnd; )
  {
    lcPl += plsSpace(10) + '<TR>\n';
    for (lnLoop1 = 1; lnLoop1 <= 7; ++lnLoop1, ldLoop1.addDate(1))
    {
      lcDay = ldLoop1.getDate();
      lcPl += plsSpace(12) + '<TD ALIGN="Center">\n'

      if (ldLoop1.getMonth() == lnMonth)
        lcPl += plsSpace(14) + 
          '<A HREF="javascript:opener.document.forms ' +
            '[' + tnForm + '].elements [' + tnField + '].value = ' +
            "'" + PlsDateFormat(ldLoop1.toString()) + "'" + '; window.close();">' +
            '<FONT COLOR="#' +
              (ldLoop1.toString() == tdToday.toString() ? 'FF0000' : '808080') + '">' +
              lcDay + '<\/FONT>' +
          '<\/A>\n';
      else
        lcPl += plsSpace(14) + '<FONT COLOR="#808080">' + lcDay + '<\/FONT>\n';

      lcPl += plsSpace(12) + '<\/TD>\n';
    }
    lcPl += plsSpace(10) + '<\/TR>\n';
  }

  lcPl += plsSpace(10) + '<\/TR>\n';
  lcPl += plsSpace(8) + '<\/TABLE>\n';
  lcPl += plsSpace(6) + '<\/FORM>\n';
  lcPl += plsSpace(4) + '<\/TD>\n';
  lcPl += plsSpace(2) + '<\/TR>\n';
  lcPl += plsSpace(0) + '<\/TABLE>\n';
  lcPl += plsSpace(0) + '<\/BODY>\n';
  lcPl += plsSpace(0) + '<\/HTML>\n';

  return lcPl;
}