function showCalendar(theElement, theElementName)
{ if (isDDMONYYYY(theElement, theElementName)) show_calendar(theElementName,'DD-MON-YYYY','','',theElement);
}

function isDDMONYYYY
(theElement, theElementName)
{
 var DayArray =new Array(31,28,31,30,31,30,31,31,30,31,30,31);
 var MonthArray = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
 var thisYear = null;
 var thisMon = null;
 var thisDay = null;
 var today = null;
 inpDate = theElement.value;
  if (inpDate.length == 0 ) return true;
 thisDay = inpDate.substr(0,2);
 thisMonth = inpDate.substr(3,3).toUpperCase();
 thisYear = inpDate.substr(7,2);
 var filter=/^[0-9]{2}[- \/][a-zA-Z]{3}[- \/][0-9]{4}$/;
  if (! filter.test(inpDate)) 
  {   alert("Please enter Date in DD-MON-YYYY Format"); 
       theElement.focus(); 
       theElement.select(); 
       return false; 
  } 
  /* Check Valid Month */
  var filter=/JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC/ ;
  if (! filter.test(thisMonth))
  {
     alert("Please enter the Correct Month");
     theElement.focus(); 
     theElement.select(); 
     return false;
  }
  /* Check For Leap Year */
  N=Number(thisYear);
  if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) ) 
  {
    DayArray[1]=29;   
  }
  /* Check for valid days for month */
  for(var ctr=0; ctr<=11; ctr++)
  {
   if (MonthArray[ctr]==thisMonth)
   {
      if (thisDay<= DayArray[ctr] && thisDay >0 )
           return true;
       else
       {
           alert("Please enter a valid Day"); 
           theElement.focus(); 
           theElement.select(); 
           return false; 
       }
    }
   }
}


// Date Picker Code
var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Verdana;Arial";
var fontstyle = "font-family:Verdana,Arial;font-size:10pt;"

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_WinCal, p_month, p_year, p_format, p_submit) 
{
 if ((p_month == null) && (p_year == null))	return;

  if (p_WinCal == null) {
    this.gWinCal = ggWinCal;
  } else {
    this.gWinCal = p_WinCal;
  }
    
  if (p_month == null | p_month == "") {
    this.gMonthName = null;
//    this.gMonth = null;
    this.gMonth = gNow.getMonth();
    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 = "#F7F7E7";
  this.gFGColor = "black";
  this.gTextColor = "#CECF9C";
  this.gHeaderColor = "#CECF9C";
  this.gReturnItem = p_item;
  this.gSubmit = p_submit;
}

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) {                        // Backward
    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) {                       // Forward
      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) {                        // Backward
    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) {                       // Forward
      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=0 CELLSPACING=0 CELLPADDING=2 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>");
  this.wwrite("<script type='text/javascript'>");
  this.wwrite("function chgMonth(form) {");
  this.wwrite("  var year = 0; var yearStr = new String()");
  this.wwrite("  yearStr = form.fYears.options[form.fYears.selectedIndex].text ;");
  this.wwrite("  if (yearStr.substr(0,3) == 'Pre') {");
  this.wwrite("    year = parseInt(yearStr.substr(4,4)) - 1;");
  this.wwrite("  } else {"); 
  this.wwrite("    if (yearStr.substr(0,4) == 'Post') {");
  this.wwrite("      year = parseInt(yearStr.substr(5,4)) + 1;");
  this.wwrite("    } else {"); 
  this.wwrite("      year = parseInt(yearStr.substr(0,4));");
  this.wwrite("    }");
  this.wwrite("  }");
  this.wwrite("  window.opener.Build('"+ this.gReturnItem +"', form.fMonths.options[form.fMonths.selectedIndex].value, year.toString(), '" + this.gFormat + "','" + p_submit + "');");
  this.wwrite("}");
  this.wwrite("</script>");
  this.wwrite("</head>");

  this.wwrite("<body " + 
	      "link=\"" + this.gLinkColor + "\" " + 
	      "vlink=\"" + this.gLinkColor + "\" " +
	      "alink=\"" + this.gLinkColor + "\" " +
	      "text=\"" + this.gTextColor + "\">");

  this.wwriteA("<FONT STYLE='" + fontstyle + "'>");
//  this.wwriteA("<B>" + this.gMonthName + " " + this.gYear + "</B><BR>");

// 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><FORM><TR BGCOLOR='#f0f8ff'>");
  this.wwrite("<TD ALIGN=center><A HREF=\"" + "javascript:window.opener.Build(" + 
		      "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" +
		      ",'" + p_submit + "');" + "\"><FONT STYLE='text-decoration=none;'><<</FONT><\/A></TD>");
		  
// Get the Month Select 
  vCode = this.month_select(this.gMonth);
  this.wwrite("<TD ALIGN=center>" + vCode + "</TD>");
// Get the Year Select 
  vCode = this.year_select(this.gYear);
  this.wwrite("<TD ALIGN=center>" + vCode + "</TD>");
  this.wwrite("<TD ALIGN=center><A HREF=\"" + "javascript:window.opener.Build(" + 
		      "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +
		      ",'" + p_submit + "');" + "\"><FONT STYLE='text-decoration=none;'>>></FONT><\/A></TD>");
  this.wwrite("</TR></TABLE><BR>");
		
// Get the complete calendar code for the month..
  vCode = this.getMonthlyCalendarCode();
  this.wwrite(vCode);

  this.wwrite("</form></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 BGCOLOR='#CECF9C'>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Sun</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Mon</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Tue</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Wed</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Thu</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "color:" + this.gHeaderColor + ";'><B>Fri</B></FONT></TD>";
  vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER><FONT STYLE='" + fontstyle + 
                  "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 BGCOLOR='#F7F7E7'>";
  for (i=0; i<vFirstDay; i++) {
    vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER" + this.write_weekend_string(i) + "><FONT STYLE='" + fontstyle + "'> </FONT></TD>";
  }

// Write rest of the 1st week

  for (j=vFirstDay; j<7; j++) {
    vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER" + this.write_weekend_string(j) + "><FONT STYLE='" + fontstyle + "'>" + 
	    "<A HREF='#' " +  "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
	    this.format_data(vDay) + "';window.close();" + this.gSubmit + "\" STYLE='text-decoration=none;'>" + 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 BGCOLOR='#F7F7E7'>";

    for (j=0; j<7; j++) {
      vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER" + this.write_weekend_string(j) + "><FONT STYLE='" + fontstyle + "'>" + 
	      "<A HREF='#' " + "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
	      this.format_data(vDay) + "';window.close();" + this.gSubmit + "\" STYLE='text-decoration=none;'>" + 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++) {
    vCode = vCode + "<TD WIDTH='32' ALIGN=CENTER" + this.write_weekend_string(j+m) + 
	                "><FONT STYLE='" + fontstyle + "color:gray;'> </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.month_select = function(vMonth) 
{
  var vCode = "";	
  vCode = vCode + "<SELECT NAME='fMonths' onChange='chgMonth(form);'>";
  
  for (i=0; i<12; i++) {
    if (vMonth == i) {
      vCode = vCode + "<OPTION SELECTED VALUE=" + i + ">" + Calendar.Months[i];
	} else {
	  vCode = vCode + "<OPTION VALUE=" + i + ">" + Calendar.Months[i];
	}
  }
  
  vCode = vCode + "</SELECT>";
	
  return vCode;
}

Calendar.prototype.year_select = function(vYear) 
{
  var vCode = "";
  var startYear = 1990;
    
  if (vYear < startYear) {
    while (vYear < startYear) {
	  startYear -= 30;
	}
  } else {
    while (vYear > (startYear + 30)) {
	  startYear += 30;
	}
  }
	
  vCode = vCode + "<SELECT NAME='fYears' onChange='chgMonth(form);'>";
  
  vCode = vCode + "<OPTION>Pre " + startYear;
  
  for (i=startYear; i<startYear+31; i++) {
    if (vYear == i) {
      vCode = vCode + "<OPTION SELECTED>" + i;
	} else {
	  vCode = vCode + "<OPTION>" + i;
	}
  }
  
  vCode = vCode + "<OPTION>Post " + (startYear + 30);
  
  vCode = vCode + "</SELECT>";
	
  return vCode;
}

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 "DD-MM-YY" :
	 vData = vDD + "-" + vMonth + "-" + vY2;
	 break;
    default :
	 vData = vMonth + "\/" + vDD + "\/" + vY4;
  }

  return vData;
}

function InputDate(iDate)
{
  var input = new String(iDate.value);
  var oraMon = ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
  
  for (i=0; i<12; i++) {
    if (input.substr(3,3) == oraMon[i]) break;
  }
  
  if (input.length == 9) { 
    oDate = new Date(2000 + parseInt(input.substr(7,2),10),i,parseInt(input.substr(0,2),10)) ;
  } else { 
    oDate = new Date(parseInt(input.substr(7,4),10),i,parseInt(input.substr(0,2),10)) ;
  }
  return oDate;
}

function Build(p_item, p_month, p_year, p_format, p_submit) 
{
  var p_WinCal = ggWinCal;
  gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format, p_submit);

// Customize your Calendar here..
  gCal.gBGColor="#F7F7E7";
  gCal.gLinkColor="#31659C";
  gCal.gTextColor="black";
  gCal.gHeaderColor="#31659C";	
  gCal.show();
}

function show_calendar() 
{

// p_item	: Return Item.
// p_format : Date format (mm/dd/yyyy, dd/mm/yy, ...) 
// p_month  : 0-11 for Jan-Dec; 12 for All Months.
// p_year	: 4-digit year
// p_date   : current field
// p_submit : if yes submit form

  p_item = arguments[0];
  p_split = arguments[0].split(".");
  if (arguments[1] == null) {
    p_format = "MM/DD/YYYY";
  } else {
    p_format = arguments[1];
  }
  if (arguments[2] == null) {
    p_month = new String(gNow.getMonth());
  } else {
    p_month = arguments[2];
  }
  if (arguments[3] == "" || arguments[3] == null) {
    p_year = new String(gNow.getFullYear().toString());
  } else {
    p_year = arguments[3];
  }
  if (arguments[4] == null || arguments[4].value == "") {
    null ;
  } else {
    gNow = InputDate(arguments[4]);
	p_year = new String(gNow.getFullYear().toString());
  }
  if (arguments[5] == "" || arguments[5] == null) {
    p_submit = "";
  } else {
    p_submit = "self.opener.document."  + p_split[0] + ".submit();";
  }
  vWinCal = window.open("", "Calendar",  "width=250,height=205,status=yes,resizable=no,top=200,left=200");
  vWinCal.opener = self;
  ggWinCal = vWinCal;

  Build(p_item, p_month, p_year, p_format, p_submit);
  
  ggWinCal.focus();
}
