//Sample: writeCalendar(3, 2007, '', 'calendarDiv', findObjPosY(this) + 5, findObjPosX(this) + 105, 'txtTarget');
//<span id="calendarDivShadow" style="visibility:hidden; background-color:#333; position:absolute; z-index:1; top:0; left:0; filter: alpha(opacity=75);">&nbsp;</span>
//<span id="calendarDiv" style="visibility:hidden; position:absolute; top:0; left:0; z-index:5;">&nbsp;</span>
//<script language="JavaScript" src="/_system/@library/jsCalendar.js" type="text/javascript></script>
//<script language="JavaScript" src="/_system/@library/jsCommon.js" type="text/javascript></script>
//<link rel="StyleSheet" type="text/css" href="/_system/@library/jsCalendar.css">

var sMonthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var sDayNames = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var dToday = new Date();

function calFindPosX(obj)
{
 var curleft = 0;
 if(obj.offsetParent)
     while(1) 
     {
       curleft += obj.offsetLeft;
       if(!obj.offsetParent)
         break;
       obj = obj.offsetParent;
     }
 else if(obj.x)
     curleft += obj.x;
 return curleft;
}


function calFindPosY(obj)
{
 var curtop = 0;
 if(obj.offsetParent)
     while(1)
     {
       curtop += obj.offsetTop;
       if(!obj.offsetParent)
         break;
       obj = obj.offsetParent;
     }
 else if(obj.y)
     curtop += obj.y;
 return curtop;
}

function convertToPrettyDate(iMonth, iDate, iYear) {
   dTemp = new Date(iYear, iMonth, iDate);
   return sDayNames[dTemp.getDay()].substr(0, 3) + ", " + sMonthNames[dTemp.getMonth()].substr(0, 3) + " " + dTemp.getDate() + " " + dTemp.getFullYear();
}

function writeCalendar(iMonth, iYear, dSetDate, sCalSpace, iTop, iLeft, sTarget) {
   var sCalendar;
   oCalSpace = document.getElementById(sCalSpace);
   oCalShadow = document.getElementById(sCalSpace + "Shadow");
   dTempDateSerial = new Date(iYear, iMonth, 00);
   iNumDaysInMonth = dTempDateSerial.getDate();
   dTempNextDate = new Date(iYear, iMonth + 2, 00);
   dTempPrevDate = new Date(iYear, iMonth, 00);
   
   //Open up container table.
   sCalendar = "<table class=\"jsCalendarNode\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
   
   //Write out header row.
   sCalendar += "<tr><td class=\"jsCalendarMiscCell\" onclick=\"writeCalendar(" + dTempPrevDate.getMonth() + "," + dTempPrevDate.getFullYear() + ", '', '" + sCalSpace + "', " + iTop + ", " + iLeft + ", '" + sTarget + "');\">&lt;</td>";
   sCalendar += "<td colspan=\"5\" class=\"jsCalendarHeader\">" + sMonthNames[dTempDateSerial.getMonth()] + " `" + (dTempDateSerial.getFullYear() + "").substr(2, 2) + "</td>";
   sCalendar += "<td class=\"jsCalendarMiscCell\" onclick=\"writeCalendar(" + dTempNextDate.getMonth() + "," + dTempNextDate.getFullYear() + ", '', '" + sCalSpace + "', " + iTop + ", " + iLeft + ", '" + sTarget + "');\">&gt;</td></tr>";
   
   //Write out a header for week days.
   sCalendar += "<tr>";
   
   for (var iTempCount = 0; iTempCount <= 6; iTempCount++) {
      sCalendar += "<td class=\"jsCalendarWeekDayCell\">" + sDayNames[iTempCount].substr(0, 3) + "</td>"
   }
   
   sCalendar += "</tr>";
   
   //Main loop.
   for (iDayCount = 1; iDayCount <= iNumDaysInMonth; iDayCount++) {
      dTempDateSerial = new Date(iYear, (iMonth - 1), iDayCount);
      
      //Open up row for beginning of month & weeks.
      if ((iDayCount == 1) || (dTempDateSerial.getDay() == 0)) {
         sCalendar += "<tr>";
      }
      
      //Blank cells @ beginning of month.
      if (iDayCount == 1) {
         for (var iBlankCount = 1; iBlankCount <= dTempDateSerial.getDay(); iBlankCount++) {
            var dPrevMonthTempCount = new Date(iYear, (iMonth - 1), 1 - (dTempDateSerial.getDay() - (iBlankCount - 1)));
            sCalendar += "<td class=\"jsCalendarInactiveDate\">" + dPrevMonthTempCount.getDate() + "</td>";
         }
      }
      
      //Write out dates.
      if ((dToday.getMonth() == dTempDateSerial.getMonth()) && (dToday.getDate() == dTempDateSerial.getDate()) && (dToday.getFullYear() == dTempDateSerial.getFullYear())) {
         sCurrentClassName = "jsCalendarSelectedDate";
      }else{
         sCurrentClassName = "jsCalendarActiveDate";
      }
      
      sCalendar += "<td class=\"" + sCurrentClassName + "\" onclick=\"document.getElementById('" + sTarget + "').value = '" + (dTempDateSerial.getMonth() + 1) + "/" + dTempDateSerial.getDate() + "/" + dTempDateSerial.getFullYear() + "'; hideCalendar('" + sCalSpace + "');\" onmouseover=\"document.getElementById('jsCalendarFooterCell').innerHTML = convertToPrettyDate(" + dTempDateSerial.getMonth() + ", " + dTempDateSerial.getDate() + ", " + dTempDateSerial.getFullYear() + ");\" onmouseout=\"document.getElementById('jsCalendarFooterCell').innerHTML = convertToPrettyDate(" + dToday.getMonth() + ", " + dToday.getDate() + ", " + dToday.getFullYear() + ");\">" + iDayCount + "</td>";
      
      //Write out end of month cells.
      if ((iDayCount == iNumDaysInMonth) && (dTempDateSerial.getDay() < 6)) {
         for (iBlankCount = 0; iBlankCount < (6 - dTempDateSerial.getDay()); iBlankCount++) {
            sCalendar += "<td class=\"jsCalendarInactiveDate\">" + (iBlankCount + 1) + "</td>";
         }
      }
      
      //Close up row for weeks & end of month.
      if (dTempDateSerial.getDay() == 6) {
         sCalendar += "</tr>";
      }
   }
   
   //Set up footer row.
   sCalendar += "<tr><td id=\"jsCalendarFooterCell\" class=\"jsCalendarFooter\" colspan=\"6\">" + convertToPrettyDate(dToday.getMonth(), dToday.getDate(), dToday.getFullYear()) + "</td><td colspan=\"1\" class=\"jsCalendarCloseLink\" title=\"Close Calendar.\" onclick=\"hideCalendar('" + sCalSpace + "');\">X</td></tr>"
   
   sCalendar += "</table>";
   oCalSpace.innerHTML = sCalendar;
   
   //Move Calendar div to the required location.
   oCalSpace.style.top = iTop;
   oCalSpace.style.left = iLeft;
   
   //Setup drop-shadow.
   oCalShadow.style.width = oCalSpace.clientWidth;
   oCalShadow.style.height = oCalSpace.clientHeight;
   oCalShadow.style.top = calFindPosY(oCalSpace) + 6;
   oCalShadow.style.left = calFindPosX(oCalSpace) - 6;
   
   //Make calendar visible *after* all alterations are finished.
   oCalSpace.style.visibility = "visible";
   oCalShadow.style.visibility = "visible";
}

function hideCalendar(sCalSpace) {
   oCalSpace = document.getElementById(sCalSpace);
   oCalShadow = document.getElementById(sCalSpace + "Shadow");
   
   oCalSpace.style.visibility = "hidden";
   oCalShadow.style.visibility = "hidden";
}

function initCalendar(sId) {
   document.body.innerHTML += sId;
}