


var weekend = [0,6];

var gNow = new Date();
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];

function Calendar(p_item, p_field, p_WinCal, p_month, p_year, p_format, p_autosubmit) {
	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;
	}

    if(p_format==null)
    this.gFormat = "YYYY-MM-DD";
    else
    this.gFormat = p_format;

	this.gYear = p_year;
	//this.gBGColor = "gainsboro";
	//this.gFGColor = "m";
	//this.gTextColor = "black";
	//this.gHeaderColor = "black";
	this.gReturnItem = p_item;
    this.gForm       = p_item;
    this.gField      = p_field;
	this.gAutosubmit = p_autosubmit;
}

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();
}

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 = "";

	vHeader_Code = this.cal_header();
	vData_Code = this.cal_data();
	vCode = vCode + vHeader_Code + vData_Code;

	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("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\">");
    this.wwrite("<link href='/css/external-datepicker.css' rel=\"stylesheet\" type=\"text/css\">");
	this.wwrite("</head>");

	this.wwrite("<body>");

	// 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 class=\"mainTable\">");

    this.wwrite("<tr class=\"titleRow\">");
    this.wwrite("<td colspan=\"7\"><strong>");
  	this.wwriteA(this.gMonthName + " " + this.gYear);
    this.wwrite("</strong></td>");
    this.wwrite("</tr>");

    this.wwrite("<tr class=\"navigationRow\">");
    this.wwrite("<td WIDTH='49%' colspan=\"3\">");
    this.wwrite("Month");
    this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + 
		");" +
		"\"><img src='/images/toolkit/platform/prev_off.gif' width=\"15\" height=\"15\" border=\"0\" align=\"absmiddle\"><\/A>");
    this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + 
		");" +
		"\"><img src='/images/toolkit/platform/next_off.gif' width=\"15\" height=\"15\" border=\"0\" align=\"absmiddle\"><\/A>");
    this.wwrite("</td>");
    this.wwrite("<td WIDTH='2%'>&nbsp;</td>");
    this.wwrite("<td WIDTH='49%' align='right' colspan=\"3\">");
    this.wwrite("Year");
    this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + 
		");" +
		"\"><img src='/images/toolkit/platform/prev_off.gif' width=\"15\" height=\"15\" border=\"0\" align=\"absmiddle\"><\/A>");
    this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + 
		");" +
		"\"><img src='/images/toolkit/platform/next_off.gif' width=\"15\" height=\"15\" border=\"0\" align=\"absmiddle\"><\/A>");
    this.wwrite("</td>");
    this.wwrite("</tr>");

	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("</body></html>");
	this.gWinCal.document.close();
}

//only updated style of header and body, since it is not used now, will not do further update.
Calendar.prototype.showY = function() {
	var vCode = "";
	var i;
	var vr, vc, vx, vy;		// Row, Column, X-coord, Y-coord
	var vxf = 285;			// X-Factor
	var vyf = 200;			// Y-Factor
	var vxm = 10;			// X-margin
	var vym;				// Y-margin
	if (isIE)	vym = 75;
	else if (isNav)	vym = 25;

	this.gWinCal.document.open();

	this.wwrite("<html>");
	this.wwrite("<head><title>Calendar</title>");
    this.wwrite("<meta http-equiv=\"Content-Type\" content=\"text/html\"; charset=\"utf8\">");
    this.wwrite("<link href='/pg-connection-portal/css/external-datepicker.css' rel=\"stylesheet\" type=\"text/css\">");
	this.wwrite("</head>");


	this.wwrite("<body>");

	this.wwrite("Year : " + this.gYear);


	// Show navigation buttons
	var prevYYYY = parseInt(this.gYear) - 1;
	var nextYYYY = parseInt(this.gYear) + 1;

	this.wwrite("<TABLE class=\"internalTable\"><TR><TD ALIGN=center valign=top>");
	this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', null, '" + prevYYYY + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + "'" +
		");" +
		"\" alt='Prev Year'><img src='/pg-connection-portal/images/toolkit/platform/date-picker/prevYear.gif' border='0' width='30' height='18'><\/A></TD>");
	this.wwrite("<TD ALIGN=center>");
	this.wwrite("<A HREF=\"" +
		"javascript:window.opener.Build(" +
		"'" + this.gForm + "', '" + this.gField + "', null, '" + nextYYYY + "', '" + this.gFormat + "', " + (this.gAutosubmit ? "true":"false" ) + "'" +
		");" +
		"\"><img src='/pg-connection-portal/images/toolkit/platform/date-picker/nextYear.gif' border='0' width='30' height='18'><\/A></TD></TR></TABLE><BR>");

	// Get the complete calendar code for each month..
	var j;
	for (i=11; i>=0; i--) {
		if (isIE)
			this.wwrite("<DIV ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");
		else if (isNav)
			this.wwrite("<LAYER ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");

		this.gMonth = i;
		this.gMonthName = Calendar.get_month(this.gMonth);
		vCode = this.getMonthlyCalendarCode();
		this.wwrite(this.gMonthName + "/" + this.gYear + "<BR>");
		this.wwrite(vCode);

		if (isIE)
			this.wwrite("</DIV>");
		else if (isNav)
			this.wwrite("</LAYER>");
	}

	this.wwrite("</font><BR></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 class=\"daysRow\">";
	vCode = vCode + "<TD WIDTH='14%'>Sun</TD>";
	vCode = vCode + "<TD WIDTH='14%'>Mon</TD>";
	vCode = vCode + "<TD WIDTH='14%'>Tue</TD>";
	vCode = vCode + "<TD WIDTH='14%'>Wed</TD>";
	vCode = vCode + "<TD WIDTH='14%'>Thu</TD>";
	vCode = vCode + "<TD WIDTH='14%'>Fri</TD>";
	vCode = vCode + "<TD WIDTH='16%'>Sat</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 nowDay = gNow.getDate();
	var nowMonth = gNow.getMonth();
	var nowYear = gNow.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 class=\"weekRow\">";
	for (i=0; i<vFirstDay; i++) {
		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(i) + ">&nbsp;</TD>";
	}

	// Write rest of the 1st week
	for (j=vFirstDay; j<7; j++) {

        if (vDay == nowDay && this.gMonth == nowMonth && this.gYear == nowYear)
        vCode = vCode + "<TD WIDTH='14%' class=\"currentDay\">";
        else
		vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + ">";

		vCode = vCode +	"<A HREF='#' " +
				"onClick=\"self.opener.document.getElementById('" + this.gForm + "').elements['" + this.gField + "'].value='" +
				this.format_data(vDay) +
				"';if(false) self.opener.theFormWatcher.hasChanged(self.opener.document.getElementById('" + this.gForm + "').elements['" + this.gField + "'].form);" +
				(this.gAutosubmit ? "self.opener.document.getElementById('" + this.gForm + "').submit();" : "" ) +
				"window.close();\">" +
				this.format_day(vDay) +
			"</A>" +
			"</TD>";
		vDay=vDay + 1;
	}
	vCode = vCode + "</TR>";

	// Write the rest of the weeks
	for (k=2; k<7; k++) {
		vCode = vCode + "<TR class=\"weekRow\">";

		for (j=0; j<7; j++) {

			if (vDay == nowDay && this.gMonth == nowMonth && this.gYear == nowYear)
            vCode = vCode + "<TD WIDTH='14%' class=\"currentDay\">";
            else
		    vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + ">";

			vCode = vCode +	"<A HREF='#' " +
					"onClick=\"self.opener.document.getElementById('" + this.gForm + "').elements['" + this.gField + "'].value='" +
					this.format_data(vDay) +
				    "';if(false) self.opener.theFormWatcher.hasChanged(self.opener.document.getElementById('" + this.gForm + "').elements['" + this.gField + "'].form);" +
     				(this.gAutosubmit ? "self.opener.document.getElementById('" + this.gForm + "').submit();" : "" ) +
				    "window.close();\">" +
				this.format_day(vDay) +
				"</A>" +
				"</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 WIDTH='14%'" + this.write_weekend_string(j+m) +
			">&nbsp;</TD>";
		else
			vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) +
			">" + m + "</TD>";
	}

	return vCode;
}

Calendar.prototype.format_day = function(vday)
{
		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 (" class=\"weekendDay\"");
	}

	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 "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 "YYYY-MM-DD" :
                        vData = vY4 + "-" + vMonth + "-" + vDD;
                        break;
		case "DD-MM-YY" :
			vData = vDD + "-" + vMonth + "-" + vY2;
			break;

		default :
			vData = vY4 + "-" + vMonth + "-" + vDD;
	}

	return vData;
}

function Build(p_item, p_field, p_month, p_year, p_format, p_autosubmit) {
	var p_WinCal = ggWinCal;
	gCal = new Calendar(p_item, p_field, p_WinCal, p_month, p_year, p_format, p_autosubmit);

	// Customize your Calendar here..
	//gCal.gBGColor="EEEEEE";
	//gCal.gLinkColor="black";
	//gCal.gTextColor="black";
	//gCal.gHeaderColor="003A67";

	// Choose appropriate show function
	if (gCal.gYearly)	gCal.showY();
	else	gCal.show();
}


var iDatePickerX = 0;	// show the date picker at this X coord.
var iDatePickerY = 0;	// show the date picker at this Y coord.

// show the data picker
// argument[0] is the form name
// argument[1] is the form element
// argument[2] autosubmit (true|false)
// argument[3] is the image used to open the date picker
// args [1](IE) or [3](NETSCAPE) are used to find the x,y coords where the calendar opens
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.
	*/

 	// get the calendar position relative to the element we are working with
    	getElementPos(arguments[1], arguments[3]);

        var wSizeX=screen.width;
        var wSizeY=screen.height;

        var sizeX=220;
        var sizeY=220;

        if((wSizeX-iDatePickerX)<sizeX){
            iDatePickerX-=sizeX;
        }

        if((wSizeY-iDatePickerY)<sizeY){
            iDatePickerY-=sizeY;
        }

	    p_item = arguments[0];
        p_field = arguments[1];
		p_autosubmit=arguments[2];

        if (arguments[4] == null)
            p_format = "YYYY-MM-DD";
        else
            p_format = arguments[4];

        if (arguments[5] == null)
            p_month = new String(gNow.getMonth());
        else
            p_month = arguments[5];

         if (arguments[6] == "" || arguments[5] == null)
            p_year = new String(gNow.getFullYear().toString());
         else
            p_year = arguments[6];



	//var sFeatures = "width=200,height=200,status=no,resizable=no";
	var sFeatures = "width="+sizeX+",height="+sizeY+",status=no,resizable=yes";
        var sPosString = ',left=' + iDatePickerX + ',top=' + iDatePickerY;

        sFeatures += sPosString;


	var vWinCal = window.open('/js/empty.html', "Calendar", sFeatures);
	vWinCal.opener = self;
	ggWinCal = vWinCal;
    ggWinCal.focus();       // put on top the popup window if it was hiddend behind another window
	Build(p_item, p_field, p_month, p_year, p_format, p_autosubmit);
}
/*
Yearly Calendar Code Starts here
*/
function show_yearly_calendar(p_item, p_field, 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 = "YYYY-MM-DD";

	var vWinCal = window.open("", "Calendar", "scrollbars=yes");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_field, null, p_year, p_format, false/*no autosubmit*/);
}

var isNS = (navigator.userAgent.indexOf('Netscape') != -1 || navigator.userAgent.indexOf('Mozilla/5.0')!=-1);
var isIE = (navigator.userAgent.indexOf('MSIE') != -1);

// gets the x,y position of either an image(NETSCAPE) or a form element (IE)
function getElementPos(sDateFieldName, sDateImgName)
{

    // sDateFieldName is the name of the text field into which
    // the date will be set.
    // sImgDateName is the name of the image of which the x, y
    // coordinates are used to calculate where to place the
    // date picker (Netscape only).
    var hDateTextControl;
    var sPosString = "";
    var bFound = false;
    var appVersion;


    // Determine x & y coordinates to draw calendar. For Netscape
    // use x & y coordinates of image passed to function. For IE
    // use the bounding rectangle of the date text field.
    if (isNS)
    {
        // Include menubar height in x, y calculations.
        var iMenuBarHeight = window.outerHeight - window.innerHeight;

        iDatePickerX = window.document.images[sDateImgName].x + window.screenX-window.pageXOffset;
        iDatePickerY = window.document.images[sDateImgName].y + window.screenY-window.pageYOffset+iMenuBarHeight;

    }
    else if (isIE)
    {
        // To avoid looping, the form name could have been
        // passed to this function but in the spirit of loose
        // coupling between the datepicker and the parent window,
        // this was not done.
        // Looping could also be avoided by using the syntax
        // 'window.opener.document.all[sDateFieldName]', but the
        // (x, y) coordinates returned using this syntax are different
        // from the ones returned by looping through all the forms.
        for (i = window.document.forms.length - 1; i >=0; i--)
        {
            for (j = window.document.forms[i].elements.length - 1; j >= 0; j--)
            {
                if (sDateFieldName == window.document.forms[i].elements[j].name)
                {
                    hDateTextControl = window.document.forms[i].elements[j];
                    bFound = true;
                    break;
                }
            }

            if (bFound)
            {
                break;
            }
        }


    	rect = hDateTextControl.getBoundingClientRect();

    	iDatePickerX = rect.left;
    	iDatePickerY = rect.bottom;

    	iDatePickerX += window.screenLeft;
    	iDatePickerY += window.screenTop;

    }
    else
    {	// don't try to guess the document model of other brower types,
	// since it may break the code, just use default values so the calendar works
    	iDatePickerX = 200;
	iDatePickerY = 100;
    }
}

