function $(id) {
	return document.getElementById(id);
}

// ------------------------------
// Date Picker
// ------------------------------

var calendarFocus = false;
var datePickerDivID = "datepicker";

var dayArrayShort = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
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 = "dmy";
var dateSeparator = defaultDateSeparator;
var dateFormat = defaultDateFormat;
var fixed = false;
var showOnlyDay = -1;
var inlinePicker = false;

function displayDatePicker(targetDateField, displayBelowThisObject, dtFormat, dtSep)
{  
  if (!displayBelowThisObject)
    displayBelowThisObject = targetDateField;
	
  dateSeparator = (dtSep) ? dtSep : defaultDateSeparator;
  
  dateFormat = (dtFormat) ? dtFormat : 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 (!$(datePickerDivID)) {
    var newNode = document.createElement("div");
    newNode.setAttribute("id", datePickerDivID);
    newNode.setAttribute("class", "dpDiv");
    newNode.setAttribute("style", "visibility: hidden;");
    document.body.appendChild(newNode);
  }
  
  var pickerDiv = $(datePickerDivID).style;
  pickerDiv.position = fixed ? "fixed" : 'absolute';
  pickerDiv.left = x + "px";
  pickerDiv.top = y + "px";
  pickerDiv.visibility = (pickerDiv.visibility == "visible" ? "hidden" : "visible");
  pickerDiv.display = (pickerDiv.display == "block" ? "none" : "block");
  
  refreshDatePicker(targetDateField.name, dt.getFullYear(), dt.getMonth(), dt.getDate());
}

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

  if ((month >= 0) && (year > 0)) {
    thisDay = new Date(year, month, 1);
  }
  else {
    day = thisDay.getDate();
    thisDay.setDate(1);
  }

  var TD = "<td ";
  var TD_title = '<td colspan="5">';
  var TD_buttons = "<td>";
  var TD_todaybutton = '<td colspan="7">';
  var TD_selected = "<td class='dpDayHighlightTD' ";
  var xTD = "</td>";
  var DIV_title = "<div>";
  var DIV_selected = "<div class='dpDayHighlight'>";
  var xDIV = "</div>";
  
  var html = '<table cellspacing="0" cellpadding="0" onfocus="calendarFocus = true;" onblur="calendarFocus = false;">';
  
  html += '<thead><tr>';
  
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, -1, '<img src="/images/calendar-arrow-left.png" alt="Left" />') + xTD;
  html += TD_title + DIV_title + monthArrayLong[ thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV + xTD;
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, 1, '<img src="/images/calendar-arrow-right.png" alt="Right" />') + xTD;
  
  html += '</tr><tr>';

  for(i = 0; i < dayArrayShort.length; i++)
    html += '<th>' + dayArrayShort[i] + '</th>';

  html += '</tr></thead>';

  // first, the leading blanks
  for (i = 0; i < thisDay.getDay(); i++)
    html += "<th></th>";

  // now, the days of the month
  do {
    dayNum = thisDay.getDate();
    TD_onclick = " onclick=\"updateDateField(this, '" + dateFieldName + "', '" + getDateString(thisDay) + "')\">";
		
		if (showOnlyDay != -1 && thisDay.getDay() != showOnlyDay) {
			TD_onclick = ' style="color:#999;background:#eee;cursor:defauly">';
		}
		
    if (dayNum == day)
      html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;
    else {
      html += TD + TD_onclick + dayNum + xTD;
		}

    // if this is a Saturday, start a new row
    if (thisDay.getDay() == 6)
      html += '</td><tr>';

    // increment the day
    thisDay.setDate(thisDay.getDate() + 1);
  } while (thisDay.getDate() > 1)

  // fill in any trailing blanks
  if (thisDay.getDay() > 0) {
    for (i = 6; i > thisDay.getDay(); i--)
      html += "<th></th>";
  }
  
  html += '</tr>';

  // add a button to allow the user to easily return to today, or close the calendar
  var today = new Date();
  var todayString = "Today is " + dayArrayMed[today.getDay()] + ", " + monthArrayMed[ today.getMonth()] + " " + today.getDate();
  
	if (!inlinePicker) {
		html += '<tfoot><tr>' + TD_todaybutton + '<div class="buttons">';
  
		html += "<input type='button' onClick='refreshDatePicker(\"" + dateFieldName + "\");' value='this month' /> ";
  	html += "<input type='button' onClick='updateDateField(\"this, " + dateFieldName + "\");' value='close' />";
  	html += '</td></tr></tfoot>';
	}
	
  html += '</table>';

  $(datePickerDivID).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 "<a onClick='refreshDatePicker(\"" + dateFieldName + "\", " + newYear + ", " + newMonth + ");'>" + label + "</a>";
}

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;
}

var selectedDateCell = null;

function updateDateField(td, dateFieldName, dateString)
{
  var targetDateField = document.getElementsByName(dateFieldName).item(0);
  if (dateString)
    targetDateField.value = dateString;

		if (inlinePicker) {
			if (selectedDateCell)
				selectedDateCell.style.background = 'none';
			
			td.style.background = 'red';
			selectedDateCell = td;
			
			return;
		}
			
			
  var pickerDiv = $(datePickerDivID);
  pickerDiv.style.visibility = "hidden";
  pickerDiv.style.display = "none";
}

function closeCalendar()
{
	if (inlinePicker)
		return;
	
	if ($('datepicker')) {
		var dateDiv = $(datePickerDivID);
		if (dateDiv.style.visibility == 'visible')
		{
			$(dateDiv).style.visibility = 'hidden';
			$(dateDiv).style.display = 'none';
		}
	}			
}
