//JS DatePicker @0-8BFCF88C

// Date formatting functions begin ---------------------------------------------------


var listMonths = new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
var listShortMonths = new Array("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic");
var firstWeekDay = "Dom";
var listWeekdays = new Array("Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato");
var listShortWeekdays = new Array("Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab");

var DateMasks = new Array(26);
    DateMasks["d"] = 0;
    DateMasks["dd"] = 2;
    DateMasks["m"] = 0;
    DateMasks["mm"] = 2;
    DateMasks["mmm"] = 3;
    DateMasks["mmmm"] = 0;
    DateMasks["M"] = 0;
    DateMasks["MM"] = 2;
    DateMasks["MMM"] = 3;
    DateMasks["MMMM"] = 0;
    DateMasks["yy"] = 2;
    DateMasks["yyyy"] = 4;
    DateMasks["h"] = 0;
    DateMasks["hh"] = 2;
    DateMasks["H"] = 0;
    DateMasks["HH"] = 2;
    DateMasks["n"] = 0;
    DateMasks["nn"] = 2;
    DateMasks["s"] = 0;
    DateMasks["ss"] = 2;
    DateMasks["am/pm"] = 2;
    DateMasks["AM/PM"] = 2;
    DateMasks["A/P"] = 1;
    DateMasks["a/p"] = 1;
    DateMasks["w"] = 0;
    DateMasks["q"] = 0;
    DateMasks["S"] = 0;

function geckoGetRv()
{
  if (navigator.product != 'Gecko')
  {
    return -1;
  }
  var rvValue = 0;
  var ua      = navigator.userAgent.toLowerCase();
  var rvStart = ua.indexOf('rv:');
  var rvEnd   = ua.indexOf(')', rvStart);
  var rv      = ua.substring(rvStart+3, rvEnd);
  var rvParts = rv.split('.');
  var exp     = 1;

  for (var i = 0; i < rvParts.length; i++)
  {
    var val = parseInt(rvParts[i]);
    rvValue += val / exp;
    exp *= 100;
  }

  return rvValue;
}

function isInArray(strValue, arrArray)
{
  var intResult = -1;
  for ( var j = 0; j < arrArray.length && (strValue != arrArray[j]); j++ );
  if ( j != arrArray.length )
    intResult = j;    
  return intResult;
}

function parseDateFormat(strMask)
{
  var UNDEF;
  var arrResult = new Array();             
  if (strMask == "" || typeof(strMask) == "undefined")
    return arrResult;
  var arrMaskTokens = new Array(
  "d", "w", "m", "M", "q", "y", "h", "H", "n", "s", 
  "dd", "ww", "mm", "MM", "yy", "hh", "HH", "nn", "ss", "S",
  "ddd", "mmm", "MMM", "A/P", "a/p", "dddd", "mmmm", "MMMM", 
  "yyyy", "AM/PM", "am/pm", "LongDate", "LongTime", 
  "ShortDate", "ShortTime", "GeneralDate");
  var arrMaskTokensFirstLetters = new Array("d", "w", "m", "M",
  "q", "y", "h", "H", "n", "s", "A", "a", "L", "S", "G");
  var strMaskLength = strMask.length;
  var i = 0, intMaskPosition = 0;
  var arrMask = new Array();
  var strToken = "";
  while (i < strMaskLength)
  {
  if (strMask.charAt(i) == "\\")
  {
    strToken += strMask.charAt(++i);
    i ++;
  }
  else if (strMask.charAt(i) == "'")
  {
    i ++;
    while ((i < strMask.length) && (strMask.charAt(i) != "'"))
    strToken += strMask.charAt(i++);
    i ++;
  }
  else
  {
    var j = isInArray(strMask.charAt(i), arrMaskTokensFirstLetters);
    if ( j != -1 )
    {
    var k;
    for (k = (arrMaskTokens.length - 1); k >= 0 && 
      strMask.slice(i, i + arrMaskTokens[k].length) != arrMaskTokens[k]; k--);
    if (k != -1)
    {
      if (strToken.length > 0)
      {
      if ( isInArray(strToken, arrMaskTokens) == -1)
        arrMask[intMaskPosition ++] = strToken;
      else
        arrMask[intMaskPosition ++] = "\\" + strToken;
      strToken = "";
      }
      arrMask[intMaskPosition ++] = arrMaskTokens[k];
      i += arrMaskTokens[k].length;
    }
    else
    {
      strToken = strMask.charAt(i);
      i ++;
    }
    }
    else
    {
    strToken += strMask.charAt(i);
    i ++;
    }
  }
  }
  if (strToken.length > 0)
  {
  if ( isInArray(strToken, arrMaskTokens) == -1)
    arrMask[intMaskPosition ++] = strToken;
  else
    arrMask[intMaskPosition ++] = "\\" + strToken;
  strToken = "";
  }
  arrResult = arrMask;
  return arrResult;
}

function getDayOfYear(year, month, day)
{
  var firstDay = new Date(year, 0, 1);
  var date = new Date(year, month, day);
  return (date-firstDay)/(1000*60*60*24);
}

function get12Hour(hoursNumber)
{
  if (hoursNumber == 0)
    hoursNumber = 12;
  else if (hoursNumber > 12)
    hoursNumber = hoursNumber - 12;
  return hoursNumber;
}

function addZero(value, resultLength)
{
  var countZero = resultLength - String(value).length;
  var result = String(value);
  for (var i=0; i<countZero; i++)
    result = "0" + result;
  return result;
}

function getAMPM(HoursNumber, AnteMeridiem, PostMeridiem)
{
  if (HoursNumber >= 0 && HoursNumber < 12)
    return AnteMeridiem;
  else
    return PostMeridiem;
}

function formatDate(dateToFormat, parsedFormat)
{
  var resultArray = new Array(parsedFormat.length);
  for (var i=0; i<parsedFormat.length; i++)
  {
    switch (parsedFormat[i]) 
    {
      case "d": 
        resultArray[i] = dateToFormat.getDate(); 
        break;
      case "w":
        resultArray[i] = dateToFormat.getDay()+1;
        break;
      case "m": case "M": 
        resultArray[i] = dateToFormat.getMonth()+1;
        break;
      case "q": 
        resultArray[i] = Math.floor((dateToFormat.getMonth()+4)/4);
        break;
      case "y": 
        resultArray[i] = getDayOfYear(dateToFormat.getFullYear(), dateToFormat.getMonth(), dateToFormat.getDate());
        break;
      case "h": 
        resultArray[i] = "";//get12Hour(dateToFormat.getHours());
        break;
      case "H": 
        resultArray[i] = "";//dateToFormat.getHours();
        break;
      case "n": 
        resultArray[i] = "";//dateToFormat.getMinutes();
        break;
      case "s": 
        resultArray[i] = "";//dateToFormat.getSeconds();
        break;
      case "dd": 
        resultArray[i] = addZero(dateToFormat.getDate(), 2);
        break;
      case "ww": 
        resultArray[i] = Math.floor(getDayOfYear(dateToFormat.getFullYear(), dateToFormat.getMonth(), dateToFormat.getDate())/7)+1;
        break;
      case "mm": case "MM": 
        resultArray[i] = addZero(dateToFormat.getMonth()+1, 2);
        break;
      case "yy": 
        resultArray[i] = String(dateToFormat.getFullYear()).substr(2);
        break;
      case "hh": 
        resultArray[i] = "";//addZero(get12Hour(dateToFormat.getHours()), 2);
        break;
      case "HH": 
        resultArray[i] = "";//addZero(dateToFormat.getHours(), 2);
        break;
      case "nn": 
        resultArray[i] = "";//addZero(dateToFormat.getMinutes(), 2);
        break;
      case "ss": 
        resultArray[i] = "";//addZero(dateToFormat.getSeconds(), 2);
        break;
      case "S": 
        resultArray[i] = "";//"000";
        break;
      case "ddd": 
        resultArray[i] = listShortWeekdays[dateToFormat.getDay()];
        break;
      case "mmm": case "MMM": 
        resultArray[i] = listShortMonths[dateToFormat.getMonth()];
        break;
      case "A/P": 
        resultArray[i] = "";//getAMPM(dateToFormat.getHours(), "A", "P");
        break;
      case "a/p": 
        resultArray[i] = "";//getAMPM(dateToFormat.getHours(), "a", "p");
        break;
      case "dddd": 
        resultArray[i] = listWeekdays[dateToFormat.getDay()];
        break;
      case "mmmm": case "MMMM": 
        resultArray[i] = listMonths[dateToFormat.getMonth()];
        break;
      case "yyyy": 
        resultArray[i] = dateToFormat.getFullYear();
        break;
      case "AM/PM": 
        resultArray[i] = "";//getAMPM(dateToFormat.getHours(), "AM", "PM");
        break;
      case "am/pm": 
        resultArray[i] = "";//getAMPM(dateToFormat.getHours(), "am", "pm");
        break;
      case ":": 
        resultArray[i] = "";
        break;
      case "LongDate": 
        resultArray[i] = formatDate(dateToFormat, parseDateFormat("dddd, mmmm dd, yyyy"));
        break;
      case "LongTime": 
        resultArray[i] = "";//formatDate(dateToFormat, parseDateFormat("h:nn:ss AM/PM"));
        break;
      case "ShortDate": 
        resultArray[i] = formatDate(dateToFormat, parseDateFormat("m/d/yy"));
        break;
      case "ShortTime": 
        resultArray[i] = "";//formatDate(dateToFormat, parseDateFormat("H:nn"));
        break;
      case "GeneralDate": 
        resultArray[i] = formatDate(dateToFormat, parseDateFormat("m/d/yy hh:nn AM/PM"));
        break;
      default:
        if (String(parsedFormat[i]).charAt(0)=="\\")
        resultArray[i] = String(parsedFormat[i]).substr(0);
      else
        resultArray[i] = parsedFormat[i];
    }
  }
  return resultArray.join("");
}

function parseDate(dateToParse, parsedMask)
{
  var resultDate, resultDateArray = new Array(8);
  var MaskPart, MaskLength, TokenLength;
  var IsError;
  var DatePosition, MaskPosition;
  var Delimiter, BeginDelimiter;
  var MonthNumber, MonthName;
  var DatePart;

  var IS_DATE_POS, YEAR_POS, MONTH_POS, DAY_POS, IS_TIME_POS, HOUR_POS, MINUTE_POS, SECOND_POS;

  IS_DATE_POS = 0;  YEAR_POS = 1;  MONTH_POS = 2;  DAY_POS = 3;
  IS_TIME_POS = 4;  HOUR_POS = 5;  MINUTE_POS = 6;  SECOND_POS = 7;

  if (!parsedMask)
  {
    resultDate = null;
  }
  else if (parsedMask[0] == "GeneralDate" && String(dateToParse)!="")
    resultDate = parseDate(dateToParse, parseDateFormat("m/d/yy hh:nn AM/PM"));
  else if (parsedMask[0] == "LongDate" && String(dateToParse)!="")
    resultDate = parseDate(dateToParse, parseDateFormat("dddd, mmmm dd, yyyy"));
  else if (parsedMask[0] == "ShortDate" && String(dateToParse)!="")
    resultDate = parseDate(dateToParse, parseDateFormat("m/d/yy"));
  else if (parsedMask[0] == "LongTime" && String(dateToParse)!="")
    resultDate = parseDate(dateToParse, parseDateFormat("h:nn:ss AM/PM"));
  else if (parsedMask[0] == "ShortTime" && String(dateToParse)!="")
    resultDate = parseDate(dateToParse, parseDateFormat("H:nn"));
  else if (String(dateToParse) == "") resultDate = null;
  else
  {
    DatePosition = 0;
    MaskPosition = 0;
    MaskLength = parsedMask.length;
    IsError = false;

    // Default date
    resultDateArray[IS_DATE_POS] = false;
    resultDateArray[IS_TIME_POS] = false;
    resultDateArray[YEAR_POS] = 0;  resultDateArray[MONTH_POS] = 12;  resultDateArray[DAY_POS] = 1;
    resultDateArray[HOUR_POS] = 0;  resultDateArray[MINUTE_POS] = 0;  resultDateArray[SECOND_POS] = 0;

    while ((MaskPosition < MaskLength) && !IsError)
    {
      MaskPart = parsedMask[MaskPosition];
      if (DateMasks[MaskPart] != null)
      {
        TokenLength = DateMasks[MaskPart];
        if (TokenLength > 0)
        {
          DatePart = String(dateToParse).substr(DatePosition, TokenLength);
          DatePosition = DatePosition + TokenLength;
        }else
        {
          if (MaskPosition < MaskLength)
          {
            Delimiter = parsedMask[MaskPosition + 1];
            BeginDelimiter = dateToParse.indexOf(Delimiter, DatePosition);
            if (BeginDelimiter == -1)
            {
              //alert("ParseDate function: The number doesn't match the mask.");
              return null;
            }else 
            {
              DatePart = String(dateToParse).substr(DatePosition, BeginDelimiter - DatePosition);
              DatePosition = BeginDelimiter;
            }
          }else DatePart = String(dateToParse).substr(DatePosition);
        }
        switch (MaskPart)
        {
          case "d": case "dd":
            resultDateArray[DAY_POS] = Math.floor(DatePart);
            resultDateArray[IS_DATE_POS] = true;
            break;
          case "m": case "mm": case "M": case "MM":
            resultDateArray[MONTH_POS] = Math.floor(DatePart);
            resultDateArray[IS_DATE_POS] = true;
            break;
          case "mmm": case "mmmm": case "MMM": case "MMMM":
            MonthNumber = 0;
            MonthName = String(DatePart).toUpperCase();
            if (MaskPart == "mmm") 
              MonthNamesArray = listMonths;
            else
              MonthNamesArray = listShortMonths;
            while (MonthNumber < 11 && String(MonthNamesArray[MonthNumber]).toUpperCase() != MonthName)
            {
              MonthNumber = MonthNumber + 1;
            }
            if (MonthNumber == 11) 
            {
              if (String(MonthNamesArray[11]).toUpperCase() != MonthName) 
              {
                //alert("ParseDate function: The number doesn't match the mask.");
                return null;
              }
            }
            resultDateArray[MONTH_POS] = MonthNumber + 1;
            resultDateArray[IS_DATE_POS] = true;
            break;
          case "yy": 
                  var last2Digits = Math.floor(DatePart);
            var centuryDigits = (last2Digits>=50)?1900:2000;
            resultDateArray[YEAR_POS] = centuryDigits + last2Digits;
            resultDateArray[IS_DATE_POS] = true;
            break;
          case "yyyy":
            resultDateArray[YEAR_POS] = Math.floor(DatePart);
            resultDateArray[IS_DATE_POS] = true;
            break;
          case "h": case "hh":
            if (Math.floor(DatePart) == 12) 
              resultDateArray[HOUR_POS] = 0;
            else 
              resultDateArray[HOUR_POS] = Math.floor(DatePart);
            resultDateArray[IS_TIME_POS] = true;
            break;
          case "H": case "HH":
            resultDateArray[HOUR_POS] = Math.floor(DatePart);
            resultDateArray[IS_TIME_POS] = true;
            break;
          case "n": case "nn":
            resultDateArray[MINUTE_POS] = Math.floor(DatePart);
            resultDateArray[IS_TIME_POS] = true;
            break;
          case "s": case "ss":
            resultDateArray[SECOND_POS] = Math.floor(DatePart);
            resultDateArray[IS_TIME_POS] = true;
            break;
          case "am/pm": case "a/p": case "AM/PM": case "A/P":
            if (String(DatePart).toLowerCase().charAt(0) == "p") 
              resultDateArray[HOUR_POS] = resultDateArray[HOUR_POS] + 12;
            else if (String(DatePart).toLowerCase().charAt(0) == "a") Then
              resultDateArray[HOUR_POS] = resultDateArray[HOUR_POS];
            resultDateArray[IS_TIME_POS] = true;
            break;
          case "w": case "q": case "S":
            //Do Nothing
            break;
        }
      }else DatePosition = DatePosition + parsedMask[MaskPosition].length;
      MaskPosition = MaskPosition + 1
    }
    if (resultDateArray[IS_DATE_POS] && resultDateArray[IS_TIME_POS]) 
    {
      resultDate = new Date(resultDateArray[YEAR_POS], resultDateArray[MONTH_POS] - 1, resultDateArray[DAY_POS], resultDateArray[HOUR_POS], resultDateArray[MINUTE_POS], resultDateArray[SECOND_POS]);
    }else if (resultDateArray[IS_DATE_POS])
    {
      resultDate = new Date(resultDateArray[YEAR_POS], resultDateArray[MONTH_POS] - 1, resultDateArray[DAY_POS]);
    }else if (resultDateArray[IS_DATE_POS])
    {
      resultDate = new Date(0, 0, 0, resultDateArray[HOUR_POS], resultDateArray[MINUTE_POS], resultDateArray[SECOND_POS]);
    }
  }
  return resultDate;
}

function checkDateRange(date)
{
  var minDate = new Date(1753, 0, 1);
  var maxDate = new Date(9999, 11, 31);
  if (date < minDate) return minDate;
  if (date > maxDate) return maxDate;
  return date;
}

// Date formatting functions end ---------------------------------------------------

var DatePickerObject = new Object();

var disableEvents = false;

// Determine browser brand
var isNav = false;
var isIE  = false;

// Assume it's either Netscape or MSIE
if (navigator.appName == "Netscape") 
{
  isNav = true;
}
else 
{
  isIE = true;
}

// Get currently selected language
selectedLanguage = navigator.language;

// DatePicker functions begin here ---------------------------------------------------

// Set the initial value of the global date field
function setDateField(dateField,control) 
{
  // Assign the incoming field object to a global variable
  calDateField = dateField;

  // Get the value of the incoming field
  inDate = dateField.value;

  // Set calDate to the date in the incoming field or default to today's date
  setInitialDate(control);

  // The DatePicker frameset documents are created by javascript functions
  calDocTop    = buildTopCalFrame(control);
  calDocBottom = buildBottomCalFrame(control);
}

// Set the initial DatePicker date to today or to the existing value in dateField
function setInitialDate(control) 
{
  // Create a new date object 
  calDate = parseDate(inDate, parseDateFormat(eval(control+'.format')));

  if (calDate) calDate = checkDateRange(calDate);

  // If the incoming date is invalid, use the current date
  if (isNaN(calDate) || !calDate) 
  {
    // Simply create a new date object which defaults to the current date
    calDate = new Date();
  }
  
  eval(control+'.currentDate = new Date(calDate.getFullYear(), calDate.getMonth(), calDate.getDate());');

  // KEEP TRACK OF THE CURRENT DAY VALUE
  calDay  = calDate.getDate();

  // Set day value to 1... to avoid javascript date calculation anomalies
  // (if the month changes to feb and the day is 30, the month would change to march
  //  and the day would change to 2.  setting the day to 1 will prevent that)
  calDate.setDate(1);
}

// Popup a window with the DatePicker in it
function showDatePicker(format, style, form_name, form_control) 
{
  if (geckoGetRv()==0.0902)
  {
    alert("Date Picker non è compatible con Netscape 6.1");
    return ;
  }
  disableEvents = false;

  var control = 'DatePickerObject';

  DatePickerObject = new Object();
  DatePickerObject.format           = format;
  DatePickerObject.style            = String(style);
  DatePickerObject.control          = String("document."+form_name+"."+form_control);
  DatePickerObject.selectedDate     = new Date();

  // Pre-build portions of the DatePicker when this js library loads into the browser !!!!!!
  buildCalParts(control);

  // Set initial value of the date field and create top and bottom frames
  setDateField(eval(eval(control+'.control')), control);

  // Use the javascript-generated documents (calDocTop, calDocBottom) in the frameset
  calDocFrameset = 
      "<HTML><HEAD><TITLE>Calendario</TITLE><SCRIPT SRC='DatePicker.js' language='JavaScript'><"+"/SCRIPT></HEAD>\n" +
      "<FRAMESET ROWS='60,*' FRAMEBORDER='0' FRAMESPACING='0'>\n" +
      "  <FRAME NAME='topCalFrame' SRC='javascript:parent.opener.calDocTop' SCROLLING='no' NORESIZE MARGINHEIGHT='0'>\n" +
      "  <FRAME NAME='bottomCalFrame' SRC='javascript:parent.opener.calDocBottom' SCROLLING='no' NORESIZE MARGINHEIGHT='0'>\n" +
      "</FRAMESET>\n";

  // Display the DatePicker in a new popup window
  if (typeof(eval("top.newWin" + control)) != "object") 
  {
    var w_left = Math.ceil(screen.width/2-120);
    var w_top = Math.ceil(screen.height/2-110);
    eval("top.newWin" + control + " = window.open('javascript:parent.opener.calDocFrameset', 'calWin'+control, 'dependent=yes,left="+w_left+",top="+w_top+",width=240,height=220,screenX=200,screenY=300,titlebar=yes, center: yes, help: no, resizable: yes, status: no');");
  }
  eval("top.newWin" + control + ".focus();");
}

// Create the top DatePicker frame
function buildTopCalFrame(control) 
{
  // Create the top frame of the DatePicker
  var calDoc =
      "<HTML>" +
      "<HEAD>" +
      // Stylesheet defines appearance of DatePicker
      "<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\""+eval(control+".style")+"\">"+
      "<STYLE>" +
      "BODY, TABLE, TH, TR, TD, UL, OL, LI, P, FONT, A, BLOCKQUOTE, LABEL { font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 13px; }" +
      "hr {	color: #B5C7CE;  height: 1px;    }" +
      "</STYLE>" +
      "</HEAD>" +
      "<BODY TOPMARGIN='0' LEFTMARGIN='0' ONUNLOAD='parent.opener.UnLoad(\""+control+"\");'>" +
      "<FORM NAME='calControl' onSubmit='return false;'>" +
      "<CENTER>" +
      "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0>" +
      "<TR><TD COLSPAN=7>" +
      "<CENTER>" +
      getMonthSelect(control) +
      "<INPUT class=\"CalendarControls\" NAME='year' VALUE='" + calDate.getFullYear() + "'TYPE=TEXT SIZE=4 MAXLENGTH=4 onChange='parent.opener.setYear(\""+control+"\")'>" +
      "</CENTER>" +
      "</TD>" +
      "</TR>" +
      "<TR>" +
      "<TD COLSPAN=7>" +
      "<INPUT " +
      "TYPE=BUTTON CLASS=\"CalendarButtons\" NAME='previousYear' VALUE='<<' onClick=\"parent.opener.setPreviousYear('" + control + "')\"><INPUT " +
      "TYPE=BUTTON CLASS=\"CalendarButtons\" NAME='previousMonth' VALUE=' < ' onClick=\"parent.opener.setPreviousMonth('" + control + "')\"><INPUT " +
      "TYPE=BUTTON CLASS=\"CalendarButtons\" NAME='today' VALUE='Oggi' onClick=\"parent.opener.setToday('" + control + "')\"><INPUT " +
      "TYPE=BUTTON CLASS=\"CalendarButtons\" NAME='nextMonth' VALUE=' > ' onClick=\"parent.opener.setNextMonth('" + control + "')\"><INPUT " +
      "TYPE=BUTTON CLASS=\"CalendarButtons\" NAME='nextYear' VALUE='>>' onClick=\"parent.opener.setNextYear('" + control + "')\">" +
      "</TD>" +
      "</TR>" +
      "</TABLE>" +
      "</CENTER>" +
      "</FORM>" +
      "</BODY>" +
      "</HTML>";

  return calDoc;
}

// Create the bottom DatePicker frame 
function buildBottomCalFrame(control) 
{
  // Start DatePicker document
  var calDoc = (isNav?"<HTML>" + "<HEAD>" +
      // Stylesheet defines appearance of DatePicker
      "<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\""+eval(control+".style")+"\">"+
      "<STYLE>" +
      "BODY, TABLE, TH, TR, TD, UL, OL, LI, P, FONT, A, BLOCKQUOTE, LABEL { font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 13px; }" +
      "hr {	color: #B5C7CE;  height: 1px;    }" +
      "</STYLE>" +
      "</HEAD>" +
      "<BODY TOPMARGIN='0' LEFTMARGIN='0'>":"") + DatePickerBegin;

  // Get month, and year from global DatePicker date
  month   = calDate.getMonth();
  year    = calDate.getFullYear();


  // Get globally-tracked day value (prevents javascript date anomalies)
  day     = calDay;

  var i   = 0;

  // Determine the number of days in the current month
  var days = getDaysInMonth();

  // If global day value is > than days in month, highlight last day in month
  if (day > days) 
    day = days;

  // Determine what day of the week the DatePicker starts on
  var firstOfMonth = new Date (year, month, 1);

  // Get the day of the week the first day of the month falls on
  var startingPos  = firstOfMonth.getDay() - firstWeekDayIndex;
  days += startingPos;

  // Keep track of the columns, start a new row after every 7 columns
  var columnCount = 0;

  // Make beginning non-date cells blank
  for (i = 0; i < startingPos; i++) 
  {
    calDoc += blankCell;
    columnCount++;
  }

  // Set values for days of the month
  var currentDay = 0;
  var dayType    = "weekday";

  // Date cells contain a number
  for (i = startingPos; i < days; i++) 
  {
    var paddingChar = "&nbsp;";

    // Adjust spacing so that all links have relatively equal widths
    if (i-startingPos+1 < 10) 
      padding = "&nbsp;&nbsp;";
    else 
      padding = "&nbsp;";

    // Get the day currently being written
    currentDay = i-startingPos+1;

    // Set the type of day, the focusDay generally appears as a different color
    var currentDate = eval(control+'.currentDate');
    if (currentDay == day && month==currentDate.getMonth() && year==currentDate.getFullYear())
      dayType = "focusDay";
    else 
      dayType = "weekDay";


    // Add the day to the DatePicker string depending on workday or not. 
    if (columnCount % 7 == 0 || columnCount % 7 == 6 ) 
    {
      calDoc += "<TD align=center class=\"weekend\">" +
                "<a class=\"" + dayType + "\" href=\"javascript:parent.opener.returnDate(" + 
                currentDay + ",'" + control + "')\">" + padding + currentDay + paddingChar + "</a></TD>";
    }
    else 
    {
      calDoc += "<TD align=center class=\"workday\">" +
                "<a class=\"" + dayType + "\" href=\"javascript:parent.opener.returnDate(" + 
                currentDay + ",'" + control + "')\">" + padding + currentDay + paddingChar + "</a></TD>";
    }
    columnCount++;

    // Start a new row when necessary
    if (columnCount % 7 == 0) 
      calDoc += "</TR><TR>";
  }

  // Make remaining non-date cells blank
  for (i=days; i<42; i++)
  {
    calDoc += blankCell;
    columnCount++;

    // Start a new row when necessary
    if (columnCount % 7 == 0) 
    {
      calDoc += "</TR>";
      if (i<41) calDoc += "<TR>";
    }
  }

  // Finish the new DatePicker page
  calDoc += DatePickerEnd + (isNav?"</BODY>" + "</HTML>":"");

  // Return the completed DatePicker page
  return calDoc;
}

// Write the monthly DatePicker to the bottom DatePicker frame
function writeDatePicker(control)
{
  // Create the new DatePicker for the selected month & year
  calDocBottom = buildBottomCalFrame(control);

  // Write the new DatePicker to the bottom frame
  if (isNav)
  {
    var doc = eval("top.newWin" + control + ".frames['bottomCalFrame'].document;");
    var body = doc.getElementsByTagName("body")[0];
    body.innerHTML = calDocBottom;
  }
  else
  {
    eval("top.newWin" + control + ".frames['bottomCalFrame'].document.open();");
    eval("top.newWin" + control + ".frames['bottomCalFrame'].document.write(calDocBottom);");
    eval("top.newWin" + control + ".frames['bottomCalFrame'].document.close();");
  }
}

// Set the DatePicker to today's date and display the new DatePicker
function setToday(control)
{
  // Set global date to today's date
  calDate = new Date();

  // Set day month and year to today's date
  var month = calDate.getMonth();
  var year  = calDate.getFullYear();

  // Set month in drop-down list
  eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex = month;");

  // Set year value
  eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");

  // Display the new DatePicker
  writeDatePicker(control);
}

// Set the global date to the newly entered year and redraw the DatePicker
function setYear(control)
{
  if (disableEvents) return false;

  // Get the new year value
  eval("var year  = top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value;");

  // If it's a four-digit year then change the DatePicker
  if (isFourDigitYear(year,control))
  {
    calDate.setFullYear(year);
    if (calDate) calDate = checkDateRange(calDate);
    year = calDate.getFullYear();
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");
    writeDatePicker(control);
  }
  else 
  {
    // Highlight the year if the year is not four digits in length
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.focus();");
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.select();");
  }
}

// Set the global date to the selected month and redraw the DatePicker
function setCurrentMonth(control)
{
  if (disableEvents) return false;

  // Get the newly selected month and change the DatePicker accordingly
  eval("var month = top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex;");

  calDate.setMonth(month);
  if (calDate) calDate = checkDateRange(calDate);
  writeDatePicker(control);
}

// Set the global date to the previous year and redraw the DatePicker
function setPreviousYear(control)
{
  eval("var year  = top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value;");

  if (isFourDigitYear(year,control) && year > 1000)
  {
    year--;
    calDate.setFullYear(year);
    if (calDate) calDate = checkDateRange(calDate);
    year = calDate.getFullYear();
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");
    writeDatePicker(control);
  }
}

// Set the global date to the previous month and redraw the DatePicker
function setPreviousMonth(control)
{
  eval("var year  = top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value;");
  if (isFourDigitYear(year,control))
  {
    eval("var month = top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex;");

    // If month is january, set month to december and decrement the year
    if (month == 0)
    {
      month = 11;
      if (year > 1000)
      {
        year--;
        calDate.setFullYear(year);
        if (calDate) calDate = checkDateRange(calDate);
        year = calDate.getFullYear();
        eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");
      }
    }
    else 
    {
      month--;
    }
    calDate.setMonth(month);
    if (calDate) calDate = checkDateRange(calDate);
    month = calDate.getMonth();
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex = month;");
    writeDatePicker(control);
  }
}

// Set the global date to the next month and redraw the DatePicker
function setNextMonth(control)
{
  eval("var year = top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value;");

  if (isFourDigitYear(year,control))
  {
    eval("var month = top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex;");

    // If month is december, set month to january and increment the year
    if (month == 11)
    {
      month = 0;
      year++;
      calDate.setFullYear(year);
      if (calDate) calDate = checkDateRange(calDate);
      year = calDate.getFullYear();
      eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");
    } else
    {
      month++;
    }
    calDate.setMonth(month);
    if (calDate) calDate = checkDateRange(calDate);
    month = calDate.getMonth();
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.month.selectedIndex = month;");
    writeDatePicker(control);
  }
}

// Set the global date to the next year and redraw the DatePicker
function setNextYear(control)
{
  eval("var year  = top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value;");
  if (isFourDigitYear(year,control))
  {
    year++;
    calDate.setFullYear(year);
    if (calDate) calDate = checkDateRange(calDate);
    year = calDate.getFullYear();
    eval("top.newWin" + control + ".frames['topCalFrame'].document.calControl.year.value = year;");
    writeDatePicker(control);
  }
}

// Get number of days in month
function getDaysInMonth()
{
  var days;
  var month = calDate.getMonth()+1;
  var year  = calDate.getFullYear();

  // Return 31 days
  if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
  {
    days=31;
  }
  // Return 30 days
  else if (month==4 || month==6 || month==9 || month==11) 
  {
    days=30;
  }
  // Return 29 days
  else if (month==2)  
  {
    if (isLeapYear(year))
    {
      days=29;
    }
    // Return 28 days
    else 
    {
      days=28;
    }
  }
  return (days);
}

// Check to see if year is a leap year
function isLeapYear (Year)
{
  if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0))
    return true;
  else 
    return false;
}

// Ensure that the year is four digits in length
function isFourDigitYear(year,control)
{
  if (year.length != 4)
  {
    eval("top.newWin" + control +".frames['topCalFrame'].document.calControl.year.value = calDate.getFullYear();");
    eval("top.newWin" + control +".frames['topCalFrame'].document.calControl.year.select();");
    eval("top.newWin" + control +".frames['topCalFrame'].document.calControl.year.focus();");
  }
  else 
  {
    return true;
  }
}

// Build the month select list
function getMonthSelect(control)
{
  // Determine month to set as default
  var activeMonth = calDate.getMonth();

  // Start html select list element
  monthSelect = "<SELECT class=\"CalendarControls\" NAME='month' onChange='parent.opener.setCurrentMonth(\""+control+"\")'>";

  // Loop through month array
  for (i in listMonths)
  {
    // Show the correct month in the select list
    if (i == activeMonth)
    {
      monthSelect += "<OPTION SELECTED>" + listMonths[i] + "\n";
    }
    else 
    {
      monthSelect += "<OPTION>" + listMonths[i] + "\n";
    }
  }
  monthSelect += "</SELECT>";

  // Return a string value which contains a select list of all 12 months
  return monthSelect;
}

// Set days of the week depending on language
function createWeekdayList(control)
{
  firstWeekDayIndex = 0;
  newWeekdayArray = new Array(7);
  newWeekdayList = new Array(7);

  for (var i=0; i<listShortWeekdays.length; i++)
    if (listShortWeekdays[i]==firstWeekDay) firstWeekDayIndex = i;

  for (var i=firstWeekDayIndex; i<listShortWeekdays.length; i++)
  {
      newWeekdayArray[i-firstWeekDayIndex] = listShortWeekdays[i];
      newWeekdayList[i-firstWeekDayIndex] = listWeekdays[i];
  }

  for (var i=0; i<firstWeekDayIndex; i++)
  {
      newWeekdayArray[7-firstWeekDayIndex-i] = listShortWeekdays[i];
      newWeekdayList[7-firstWeekDayIndex-i] = listWeekdays[i];
  }

  // Start html to hold weekday names in table format
  var weekdays = "<TR>";

  // Loop through weekday array
  for (i in listShortWeekdays)
  {
      weekdays += "<TH class=\"calendar\" align=\"center\">" + newWeekdayArray[i] + "</TH>";
  }

  weekdays += "</TR>";

  // Return table row of weekday abbreviations to display above the DatePicker
  return weekdays;
}

// Pre-build portions of the DatePicker (for performance reasons)
function buildCalParts(control)
{
  // Generate weekday headers for the DatePicker
  weekdays = createWeekdayList(control);

  // Build the blank cell rows
  blankCell = "<TD align=center class=\"workday\">&nbsp;&nbsp;&nbsp;</TD>";

  // Build the top portion of the DatePicker page using css to control some display elements
  DatePickerBegin =
      (isNav?"":"<HTML>" +
      "<HEAD>" +
      // Stylesheet defines appearance of DatePicker
      "<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\""+eval(control+".style")+"\">"+
      "<STYLE>" +
      "BODY, TABLE, TH, TR, TD, UL, OL, LI, P, FONT, A, BLOCKQUOTE, LABEL { font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 13px; }" +
      "hr {	color: #B5C7CE;  height: 1px;    }" +
      "</STYLE>" +
      "</HEAD>" +
      "<BODY TOPMARGIN='0' LEFTMARGIN='0'>") + "<CENTER>";

  // Navigator needs a table container to display the table outlines properly
  if (isNav)
  {
    DatePickerBegin += "<TABLE CELLPADDING=0 CELLSPACING=1 ALIGN=CENTER CLASS=\"Table\"><TR><TD>";
  }

  // Build weekday headings
  DatePickerBegin += "<TABLE CELLPADDING=0 CELLSPACING=1 CLASS=\"Table\">" + weekdays + "<TR>";

  // Build the bottom portion of the DatePicker page
  DatePickerEnd = "";

  // Navigator needs a table container to display the borders properly
  if (isNav)
  {
    DatePickerEnd += "</TD></TR></TABLE>";
  }

  // End the table and html document
  DatePickerEnd +=
      "</TABLE>" +
      "</CENTER>" +
      (isNav?"":"</BODY>" +
      "</HTML>");
}

// Set field value to the date selected and close the DatePicker window
function returnDate(inDay,control)
{
  disableEvents = true;

  // inDay = the day the user clicked on
  calDate.setDate(inDay);

  if (calDate) calDate = checkDateRange(calDate);

  // Set the date returned to the user
  var dateFormat = eval(control + ".format");

  outDate = formatDate(calDate, parseDateFormat(dateFormat));

  // Set the value of the field that was passed to the DatePicker
  calDateField.value = String(outDate).replace(/\s*$/, "");

  // Give focus back to the date field
  calDateField.focus();

  // Close the DatePicker window
  eval("top.newWin" + control + ".close()");
  eval("top.newWin" + control + " = '';")
}

function UnLoad(control)
{
  disableEvents = true;
  eval("top.newWin" + control + " = '';")
}

//End JS DatePicker

