var CAL_MONTHS = new Array('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December');
//var CAL_HOURS_IN_DAY = new Array('midnight','1 am','2 am','3 am','4 am','5 am','6 am','7 am','8 am','9 am','10 am','11 am','noon','1 pm','2 pm','3 pm','4 pm','5 pm','6 pm','7 pm','8 pm','9 pm','10 pm','11 pm');
var CAL_HOURS_IN_DAY = new Array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23');

var CAL_DAYS_OF_WEEK = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

function DateInput(formFieldName) {
    this.formFieldName = formFieldName;
    this.minYearInRange = new Date().getFullYear()-5;
    this.maxYearInRange = new Date().getFullYear()-5;
    this.bIncludeTime=false;
    this.defaultDate = new Date();
    this.onClickJSFunction = null;
    this.onChangeJSFunction = null;
}

DateInput.prototype.setShowDay = function(bShowDay) {
    this.showDay=bShowDay;
}

DateInput.prototype.draw = function() {
    drawDateInput(this.formFieldName,this.minYearInRange,this.maxYearInRange,this.bIncludeTime,this.defaultDate,this.onClickJSFunction,this.onChangeJSFunction)
}

// will draw a date input onto the screen, setting it to the defaultDate (if passed in) or the current date
// bIncludeTime to indicate whether to draw inputs for the time as well
// formName to indicate what String to use as the form field name base, in case of duplicates
// minYearInRange minimum year in the dropdown
// maxYearInRange maximum year in the dropdown
function drawDateInput(formFieldName,minYearInRange,maxYearInRange,bIncludeTime,defaultDate,onClickJSFunction,onChangeJSFunction) {

    var onClickStr='';
    if (onClickJSFunction != null) {
        onClickStr = ' onclick="' + onClickJSFunction + '" ';
    }

    var onChangeStr='';
    if (onChangeJSFunction != null) {
        onChangeStr = ' onchange="' + onChangeJSFunction + '" ';
    }

    /*  if no date, set to nothing
    if (defaultDate == null) {
        defaultDate = new Date();
    }
    */

    var theDay = (defaultDate != null ? defaultDate.getDate() : '');
    var theMonth = (defaultDate != null ? defaultDate.getMonth() : -1);
    var theYear = (defaultDate != null ? defaultDate.getFullYear() : '');

    var htmlStr = '<select name="' + formFieldName + 'Day" style="width:57px;"' + onClickStr + ' ' + onChangeStr + '><option value="">Day</option>';

    var maxDays = getMaxDaysInMonth(theYear, theMonth);
    for(var i=1; i <= maxDays; i++) {
        htmlStr += '<option value="' + i + '"';
        if (i == theDay) {
            htmlStr += ' selected ';
        }
        htmlStr += '>' + i + '</option>';
    }
    htmlStr += '</select>&nbsp;';

    htmlStr += '<select name="' +formFieldName + 'Month" onChange="calendarUpdateDays(\'' + formFieldName + '\')' + (onChangeJSFunction != null ? ', ' + onChangeJSFunction : '') + '" ' + onClickStr + ' ' + onChangeStr + '>' +
        '<option value="">Month</option>';
    for(var i=0; i < CAL_MONTHS.length;i++) {
        htmlStr += '<option value="' + i + '"';
        if (i == theMonth) {
            htmlStr += ' selected ';
        }
        htmlStr += '>' + CAL_MONTHS[i] + '</option>';
    }
    htmlStr += '</select>&nbsp;';

    htmlStr += '<select name="' +formFieldName + 'Year" onChange="calendarUpdateMonths(\'' + formFieldName + '\')' + (onChangeJSFunction != null ? ', ' + onChangeJSFunction : '') + '" ' + onClickStr + '>' +
        '<option value="">Year</option>';
    for (var i=minYearInRange;i<=maxYearInRange;i++) {
        htmlStr += '<option value="' + i + '"';
        if (i == theYear) {
            htmlStr += ' selected ';
        }
        htmlStr += '>' + i + '</option>';
    }
    htmlStr += '</select>';
    
    htmlStr += '&nbsp;<a href="javascript:showCalendar(\'' + formFieldName + '\');" ' + onClickStr + ' ' + onChangeStr + 
        '><img src="/images/icons/showCalendar.gif" border="0" align="absmiddle"></a>';


    // now check if we need to include the time selects too
    if (bIncludeTime) {
        var theHour;
        var dateHour;
        var ampm;
        var dateMinute;
        var timeToShow = '';
        if (defaultDate != null) {
            theHour = defaultDate.getHours();
            // HOURS, MINUTES
            // fill in with the time from the date:
            dateHour = defaultDate.getHours();
            ampm = (dateHour > 11 ? 'pm' : 'am');
            dateMinute = defaultDate.getMinutes();
            if (dateMinute < 10) {
                dateMinute = '0' + dateMinute;
            }
            if (dateHour > 12) {
                dateHour -= 12;
            }
            if (dateHour == 0) {
                dateHour = 12;
            }
            timeToShow = dateHour + ':' + dateMinute;
        }
        htmlStr += '<br><img src="/images/clear.gif" width="1" height="4"><br><input type="text" name="' +formFieldName + 'Hour" style="width:51px;" value="' + timeToShow + '" onblur="validateEnteredTime(this)"' + onClickStr + ' ' + onChangeStr + '>';
        htmlStr += '&nbsp;'
        
        //AM/PM
        htmlStr += '<select style="width:51px;" name="' +formFieldName + 'AMPM"' + onClickStr + ' ' + onChangeStr + '>';
        htmlStr += '<option value="am"' + (ampm == 'am' ? ' selected ' : '') + '>am</option>';
        htmlStr += '<option value="pm"' + (ampm == 'pm' ? ' selected ' : '') + '>pm</option>';
        htmlStr += '</select>&nbsp;';

        //TIME ZONE
        /*
        htmlStr += '<select name="' + formFieldName + 'TimeZone"' + onClickStr + '>';
        */
        // TODO: should i get the string back for the ref data, instead of having it write itself out?
        document.write(htmlStr);
        //var timeZones = allRefData['TimeZone'];
        //        writeRefDataSelectOptions('JAVA_TIMEZONE',false,false);
        /*
        document.write('</select>&nbsp;');
        */
        // try to preselect the user's time zone
        //document.write('<script language="JavaScript">doSelect(document.forms[0].' + formFieldName + 'TimeZone,\'' + defaultTimeZone + '\');</script>');
        //alert('<script language="JavaScript">doSelect(document.forms[0].' + formFieldName + 'TimeZone,\'' + defaultTimeZone + '\');</script>');
        /*
        document.write('<input type="hidden" name="hdn' + formFieldName + 'TimeZone">');
        */
    } else {
        document.write(htmlStr);
    }
    document.write('<input type="hidden" name="' + formFieldName + 'Date">');
    //alert('html:' + htmlStr);
}

function drawTimeInput(formFieldName,defaultDate,onClickJSFunction,onChangeJSFunction) {
    htmlStr = '';
    var onClickStr='';
    if (onClickJSFunction != null) {
        onClickStr = ' onclick="' + onClickJSFunction + '" ';
    }

    var onChangeStr='';
    if (onChangeJSFunction != null) {
        onChangeStr = ' onchange="' + onChangeJSFunction + '" ';
    }

    /*  if no date, set to nothing
    if (defaultDate == null) {
        defaultDate = new Date();
    }
    */

        var theHour;
        var dateHour;
        var ampm;
        var dateMinute;
        var timeToShow = '';
        if (defaultDate != null) {
            theHour = defaultDate.getHours();
            // HOURS, MINUTES
            // fill in with the time from the date:
            dateHour = defaultDate.getHours();
            ampm = (dateHour > 11 ? 'pm' : 'am');
            dateMinute = defaultDate.getMinutes();
            if (dateMinute < 10) {
                dateMinute = '0' + dateMinute;
            }
            if (dateHour > 12) {
                dateHour -= 12;
            }
            if (dateHour == 0) {
                dateHour = 12;
            }
            timeToShow = dateHour + ':' + dateMinute;
        }
        htmlStr += '<input type="text" name="' +formFieldName + 'Hour" style="width:51px;" value="' + timeToShow + '" onblur="validateEnteredTime(this)"' + onClickStr + ' ' + onChangeStr + '>';
        htmlStr += '&nbsp;'
        
        //AM/PM
        htmlStr += '<select style="width:51px;" name="' +formFieldName + 'AMPM"' + onClickStr + '>';
        htmlStr += '<option value="am"' + (ampm == 'am' ? ' selected ' : '') + '>am</option>';
        htmlStr += '<option value="pm"' + (ampm == 'pm' ? ' selected ' : '') + '>pm</option>';
        htmlStr += '</select>&nbsp;';

        document.write(htmlStr);
    document.write('<input type="hidden" name="' + formFieldName + 'Time">');
}

function validateEnteredTime(timeInput,isRequired) {
    var timeStr = timeInput.value;
    // check if it's blank:    
    if (!isRequired && timeStr.match(/^\s*$/)) {
        timeInput.value = '';
        //alert('all spaces');
        return;
    }
    if (!timeStr.match(/^\d+\:\d+$/)) {
        alert(Validator.buildMessage('DATE_TIME_FORMAT'));
        //alert('Please enter the time in the format hh:mm, for example 10:15.');
        timeInput.focus();
        return false;
    }
    var theHour = parseInt(timeStr.substring(-1,timeStr.indexOf(':')),10);
    var theMinute = parseInt(timeStr.substring(timeStr.indexOf(':')+1),10);
    //alert('hour: ' + theHour + ' minute: ' + theMinute);
    if (theHour < 1 || theHour > 12 || theMinute < 0 || theMinute > 59) {
        alert(Validator.buildMessage('DATE_TIME_FORMAT'));
        timeInput.focus();
        return false;
    }
    return true;
}

function validateEnteredDate(formFieldBase,fieldLabel,isRequired) {
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');
alert(daySel + ' m ' + monthSel + ' y ' + yearSel);
    if (!isRequired && daySel.selectedIndex == 0 && monthSel.selectedIndex == 0 && yearSel.selectedIndex == 0) {
        return true;
    }
    if (daySel.selectedIndex == 0 || monthSel.selectedIndex == 0 || yearSel.selectedIndex == 0) {
        alert(Validator.buildMessage('DATE_REQUIRED', fieldLabel));
        return false;
    }
    // see if there is a time to save also
    var hourSel = eval('document.forms[0].' + formFieldBase + 'Hour');
    if (typeof(hourSel) != 'undefined') {
      return validateEnteredTime(hourSel,true);
    }
    return true;
}


function saveEnteredDate(formFieldBase) {    
    var hiddenDateField = eval('document.forms[0].'+ formFieldBase + 'Date');
    // put together a date string from the inputs, to submit to the server
    var theDate = getCalendarDate(formFieldBase);
    //alert('date to save:'+ theDate + '!');
    var strDate = (theDate.getMonth()+1) + '/' + theDate.getDate() + '/' + theDate.getFullYear() + ' ' + theDate.getHours() + ':' + theDate.getMinutes();
    hiddenDateField.value = strDate;
    //alert(hiddenDateField.value);
}

function saveEnteredTime(formFieldBase) {
    
    var hiddenDateField = eval('document.forms[0].'+ formFieldBase + 'Time');
    var theDate = new Date();

    // see if there is a time to save also
    var hourSel = eval('document.forms[0].' + formFieldBase + 'Hour');
    if (typeof(hourSel) != 'undefined') {
        // check it again just in case:
        if (!validateEnteredTime(hourSel)) {
            return false;
        }
        //var hiddenTimeZoneField = eval('document.forms[0].hdn'+ formFieldBase + 'TimeZone');
        var ampmSel = eval('document.forms[0].' + formFieldBase + 'AMPM');
        
        var timeStr = hourSel.value;
        var selectedHour = parseInt(timeStr.substring(0,timeStr.indexOf(':')));
        var selectedMinute = parseInt(timeStr.substring(timeStr.indexOf(':')+1));
        var selectedAMPM = ampmSel[ampmSel.selectedIndex].value;
        if (selectedAMPM == 'pm' && selectedHour != 12) {
            selectedHour += 12;
        }
        else if (selectedAMPM == 'am' && selectedHour == 12) {
            selectedHour = 0;
        }

        theDate.setHours(selectedHour);
        theDate.setMinutes(selectedMinute);
        //hiddenTimeZoneField.value = selectedTimeZone;   
    }
    var strDate = (theDate.getHours() + ':' + theDate.getMinutes());
    hiddenDateField.value = strDate;
}


// erase this one it's extra
function doSelectExtra(selectObj,valueToSelect)
{
    var selectIt = trim(valueToSelect);
    for(i=0;i<selectObj.length;i++) {
        if(selectObj.options[i].value == selectIt)
            selectName.options[i].selected=true;//selectedIndex=i;
    }
}


function getMaxDaysInMonth(year, month)
{  
        maxDaysInMonth = 30;

        if(month == 1)
        {
                if(((year % 400) == 0) || (((year % 4) == 0) && ((year % 100) != 0)))
                        maxDaysInMonth = 29;
                else
                        maxDaysInMonth = 28;
        }
        else if((month < 7 && ((month % 2) == 0)) || (month >= 7 && ((month %2) == 1)))
                maxDaysInMonth = 31;

//alert("return maxDaysInMonth.."+maxDaysInMonth);
        return maxDaysInMonth;
}

function calendarUpdateMonths(formFieldBase) {
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');
    
    // only care if they picked Feb.
    if (monthSel.selectedIndex == 2) {
        calendarUpdateDays(formFieldBase);
    }
}

function calendarUpdateDays(formFieldBase) {
    //alert('form field base: ' + formFieldBase);
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');
    
    //alert('about to alert year: ' + yearSel);
    //alert('the year: ' + yearSel[yearSel.selectedIndex].value);
    var selectedYear  = parseInt(yearSel[yearSel.selectedIndex].value, 10);
    var selectedMonth = parseInt(monthSel[monthSel.selectedIndex].value, 10);
    var selectedDay = parseInt(daySel[daySel.selectedIndex].value, 10); 

    var maxDays = getMaxDaysInMonth(selectedYear, selectedMonth);

    daySel.options.length = 0;
    daySel.options[0] = new Option("Day" , 0);

    var dayToSelect = maxDays; // select max by default

    for (var i=1; i <= maxDays; i++) {
        daySel.options[i] = new Option("" + i, "" + i);
        if (i == selectedDay) {
            dayToSelect = i;
        }
    }
    daySel.options[dayToSelect].selected=true;    
}

/* Begin of Calendar Code */

var weekend = [0,6];
var weekendColor = "#fef7a7";
var fontface = "Verdana";
var fontsize = 2;

var gNow = new Date();
var ggNNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;

// Non-Leap year Month days..
Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Leap year Month days..
Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function Calendar(formFieldBase, calendarWindow, theDate) {
    
    this.formFieldBase = formFieldBase;
    this.calendarDate = theDate;//new Date();
    this.selectedDate = new Date();
    this.popupWindow = calendarWindow;

    this.gBGColor = "white";
    this.gFGColor = "black";
    this.gTextColor = "black";
    this.gHeaderColor = "black";
}

function getMonth() {
    return this.calendarDate.getMonth();
}
Calendar.prototype.getMonth = getMonth;

function getDate() {
    return this.calendarDate.getDate();
}
Calendar.prototype.getDate = getDate;

function getYear() {
    return this.calendarDate.getFullYear();
}
Calendar.prototype.getYear = getYear;

function getMonthName() {
    return CAL_MONTHS[this.getMonth()];
}
Calendar.prototype.getMonthName = getMonthName;


function getDaysOfMonth() { //monthNo, p_year) {
        /*
        Check for leap year ..
        1.Years evenly divisible by four are normally leap years, except for...
        2.Years also evenly divisible by 100 are not leap years, except for...
        3.Years also evenly divisible by 400 are leap years.
        */
    var monthNo = this.getMonth();
    var p_year = this.getYear();

        if ((p_year % 4) == 0) {
                if ((p_year % 100) == 0 && (p_year % 400) != 0)
                        return Calendar.DOMonth[monthNo];

                return Calendar.lDOMonth[monthNo];
        } else
                return Calendar.DOMonth[monthNo];
}
Calendar.prototype.getDaysOfMonth = getDaysOfMonth;


function Calendar_calc_month_year(p_Month, p_Year, incrm, currYear) {
        /*
        Will return an 1-D array with 1st element being the calculated month
        and second being the calculated year
        after applying the month increment/decrement as specified by 'incr' parameter.
        'incr' will normally have 1/-1 to navigate thru the months.
        */
        var ret_arr = new Array();
        if(parseInt(p_Year) > (currYear+3))
                {
                p_Year =currYear-1;
                }
                if(parseInt(p_Year) < (currYear-1))
                {
                        p_Year =(currYear+3);
                }

        if (incr == -1) {
                // B A C K W A R D
                if (p_Month == 0) {
                        ret_arr[0] = 11;
                        ret_arr[1] = parseInt(p_Year) - 1;
                        
                        if(parseInt(p_Year,10) == (currYear-1))
                         {
                          p_Year=currYear+3;
                          ret_arr[1] =p_Year;
                         }
                }
                else {
                        ret_arr[0] = parseInt(p_Month) - 1;
                        ret_arr[1] = parseInt(p_Year);

                     }
                
        } else if (incr == 1) {
                // F O R W A R D
                if (p_Month == 11) {
                        ret_arr[0] = 0;
                        ret_arr[1] = parseInt(p_Year) + 1;
                        
                        
                        if(parseInt(p_Year,10) >= (currYear+3))
                             {
                              p_Year=currYear-1;
                              ret_arr[1] =p_Year;
                            }
                }
                else {
                        ret_arr[0] = parseInt(p_Month) + 1;
                        ret_arr[1] = parseInt(p_Year);
                        
                        
                }
        }

        return ret_arr;
}

// This is for compatibility with Navigator 3.0 
// We have to create and discard one object before the prototype object exists.
var theCalendar = new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
    //alert('in getMonthlyCalCode');
        var vCode = "";
        var vHeader_Code = "";
        var vData_Code = "";

        // Begin Table Drawing code here..
        vCode = vCode + "<TABLE BORDER=1 BGCOLOR=\"" + this.gBGColor + "\">";

        vHeader_Code = this.getCalHeader();
        vData_Code = this.getCalData();
        vCode = vCode + vHeader_Code + vData_Code;

        vCode = vCode + "</TABLE>";

        return vCode;
}


Calendar.prototype.show = function() {
    //alert('in show');
    var vCode = "";

        this.popupWindow.document.open();

        // Setup the page...
        this.wwrite("<html>");
        this.wwrite("<head><title>Calendar</title>");
        this.wwrite("<style>");
        this.wwrite("body { font-family:Verdana,Arial,sans-serif;font-size:11px;font-weight:normal;color:#666666;}");
        this.wwrite("a { font-weight:normal;color:#666666;font-size:11px;}");
        this.wwrite("td { text-align:center;font-size:11px;}");
        this.wwrite("td.weekend { color:#666666;background-color:#fef7a7;}");
        this.wwrite("td.dayHeader { font-weight:bold;color:#666666;background-color:#ffffff;}");
        this.wwrite("</style>");



        this.wwrite("</head>");
        this.wwrite("<body>");
        this.wwriteA("<b>");
        this.wwriteA(this.getMonthName() + " " + this.getYear());
        this.wwriteA("</b><br>");

        this.wwrite("<table width='100%' border=0 cellspacing=2 cellpadding=2 bgcolor='#fdf77f'><tr><td>");
        var prevYearString=parseInt(this.getYear())-1 + ',' + this.getMonth();
        var prevMonth=parseInt(this.getMonth())-1; 
        var prevMonthString;

        // check for wrapping
        if (prevMonth < 0) {
            prevMonthString = parseInt(this.getYear())-1 + ',11';
        } else {
            prevMonthString = this.getYear() + ',' + prevMonth;
        }

        var nextYearString=parseInt(this.getYear())+1 + ',' + this.getMonth();
        var nextMonth=parseInt(this.getMonth())+1; 
        var nextMonthString;

        // check for wrapping
        if (nextMonth > 11) {
            nextMonthString = parseInt(this.getYear())+1 + ',0';
        } else {
            nextMonthString = this.getYear() + ',' + nextMonth;
        }

        // prev year link
        this.wwrite("[<b><a href=\"" +
                "javascript:window.opener.theCalendar.rebuildCalendar('" + this.formFieldBase + "'," + prevYearString + ");" +
                "\"><<<\/A>Y</b>]</td><td>");

        // prev month link
        this.wwrite("[<B><A HREF=\"" +
                "javascript:window.opener.theCalendar.rebuildCalendar('" + this.formFieldBase + "'," + prevMonthString + ");" +
                "\"><<\/A>M</B>]</TD><TD>");

        
        this.wwrite("[<A HREF='#' onClick=\"window.close();\">cancel</A>]</TD><TD ALIGN=center>");
        
        // next month link
        this.wwrite("[<B>M<A HREF=\"" +
                "javascript:window.opener.theCalendar.rebuildCalendar('" + this.formFieldBase + "'," + nextMonthString + ");" +
                "\">><\/A></B>]</TD><TD>");
                
        // next year link
        this.wwrite("[<B>Y<A HREF=\"" +
                "javascript:window.opener.theCalendar.rebuildCalendar('" + this.formFieldBase + "'," + nextYearString + ");" +
                "\">><\/A></B>]</TD></TR></TABLE>");
                
        // Get the complete calendar code for the month..
        vCode = this.getMonthlyCalendarCode();
        this.wwrite(vCode);
        //alert('6');
        this.wwrite("</body></html>");
        this.popupWindow.document.close();
}

function rebuildCalendar(formFieldBase,newYear,newMonth) {
    this.calendarDate.setYear(newYear);
    this.calendarDate.setMonth(newMonth);
    this.show();
}
Calendar.prototype.rebuildCalendar=rebuildCalendar;

Calendar.prototype.wwrite = function(wtext) {
        this.popupWindow.document.writeln(wtext);
}

Calendar.prototype.wwriteA = function(wtext) {
        this.popupWindow.document.write(wtext);
}

Calendar.prototype.getCalHeader = function() {
        var vCode = "";

        vCode = vCode + "<TR>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[0]+"</TD>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[1]+"</TD>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[2]+"</TD>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[3]+"</TD>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[4]+"</TD>";
        vCode = vCode + "<TD WIDTH='14%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[5]+"</TD>";
        vCode = vCode + "<TD WIDTH='16%' class=\"dayHeader\">"+CAL_DAYS_OF_WEEK[6]+"</TD>";
        vCode = vCode + "</TR>";

        return vCode;
}

Calendar.prototype.getCalData = function() {

        var vFirstDay=this.calendarDate.getDay();
        //alert('first day:' + vFirstDay + ' date: ' + this.calendarDate);
        var vDay=1;
        var vLastDay=this.getDaysOfMonth();
        var vOnLastDay=0;
        var vCode = "";
        var dateIndex=0;
        var monthIndex=this.getMonth();
        var yearIndex=this.getYear();

        /*
        Get day for the 1st of the requested month/year..
        Place as many blank cells before the 1st day of the month as necessary.
        */

        vCode = vCode + "<TR>";
        for (i=0; i<vFirstDay; i++) {
                vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(i) + "><FONT SIZE='2' FACE='" + fontface + "'>&nbsp;</FONT></TD>";
        }

        // Write rest of the 1st week
        vDay = 1;
        for (j=vFirstDay; j<7; j++) {         
            vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +
                "<A HREF='#' " +
                    "onClick=\"self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Year,'" + yearIndex + "');self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Month,'" + monthIndex + "');self.opener.calendarUpdateDays('" + this.formFieldBase + "');self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Day,'" + vDay + "');self.opener.callCalendarOnChangeEvent('"+this.formFieldBase+"');window.close();\">" +
                this.formatDay(vDay) +
                //vDay +
                    "</A>" +
                    "</FONT></TD>";

            vDay++;
        }
        vCode = vCode + "</TR>";

        // Write the rest of the weeks
        for (k=2; k<7; k++) {
            vCode = vCode + "<TR>";
            
            for (j=0; j<7; j++) {
                
                vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +
                    "<A HREF='#' " +
                    "onClick=\"self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Year,'" + yearIndex + "');self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Month,'" + monthIndex + "');self.opener.calendarUpdateDays('" + this.formFieldBase + "');self.opener.showSelectedOption(self.opener.document.forms[0]." + this.formFieldBase + "Day,'" + vDay + "');self.opener.callCalendarOnChangeEvent('"+this.formFieldBase+"');window.close();\">" +
                    this.formatDay(vDay) +
                    //vDay +
                    "</A>" +
                    "</FONT></TD>";
                
                vDay++;
                
                if (vDay > vLastDay) {
                    vOnLastDay = 1;
                    break;
                }
            }
            
            if (j == 6)
                vCode = vCode + "</TR>";
            if (vOnLastDay == 1)
                break;
        }

        // Fill up the rest of last week with proper blanks, so that we get proper square blocks
        for (m=1; m<(7-j); m++) {
            vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) +
                "><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'>" + '&nbsp;' + //m + 
                "</FONT></TD>";
        }

        return vCode;
}



Calendar.prototype.formatDay = function(vday) {
    var vNowDay = this.selectedDate.getDate();
    var vNowMonth = this.selectedDate.getMonth();
    var vNowYear = this.selectedDate.getFullYear();

    if (vday == vNowDay && this.getMonth() == vNowMonth && this.getYear() == vNowYear)
        return ("<FONT COLOR=\"RED\"><B>" + vday + "</B></FONT>");
    else
        return (vday);
}



Calendar.prototype.write_weekend_string = function(vday) {
        var i;

        // Return special formatting for the weekend day.
        for (i=0; i<weekend.length; i++) {
                if (vday == weekend[i])
                        return (" BGCOLOR=\"" + weekendColor + "\"");
        }

        return "";
}

function showCalendar(formFieldBase) {
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');

    var calendarDate = new Date();
                
    if(daySel.selectedIndex != 0 && monthSel.selectedIndex != 0 && yearSel.selectedIndex != 0) {
        calendarDate.setFullYear(yearSel.options[yearSel.selectedIndex].value);
        calendarDate.setMonth(monthSel.options[monthSel.selectedIndex].value);
        calendarDate.setDate(daySel.options[daySel.selectedIndex].value);                
    }
    calendarDate.setDate(1); // it's a monthly calendar, and will use the 1st to position the days
    vWinCal = window.open("", "Calendar",
                          "width=250,height=250,status=no,resizable=no,top=200,left=200");
    vWinCal.opener = self;
    ggWinCal = vWinCal;
    
    theCalendar = new Calendar(formFieldBase,vWinCal,calendarDate);
    theCalendar.show();
}


function selectCalendarDate(formFieldBase,newDate) {
    if (newDate == null)
        return;
    var theDay = newDate.getDate();
    var theMonth = newDate.getMonth();
    var theYear = newDate.getFullYear();

    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');

    showSelectedOption(yearSel,theYear+'');
    showSelectedOption(monthSel,theMonth+''); // jp: needs to be a string to not select the 0 option
    calendarUpdateDays(formFieldBase); // update the days in the month
    showSelectedOption(daySel,theDay+'');
}

function getCalendarDate(formFieldBase) {
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');

    if (yearSel.selectedIndex == 0 || monthSel.selectedIndex == 0 || daySel.selectedIndex == 0) {
        return new Date();
    }
    var selectedYear  = parseInt(yearSel[yearSel.selectedIndex].value, 10);
    var selectedMonth = parseInt(monthSel[monthSel.selectedIndex].value, 10);
    var selectedDay = parseInt(daySel[daySel.selectedIndex].value, 10); 

    var theDate = new Date();

    // jp: set the month with a day of 1; otherwise if it's a 30 day month, it'll roll to the next month on the 31st
    theDate.setYear(selectedYear);
    theDate.setMonth(selectedMonth,1);
    theDate.setDate(selectedDay);
    
    // see if there is a time to save also
    var hourSel = eval('document.forms[0].' + formFieldBase + 'Hour');
    if (typeof(hourSel) != 'undefined') {
        // check it again just in case:
        if (!validateEnteredTime(hourSel)) {
            return false;
        }
        //var hiddenTimeZoneField = eval('document.forms[0].hdn'+ formFieldBase + 'TimeZone');
        var ampmSel = eval('document.forms[0].' + formFieldBase + 'AMPM');
        var timeZoneSel = eval('document.forms[0].' + formFieldBase + 'TimeZone');
        
        var timeStr = hourSel.value;
        var selectedHour = parseInt(timeStr.substring(0,timeStr.indexOf(':')));
        var selectedMinute = parseInt(timeStr.substring(timeStr.indexOf(':')+1));
        var selectedAMPM = ampmSel[ampmSel.selectedIndex].value;
        if (selectedAMPM == 'pm' && selectedHour != 12) {
            selectedHour += 12;
        }
        else if (selectedAMPM == 'am' && selectedHour == 12) {
            selectedHour = 0;
        }
        
        theDate.setHours(selectedHour);
        theDate.setMinutes(selectedMinute);
        //hiddenTimeZoneField.value = selectedTimeZone;   
    }
    return theDate;
}

function disableCalendar(formFieldBase) {
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');
    daySel.disabled=true;
    monthSel.disabled=true;
    yearSel.disabled=true;
    //see if there is a time to disable too
    var hourSel = eval('document.forms[0].' + formFieldBase + 'Hour');
    if (typeof(hourSel) != 'undefined') {
        var ampmSel = eval('document.forms[0].' + formFieldBase + 'AMPM');
        var timeZoneSel = eval('document.forms[0].' + formFieldBase + 'TimeZone');
        hourSel.disabled=true;
        ampmSel.disabled=true;
        timeZoneSel.disabled=true;
    }
}

function enableCalendar(formFieldBase) {
    var daySel = eval('document.forms[0].' + formFieldBase + 'Day');
    var monthSel = eval('document.forms[0].' + formFieldBase + 'Month');
    var yearSel = eval('document.forms[0].' + formFieldBase + 'Year');
    daySel.disabled=false;
    monthSel.disabled=false;
    yearSel.disabled=false;
    //see if there is a time to disable too
    var hourSel = eval('document.forms[0].' + formFieldBase + 'Hour');
    if (typeof(hourSel) != 'undefined') {
        var ampmSel = eval('document.forms[0].' + formFieldBase + 'AMPM');
        var timeZoneSel = eval('document.forms[0].' + formFieldBase + 'TimeZone');
        hourSel.disabled=false;
        ampmSel.disabled=false;
        timeZoneSel.disabled=false;
    }
}

/**
 * called when a date is selected, to see if an onchange event needs to be triggered for the updated date picker
 */
function callCalendarOnChangeEvent(strFormFieldBase) {
    var objSel = eval('document.forms[0].'+strFormFieldBase+'Day');
    if (objSel.onchange != null) {
        objSel.onchange();    
    }
}

Date.prototype.roundToNearestHalfHour = function() {
    var minutes = this.getMinutes();
    if (minutes > 15 && minutes < 45) {
        this.setMinutes(30);
    } else {
        this.setMinutes(00);
    }
}
