/**
version 1.5
December 4, 2005
Julian Robichaux -- http://www.nsftools.com
*/

var datePickerDivID = "calendarPicker";
var iFrameDivID = "calendariframe";

var dayArrayShort = new Array('S', 'M', 'T', 'W', 'T', 'F', 'S');
var dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
var dayArrayLong = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var monthArrayShort = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
var monthArrayLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
 
var defaultDateSeparator = "/";
var defaultDateFormat = "mdy";
var dateSeparator = defaultDateSeparator;
var dateFormat = defaultDateFormat;

function displayDatePicker(dateFieldName, displayBelowThisObject, dtFormat, dtSep)
{
  var targetDateField = document.getElementsByName (dateFieldName).item(0);

  if (!displayBelowThisObject)
    displayBelowThisObject = targetDateField;
 
  if (dtSep)
    dateSeparator = dtSep;
  else
    dateSeparator = defaultDateSeparator;
 
  if (dtFormat)
    dateFormat = dtFormat;
  else
    dateFormat = defaultDateFormat;
 
  var x = displayBelowThisObject.offsetLeft;
  var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight ;
 
  var parent = displayBelowThisObject;
  while (parent.offsetParent) {
    parent = parent.offsetParent;
    x += parent.offsetLeft;
    y += parent.offsetTop ;
  }
 
  drawDatePicker(targetDateField, x, y);
}

function drawDatePicker(targetDateField, x, y)
{
  var dt = getFieldDate(targetDateField.value );
 
  if (!document.getElementById(datePickerDivID)) {
   
    var newNode = document.createElement("div");
    newNode.setAttribute("id", datePickerDivID);
    newNode.setAttribute("class", "dpDiv");
    newNode.setAttribute("style", "visibility: hidden;");

	var container = new Element('div', {'id':'pickerBackground'}).injectInside(newNode);
    document.body.appendChild(newNode);
	if(window.ie6){
		var iFrame = new Element('iframe', {
			'styles' : {
				'position' : 'absolute',
				'opacity' : .1
			}
		}).injectAfter(newNode);
		setInterval(function(){
			if($('calendarPicker').style.display == 'none'){
				iFrame.setStyles({
					'top' : -100,
					'left' : -100,
					'height' : 1,
					'width' : 1
				});
			} else {
				iFrame.setStyles({
					'top' : container.getTop(),
					'left' : container.getLeft(),
					'width' : 220,
					'height' : 219
				});
			}
		}, 20);
	}
	new PNGFix();
  }
 
  var pickerDiv = document.getElementById(datePickerDivID);
  pickerDiv.style.position = "absolute";
  pickerDiv.style.left = x + "px";
  pickerDiv.style.top = y + "px";
  pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");
  pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
  pickerDiv.style.zIndex = 10000;
 
  refreshDatePicker(targetDateField.name, dt.getFullYear(), dt.getMonth(), dt.getDate());
	if(newNode) newNode.makeDraggable();
}

function refreshDatePicker(dateFieldName, year, month, day)
{
  var thisDay = new Date();
  var currentDay = new Date();

  if ((month >= 0) && (year > 0)) {
    thisDay = new Date(year, month, 1);
  } else {
    day = thisDay.getDate();
    thisDay.setDate(1);
  }
  var finalDate = new Date();
  finalDate = finalDate.setDate(finalDate.getDate() + 14);
  var html =	'<div class="close" onclick="updateDateField(\'' + dateFieldName + '\');">&nbsp;</div>' +
				'<table class="calendar">' +
					'<tr>' + 
						'<th class="button previous">' + getButtonCode(dateFieldName, thisDay, -1, "&lt;") + '</th>' +
						'<th class="month" colspan="5" onclick="refreshDatePicker(\'' + dateFieldName + '\');">' + monthArrayLong[ thisDay.getMonth()] + " " + thisDay.getFullYear() + '</th>' +
						'<th class="button next">' + getButtonCode(dateFieldName, thisDay, 1, "&gt;") + '</th>' +
 					'</tr>' + 
					'<tr class="days">';
	for(i = 0; i < dayArrayShort.length; i++){
		html += '<td>' + dayArrayShort[i] + '</td>';
	}
	
	html += '</tr><tr>';
  	for (i = 0; i < thisDay.getDay(); i++){
    	html += '<td class="invalid">&nbsp;</td>';
  	}
 
  do {
    dayNum = thisDay.getDate();
	if(currentDay > thisDay || finalDate < thisDay){
	  html += '<td class="invalid">' + dayNum + '</td>';
	} else if (dayNum == day){
      html += '<td class="selected" onclick="updateDateField(\'' + dateFieldName + '\', \'' + getDateString(thisDay) + '\');">' + dayNum + '</td>';
   } else {
      html += '<td onclick="updateDateField(\'' + dateFieldName + '\', \'' + getDateString(thisDay) + '\');">' + dayNum + '</td>';
    }
    if (thisDay.getDay() == 6)
      html += '</tr><tr>';
    
    thisDay.setDate(thisDay.getDate() + 1);
  } while (thisDay.getDate() > 1)
 
  if (thisDay.getDay() > 0) {
    for (i = 6; i > thisDay.getDay(); i--)
      html += '<td>&nbsp;</td>';
  }
  html += "</tr>";
 
  var today = new Date();
  var todayString = "Today is " + dayArrayMed[today.getDay()] + ", " + monthArrayMed[ today.getMonth()] + " " + today.getDate();
  html += '</table>';
  document.getElementById('pickerBackground').innerHTML = html;
}

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 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" :
      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" :
          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;
      }
      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.getElementsByName (dateFieldName).item(0);
  if (dateString)
    targetDateField.value = dateString;
 
  var pickerDiv = document.getElementById(datePickerDivID);
  pickerDiv.style.visibility = "hidden";
  pickerDiv.style.display = "none";
 
  targetDateField.focus();
   if ((dateString) && (typeof(datePickerClosed) == "function"))
    datePickerClosed(targetDateField);
}

