
/*
 * Global variables.
 ********************************************************/
var CalTextElement;
var CalDisplayElement;
var IsCalDisplayed  = false;
var SelectedDay     = new Date();

var DayHoverBg      = '#000000';
var DayHoverFg      = '#FFFFFF';

var CalPositionX    = 5;
var CalPositionY    = 5;


/*
 * Shows embedded calendar by unhiding the element in
 * which it is containted.
 ********************************************************/
function showCalendar(posX, posY)
{
    if (!CalTextElement || !CalDisplayElement) {
        alert("Invalid element(s) passed to showCalendar().");
        return;
    }

    CalPositionX = posX;
    CalPositionY = posY;

    /*
    if (document.documentElement.scrollTop) {
        CalPositionY += document.documentElement.scrollTop;

    } else if (document.body.scrollTop) {
        CalPositionY += document.body.scrollTop;

    } else if (window.pageYOffset) {
        CalPositionY += window.pageYOffset;
    }
    */

    showMonth(-1,-1);

    if (IsCalDisplayed) {
        hideCalendar();
        return;
    }

    IsCalDisplayed = true;
    CalDisplayElement.style.display = 'block';

    //startFadeIn(calendarFadeInObject);
}

/*
 * Hides embedded calendar by hiding the element in
 * which it is contained.
 ********************************************************/
function hideCalendar()
{
    if (CalDisplayElement == null)
        return;

    IsCalDisplayed = false;
    
    //startFadeOut(calendarFadeOutObject);
    CalDisplayElement.style.display = 'none';
}

/*
 * Write embedded HTML for showing calendar object.
 ********************************************************/
function showMonth(inMonth,inYear)
{
    var month = inMonth;
    var year  = inYear;

    if (inMonth < 0 && inYear < 0) {
        month = SelectedDay.getMonth();
        year  = SelectedDay.getFullYear();
    }

    if (!CalDisplayElement)
        return;

    var monthName = getMonthString(month);
    var prevMonth = month - 1;
    var nextMonth = month + 1;
    var prevYear = year;
    var nextYear = year;

    if (month == 0) {
        prevMonth = 11;
        prevYear--;
    }

    if (month == 11) {
        nextMonth = 0;
        nextYear++;
    }

    var html = "\
      <table id=\"monthTable\" style=\"z-index:1000;position:absolute;top:"+CalPositionY+"px;left:"+CalPositionX+"px;\" cellpadding=\"0\" cellspacing=\"0\"> \
      <tr> \
        <td class=\"topRow\" colspan=\"6\"> \
          <select id=\"monthSelector\" onchange=\"showMonth(this.selectedIndex,"+year+");\">";

    for (m=0; m<12; m++) {
        mName = getAbbrMonthString(m);
        html += "<option value=\""+m+"\"";
        if (m == month) {
            html += " selected";
        }
        html += ">"+mName+"</option>";
    }

    html += "\
          </select> \
          <select id=\"yearSelector\" \
                  onchange=\"showMonth("+month+",new Number(this.options[this.selectedIndex].value));\">";

    for (y=(year-20); y<=(year+20); y++) {
        html += "<option value=\""+y+"\"";
        if (y == year) {
            html += " selected";
        }
        html += ">"+y+"</option>";
    }

    html += "\
          </select> \
        </td> \
        <td class=\"topRow\" colspan=\"1\"> \
          <a href=\"javascript:hideCalendar();\"><img id=\"xImg\" src=\"images/close.gif\" style=\"float:right;\"></a> \
        </td> \
      </tr> \
      <tr> \
        <td class=\"monthNameRow\" colspan=\"1\" style=\"text-align:left;letter-spacing:0px;\"> \
          <a href=\"javascript:showMonth("+prevMonth+","+prevYear+");\"><img src=\"images/left.gif\"></a></td> \
        <td class=\"monthNameRow\" colspan=\"5\" style=\"font-weight:bold;\">"+monthName+", "+year+"</td> \
        <td class=\"monthNameRow\" colspan=\"1\" style=\"text-align:right;letter-spacing:0px;\"> \
          <a href=\"javascript:showMonth("+nextMonth+","+nextYear+");\"><img src=\"images/right.gif\"></a></td> \
      </tr> \
      <tr> \
        <td class=\"dayNameRow\">Sun</td> \
        <td class=\"dayNameRow\">Mon</td> \
        <td class=\"dayNameRow\">Tue</td> \
        <td class=\"dayNameRow\">Wed</td> \
        <td class=\"dayNameRow\">Thu</td> \
        <td class=\"dayNameRow\">Fri</td> \
        <td class=\"dayNameRow\">Sat</td> \
      </tr> \
      <tr> \
      ";

    var monthDays = getMonthDays(month,year);
    var firstDay  = new Date((month+1)+'/'+'1'+'/'+year);
    var weekDay   = firstDay.getDay();

    for (d=0; d<weekDay; d++) {
        html += "<td class=\"blankDay\">&nbsp;</td>";
    }

    var day = 1;
    for (d=weekDay; d<(monthDays+weekDay); d++) {

        var tagID = '';
        if (SelectedDay.getDate() == day &&
            SelectedDay.getMonth() == month &&
            SelectedDay.getFullYear() == year)
        {
            tagID = 'id=today';
        }

        html += "<td class=\"weekDay\" "+tagID+" \
                     onClick=\"selectDay("+day+","+month+","+year+");\" \
                     onMouseOver=\"dayHoverOn(this);\" \
                     onMouseOut=\"dayHoverOff(this);\">"+day+"</td>";

        day++;

        if (((d+1)%7) == 0)
            html += "</tr><tr>";
    }

    for (d=(((d%7)==0)?7:(d%7)); d<7; d++) {
        html += "<td class=\"blankDay\">&nbsp;</td>";
    }

    html += "</tr></center>";

    CalDisplayElement.innerHTML = html;
}

/*
 * What happens when a day is clicked.
 ********************************************************/
function selectDay(day,month,year)
{
    if (!CalTextElement)
        return;

    var dateString = day + ' ' + getMonthString(month) + ' ' + year;
    SelectedDay = new Date(dateString);
    CalTextElement.value = dateString;
    hideCalendar();
}

/*
 * What happens when a cell is highlighted.
 ********************************************************/
function dayHoverOn(cell)
{
    if (cell == null)
        return;

    cell.style.backgroundColor = DayHoverBg;
    cell.style.color = DayHoverFg;
}

/*
 * Resets the hover attributes.
 ********************************************************/
function dayHoverOff(cell)
{
    if (cell == null)
        return;

    cell.style.backgroundColor = '';
    cell.style.color = '';
}

/*
 * Converts a month number (1-11) to a month string.
 ********************************************************/
function getMonthString(monthNum)
{
    switch (monthNum) {
        case 0:  return "January";
        case 1:  return "February";
        case 2:  return "March";
        case 3:  return "April";
        case 4:  return "May";
        case 5:  return "June";
        case 6:  return "July";
        case 7:  return "August";
        case 8:  return "September";
        case 9:  return "October";
        case 10: return "November";
        case 11: return "December";
        default: return "";
    }
}

/*
 * Converts a month number (1-11) to an abbr. string.
 ********************************************************/
function getAbbrMonthString(monthNum)
{
    switch (monthNum) {
        case 0:  return "JAN";
        case 1:  return "FEB";
        case 2:  return "MAR";
        case 3:  return "APR";
        case 4:  return "MAY";
        case 5:  return "JUN";
        case 6:  return "JUL";
        case 7:  return "AUG";
        case 8:  return "SEP";
        case 9:  return "OCT";
        case 10: return "NOV";
        case 11: return "DEC";
        default: return "";
    }
}

/*
 * Determines how many days are in a given month.
 ********************************************************/
function getMonthDays(monthNum,year)
{
    var monthDays = 31;

    if (monthNum == 3 || monthNum == 5 || monthNum == 7 || monthNum == 10)
        monthDays = 30;

    if (monthNum == 1) {
        monthDays = 28;
        if (isLeapYear(year))
            monthDays++
    }

    return monthDays;
}

/*
 * Determines if the input year is a leap year.
 ********************************************************/
function isLeapYear(year)
{
    return (((year%4)==0 && (year%100)!=0) || (year%400)==0);
}
