var weekend = [0,6];
var weekendColor = "#e0e0e0";
var gNow = new Date(); // current date (local)
var vCurrentDay = gNow.getDate();
var vCurrentMonth = gNow.getMonth();
var vCurrentYear = gNow.getFullYear();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
Calendar.Months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
// 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];
var bValidDate = true;
MonthAbbreviations = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
DaysInMonth = new Array('31', '28', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31');
function isLeapYear (Year) {
        if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
                return true;
        } else {
                return false;
        }
}
var maxMonth = vCurrentMonth
var maxYear = vCurrentYear
if(isLeapYear(maxYear)){
        DaysInMonth[1] = 29; // adjust # of days in February if it is a leap year
}
nDays = DaysInMonth[maxMonth]; // # of days in current month
var maxDay = vCurrentDay + 331;
while(bValidDate){              
        if (maxDay > nDays) { // if new dd is greater than # of days in current month then
                maxMonth = maxMonth + 1; // new mm
                if (maxMonth == 12) {
                        maxMonth = 0; // correct new mm to January if mm was December
                        maxYear = maxYear + 1 // new yy
                        if(isLeapYear(maxYear)){
                                DaysInMonth[1] = 29; // # of days in February is 29 if a leap year
                        } else {
                                DaysInMonth[1] = 28; // # of days in February is 28 otherwise
                        }
                }
                maxDay = maxDay - nDays; // new dd
                nDays = DaysInMonth[maxMonth]; // # of days in new month
        }else{
                bValidDate = false;
        }
}
function Calendar(p_item, p_WinCal, p_month, p_year, p_format) {
        if ((p_month == null) && (p_year == null))      return;
        if (p_WinCal == null)
                this.gWinCal = ggWinCal;
        else
                this.gWinCal = p_WinCal;
        if (p_month == null) {
                this.gMonthName = null;
                this.gMonth = null;
        } else {
                this.gMonthName = Calendar.get_month(p_month);
                this.gMonth = new Number(p_month);
        }
        this.gYear = p_year;
        this.gFormat = p_format;
        this.gReturnItem = p_item;
}
Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.calc_month_year = Calendar_calc_month_year;
function Calendar_get_month(monthNo) {
        return Calendar.Months[monthNo];
}
function Calendar_get_daysofmonth(monthNo, p_year) {
        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];
}
function Calendar_calc_month_year(p_Month, p_Year, incr) {
        /* 
        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 (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;
                }
                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;
                }
                else {
                        ret_arr[0] = parseInt(p_Month) + 1;
                        ret_arr[1] = parseInt(p_Year);
                }
        }
        return ret_arr;
}
// This is for compatibility with Navigator 3, we have to create and discard one object before the prototype object exists.
new Calendar();
Calendar.prototype.getMonthlyCalendarCode = function() {
        var vCode = "";
        var vHeader_Code = "";
        var vData_Code = "";
        // Begin Table Drawing code here..
        vCode = vCode + "<TABLE BORDER=1 BGCOLOR=\"" + this.gBGColor + "\">";
        vHeader_Code = this.cal_header();
        vData_Code = this.cal_data();
        vCode = vCode + vHeader_Code + vData_Code;
        vCode = vCode + "</TABLE>";
        return vCode;
}
Calendar.prototype.show = function() {
        var vCode = "";
        this.gWinCal.document.open();
        // Setup the page...
        this.wwrite("<html>");
        this.wwrite("<head><title>Calendar</title></head>");
        this.wwrite("<body link='" + this.gLinkColor + "' vlink='" + this.gLinkColor + "' alink='" + this.gLinkColor + "' text='" + this.gTextColor + "'>");
        // Show navigation buttons
        var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
        var prevMM = prevMMYYYY[0];
        var prevYYYY = prevMMYYYY[1];
        var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
        var nextMM = nextMMYYYY[0];
        var nextYYYY = nextMMYYYY[1];
        this.wwrite("<TABLE WIDTH='100%' BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>");
        if(this.gMonth == vCurrentMonth && this.gYear == vCurrentYear){
                this.wwrite("&nbsp;");
        }else{
                this.wwrite("[<A HREF=\"" +
                        "javascript:window.opener.Build(" +
                        "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" +
                        ");\"><</A>]");
        }
        this.wwrite("</TD><TD ALIGN=center><FONT FACE='Arial' STYLE='font-size:14px'><B>" +
                this.gMonthName + " " + this.gYear + "</B></TD>");
        this.wwrite("<TD ALIGN=center>");
        if(this.gMonth == maxMonth && this.gYear == maxYear){
                this.wwrite("&nbsp;");
        }else{
                this.wwrite("[<A HREF=\"" +
                        "javascript:window.opener.Build(" + 
                        "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +
                        ");\">></A>]");
        }
        this.wwrite("</TD></TR></TABLE><BR>");
        // Get the complete calendar code for the month..
        vCode = this.getMonthlyCalendarCode();
        this.wwrite(vCode);
        this.wwrite("</font><div align='center'><br><a href='javascript:window.close()'><font face='Arial' style='font-size:10px'>Close Window</font></a></div></body></html>");
        this.gWinCal.document.close();
}
Calendar.prototype.wwrite = function(wtext) {
        this.gWinCal.document.writeln(wtext);
}
Calendar.prototype.cal_header = function() {
        var vCode = "";
        vCode = vCode + "<TR>";
        vCode = vCode + "<TD WIDTH='15%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Sun</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='14%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Mon</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='14%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Tue</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='14%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Wed</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='14%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Thu</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='14%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Fri</B></FONT></TD>";
        vCode = vCode + "<TD WIDTH='15%'><FONT STYLE='font-size:12px' FACE='Arial' COLOR='" + this.gHeaderColor + "'><B>Sat</B></FONT></TD>";
        vCode = vCode + "</TR>";
        return vCode;
}
Calendar.prototype.cal_data = function() {
        var vDate = new Date();
        vDate.setDate(1);
        vDate.setMonth(this.gMonth);
        vDate.setFullYear(this.gYear);
        var vFirstDay=vDate.getDay();
        var vDay=1;
        var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
        var vOnLastDay=0;
        var vCode = "";
        var vDateMonth = vDate.getMonth();
        var vDateYear = vDate.getFullYear();
        /*
        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 " + this.write_weekend_string(i) + "><FONT STYLE='font-size:12px' FACE='Arial'>&nbsp;</FONT></TD>";
        }
        // Write rest of the 1st week
        for (j=vFirstDay; j<7; j++) {
                vCode = vCode + "<TD " + this.write_weekend_string(j) + "><FONT STYLE='font-size:12px' FACE='Arial'>" 
                if ((vDay < vCurrentDay && vDateMonth == vCurrentMonth && vDateYear == vCurrentYear) || ((vDay > maxDay && vDateMonth == maxMonth || vDateMonth > maxMonth) && vDateYear == maxYear)){
                        vCode = vCode + vDay
                }else{
                        vCode = vCode + "<A HREF='#' " + 
                                "onClick=\"self.opener.document." + this.gReturnItem + "Day.value='" + vDay + 
                                "';self.opener.document." + this.gReturnItem + "Month.value='" + MonthAbbreviations[vDateMonth] + "';window.close();\">" + 
                                this.format_day(vDay) + "</A>";
                }
                vCode = vCode + "</FONT></TD>";
                vDay=vDay + 1;
        }
        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 " + this.write_weekend_string(j) + "><FONT STYLE='font-size:12px' FACE='Arial'>" 
                        if ((vDay < vCurrentDay && vDateMonth == vCurrentMonth && vDateYear == vCurrentYear) || (vDay > maxDay && vDateMonth == maxMonth && vDateYear == maxYear)){
                                vCode = vCode + vDay
                        }else{
                                vCode = vCode + "<A HREF='#' " + 
                                        "onClick=\"self.opener.document." + this.gReturnItem + "Day.value='" + vDay + 
                                        "';self.opener.document." + this.gReturnItem + "Month.value='" + MonthAbbreviations[vDateMonth] + "';window.close();\">" + 
                                this.format_day(vDay) + "</A>"
                        }
                        vCode = vCode + "</FONT></TD>";
                        vDay=vDay + 1;
                        if (vDay > vLastDay) {
                                vOnLastDay = 1;
                                break;
                        }
                }
                if (j == 6)
                        vCode = vCode + "</TR>";
                if (vOnLastDay == 1)
                        break;
        }
        // Fill up the rest of last week with blanks
        for (m=1; m<(7-j); m++) {
                        vCode = vCode + "<TD " + this.write_weekend_string(j+m) + 
                        "><FONT STYLE='font-size:12px' FACE='Arial'>&nbsp;</FONT></TD>";
        }
        return vCode;
}
Calendar.prototype.format_day = function(vday) {
        if (vday == vCurrentDay && this.gMonth == vCurrentMonth && this.gYear == vCurrentYear)
                return ("<FONT COLOR=\"#BB0026\"><B>" + vday + "</B></FONT>");
        else
                return (vday);
}
Calendar.prototype.write_weekend_string = function(vday) {
        var i;
        for (i=0; i<weekend.length; i++) {
                if (vday == weekend[i])
                        return (" BGCOLOR=\"" + weekendColor + "\"");
        }
        return "";
}
function Build(p_item, p_month, p_year, p_format) {
        var p_WinCal = ggWinCal;
        gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format);
        gCal.gBGColor="white";
        gCal.gLinkColor="#172169";
        gCal.gTextColor="#172169";
        gCal.gHeaderColor="#172169";
        gCal.show();
}
function show_calendar() {
        p_item = arguments[0];
        if (arguments[1] == null)
                p_month = new String(gNow.getMonth());
        else
                p_month = arguments[1];
        if (arguments[2] == "" || arguments[2] == null)
                p_year = new String(gNow.getFullYear().toString());
        else
                p_year = arguments[2];
        if (arguments[3] == null)
                p_format = "MM/DD/YYYY";
        else
                p_format = arguments[3];
        vWinCal = window.open("", "Calendar", 
                "width=250,height=250,status=no,resizable=no,top=200,left=200");
        vWinCal.opener = self;
        ggWinCal = vWinCal;
        Build(p_item, p_month, p_year, p_format);
}