var datePickerDivID = "datepicker";
var iFrameDivID     = "datepickeriframe";

var defaultDateSeparator  = "-";
var defaultDateFormat     = "yymd";  // valid values are "mdy", "dmy", and "ymd"
var dateSeparator         = defaultDateSeparator;
var dateFormat            = defaultDateFormat;

function displayDatePicker (dateFieldId,displayBelowThisObject,dtFormat,dtSep)
{
  var targetDateField = document.getObjectRef(dateFieldId);

  if (!displayBelowThisObject)
    displayBelowThisObject  = targetDateField;

  if (dtSep)
    dateSeparator = dtSep;
  else
    dateSeparator = defaultDateSeparator;

  if (dtFormat)
    dateFormat  = dtFormat;
  else
    dateFormat  = defaultDateFormat;

  drawDatePicker(targetDateField,displayBelowThisObject);
}

function drawDatePicker (targetDateField,oRef)
{
  var dt        = getFieldDate(targetDateField.value);
  var pickerDiv = document.getObjectRef(datePickerDivID);

  if (pickerDiv == null)
  {
    pickerDiv = document.createElement("div");

    pickerDiv.setAttribute("id",datePickerDivID);
    pickerDiv.setAttribute("class","dpDiv");
    pickerDiv.setAttribute("style","visibility:hidden;");

    document.body.appendChild(pickerDiv);
  }

  pickerDiv.style.position    = "absolute";
  pickerDiv.style.visibility  = (pickerDiv.style.visibility == "visible"?"hidden":"visible");
  pickerDiv.style.display     = (pickerDiv.style.display == "block"?"none":"block");
  pickerDiv.style.zIndex      = 10000;

  document.showDIVNextTo(datePickerDivID,oRef);

  refreshDatePicker(targetDateField.id,dt.getFullYear(),dt.getMonth(),dt.getDate());
}

function refreshDatePicker (dateFieldName,year,month,day)
{
  var thisDay;

  if ((month >= 0) && (year > 0))
  {
    thisDay = new Date(year,month,1);
  }
  else
  {
    thisDay = new Date();
    day     = thisDay.getDate();

    thisDay.setDate(1);
  }

  var crlf            = "\r\n";
  var TABLE           = "<table cols=\"7\" class=\"dpTable\">" + crlf;
  var xTABLE          = "</table>" + crlf;
  var TR              = "<tr class=\"dpTR\">";
  var TR_title        = "<tr class=\"dpTitleTR\">";
  var TR_days         = "<tr class=\"dpDayTR\">";
  var TR_todaybutton  = "<tr class=\"dpTodayButtonTR\">";
  var xTR             = "</tr>" + crlf;
  var iTD             = "<td>";
  var TD              = "<td class=\"dpTD\"";
  var TD_free         = "<td class=\"dpFreeTD\"";
  var TD_title        = "<td colspan=\"5\" class=\"dpTitleTD\">";
  var TD_buttons      = "<td class=\"dpButtonTD\">";
  var TD_todaybutton  = "<td colspan=\"7\" class=\"dpTodayButtonTD\">";
  var TD_days         = "<td class=\"dpDayTD\">";
  var TD_freedays     = "<td class=\"dpFreeDayTD\">";
  var TD_selected     = "<td class=\"dpDayHighlightTD\"";
  var xTD             = "</td>" + crlf;
  var DIV_title       = "<div class=\"dpTitleText\">";
  var DIV_selected    = "<div class=\"dpDayHighlight\">";
  var xDIV            = "</div>";

  var html = TABLE;

  html += TR_title;
  html += TD_buttons + getButtonCode(dateFieldName,thisDay,-1,"&lt;") + xTD;
  html += TD_title + DIV_title + monthArray[thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV + xTD;
  html += TD_buttons + getButtonCode(dateFieldName,thisDay,1,"&gt;") + xTD;
  html += xTR;

  html += TR_days;
  for (i = 0;i < dayArray.length;i++)
  {
    if ((i == 0) || (i == (dayArray.length - 1)))
      html += TD_freedays + dayArray[i] + xTD;
    else
      html += TD_days + dayArray[i] + xTD;
  }
  html += xTR;

  html += TR;

  for (i = 0;i < thisDay.getDay();i++)
  {
    html += iTD + "&nbsp;" + xTD;
  }

  do
  {
    dayNum      = thisDay.getDate();
    TD_onclick  = " onclick=\"updateDateField('" + dateFieldName + "','" + getDateString(thisDay) + "');\">";

    if (dayNum == day)
    {
      html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;
    }
    else
    {
      if ((thisDay.getDay() == 0) || (thisDay.getDay() == 6))
        html += TD_free + TD_onclick + dayNum + xTD;
      else
        html += TD + TD_onclick + dayNum + xTD;
    }

    if (thisDay.getDay() == 6)
    {
      html += xTR + TR;
    }

    thisDay.setDate(thisDay.getDate() + 1);
  }
  while (thisDay.getDate() > 1);

  if (thisDay.getDay() > 0)
  {
    for (i = 7;i > thisDay.getDay();i--)
    {
      html += iTD + "&nbsp;" + xTD;
    }
  }
  html += xTR;

  var today = new Date();

  html += TR_todaybutton + TD_todaybutton;
  html += "<div class=\"dpTodayButton\" style=\"margin-right:10px\" onClick=\"refreshDatePicker('" + dateFieldName +
          "');\">" + lblToday.htmlEncode() + "</div>";
  html += "<div class=\"dpTodayButton\" onClick=\"updateDateField('" + dateFieldName +
          "');\">" + lblClose.htmlEncode() + "</div>";
  html += xTD + xTR;

  html += xTABLE;

  document.getObjectRef(datePickerDivID).innerHTML = html;

  adjustiFrame();
}

function getButtonCode (dateFieldName,dateVal,adjust,label)
{
  var newMonth  = (dateVal.getMonth() + adjust) % 12;
  var newYear   = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);

  if (newMonth < 0)
  {
    newMonth += 12;
    newYear  += -1;
  }

  return("<div class=\"dpButton\" onClick=\"refreshDatePicker('" + dateFieldName + "'," + newYear + "," + newMonth + ");\">" + label + "</div>");
}

function getDateString (dateVal)
{
  var dayString   = "00" + dateVal.getDate();
  var monthString = "00" + (dateVal.getMonth() + 1);

  dayString   = dayString.substring(dayString.length - 2);
  monthString = monthString.substring(monthString.length - 2);

  switch (dateFormat)
  {
  case "dmy":
    return(dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear());
  case "ymd":
  case "yymd":
    return(dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString);
  case "mdy":
  default:
    return(monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear());
  }
}

function getFieldDate (dateString)
{
  var dateVal;
  var dArray;
  var d,m,y;

  try
  {
    dArray  = splitDateString(dateString);

    if (dArray)
    {
      switch (dateFormat)
      {
      case "dmy":
        d = parseInt(dArray[0],10);
        m = parseInt(dArray[1],10) - 1;
        y = parseInt(dArray[2],10);
        break;
      case "ymd":
      case "yymd":
        d = parseInt(dArray[2],10);
        m = parseInt(dArray[1],10) - 1;
        y = parseInt(dArray[0],10);
        break;
      case "mdy":
      default :
        d = parseInt(dArray[1],10);
        m = parseInt(dArray[0],10) - 1;
        y = parseInt(dArray[2],10);
        break;
      }

      if (y < 100)
        y += 2000;

      dateVal = new Date(y,m,d);
    }
    else if (dateString)
    {
      dateVal = new Date(dateString);
    }
    else
    {
      dateVal = new Date();
    }
  }
  catch (e)
  {
    dateVal = new Date();
  }

  return(dateVal);
}

function splitDateString (dateString)
{
  var dArray;

  if (dateString.indexOf("/") >= 0)
  {
    dArray = dateString.split("/");
  }
  else if (dateString.indexOf(".") >= 0)
  {
    dArray = dateString.split(".");
  }
  else if (dateString.indexOf("-") >= 0)
  {
    dArray = dateString.split("-");
  }
  else if (dateString.indexOf("\\") >= 0)
  {
    dArray = dateString.split("\\");
  }
  else
  {
    dArray = false;
  }

  return(dArray);
}

function updateDateField (dateFieldName,dateString)
{
  var targetDateField = document.getObjectRef(dateFieldName);
  var showDateField   = document.getObjectRef('show_' + dateFieldName);
  var pickerDiv       = document.getObjectRef(datePickerDivID);

  if (dateString)
  {
    targetDateField.value = dateString;

    if (showDateField)
      showDateField.value = dateString;
  }

  pickerDiv.style.visibility  = "hidden";
  pickerDiv.style.display     = "none";

  adjustiFrame();
//  targetDateField.focus();

  if ((dateString) && (typeof(datePickerClosed) == "function"))
  {
    datePickerClosed(targetDateField);
  }
}

function adjustiFrame (pickerDiv,iFrameDiv)
{
  var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);

  if (isOpera)
    return;

  try
  {
    var iFrameDiv = document.getObjectRef(iFrameDivID);

    if (iFrameDiv == null)
    {
      iFrameDiv = document.createElement("iFrame");

      iFrameDiv.setAttribute("id",iFrameDivID);
      iFrameDiv.setAttribute("src","javascript:false;");
      iFrameDiv.setAttribute("scrolling","no");
      iFrameDiv.setAttribute ("frameborder","0");

      document.body.appendChild(iFrameDiv);
    }

    if (!pickerDiv)
      pickerDiv = document.getObjectRef(datePickerDivID);

    try
    {
      iFrameDiv.style.position    = "absolute";
      iFrameDiv.style.width       = pickerDiv.offsetWidth;
      iFrameDiv.style.height      = pickerDiv.offsetHeight;
      iFrameDiv.style.top         = pickerDiv.style.top;
      iFrameDiv.style.left        = pickerDiv.style.left;
      iFrameDiv.style.zIndex      = pickerDiv.style.zIndex - 1;
      iFrameDiv.style.visibility  = pickerDiv.style.visibility;
      iFrameDiv.style.display     = pickerDiv.style.display;
    }
    catch(e)
    {
    }
  }
  catch (ee)
  {
  }
}
