/* ********************************************************************

Softricks Javascript Calendar

Author : Kedar R. Bhave



Modification History :-

v1.0    1st Jan 2000.

v1.2    Added Navigation buttons, and Print capability.

v1.21   Bugfixes, Highlighted Weekend days

v1.22   Includes first days for the next month (grayed-out) in the month

                view (after the last day of the month).

        Added support for MONTH DD, YYYY format. (09/13)



# COPYRIGHT NOTICE

# Copyright (c) 2000 Softricks.com, All rights reserved.

# This script may be used and modified free of charge by anyone as long as

# this copyright notice and the comments above are kept in their original

# form. By using this script, you agree to the disclaimer notices as on the

# softricks.com site.

#

# Selling the code for this script without prior written consent is not

# allowed. Redistributing this script over the internet or in any other

# medium should be done only with the written permission from the author.

#

# In all cases copyright and headers must remain intact.

#

# Distributed under the GNU General Public License.

# For more information visit: http://www.gnu.org/copyleft/lgpl.html

******************************************************************** */

var weekend = [0,6];

var weekendColor = "#e0e0e0";

var fontface = "Verdana";

var fontsize = 2;

var title_bg_style = "background-color: rgb(0,4,98);";

var title_style = "background-color: rgb(0,4,98); color: rgb(250,250,250); font-family: Arial; font-size: 15pt;";

var center_style = "background-color: rgb(200,200,250); border: 1px solid rgb(0,0,0);";

var label_style = "color: rgb(0,4,98); font-style: bold; font-family: Arial; font-size: 10pt;";

var nav_style = "color: rgb(250,250,250); font-style: bold; font-family: Arial; font-size: 15pt;";



var gNow = new Date();

var ggWinCal;           // Really global variable pointing to the calendar window



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];



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;

                this.gYearly = true;

        } else {

                this.gMonthName = Calendar.get_month(p_month);

                this.gMonth = new Number(p_month);

                this.gYearly = false;

        }



        this.gYear = p_year;

        this.gFormat = p_format;

        this.gBGColor = "white";

        this.gFGColor = "black";

        this.gTextColor = "black";

        this.gHeaderColor = "black";

        this.gReturnItem = p_item;

}



Calendar.get_month = Calendar_get_month;

Calendar.get_daysofmonth = Calendar_get_daysofmonth;

Calendar.calc_month_year = Calendar_calc_month_year;

Calendar.print = Calendar_print;



function Calendar_get_month(monthNo) {

        return Calendar.Months[monthNo];

}



function Calendar_get_daysofmonth(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.

        */

        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;

}



function Calendar_print() {

        ggWinCal.print();

}



// 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 cellpadding=2>";



        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>");

        this.wwrite("</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>");



		this.wwrite("<TR>");

		this.wwrite("<TD height=30>");



		this.wwrite("<TABLE WIDTH='100%' height='100%' BORDER=0 CELLSPACING=0 CELLPADDING=0 bgcolor='rgb(0,4,98)'>");

		this.wwrite("<TD ALIGN=center valign=bottom>");

        this.wwrite("[<A HREF=\"" +

                "javascript:window.opener.Build(" +

                "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" +

                ");" +

                "\"><img src='/leoniditor/js/tree_img/back.gif' border=1><\/A>]</TD>");

        this.wwrite("</TD>");

        this.wwrite("<TD ALIGN=center width=70%>");

        this.wwriteA("<FONT style='" + title_style + "'>");

        this.wwriteA(this.gMonthName + " " + this.gYear);

        this.wwriteA("</B><BR>");

        this.wwrite("</TD>");

		this.wwrite("<TD ALIGN=center valign=bottom>");

        this.wwrite("[<A HREF=\"" +

                "javascript:window.opener.Build(" +

                "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +

                ");" +

                "\"><img src='/leoniditor/js/tree_img/forward.gif' border=1><\/A>]");

		this.wwrite("</TD>");

		this.wwrite("</TR>");

		this.wwrite("</TABLE>");



//		this.wwrite("<TR>");

//		this.wwrite("<TD height=10>");

//		this.wwrite("</TD>");

		this.wwrite("</TR>");

		this.wwrite("<TR>");

		this.wwrite("<TD  style='" + center_style + "'>");

        // Get the complete calendar code for the month..

        vCode = this.getMonthlyCalendarCode();

        this.wwrite(vCode);

        this.wwrite("</TD>");

		this.wwrite("</TR>");

		this.wwrite("</TABLE>");



        this.wwrite("</font></body></html>");

        this.gWinCal.document.close();

}



Calendar.prototype.wwrite = function(wtext) {

        this.gWinCal.document.writeln(wtext);

}



Calendar.prototype.wwriteA = function(wtext) {

        this.gWinCal.document.write(wtext);

}



Calendar.prototype.cal_header = function() {

        var vCode = "";



        vCode = vCode + "<TR>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Sun</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Mon</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Tue</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Wed</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Thu</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='14%'><FONT SIZE='2' FACE='" + fontface + "' COLOR='" + this.gHeaderColor + "'><B>Fri</B></FONT></TD>";

        vCode = vCode + "<TD WIDTH='16%'><FONT SIZE='2' FACE='" + fontface + "' 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 = "";



        /*

        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 + "'> </FONT></TD>";

        }



        // Write rest of the 1st week

        for (j=vFirstDay; j<7; j++) {

                vCode = vCode + "<TD align='right' WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +

                        "<A HREF='#' " +

                                "onClick=\"self.opener.document." + this.gReturnItem + ".value='" +

                                this.format_data(vDay) +

                                "';window.close();\">" +

                                this.format_day(vDay) +

                        "</A>" +

                        "</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 align='right' WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" +

                                "<A HREF='#' " +

                                        "onClick=\"self.opener.document." + this.gReturnItem + ".value='" +

                                        this.format_data(vDay) +

                                        "';window.close();\">" +

                                this.format_day(vDay) +

                                "</A>" +

                                "</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 proper blanks, so that we get proper square blocks

        for (m=1; m<(7-j); m++) {

                if (this.gYearly)

                        vCode = vCode + "<TD align='right' WIDTH='14%'" + this.write_weekend_string(j+m) +

                        "><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'> </FONT></TD>";

                else

                        vCode = vCode + "<TD align='right' WIDTH='14%'" + this.write_weekend_string(j+m) +

                        "><FONT SIZE='2' FACE='" + fontface + "' COLOR='gray'>" + m + "</FONT></TD>";

        }



        return vCode;

}



Calendar.prototype.format_day = function(vday) {

        var vNowDay = gNow.getDate();

        var vNowMonth = gNow.getMonth();

        var vNowYear = gNow.getFullYear();



        if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == 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 "";

}



Calendar.prototype.format_data = function(p_day) {

        var vData;

        var vMonth = 1 + this.gMonth;

        vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;

        var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();

        var vFMon = Calendar.get_month(this.gMonth).toUpperCase();

        var vY4 = new String(this.gYear);

        var vY2 = new String(this.gYear.substr(2,2));

        var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;



        switch (this.gFormat) {

                case "MM\/DD\/YYYY" :

                        vData = vMonth + "\/" + vDD + "\/" + vY4;

                        break;

                case "MM\/DD\/YY" :

                        vData = vMonth + "\/" + vDD + "\/" + vY2;

                        break;

                case "MM-DD-YYYY" :

                        vData = vMonth + "-" + vDD + "-" + vY4;

                        break;

                case "MM-DD-YY" :

                        vData = vMonth + "-" + vDD + "-" + vY2;

                        break;



                case "DD\/MON\/YYYY" :

                        vData = vDD + "\/" + vMon + "\/" + vY4;

                        break;

                case "DD\/MON\/YY" :

                        vData = vDD + "\/" + vMon + "\/" + vY2;

                        break;

                case "DD-MON-YYYY" :

                        vData = vDD + "-" + vMon + "-" + vY4;

                        break;

                case "DD-MON-YY" :

                        vData = vDD + "-" + vMon + "-" + vY2;

                        break;



                case "DD\/MONTH\/YYYY" :

                        vData = vDD + "\/" + vFMon + "\/" + vY4;

                        break;

                case "DD\/MONTH\/YY" :

                        vData = vDD + "\/" + vFMon + "\/" + vY2;

                        break;

                case "DD-MONTH-YYYY" :

                        vData = vDD + "-" + vFMon + "-" + vY4;

                        break;

                case "DD-MONTH-YY" :

                        vData = vDD + "-" + vFMon + "-" + vY2;

                        break;

                case "MONTH DD, YYYY" :

                		vData = vFMon + " " + vDD + ", " + vY4;

                		break;

                case "DD\/MM\/YYYY" :

                        vData = vDD + "\/" + vMonth + "\/" + vY4;

                        break;

                case "DD\/MM\/YY" :

                        vData = vDD + "\/" + vMonth + "\/" + vY2;

                        break;

                case "DD-MM-YYYY" :

                        vData = vDD + "-" + vMonth + "-" + vY4;

                        break;

                case "DD-MM-YY" :

                        vData = vDD + "-" + vMonth + "-" + vY2;

                        break;



                default :

                        vData = vMonth + "\/" + vDD + "\/" + vY4;

        }



        return vData;

}



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);



        // Customize your Calendar here..

        gCal.gBGColor="white";

        gCal.gLinkColor="black";

        gCal.gTextColor="black";

        gCal.gHeaderColor="darkgreen";



        // Choose appropriate show function

        if (gCal.gYearly)       gCal.showY();

        else    gCal.show();

}



/* ******************************************************************************* */

/*

Monthly Calendar Code Starts here

*/

function show_calendar() {

        /*

                p_month : 0-11 for Jan-Dec; 12 for All Months.

                p_year  : 4-digit year

                p_format: Date format (mm/dd/yyyy, dd/mm/yy, ...)

                p_item  : Return Item.

        */



        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 = "DD/MM/YYYY";

        else

                p_format = arguments[3];



        vWinCal = window.open("", "Calendar",

                "width=250,height=220,status=no,resizable=no");

        vWinCal.opener = self;

        ggWinCal = vWinCal;



        Build(p_item, p_month, p_year, "DD/MM/YY");

}

function show_calendar_MM_DD_YYYY() {

        /*

                p_month : 0-11 for Jan-Dec; 12 for All Months.

                p_year  : 4-digit year

                p_format: Date format (mm/dd/yyyy, dd/mm/yy, ...)

                p_item  : Return Item.

        */



        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 = "DD/MM/YYYY";

        else

                p_format = arguments[3];



        vWinCal = window.open("", "Calendar",

                "width=250,height=220,status=no,resizable=no");

        vWinCal.opener = self;

        ggWinCal = vWinCal;



        Build(p_item, p_month, p_year, "MM/DD/YYYY");

}


/* ******************************************************************************* */

/*

Yearly Calendar Code Starts here

*/

function show_yearly_calendar(p_item, p_year, p_format) {

        // Load the defaults..

        if (p_year == null || p_year == "")

                p_year = new String(gNow.getFullYear().toString());

        if (p_format == null || p_format == "")

                p_format = "MM/DD/YYYY";



        var vWinCal = window.open("", "Calendar", "scrollbars=yes");

        vWinCal.opener = self;

        ggWinCal = vWinCal;



        Build(p_item, null, p_year, p_format);

}

/* *********************************EOF********************************* */
