var calDateField;
var CalFrame;

/**
 * 0 = Sonntag
 * 1 = Montag
 * 2 = Dienstag
 * ...
 * Diese Variable kann in der jeweiligen Seite ueberschrieben werden
 * Dass MUSS natuerlich nach dem "Include" dieses Scriptes erfolgen
 */
var calWeekdayToStart = 1;
var calMonthArray = new Array('J&auml;nner', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni',
                              'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
var calWeekdayArray = new Array('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');
var calWeekdayOutput = false;

function calendar() {
  buildCal(arguments[0]);
}
function buildCal() {

    calDateField = arguments[0];

    if (CalFrame == undefined || CalFrame == null) {
      if ((typeof calDateField) == "object" && (typeof calDateField.value) == "string") {
        CalFrame = document.createElement('iframe');
        var frameName='spCalFrame'+new Date().getTime();
        CalFrame.id = frameName;
        CalFrame.name = frameName;
        CalFrame.marginHeight = '0';
        CalFrame.marginWidth = '0';
        CalFrame.scrolling = 'NO';
        CalFrame.frameBorder = '0';
        CalFrame.src = self.location.href;

        CalFrame.style.border = '0px none white';
        CalFrame.style.position = 'absolute';
        CalFrame.style.width = '230px';
        CalFrame.style.height = '220px';
        CalFrame.style.zIndex = '105';
        CalFrame.style.overflow = 'hidden';
        
        if (isTopCalPop(calDateField)) {
          CalFrame.style.marginTop= '-'+CalFrame.style.height;
        } else {
          if (calDateField.offsetHeight && calDateField.offsetHeight>=12) {
            CalFrame.style.marginTop= (calDateField.offsetHeight+1)+'px';
          } else {
            CalFrame.style.marginTop= '22px';
          }
        }

        calDateField.parentNode.insertBefore(CalFrame, calDateField);

        drawCal(calDateField.value);
      }
    } else {
      HideCal();
    }
}

// Wird oberhalb oder unterhalb des Elements aufgepopt?
function isTopCalPop(elem) {
  var topScroll = 0;
  var elemTopPos = 0;
  var winHeight = 1024;

  if (self.pageYOffset) {
	topScroll = self.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop) {
	topScroll = document.documentElement.scrollTop;
  } else if (document.body) {
	topScroll = document.body.scrollTop;
  }
  if (self.innerHeight) {
	winHeight = self.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) {
	winHeight = document.documentElement.clientHeight;
  } else if (document.body) {
	winHeight = document.body.clientHeight;
  }
  if (elem && elem.offsetHeight) {
    winHeight += elem.offsetHeight;
  }
  for (var pElem = elem; (typeof pElem) != 'undefined' && pElem && pElem != null; pElem=pElem.offsetParent) {
    if (pElem.offsetTop) {
      elemTopPos+=pElem.offsetTop;
    }
  }
  return ((elemTopPos-topScroll) > ((winHeight/2)+50)); // 50 Pixel Toleranz (Wahrscheinlichkeit nach unten zu popen ist hoeher)
}

function drawCal (sDateUeber) {
	var sHTML = new String();
	var lTargetYear;
	var lTargetMonth;
	var lTargetDay;
	
	var sSplitDate;
	
	var objPop;

	sSplitDate = sDateUeber.split(' ');
	var sDate = sSplitDate[sSplitDate.length-1];

	// ex: "02/15/2001" will get split into an array.  the '/' is the separator
	sSplitDate = sDate.split('/');
	if (sSplitDate.length<3) {
	  sSplitDate = sDate.split('.');
	}
	if (sSplitDate.length<3) {
              var jetzt = new Date();
	  lTargetYear = jetzt.getFullYear();
	  lTargetDay = jetzt.getDate();
	  lTargetMonth = jetzt.getMonth();
	} else {
	  lTargetYear = parseInt(sSplitDate[2]);
	  lTargetDay = parseInt(sSplitDate[0]);
	  lTargetMonth = parseInt(sSplitDate[1] -1);
	}
	
	//objPop= window.open('','Note','toobar=no,location=no, directories=no,status=yes,scrollbars=yes,resizable=yes, copyhistory=no,width=300,height=200')
	//font-family : Arial,Helvetica,Sans-serif;
	//font-size : 11px;
	//color : #ffffff;
	//setup styles to define the look of the calendar

	sHTML += '<html> <head> ';
	sHTML += '<title>Kalender</title> ';
	sHTML += '<style> ';
	sHTML += 'a:link {color: #0055AA; text-decoration: none; } ';
	sHTML += 'a:visited {color: #0055AA; text-decoration: none; } ';
	sHTML += 'a:active {color: #993399; text-decoration: none; } ';
	sHTML += 'a:hover {color: #0055AA; text-decoration: underline; } ';
	sHTML += 'a.calToday:link { font-weight:bold; font-size:14px; line-height:14px; color:#009900; text-decoration: none; } ';
	sHTML += 'a.calToday:visited { font-weight:bold; font-size:14px; line-height:14px; color:#009900; text-decoration: none; } ';
	sHTML += '.calHeading {background-color: Silver; font: 8px Verdana;} '
	sHTML += '.calWeekday {background-color: #aaaaaa; font-size: 11px; font-family: verdana, arial;} ';
	sHTML += '.calWeekdaySo {background-color: #aaaaaa; color: #990000; font-size: 11px; font-family: verdana, arial;} ';
	sHTML += '.calOtherDay {background-color: #eeeeee; font-family: verdana, arial; font-size: 11px;} ';
	sHTML += '.calOtherDaySo {color: #990000; background-color: #eeeeee; font-family: verdana, arial; font-size: 11px;} ';
	sHTML += '.calSelected { font-family: Arial,Helvetica,Sans-serif; font-size: 11px; color: #ffffff;background-color : #f3f3c3;} ';
	sHTML += '.calReg {font-family: Arial,Helvetica,Sans-serif; font-size: 11px;} ' ;
	sHTML += '.calRegSo {font-family: Arial,Helvetica,Sans-serif; font-size: 11px;} ' ;
	sHTML += '.calRegSo a:link {color: #990000;} ' ;
	sHTML += '.calRegSo a:visited {color: #990000;} ' ;
	sHTML += '.calRegSo a:active {color: #993399;} ' ;
	sHTML += '.calRegSo a:hover {color: #990000;} ' ;
	sHTML += 'select.month{background-color: #eeeeee; font-family: Arial,Helvetica,Sans-serif; font-size: 11px;} ';
	sHTML += 'select.year{background-color: #eeeeee; font-family: Arial,Helvetica,Sans-serif; font-size: 11px;} ';
	sHTML += '</style> ';
	sHTML += '</head> <body style="height:100%; width:100%; overflow:hidden; border:0px none white; "> ';

	//start grid
	sHTML += DrawCalendarMonth(lTargetYear, lTargetMonth, lTargetDay);
	sHTML +=  '</body> ';
	sHTML +=  '</html>';

    myCalFrame = eval('frames.'+CalFrame.name);

    try {
      myCalFrame.stop();
    } catch (ignored) {}
    try {
      myCalFrame.document.close();
    } catch (ignored) {}
    myCalFrame.document.open();
    myCalFrame.document.write(sHTML);
    myCalFrame.document.close();
}

function DrawCalendarMonth(lYear, lMonth, lDay) {
   var i, j, index;
   var sCal = new String();
   var sMonthPicker = new String();
   var sYearPicker = new String();
   var dcurrDate= new Date(lYear, lMonth, lDay);

    var lDaysInMonth = GetDaysInMonth(dcurrDate.getMonth()+1, dcurrDate.getFullYear());
    var thisMonthFirstDay = new Date(lYear, lMonth, 1);
   
    var sNextYear = ('1.' + (lMonth+1) + '.' + (lYear+1));
    var sPrevYear = ('1.' + (lMonth+1) + '.' + (lYear-1));
    
    var sNextMonth = ('1.' + (lMonth+2) + '.' + lYear);
    var sPrevMonth = ('1.' + (lMonth) + '.' + lYear);
    if (lMonth+2 > 12) {
      sNextMonth = ('1.1.' + (lYear+1));
    }
    if (lMonth < 1) {
      sPrevMonth = ('1.12.' + (lYear-1));
    }
    
    // 'Set the Date variables
  
    var jetzt = new Date();
    var dateJetztStr = jetzt.getDate()+'.';
    dateJetztStr += (jetzt.getMonth()+1)+'.';
    dateJetztStr += jetzt.getFullYear();

    if (calWeekdayOutput==true) {
      dateJetztStr = calWeekdayArray[jetzt.getDay()].substring(0,2) +' '+ dateJetztStr;
    }

    sMonthPicker += '<select class="month" name="month" id="month" onchange="var blah=\'1.\' + (this.selectedIndex + 1) + \'.' + 
        lYear + '\';parent.drawCal(blah);">';
		for (var y=0; y < 12;y++){
	      sMonthPicker += '<option value="' + y + '"';
	         if (y == lMonth) sMonthPicker += ' selected';
		  sMonthPicker += '>' + calMonthArray[y] + '</option>';
	    }
	    sMonthPicker += '</select>';

    sYearPicker += '<select class="year" name="year" id="year" onchange="var blah=\'1.' + (lMonth+1) + '.\' + this.value; '+
          'parent.drawCal(blah);">';
		for (var y=lYear-10; y <= lYear+10;y++){
	      sYearPicker += '<option value="' + y + '"';
	         if (y == lYear) sYearPicker += ' selected';
		  sYearPicker += '>' + y + '</option>';
	    }
	    sYearPicker += '</select>';


    sCal = '<table border="1" bordercolor="#000000" bgcolor="#ffffff" cellspacing="0" cellpadding="1" style="height:100%; width:100%; overflow:hidden; border:1px solid #000000; background-color:#ffffff; -moz-border-radius:4px; border-radius:4px; border-collapse:collapse;">';

    sCal += '<tr height="16" class="heading" bgcolor="#f3f3c3" style="padding-top:3px; border:0px none #000000; border-bottom:1px solid #000000;">';
    sCal += '<td height="16" align=center ondblclick="parent.HideCal();" style="border:0px none #000000; border-bottom:1px solid #000000;"><img src="/sbgcss/images/calendar_icon.gif" style="padding:0px; margin:0px;" border="0" align=center alt="X" title=""></td>';
    sCal += '<td title="aktuelles Monat anzeigen" colspan=5 align="center" style="border:0px none #000000; border-bottom:1px solid #000000; padding:0px; margin:0px; cursor:pointer; font-family:verdana,arial; font-size:12px;" onmouseover="this.style.backgroundColor=\'#f9f9eb\';" onmouseout="this.style.backgroundColor=\'\';" onclick="parent.drawCal(\''+dateJetztStr+'\');">'+dateJetztStr+'</td>';
    sCal += '<td title="Kalender schlie&szlig;en" style="border:0px none #000000; border-bottom:1px solid #000000; padding:0px; margin:0px; cursor:pointer;" onmouseover="this.style.backgroundColor=\'#f9f9eb\';" onmouseout="this.style.backgroundColor=\'\';" onclick="parent.HideCal();" align="center"><img src="/sbgcss/images/calendar_abbr.gif" style="padding:0px; margin:0px;" border="0" align=center alt="X" title="Kalender schlie&szlig;en"></td>';
    sCal += '</tr>';


    sCal += '<tr height="28" class="heading" bgcolor="#eeeeee" style="border:0px none #000000; border-top:1px solid #000000;">';
    sCal += '<td height="28" style="border:0px none #000000; border-top:1px solid #000000; padding:0px; margin:0px; cursor:pointer; font-family:verdana,arial; font-size:18px;" onmouseover="this.style.backgroundColor=\'#f9f9eb\';" onmouseout="this.style.backgroundColor=\'\';" onclick="parent.drawCal(\''+sPrevMonth+'\');" align=center>'+unescape('%AB')+'</td>';
    sCal += '<td colspan=5 style="border:0px none #000000; border-top:1px solid #000000; padding:0px; margin:0px; font-family:verdana,arial; font-size:10px;" align=center>' + sMonthPicker + sYearPicker + '</td>';
    sCal += '<td style="border:0px none #000000; padding:0px; border-top:1px solid #000000; margin:0px; cursor:pointer; font-family:verdana,arial; font-size:18px;" onmouseover="this.style.backgroundColor=\'#f9f9eb\';" onmouseout="this.style.backgroundColor=\'\';" onclick="parent.drawCal(\''+sNextMonth+'\');" align=center>'+unescape('%BB')+'</td>';
    sCal += '</tr>';

    var weekdays = '<tr height="20" bgcolor="#aaaaaa">';
    // LOOP THROUGH WEEKDAY ARRAY
	for (i=0; i < calWeekdayArray.length; i++) {
	  index = i+calWeekdayToStart;
	  if (index >= calWeekdayArray.length) {
	    index -= calWeekdayArray.length;
	  }
	  weekdays += '<td height="20" width="14%" align="center" class="calWeekday'+(index==0||index==6?'So':'')+'">' + calWeekdayArray[index].substring(0,2) +'</td>';
    }
	weekdays +='</tr><tr>';      
 
    sCal += weekdays;

    for (i=0; i < calWeekdayArray.length; i++) {
	  index = i+calWeekdayToStart;
	  if (index >= calWeekdayArray.length) {
	    index -= calWeekdayArray.length;
	  }
      if (index==thisMonthFirstDay.getDay()) break;
      sCal += DrawOtherDay(thisMonthFirstDay.getDay() - i - calWeekdayToStart, dcurrDate);
    }

    for (i=1; i < lDaysInMonth+1; i++) {
		dcurrDate.setDate(i);

		//start a new week if we are at the begin
		if (dcurrDate.getDay() ==calWeekdayToStart && i>1) { 
			sCal +='</tr><tr>';      
	    }
	
		sCal += DrawNormalDay(i, dcurrDate);
	}
    for (i=dcurrDate.getDay();  i < calWeekdayArray.length; i++) {
	  index = i+calWeekdayToStart;
	  if (index >= calWeekdayArray.length) {
	    index -= calWeekdayArray.length;
	  }
      if (index==calWeekdayToStart) break;
      sCal +=  '<td class="calOtherDay" align=center>&nbsp;</td>';
	}
	sCal +='</tr>';

    sCal += '<tr height="16" class="heading" bgcolor="#f3f3c3">';
    sCal += '<td colspan="7" align="center"><input style="font-family:verdana,arial; font-size:11px;" type="button" value="Heute" onclick="parent.SetCalDatum(event, \''+dateJetztStr+'\');"></td>';
    sCal += '</tr>';

	sCal +='</table>';      
  
 return sCal;

}

function DrawOtherDay(lDayOffset, dDate) {
 var DayNumber;
 if (lDayOffset<0) lDayOffset+=7;
 var dWorkingDate = new Date(dDate.getFullYear(), dDate.getMonth(), (- lDayOffset) + 1) 
 var sTemp = new String(); 
 
 DayNumber = dWorkingDate.getDate();
 
 //' Draws a day cell - date is in previous or next month
 //' The response.write's are separate lines for clarity only
 sTemp = '<td class="calOtherDay'+(dWorkingDate.getDay()==0||dWorkingDate.getDay()==6?'So':'')+'" align=center>';
 sTemp += '';
 sTemp += DayNumber + '</td>';
 return sTemp;
}

function DrawNormalDay(DayNumber, dDate) {
 //' Draws a day cell - date is in current month
 //' The response.write's are separate lines for clarity only
  var sDayDate = new String();
  var dWorkingDate = new Date(dDate.getFullYear(), dDate.getMonth(), DayNumber) 
  var sTemp = new String(); 
  var dToday = new Date();
  var sClassName = 'calReg'+(dWorkingDate.getDay()==0||dWorkingDate.getDay()==6?'So':'');
  var sClassNameA = '';
  
  sDayDate = DayNumber + '.' + (dWorkingDate.getMonth() + 1) + '.' + dWorkingDate.getFullYear();

  if (sDayDate == dToday.getDate() + '.' + ((dToday.getMonth() + 1) + '.' + dToday.getFullYear())) {
	sClassNameA = 'calToday';
  }
  if (calWeekdayOutput==true) {
    sDayDate = calWeekdayArray[dWorkingDate.getDay()].substring(0,2) +' '+ sDayDate;
  }
  if (sDayDate == calDateField.value) {
	sClassName+=' calSelected';
  }
  
  sTemp += '<td class="' + sClassName +'" style="cursor:pointer;';
  sTemp += '" onMouseOver="this.style.backgroundColor = \'#fcfce6\'" onMouseOut="this.style.backgroundColor = \'\'" ';
  //sTemp += 'onclick="calDateField.value=(\'' + sDayDate + '\'); HideCal();"';
  sTemp += 'onclick="parent.SetCalDatum(event, \''+sDayDate+'\');"';
  sTemp += ' align=center>';
  sTemp += '<a class="' + sClassNameA +'" href="javascript:void(\'' + sDayDate + '\');" onclick="void(\'' + sDayDate + '\');">' + DayNumber + '</a>';
  sTemp += '</td>';
  return sTemp;
}

function SetCalDatum(ev, sDatum) {
    if (!ev) {
      ev=window.event;
    }
    if (calDateField.value != sDatum) {
      calDateField.value = sDatum;
      if (calDateField.onchange) {
        try {
          if (typeof (calDateField.onchange) == 'function') {
            calDateField.onchange(ev);
          } else if (typeof (calDateField.onchange) != 'undefined') {
            eval(calDateField.onchange);
          }
        } catch (ignored) {}
      }
    }
    try {
      if (calDateField.focus) {
        calDateField.focus();
      }
    } catch (e) {}
    HideCal();
}

function HideCal() {
    CalFrame.parentNode.removeChild(CalFrame);
    CalFrame = null;
}

function GetDaysInMonth(iMonth, iYear) {
	//Returns the number of days in a month
	/*
		In: iMonth: Number of the Month -not zero based ie 3=March
		    iYear: four digit year
	*/
	var dPrevDate = new Date(iYear, iMonth, 0);
	return dPrevDate.getDate();
}

String.prototype.getDateStr = function (dateformat) 
{
 re = {d:"\\d(\\d|)",m:"([\\d]|)\\d",y:"\\d\\d([\\d]|)([\\d]|)" };
 tempobj = {};
 for(var i=0; i<3; i++)
  for(var j in dateformat)
   if(dateformat[j]==i) {
    dateformat[i]=j;
    break;
   }
 var re_str = "\\b" + re[dateformat[0]] + "([\\.]|[\\/])" + re[dateformat[1]] + "([\.]|[\/])" + re[dateformat[2]] + "\\b";
 var date = this.match(new RegExp(re_str,"gmi"));
 return  (date==null ? null : date[0].indexOf(".")!=-1 && date[0].indexOf("/")!=-1? null : date[0]);
}

String.prototype.getTimeStr = function (timeformat) {
 var time = this.match(/\b(\d|)\d\:\d\d\b/);
 return (time==null ? null : time[0]);
}

function CheckDatum(cur) {
	var s = cur.value;
	var tag, monat, jahr;
	var position = 0;
	var monatstage = [31,28,31,30,31,30,31,31,30,31,30,31];

	var m_name1 = ["j"+unescape("%E4")+"nner","februar","m"+unescape("%E4")+"rz","april","mai","juni","juli","august","september","oktober","november","dezember"];
	var m_name2 = ["jannuar","februer","marz","abril","may","juny","july","agust","sebtember","october","nobember","december"];


// leere Eingabe wird hier nicht geprueft
	if( s == "") 
		return true;

// regular expression
//                     T  T   Trennz.     Monat Trennz.    Jahr
	re = new RegExp("(\\d\\d?)[,\\x2d/.\\x3d/ ]+(\\w+)[,\\x2d/.\\x3d/ ]*(\\d*)","");
	// RegExp testen
	if ( !re.test( s)) {
		alert('Ung'+unescape('%FC')+'ltiges Eingabeformat');
		return dateErrorHandler(cur);
	}

	// RegExp ausfuehren
	regExpResult=re.exec( s);
		
	tag = regExpResult[1];
	monat = regExpResult[2];
	jahr = regExpResult[3];


	tag_n=parseInt(tag, 10);
	if( isNaN(tag_n) || (tag_n < 1) || (tag_n > 31)) {
		alert("Tag muß zwischen 1 und 31 liegen!");
		return dateErrorHandler(cur);
	}

	monat_n = parseInt( monat, 10);
	if( isNaN(monat_n)) {
		// vielleicht alpha-eingabe ?
		for(var i=0; i<12; i++)
		{
			if( m_name1[i].indexOf(monat.toLowerCase())== 0 || m_name2[i].indexOf(monat.toLowerCase())== 0 ) 
			{
				monat = i+1;
				monat_n = parseInt(monat, 10);
				break;
			}
		}
	}
	if (isNaN(monat_n)) {
		alert('Monatseingabe ist ung'+unescape('%FC')+'ltig');
		return dateErrorHandler(cur);
	}
	if(( monat_n < 1) || (monat > 12)) {
		alert("Es gibt bloß 12 Monate im Jahr  ;-) (den Monatsnamen schon probiert?)");
		return dateErrorHandler(cur);
	}

	jahr_n = parseInt( jahr, 10);

	if( isNaN(jahr_n) || jahr_n > 9999 || jahr_n < 1000) {
		year_helper = new Date;
		jahr_jetzt= year_helper.getFullYear();
		// getYear returns 2-digit values for years between 1900-1999
		if( jahr_jetzt < 100)
			jahr_jetzt += 1900;
		jahrhundert = parseInt(jahr_jetzt/100);
		jahrzweiste = jahr_jetzt - (jahrhundert*100);
		if( isNaN(jahr_n)) {
			jahr_n = jahr_jetzt;
		} else {
			if( jahr_n < 100) {
				if (jahrzweiste < 60)
					if (jahr_n < 70)
						jahr_n += (jahrhundert*100);
					else	jahr_n += ((jahrhundert-1)*100);
				else
					if (jahr_n < 70)
						jahr_n += ((jahrhundert+1)*100);
					else	jahr_n += (jahrhundert*100);
			} else if (jahr_n < 1000) {
				if (jahr_n < 300)
					jahr_n += 2000;
				else	jahr_n += 1000;
			} else {
				jahr_n = jahr_jetzt;
			}
		}
	}
	// schaltjahr ?
	leap=false;
	if( (jahr_n % 4) == 0) {
		leap=true;
		if( (jahr_n % 100) == 0) {
			leap = false;
			if( (jahr_n % 400) == 0)
				leap = true;
		}
	}

	// passen tag + monat zusammen ?
	if( leap)
		monatstage[1] = 29;
	else	
		monatstage[1] = 28;

	if( monatstage[ monat_n - 1] < tag_n) {
		alert("Monat " + m_name1[monat_n - 1] + " hat nicht " + tag_n + " Tage!");
		return dateErrorHandler(cur);
	} else {
        var dcurrDate = new Date(jahr_n, (monat_n-1), tag_n);
		neudatum = String(tag_n) + "." + String(monat_n) + "." + String(jahr_n);
        cur.value = neudatum;
		if (calWeekdayOutput==true) {
          cur.value = calWeekdayArray[dcurrDate.getDay()].substring(0,2) + ' ' + cur.value;
		}
		try {
		  cur.jahr= jahr_n;
		  cur.monat= monat_n;
		  cur.tag= tag_n;
		  cur.monatText= calMonthArray[dcurrDate.getMonth()];
		  cur.tagText= calWeekdayArray[dcurrDate.getDay()];

		  parent.document.write;
		} catch (ignored) {}
		return true;
	}
}

var CheckDateField;
function dateErrorHandler(cur) {
  CheckDateField = cur;
  if (!event) {
    var event = window.event;
  }
  if (event) {
    try {
      event.returnValue = false;
      event.cancelBubble = true;
    } catch (ignored) {}
    if (event.stopPropagation) {
      event.stopPropagation();
    }
  }
  CheckDateField.value="";
  try {
    if (CheckDateField.focus) {
      CheckDateField.focus();
    }
  } catch (e) {}
  window.setTimeout('try {if (CheckDateField && CheckDateField!=null && CheckDateField.focus) CheckDateField.focus();} catch (ignored) {}',50);
  return false;
}

