//Display Calendar

var fixedX = -1         // x position (-1 if to appear below control)
var fixedY = -1         // y position (-1 if to appear below control)
var startAt = 0         // 0 - sunday ; 1 - monday
var showWeekNumber = 0  // 0 - don't show; 1 - show
var showToday = 0       // 0 - don't show; 1 - show
var imgDir = "/img/icons/" // directory for images ... e.g. var imgDir="/img/"

var gotoString = "Go To Current Month"
var todayString = "Today is"
var weekString = "Wk"
var scrollLeftMessage = "Click to scroll to previous month. Hold mouse button to scroll automatically."
var scrollRightMessage = "Click to scroll to next month. Hold mouse button to scroll automatically."
var selectMonthMessage = "Click to select a month."
var selectYearMessage = "Click to select a year."
var selectDateMessage = "Select [date] as date." // do not replace [date], it will be replaced by date.

var crossobj, crossMonthObj, crossYearObj; // Three cross objects
var monthSelected, yearSelected, dateSelected,
    omonthSelected, oyearSelected, odateSelected,
    monthConstructed, yearConstructed, 
    intervalID1, intervalID2,
    timeoutID1, timeoutID2, 
    d0, m0, ctlNow, dateFormat, nStartingYear

var bPageLoaded=false
var ie=document.all
var dom=document.getElementById

var ns4=document.layers
var today = new Date()
var dateNow = today.getDate()
var monthNow = today.getMonth()
var yearNow = today.getFullYear()
var images = new Array("calendar_left.gif","calendar_right.gif","calendar_drop.gif","calendar_close.gif");
var bShow = false;

var gNumYears = 2; // Number of years to show  
var startDate = getDate(null, null, 5); // 5 days ahead is a default value
var gMinDate = startDate.getDate();
var gMinMonth = startDate.getMonth();
var gMinYear = startDate.getFullYear();

var endDate = new Date( yearNow+(gNumYears-1), monthNow, dateNow-1);
var gMaxDate = endDate.getDate();
var gMaxMonth = endDate.getMonth();
var gMaxYear = endDate.getFullYear(); // 1 for current year
var d1 = null;
var m1 = null;
var numUpdateCalDayMod = 7;
// ---------

/* hides <select> and <applet> objects (for IE only) */
function hideElement( elmID, overDiv )
{
  if( ie )
  {
    for( i = 0; i < document.all.tags( elmID ).length; i++ )
    {
      obj = document.all.tags( elmID )[i];
      if( !obj || !obj.offsetParent )
      {
        continue;
      }

      // Find the element's offsetTop and offsetLeft relative to the BODY tag.
      objLeft   = obj.offsetLeft;
      objTop    = obj.offsetTop;
      objParent = obj.offsetParent;
      while((objParent != null) && (objParent.tagName.toUpperCase() != "BODY") )
      {
        objLeft  += objParent.offsetLeft;
        objTop   += objParent.offsetTop;
        objParent = objParent.offsetParent;
      }
      objHeight = obj.offsetHeight;
      objWidth = obj.offsetWidth;

      if(( overDiv.offsetLeft + overDiv.offsetWidth ) <= objLeft );
      else if(( overDiv.offsetTop + overDiv.offsetHeight ) <= objTop );
      else if( overDiv.offsetTop >= ( objTop + objHeight ));
      else if( overDiv.offsetLeft >= ( objLeft + objWidth ));
      else
      {
        obj.style.visibility = "hidden";
      }
    }
  }
}

/*
* unhides <select> and <applet> objects (for IE only)
*/
function showElement( elmID )
{
  if( ie )
  {
    for( i = 0; i < document.all.tags( elmID ).length; i++ )
    {
      obj = document.all.tags( elmID )[i];

      if( !obj || !obj.offsetParent )
      {
        continue;
      }
      obj.style.visibility = "";
    }
  }
}

function HolidayRec (d, m, y, desc)
{
  this.d = d
  this.m = m
  this.y = y
  this.desc = desc
}

var HolidaysCounter = 0
var Holidays = new Array()

function addHoliday (d, m, y, desc)
{
  Holidays[HolidaysCounter++] = new HolidayRec ( d, m, y, desc )
}

if (dom)
{
  document.write ("<div onclick='bShow=true' id='calendar'  style='z-index:+999;position:absolute;visibility:hidden;'><table  class='buyNow'><tr><td><table  width='100%'><tr class='buyNow'><td><B><span id='caption'></span></B></td><td align=right><a href='javascript:hideCalendar()' onMouseOver='window.status=\"Close the Calendar\"; return true;' onMouseOut='window.status=\"\"'><IMG SRC='"+imgDir+"calendar_close.gif' WIDTH='15' HEIGHT='13' BORDER='0' ALT='Close the Calendar'></a></td></tr></table></td></tr><tr><td style='padding:5px' bgcolor=#ffffff><span id='content'></span></td></tr>")

  if (showToday==1)
  {
    document.write ("<tr bgcolor=#f0f0f0><td style='padding:5px' align=center><span id='lblToday'></span></td></tr>")
  }

  document.write ("</table></div><div id='selectMonth' style='z-index:+999;position:absolute;visibility:hidden;'></div><div id='selectYear' style='z-index:+999;position:absolute;visibility:hidden;'></div>");
}

var  monthName =  new Array("January","February","March","April","May","June","July","August","September","October","November","December")
var  monthName2 = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC")
if (startAt==0)
{
  dayName = new Array  ("Sun","Mon","Tue","Wed","Thu","Fri","Sat")
}
else
{
  dayName = new Array  ("Mon","Tue","Wed","Thu","Fri","Sat","Sun")
}
var  styleAnchor="text-decoration:none;color:black;"
var  styleLightBorder="border-style:none"

function swapImage(srcImg, destImg){
  if (ie)  { document.getElementById(srcImg).setAttribute("src",imgDir + destImg) }
}

function init()  {
  if (!ns4)
  {
    crossobj=(dom)?document.getElementById("calendar").style : ie? document.all.calendar : document.calendar
    hideCalendar()

    crossMonthObj=(dom)?document.getElementById("selectMonth").style : ie? document.all.selectMonth  : document.selectMonth

    crossYearObj=(dom)?document.getElementById("selectYear").style : ie? document.all.selectYear : document.selectYear

    monthConstructed=false;
    yearConstructed=false;

    if (showToday==1)
    {
      document.getElementById("lblToday").innerHTML =  todayString + " <a href='javascript:monthSelected=monthNow;yearSelected=yearNow;constructCalendar();' onMouseOver='window.status=\""+gotoString+"\"; return true;' onMouseOut='window.status=\"\"' title='"+gotoString+"return true;' style='"+styleAnchor+"' >"+dayName[(today.getDay()-startAt==-1)?6:(today.getDay()-startAt)]+", " + dateNow + " " + monthName[monthNow].substring(0,3)  + "  " +  yearNow  + "</a>"
    }

    sHTML1="<span id='spanLeft'  style='cursor:pointer' onMouseOver='swapImage(\"changeLeft\",\"calendar_left.gif\");this.style.borderColor=\"#88AAFF\";window.status=\""+scrollLeftMessage+"\";return true;' onclick='javascript:decMonth()' onMouseOut='clearInterval(intervalID1);swapImage(\"changeLeft\",\"calendar_left.gif\");this.style.borderColor=\"#3366FF\";window.status=\"\"' onmousedown='clearTimeout(timeoutID1);timeoutID1=setTimeout(\"StartDecMonth()\",500)'  onmouseup='clearTimeout(timeoutID1);clearInterval(intervalID1)'>&nbsp<IMG id='changeLeft' SRC='"+imgDir+"calendar_left.gif' BORDER=0>&nbsp</span>&nbsp;"
    sHTML1+="<span id='spanRight' style='cursor:pointer' onMouseOver='swapImage(\"changeRight\",\"calendar_right.gif\");this.style.borderColor=\"#88AAFF\";window.status=\""+scrollRightMessage+"\";return true;' onMouseOut='clearInterval(intervalID1);swapImage(\"changeRight\",\"calendar_right.gif\");this.style.borderColor=\"#3366FF\";window.status=\"\"' onclick='incMonth()' onmousedown='clearTimeout(timeoutID1);timeoutID1=setTimeout(\"StartIncMonth()\",500)'  onmouseup='clearTimeout(timeoutID1);clearInterval(intervalID1)'>&nbsp<IMG id='changeRight' SRC='"+imgDir+"calendar_right.gif' BORDER=0>&nbsp</span>&nbsp"
    sHTML1+="<span id='spanMonth' style='cursor:pointer' onMouseOver='swapImage(\"changeMonth\",\"calendar_drop.gif\");this.style.borderColor=\"#88AAFF\";window.status=\""+selectMonthMessage+"\";return true;' onMouseOut='swapImage(\"changeMonth\",\"calendar_drop.gif\");this.style.borderColor=\"#3366FF\";window.status=\"\"' onclick='popUpMonth()'></span>&nbsp;"
    sHTML1+="<span id='spanYear' style='cursor:pointer' onMouseOver='swapImage(\"changeYear\",\"calendar_drop.gif\");this.style.borderColor=\"#88AAFF\";window.status=\""+selectYearMessage+"\";return true;'  onMouseOut='swapImage(\"changeYear\",\"calendar_drop.gif\");this.style.borderColor=\"#3366FF\";window.status=\"\"'  onclick='popUpYear()'></span>&nbsp;"

    document.getElementById("caption").innerHTML  =  sHTML1

    bPageLoaded=true
  }
}

function hideCalendar()  {
  crossobj.visibility="hidden"
  if (crossMonthObj != null){crossMonthObj.visibility="hidden"}
  if (crossYearObj !=  null){crossYearObj.visibility="hidden"}

  showElement( 'SELECT' );
  showElement( 'APPLET' );

  if((d1!=null) && (m1!=null)){
    var dDate = new Date(yearSelected,monthSelected,dateSelected+numUpdateCalDayMod);
    setValue( d1, dDate.getDate());
    setValue( m1, dDate.getMonth()+1);
  }
}

function padZero(num) {
  return (num  < 10)? '0' + num : num ;
}

function constructDate(d,m,y)
{
  sTmp = dateFormat
  sTmp = sTmp.replace  ("dd","<e>")
  sTmp = sTmp.replace  ("d","<d>")
  sTmp = sTmp.replace  ("<e>",padZero(d))
  sTmp = sTmp.replace  ("<d>",d)
  sTmp = sTmp.replace  ("mmmm","<p>")
  sTmp = sTmp.replace  ("mmm","<o>")
  sTmp = sTmp.replace  ("mm","<n>")
  sTmp = sTmp.replace  ("m","<m>")
  sTmp = sTmp.replace  ("<m>",m+1)
  sTmp = sTmp.replace  ("<n>",padZero(m+1))
  sTmp = sTmp.replace  ("<o>",monthName[m])
  sTmp = sTmp.replace  ("<p>",monthName2[m])
  sTmp = sTmp.replace  ("yyyy",y)
  return sTmp.replace ("yy",padZero(y%100))
}

function closeCalendar() {
  hideCalendar();
  setValue(d0, dateSelected);
  setValue(m0, monthSelected+1);
}

/*** Month Pulldown  ***/

function StartDecMonth()
{
  intervalID1=setInterval("decMonth()",80)
}

function StartIncMonth()
{
  intervalID1=setInterval("incMonth()",80)
}

function incMonth () {
  if(gMaxMonth>monthSelected || gMaxYear>yearSelected ) {
    monthSelected++
    if (monthSelected>11) {
      monthSelected=0
      yearSelected++
      if(yearSelected>=(today.getFullYear()+gNumYears)){
        yearSelected = (today.getFullYear()+(gNumYears-1));
        monthSelected=11;
      }
    }
    adjustSelectedWithMaxDate();
    constructCalendar();
  }
}

function decMonth () {
  if(monthSelected>gMinMonth || yearSelected>gMinYear){
    monthSelected--
    if (monthSelected<0) {
      monthSelected=11
      yearSelected--
    }
    adjustSelectedWithMinDate();
    constructCalendar();
  }
}
  
//Adjust the selected date vs minimum date
function adjustSelectedWithMinDate()
{
  if(yearSelected<=gMinYear){
    yearSelected = gMinYear;
    if(monthSelected<gMinMonth){
      monthSelected = gMinMonth;
    }
  }
}
  
//Adjust the selected date vs maximum date
function adjustSelectedWithMaxDate()
{ 
  if(yearSelected>=gMaxYear){
    yearSelected = gMaxYear;
    if(monthSelected>gMaxMonth){
      monthSelected = gMaxMonth;
    }
  }
}

function constructMonth() {
  popDownYear()
  var iStart=0;
  var iEnd=12;
  if(yearSelected==gMinYear){
    iStart = gMinMonth;
  }
  sHTML =  ""
  for  (i=iStart; i<iEnd; i++) {
    sName =  monthName[i];
    if (i==monthSelected) {
      sName =  "<B>" +  sName +  "</B>"
    }
    sHTML += "<tr><td id='m" + i + "' onMouseOver='this.style.backgroundColor=\"#FFCC99\"' onMouseOut='this.style.backgroundColor=\"\"' style='cursor:pointer' onclick='monthConstructed=false;monthSelected=" + i + ";constructCalendar();popDownMonth();event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>"
  }

  document.getElementById("selectMonth").innerHTML = "<table width=70  style='font-family:arial; font-size:11px; border-width:1; border-style:solid;' bgcolor='#FFFFDD' cellspacing=0 onMouseOver='clearTimeout(timeoutID1)'  onMouseOut='clearTimeout(timeoutID1);timeoutID1=setTimeout(\"popDownMonth()\",100);event.cancelBubble=true'>" +  sHTML +  "</table>"
  monthConstructed=true
}

function popUpMonth() {
  constructMonth()
  crossMonthObj.visibility = (dom||ie)? "visible"  : "show"
  crossMonthObj.left = parseInt(crossobj.left) + 50
  crossMonthObj.top =  parseInt(crossobj.top) + 26
  hideElement( 'SELECT', document.getElementById("selectMonth") );
}

function popDownMonth()  {
  crossMonthObj.visibility= "hidden"
}

/*** Year Pulldown ***/

function incYear() 
{
  for (i=0; i<7; i++) {
    newYear  = (i+nStartingYear)+1
    if (newYear==yearSelected) {
      txtYear =  "&nbsp;<B>"  + newYear +  "</B>&nbsp;";
    }
    else {
      txtYear =  "&nbsp;" + newYear + "&nbsp;";
    }
    document.getElementById("y"+i).innerHTML = txtYear
  }
  nStartingYear ++;
  bShow=true
}

function decYear() 
{
  for  (i=0; i<7; i++)
  {
    newYear  = (i+nStartingYear)-1
    if (newYear==yearSelected) {
      txtYear =  "&nbsp;<B>"  + newYear +  "</B>&nbsp;" 
    }
    else {
      txtYear =  "&nbsp;" + newYear + "&nbsp;" 
    }
    document.getElementById("y"+i).innerHTML = txtYear
  }
  nStartingYear --;
  bShow=true
}

function selectYear(nYear) {
  yearSelected=parseInt(nYear+nStartingYear);
  yearConstructed=false;
  adjustSelectedWithMinDate()
  adjustSelectedWithMaxDate()
  constructCalendar()
  popDownYear()
}

function constructYear() {
  popDownMonth()
  sHTML =  ""
  if (!yearConstructed) {

    // Commented out to prevent - Year option -=ben
    //sHTML =  "<tr><td align='center'  onMouseOver='this.style.backgroundColor=\"#FFCC99\"' onMouseOut='clearInterval(intervalID1);this.style.backgroundColor=\"\"' style='cursor:pointer'  onmousedown='clearInterval(intervalID1);intervalID1=setInterval(\"decYear()\",30)' onmouseup='clearInterval(intervalID1)'>-</td></tr>"

    j =  0
    // Modified to only Show this Year + 3 more years -=ben
    //nStartingYear =  yearSelected-3; // old
    nStartingYear =  gMinYear // new
    //for  (i=(yearSelected-3); i<=(yearSelected+3); i++) { // old
    for  (i=nStartingYear; i<(nStartingYear+gNumYears); i++) { // new
      sName =  i;
      if (i==yearSelected){
        sName =  "<B>" +  sName +  "</B>"
      }
      sHTML += "<tr><td id='y" + j + "' onMouseOver='this.style.backgroundColor=\"#FFCC99\"' onMouseOut='this.style.backgroundColor=\"\"' style='cursor:pointer' onclick='selectYear("+j+");event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>"
      j ++;
    }

    // Commented out to prevent + Year option -=ben
    //sHTML += "<tr><td align='center' onMouseOver='this.style.backgroundColor=\"#FFCC99\"' onMouseOut='clearInterval(intervalID2);this.style.backgroundColor=\"\"' style='cursor:pointer' onmousedown='clearInterval(intervalID2);intervalID2=setInterval(\"incYear()\",30)'  onmouseup='clearInterval(intervalID2)'>+</td></tr>"

    document.getElementById("selectYear").innerHTML  = "<table width=44 style='font-family:arial; font-size:11px; border-width:1; border-style:solid;'  bgcolor='#FFFFDD' onMouseOver='clearTimeout(timeoutID2)' onMouseOut='clearTimeout(timeoutID2);timeoutID2=setTimeout(\"popDownYear()\",100)' cellspacing=0>"  + sHTML  + "</table>"
    yearConstructed  = true
  }
}

function popDownYear() {
  clearInterval(intervalID1)
  clearTimeout(timeoutID1)
  clearInterval(intervalID2)
  clearTimeout(timeoutID2)
  crossYearObj.visibility= "hidden"
}

function popUpYear() {
  constructYear()
  crossYearObj.visibility  = (dom||ie)? "visible" : "show"
  var leftOffset = 
    parseInt(crossobj.left)+document.getElementById("spanYear").offsetLeft + 10;
  if (ie)
  {
    leftOffset += 6
  }
  crossYearObj.left =  leftOffset
  crossYearObj.top = parseInt(crossobj.top) +  26
}

/*** calendar ***/
 function WeekNbr(n) {
    // Algorithm used:
    // From Klaus Tondering's Calendar document (The Authority/Guru)
    // hhtp://www.tondering.dk/claus/calendar.html
    // a = (14-month) / 12
    // y = year + 4800 - a
    // m = month + 12a - 3
    // J = day + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045
    // d4 = (J + 31741 - (J mod 7)) mod 146097 mod 36524 mod 1461
    // L = d4 / 1460
    // d1 = ((d4 - L) mod 365) + L
    // WeekNumber = d1 / 7 + 1

    year = n.getFullYear();
    month = n.getMonth() + 1;
    if (startAt == 0) {
       day = n.getDate() + 1;
    }
    else {
       day = n.getDate();
    }

    a = Math.floor((14-month) / 12);
    y = year + 4800 - a;
    m = month + 12 * a - 3;
    b = Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400);
    J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
    d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
    L = Math.floor(d4 / 1460);
    d1 = ((d4 - L) % 365) + L;
    week = Math.floor(d1/7) + 1;
    return week;
 }

function constructCalendar () {
  var aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31)
  var dateMessage
  var startDate = new Date(yearSelected,monthSelected,1)
  var numDaysInMonth;
    
  if (monthSelected==1) // February leap year check
  {
    var endDate  = new Date (yearSelected,monthSelected+1,1);
    endDate  = new Date (endDate  - (24*60*60*1000));
    numDaysInMonth = endDate.getDate()
  }
  else
  {
    numDaysInMonth = aNumDays[monthSelected];
  }

  datePointer  = 0
  dayPointer = startDate.getDay() - startAt

  if (dayPointer<0)
  {
    dayPointer = 6
  }

  sHTML =  "<table name='mainCalendarTable' border=0 style='font-family:verdana;font-size:10px;'><tr>"

  if (showWeekNumber==1)
  {
    sHTML += "<td width=20><b>" + weekString + "</b></td><td width=1 rowspan=7 bgcolor='#d0d0d0' style='padding:0px'><img src='"+imgDir+"divider.gif' width=1></td>"
  }

  for  (i=0; i<7; i++)  {
    sHTML += "<td width='20' align='right'><B><font color='red'>"+ dayName[i]+"</font></B></td>"
  }
  sHTML +="</tr><tr>"

  if (showWeekNumber==1)
  {
    sHTML += "<td align=right>" + WeekNbr(startDate) + "&nbsp;</td>"
  }

  for  ( var i=1; i<=dayPointer;i++ )
  {
    sHTML += "<td>&nbsp;</td>"
  }

  for( datePointer=1; datePointer<=numDaysInMonth; datePointer++ )
  {
    dayPointer++;
    sHTML += "<td align=right>"
    sStyle=styleAnchor
    if ((datePointer==odateSelected) &&  (monthSelected==omonthSelected)  && (yearSelected==oyearSelected))
    { sStyle+=styleLightBorder }

    sHint = ""
    for (k=0;k<HolidaysCounter;k++)
    {
      if ((parseInt(Holidays[k].d)==datePointer)&&(parseInt(Holidays[k].m)==(monthSelected+1)))
      {
        if ((parseInt(Holidays[k].y)==0)||((parseInt(Holidays[k].y)==yearSelected)&&(parseInt(Holidays[k].y)!=0)))
        {
          sStyle+="background-color:#FFDDDD;"
          sHint+=sHint==""?Holidays[k].desc:"\n"+Holidays[k].desc
        }
      }
    }

    var regexp= /\"/g
    sHint=sHint.replace(regexp,"&quot;")

    dateMessage = "onMouseOver='window.status=\""+selectDateMessage.replace("[date]",constructDate(datePointer,monthSelected,yearSelected))+"\";return true;' onMouseOut='window.status=\"\"' "

    // -- START CHANGES -=ben
    var sJScriptLink = "href='javascript:dateSelected="+datePointer+";closeCalendar();'";
    var sColor = "";
    var bAllowDay=true;
    if( (datePointer<gMinDate && monthSelected<=gMinMonth && yearSelected<=gMinYear) ||
        (datePointer>gMaxDate && monthSelected>=gMaxMonth && yearSelected>=gMaxYear) ){
      dateMessage = "onMouseOver='window.status=\"Can not select this day.\";return true;' onMouseOut='window.status=\"\"' ";
      sJScriptLink = "";
      bAllowDay=false;
    }

    if ((datePointer==dateNow)&&(monthSelected==monthNow)&&(yearSelected==yearNow)){
      // Selected
      //sHTML += "<b><a "+dateMessage+" title=\"" + sHint + "\" style='"+sStyle+"' "+sJScriptLink+">&nbsp;<font color=#ff0000>" + datePointer + "</font>&nbsp;</a></b>"
      sColor="#ff0000";
    }else if  (dayPointer % 7 == (startAt * -1)+1){
      // Sunday
       //sHTML += "<a "+dateMessage+" title=\"" + sHint + "\" style='"+sStyle+"' "+sJScriptLink+">&nbsp;<font color=#909090>" + datePointer + "</font>&nbsp;</a>"
       sColor="#0000aa";
    }else{
      // Any other Day
      //sHTML += "<a "+dateMessage+" title=\"" + sHint + "\" style='"+sStyle+"' "+sJScriptLink+">&nbsp;" + datePointer + "&nbsp;</a>"
      sColor="0";
    }

    if(!bAllowDay){
      sColor = "#B0B0B0";
    }

    sHTML += "<a "+dateMessage+" title=\"" + sHint + "\" style='"+sStyle+"' "+sJScriptLink+"><font color='"+sColor+"'>" + datePointer + "</font></a>"
    // --- END CHANGES


    sHTML += ""
    if ((dayPointer+startAt) % 7 == startAt) {
      sHTML += "</tr><tr>"
      if ((showWeekNumber==1)&&(datePointer<numDaysInMonth))
      {
        sHTML += "<td align=right>" + (WeekNbr(new Date(yearSelected,monthSelected,datePointer+1))) + "&nbsp;</td>"
      }
    }
  }

  document.getElementById("content").innerHTML   = sHTML
  document.getElementById("spanMonth").innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;" +  monthName[monthSelected].substring(0, 3) + "&nbsp;<IMG id='changeMonth' SRC='"+imgDir+"calendar_drop.gif' BORDER=0>"
  document.getElementById("spanYear").innerHTML =  "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + yearSelected  + "&nbsp;<IMG id='changeYear' SRC='"+imgDir+"calendar_drop.gif' BORDER=0>"
}

// Added to handle opening on a given date -=ben
function popUpCalendar2(ctl, day0, month0, format)
{
  var inDate = getDate( day0, month0);
  setDate(inDate.getMonth(), inDate.getDate(), inDate.getFullYear());
  odateSelected=dateSelected=inDate.getDate();
  omonthSelected=monthSelected=inDate.getMonth();
  oyearSelected=yearSelected=inDate.getFullYear()
  popUpCalendar(ctl, day0, month0, format);
}

// Added to handle opening but first grabbing the date from ctl -=ben
function popUpCalendar3(ctl, day0,month0, format)
{
  var dDate = new Date();
  dDate.setDate(dDate.getDate() + 5);
  gMinDate=dDate.getDate();
  gMinMonth=dDate.getMonth();
  gMinYear=dDate.getFullYear();
  popUpCalendar2(ctl,day0,month0,format);
}

// Added to grab min dates from text box control -=ben
function popUpCalendar4(ctl, day0, month0, format, day1, month1, roundtrip, y){
  fixedY = y; 
  if (!roundtrip.checked) return;
  numUpdateCalDayMod = 0;
  
  if((day1 != null)&&(month1 != null)){ 
    var date1 = getDate( day1, month1 );
    gMinDate=date1.getDate();
    gMinMonth=date1.getMonth();
    gMinYear=date1.getFullYear();
  }
  else {
    var dDate = new Date();
    dDate.setDate(dDate.getDate() + 5);
    gMinDate=dDate.getDate();
    gMinMonth=dDate.getMonth();
    gMinYear=dDate.getFullYear();   
  }
  popUpCalendar2(ctl,day0,month0,format);
}

function popUpCalendar5(ctl, day0, month0, format, day1, month1, numDayMod, y)
{
  fixedY = y; 
  d1 = day1;
  m1 = month1;
  numUpdateCalDayMod = numDayMod;
  var dDate = new Date();
  dDate.setDate(dDate.getDate() + 5);
  gMinDate=dDate.getDate();
  gMinMonth=dDate.getMonth();
  gMinYear=dDate.getFullYear();
  popUpCalendar2(ctl,day0,month0,format);
}

function popUpCalendar6(ctl, day, month, format, day1, month1)
{ 
  // I need the start day to be set to month1 and day1 + one day
  numUpdateCalDayMod = 0;
  var lowDate = getDate(day1, month1, 1); // 1 for next day 
  gMinDate =lowDate.getDate();
  gMinMonth=lowDate.getMonth();
  gMinYear=lowDate.getFullYear();
  // I need the popup to the right-down of control
  var nextTag= ctl;
  var elementPosX=0;
  var elementPosY=0;

  do
  {
    nextTag = nextTag.offsetParent;
    elementPosX += nextTag.offsetLeft;
    elementPosY += nextTag.offsetTop;
  } while(nextTag.tagName!="BODY");

  var formPosX = ctl.offsetLeft;
  var formPosY = ctl.offsetTop;	
    
  fixedX = formPosX + elementPosX -120;	// go left
  if( fixedX < 0 ) fixedX = 0;
  else if( fixedX > 178)  fixedX = 178;
  fixedY = formPosY + elementPosY + ctl.offsetHeight-60;  // go up

  // Call the callendar to display
  popUpCalendar2(ctl,day,month,format);
}


function popUpCalendar7(ctl, dayCtr, monthCtr, format, minDays, maxDays)
{
  var dDate = new Date();
  dDate.setDate(dDate.getDate() + minDays);
  gMinDate=dDate.getDate();
  gMinMonth=dDate.getMonth();
  gMinYear=dDate.getFullYear();
  dDate.setDate(dDate.getDate() + maxDays - minDays);
  gMaxDate=dDate.getDate();
  gMaxMonth=dDate.getMonth();
  gMaxYear=dDate.getFullYear();
  
  popUpCalendar2(ctl, dayCtr, monthCtr, format);
}

function setDate(month, day, year){
  dateNow   = day;
  monthNow = month;
  yearNow   = year;
}

/**
 * popUpCalendar - displays calendar sub-window with predefined values
 * minimumDate - (global) is a minimal date that can be selected 
 * 
 * PARAMETERS
 * ctl       : DHTML tag that trrigered this call
 * dayCtr    : DHTML control that has day (1-based) value
 * monthCtr  : DHTML control that has month (1-based) value
 * format    : string value for the date format used internaly
 */
function popUpCalendar(ctl, dayCtr, monthCtr, format ) 
{
  if( bPageLoaded ) // if page has not been loaded do nothing
  { 
    if( crossobj.visibility ==  "hidden" ) { // calendar is not displayed
      // saves the global parameters
      d0 = dayCtr;
      m0 = monthCtr;
      dateFormat=format;
      
      // sets selected date
      var inDate = getDate(dayCtr, monthCtr);
      odateSelected=dateSelected = inDate.getDate();
      omonthSelected=monthSelected = inDate.getMonth();
      oyearSelected=yearSelected = inDate.getFullYear();

      var point = getPosition(ctl);
      crossobj.left = fixedX==-1 ? ctl.offsetLeft + point.x - 40:  fixedX;
      crossobj.top = fixedY==-1 ?  ctl.offsetTop + point.y + ctl.offsetHeight - 40:  fixedY
      adjustSelectedWithMinDate()
      adjustSelectedWithMaxDate()
      constructCalendar();
      crossobj.visibility=(dom||ie)? "visible" : "show"
      hideElement( 'SELECT', document.getElementById("calendar") );
      bShow = true;
    }
    else
    { // calendar is displayed - hide old calendar to display a new one
      hideCalendar();
      if( ctlNow!=ctl ){
        popUpCalendar(ctl, dayCtr, monthCtr);
      }
    }
    ctlNow = ctl
  }
}
  
// Get date based on the month and day controls values
// Assumes that month is 1-based in the selection control
// 3rd argument is optional number of days ahead 
function getDate( dayCtr, monthCtr )
{
  var addDays = parseInt(getDate.arguments[2]);
  var now = new Date();
  var year = now.getFullYear();
  var month = parseInt(getValue(monthCtr));
  var day = parseInt(getValue(dayCtr));
  
  if( month==null || isNaN(month) || day==null || isNaN(day) ) {
    month = now.getMonth();
    day = now.getDate();
  }  
  else {
    // adjust the month and date
    month--; // 1-based to 0-based
  
    if( (month < now.getMonth()) || 
       ((month == now.getMonth()) && ( day< now.getDate() )) ) {
      year++;
    }
  }
  if( !isNaN(addDays) ) {
    day = parseInt(day) + addDays;
  }
  return new Date(year, month, day);
}

// Retrives the "single value control" value
function getValue( ctr )
{
  if(ctr==null) return ctr; // sanity check
  // Test if ctr is a "select-one" or a text input
  var index=ctr.selectedIndex;
  return (index==null)? ctr.value: ctr.options[index].value;
}
  
// Sets the "single value control" value
function setValue( ctr, value )
{
  if(ctr==null) return; // sanity check
  if( ctr.type == "text") {
    ctr.value = value;
  }
  else if(ctr.type == "select-one") {
    // find the right index for the value
    var indexFound = false;
    for( var i=0; i< ctr.options.length; i++) {
      if( ctr.options[i].value==value) {
        ctr.options[i].selected = true;
        indexFound = true;
      }
    }
    // if no index found select the option at index zero
    if(!indexFound && ctr.options.length>0) {
     ctr.options[0].selected = true;
    }
  }
}

// Get the element position point
function getPosition(element)
{
  var point={ x:0, y:0 };
  for( var e=element; e ; e=e.offsetParent ) {
    point.x += e.offsetLeft;
    point.y += e.offsetTop;
  }
  // loop up through the ancestors to find out any scroll set
  for( var e=element; e && e!=document.body; e=e.parentNode) {
    if( e.scrollLeft ) point.x -= e.scrollLeft;
    if( e.scrollTop )  point.y -= e.scrollTop;
  }
  return point;
}
  
document.onkeypress = function hidecal1 (e) {
  //distinguish between IE's explicit event object (window.event) 
  // and Firefox's implicit one
  var evtobj = window.event? event : e;  
  if (evtobj.keyCode == 27) {
    hideCalendar()
  }
}

document.onclick = function hidecal2 () {
  if (!bShow) {
    hideCalendar()
  }
  bShow = false
}

init();  // initialize calendar
