var ReferenceDateFieldName = null;

function DatePicker() { this.Dummy = ""; }

DatePicker.DivID = "DatePicker";
DatePicker.iFrameDivID = "datepickeriframe";
DatePicker.WeekdayShort = new Array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
DatePicker.Month = new Array('Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
DatePicker.CloseText = "Schlie&szlig;en";
 
var defaultDateSeparator = ".";
var defaultDateFormat = "dmy";    //"mdy", "dmy", "ymd"

DatePicker.Show = function(dateFieldName, referenceDateFieldName)
{
	var targetDateField = document.getElementsByName(dateFieldName).item(0);

	if(referenceDateFieldName!=null)
		ReferenceDateFieldName = referenceDateFieldName;
	else
		ReferenceDateFieldName = null;

	var x = targetDateField.offsetLeft;
	var y = targetDateField.offsetTop + targetDateField.offsetHeight ;

	var parent = targetDateField;
	while (parent.offsetParent) 
	{
		parent = parent.offsetParent;
		x += parent.offsetLeft;
		y += parent.offsetTop ;
	}

	drawDatePicker(targetDateField, x, y);
}
 
function drawDatePicker(targetDateField, x, y)
{
	var dt = getFieldDate((ReferenceDateFieldName!=null ? document.getElementsByName(ReferenceDateFieldName)[0].value : targetDateField.value));
 
	if (!document.getElementById(DatePicker.DivID)) 
	{
		var newNode = document.createElement("div");
		newNode.setAttribute("id", DatePicker.DivID);
		newNode.setAttribute("class", "DatePicker");
		newNode.setAttribute("style", "visibility: hidden;");
		document.body.appendChild(newNode);
	}
  
	var pickerDiv = document.getElementById(DatePicker.DivID);
	pickerDiv.style.position = "absolute";
	pickerDiv.style.left = x + "px";
	pickerDiv.style.top = y + "px";
	pickerDiv.style.width = "200px";
	pickerDiv.style.border = "1px solid darkgray";
	pickerDiv.style.visibility = updateDateFieldWasJustCalled ? "hidden" : "visible";
	pickerDiv.style.display = updateDateFieldWasJustCalled ? "none" : "block";
	pickerDiv.style.zIndex = 10000;
  
	updateDateFieldWasJustCalled = false;
	
	refreshDatePicker(targetDateField.name, dt.getFullYear(), dt.getMonth(), dt.getDate());
}
  
function refreshDatePicker(dateFieldName, year, month, day)
{
	var Today = new Date();
	Today.setDate(Today.getDate() + 2);
	var thisDay = Today;
	var BaseDay = thisDay;
	var ReferenceDate = (ReferenceDateFieldName!=null ? getFieldDate(document.getElementsByName(ReferenceDateFieldName)[0].value) : null);
  
	if(ReferenceDate!=null)
	{
		BaseDay = ReferenceDate;
		thisDay = BaseDay;
	}

	//alert(thisDay + "/" + Today + "/" + ReferenceDate + "/" + month + "/" + year);	

	if ((month >= 0) && (year > 0)) 
	{
		if(month<Today.getMonth() && year==Today.getYear())
			month++;
		thisDay = new Date(year, month, 1);
	}
	else 
	{
		day = thisDay.getDate();
		thisDay.setDate(1);
	}
//alert(thisDay + "/" + Today + "/" + ReferenceDate + "/" + month + "/" + year);	

	var tooSmall = false;
	var tooBig = false;
	
	if (dropDownMinMonth != "")
	{
		var year = thisDay.getYear();

		if (year < 999)
			year += 1900;

    if (year == dropDownMinYear && thisDay.getMonth() == dropDownMinMonth)
		tooSmall = true;

    if (year == dropDownMaxYear && thisDay.getMonth() == dropDownMaxMonth)
		tooBig = true;
	}
	else
		tooSmall = true;
  
	var html = "<table class='DatePicker' onmouseover=\"MouseOverTable();\" onmouseout=\"MouseOutTable('" + dateFieldName + "', '" + getDateString(thisDay) + "');\">"
				+ "<thead>"
					+ "<tr onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>"
						+ "<td onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>"
							+ getButtonCode(dateFieldName, thisDay, -1, "&lt;", tooSmall) 
						+ "</td>"
						+ "<td colspan=5 onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>"
							+ "<div onmouseover='MouseOverTable();' MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");>" 
								+ getDropDownCode(dateFieldName, thisDay, BaseDay, thisDay) + "</div>"
						+ "</td>" 
						+ "<td onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>" 
							+ getButtonCode(dateFieldName, thisDay, 1, "&gt;", tooBig) 
						+ "</td>" 
					+ "</tr>" 
				+ "</thead>" 
				+ "<tr onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>";
 
	for(i = 0; i < DatePicker.WeekdayShort.length; i++) 
		html += "<td class='Caption' onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>" + DatePicker.WeekdayShort[(i+1)%7] + "</td>";
  
	html += "</tr>"
			+ "<tr onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>";

	var numberOfWrittenLines = 0;
	var addAnAdditionalLine = true;
 
	//führende Leerflächen
	for (i = 1; i < thisDay.getDay(); i++) //hier war ne 0
		html += "<td class=\"Empty\" onmouseover='MouseOverTable();' onMouseOut='MouseOutTable(\"" + dateFieldName + "\", \"\");'>&nbsp;</td>";
			
	do 
	{
		dayNum = thisDay.getDate();
		TD_onclick = " onclick=\"updateDateField(true, false, '" + dateFieldName + "', '" + getDateString(thisDay) + "');\">";
    
		if(thisDay < Today || thisDay <= ReferenceDate)
			html += "<td class=\"Empty\" onmouseover='MouseOverTable();' onMouseOut='MouseOutTable(\"" + dateFieldName + "\", \"\");'>" + dayNum + "</td>";
		else if (dayNum == day)
			html += "<td class='Highlight' onMouseOut='this.className=\"Highlight\";MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");' onMouseOver='this.className=\"Hover\";MouseOverTable();' "
					+ TD_onclick + "<div>" + dayNum + "</div></td>";
		else
			html += "<td onMouseOut='this.className=\"\"; MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");' onMouseOver='this.className=\"Hover\"; MouseOverTable();' " 
					+ TD_onclick + "<div>" + dayNum + "</div></td>";
	  
		addAnAdditionalLine = false;
    
		//bei Samstagen eine neue Zeile anfangen
		//ne, bei Sonntagen...
		if (thisDay.getDay() == 0) //war ne 6
		{
			html += "</tr>" 
					+ "<tr onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>";
			numberOfWrittenLines++;
			addAnAdditionalLine = true;;
		}
    
		thisDay.setDate(thisDay.getDate() + 1);

	} while (thisDay.getDate() > 1)
 
 	if (thisDay.getDay() > 0) 
	{
		for (i = thisDay.getDay() +1; i <= 8; i++) //war <=
			html += "<td class=\"Empty\" onmouseover='MouseOverTable();' onMouseOut='MouseOutTable(\"" + dateFieldName + "\", \"\");'>&nbsp;</td>";
	} 
	else if (addAnAdditionalLine)
	{
		for(i = 0; i < 7; i++)
			html += "<td class=\"Empty\"><div>&nbsp;</div></td>";
	}

	while (numberOfWrittenLines < 6)
	{
		html += "</tr><tr>";
		for(i = 0; i < 7; i++)
			html += "<td class=\"Empty\"><div>&nbsp;</div></td>";
		numberOfWrittenLines++;
	}
	
	/*if (addAnAdditionalLine)
	{
		html += "</tr><tr>";
		for(i = 0; i < 7; i++)
			html += "<td class=\"Empty\"><div>&nbsp;</div></td>";
	}*/
  
	html += "</tr>"
		+ "</table><br><button onmouseover='MouseOverTable();' onMouseOut='MouseOutTable(\"" + dateFieldName + "\", \"\");' onClick='updateDateField(false, false, \"" + dateFieldName + "\");'>" + DatePicker.CloseText + "</button><br><br>";
		
	document.getElementById(DatePicker.DivID).innerHTML = html;
}

function getButtonCode(dateFieldName, dateVal, adjust, label, disabled)
{
  if (disabled)
    return "";
  else
  {
    var newMonth = (dateVal.getMonth () + adjust) % 12;
    var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
    if (newMonth < 0)
	{
      newMonth += 12;
      newYear += -1;
    }

    var ret = "<button class='dpButton' ";

    /* if (disabled)
	  ret += "disabled "; */

    ret += "onClick='refreshDatePicker(\"" + dateFieldName + "\", " + newYear + ", " + newMonth + ");'>" + label + "</button>";

    return ret;
  }
}

var dropDownMinMonth = "";
var dropDownMaxMonth = "";
var dropDownMinYear = "";
var dropDownMaxYear = "";

var dropDownEntered = false;

function DropDownEntered()
{
  dropDownEntered = true;
}

function DropDownLeft()
{
  dropDownEntered = false;
}

function getDropDownCode(dateFieldName, dateVal, baseDate, thisDay)
{
  var returnValue = "<select name=\"Months\" class='dpButton' onfocus='DropDownEntered();' onblur='DropDownLeft();' onchange='dropDownChanged(this.value);' onmouseover='MouseOverTable();' onmouseout='MouseOutTable(\"" + dateFieldName + "\", \"" + getDateString(thisDay) + "\");'>";
  var arrayLength = 12;
  
  //alert(dateVal + " / " + baseDate + " / " + thisDay);
  for (var i = 0; i < arrayLength; i++)
  {
    var newYear = baseDate.getYear();
	var dateValYear = dateVal.getYear();

    if (newYear < 999)
	{
      newYear += 1900;
	  dateValYear += 1900;
	}

    /*if (baseDate.getMonth() < i - 1 )
      newYear += 1;*/

    var newMonth = (baseDate.getMonth() + i) % 12;

	if(newMonth < baseDate.getMonth())
		newYear += 1;

    var optionValue = dateFieldName + " " + newYear + " " + newMonth;
    var optionText = DatePicker.Month[newMonth] + " " + newYear;

    if (i == 0)
    {
      dropDownMinMonth = newMonth;
      dropDownMinYear = newYear;
    }
    else if (i == arrayLength - 1)
    {
      dropDownMaxMonth = newMonth;
      dropDownMaxYear = newYear;
    }

    returnValue += "<option ";

    if (newMonth == dateVal.getMonth() && newYear == dateValYear)
      returnValue+="selected ";

    returnValue += "value ='" + optionValue + "'>" + optionText + "</option>";
  }
  returnValue += "</select>";
  
  return returnValue;
}

function dropDownChanged(param)
{
  var parameters = param.split(" ");
  refreshDatePicker(parameters[0], parameters[1], parameters[2]);
}

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 (defaultDateFormat) {
    case "dmy" :
      return dayString + defaultDateSeparator + monthString + defaultDateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + defaultDateSeparator + monthString + defaultDateSeparator + dayString;
    case "mdy" :
    default :
      return monthString + defaultDateSeparator + dayString + defaultDateSeparator + dateVal.getFullYear();
  }
}
 
function getFieldDate(dateString)
{
  var dateVal;
  var dArray;
  var d, m, y;
 
  try {
    dArray = splitDateString(dateString);
    if (dArray) {
      switch (defaultDateFormat) {
        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();
	alert(dateVal);
	dateVal.setDate(dateVal.getDate() + 2);
  }
 
  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 updateDateFieldWasJustCalled = false;

function updateDateField(update, leftWithoutExplicitClosing, dateFieldName, dateString)
{
  var targetDateField = document.getElementsByName (dateFieldName).item(0);
  if (update && dateString)
    targetDateField.value = dateString;
 
  var pickerDiv = document.getElementById(DatePicker.DivID);
  
  if (!leftWithoutExplicitClosing)
    updateDateFieldWasJustCalled = true;
  
  pickerDiv.style.visibility = "hidden";
  pickerDiv.style.display = "none";
 
  targetDateField.focus();
 
  if ((dateString) && (typeof(datePickerClosed) == "function"))
    datePickerClosed(targetDateField);
}
 
function AdjustiFrame()
{
	//Opera mag das nicht, also gar nicht erst versuchen
  var is_opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
  if (is_opera)
    return;
  
  return;
  var pickerDiv = document.getElementById(DatePicker.DivID);
  var iFrameDiv = document.getElementById(DatePicker.iFrameDivID);
  try 
  {
	if (iFrameDiv == null) {
      var newNode = document.createElement("iFrame");
      newNode.setAttribute("id", DatePicker.iFrameDivID);
      newNode.setAttribute("src", "javascript:false;");
      newNode.setAttribute("scrolling", "no");
      newNode.setAttribute("frameborder", "0");
	  document.body.appendChild(newNode);	
    }
    
    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) { 
  }
 
}

var tableTimer;

function MouseOverTable()
{
  clearTimeout(tableTimer);
}

function MouseOutTable(dateFieldName, dateString)
{
  if (!dropDownEntered)
  {
    clearTimeout(tableTimer);
  
    tableTimer = setTimeout("updateDateField(false, false, '" + dateFieldName + "', '" + dateString + "', false)", 1000);
  }
}
