// Bestimmen des Browsertyps  ***********************************************************************

var All = false;
var DOM = false;
var IE = false;

if (document.getElementById) DOM = true;
if (document.all) All = true;
if (navigator.userAgent.indexOf("MSIE") > 0 && navigator.userAgent.indexOf("Opera") < 0) IE = true

// Verweis auf List- und Textboxen zu Datumswrten  **************************************************

var txtDate;
var txtDay;
var txtMonth;
var txtYear;

// Variablen zu Kalenderinhalt  *********************************************************************

var cal;
var	blFlight = true;

var datNow;
var lstM;
var lstY;
var mon;
var yr;

// Zählersuffix für Kalender bei kumulierten Mieten, Test erfolgt in InitCal()  *********************

var kum = "";


/**********************************************************************************************
* Aufbau des Kalenderinhalts nach Wechsel zu anderem Monat / Jahr
**********************************************************************************************/

function BuildCal() {

	// frühesten möglichen Monat einstellen, falls Monat/Jahr vor datNow liegt

	var yr_new = lstY.options[lstY.selectedIndex].text;
	var mon_new = lstM.selectedIndex;
	var datStart = new Date(yr_new, mon_new, 1);		// erster Tag für eingestellten Monat/Jahr

	if (datStart < new Date(datNow.getFullYear(), datNow.getMonth(), 1)) {

		lstY.selectedIndex = 0;
		lstM.selectedIndex = datNow.getMonth();
		datStart = new Date(datNow.getFullYear(), datNow.getMonth(), 1);
	}

	mon = lstM.selectedIndex;
	yr = lstY.options[lstY.selectedIndex].text;

	// Wochentag für ersten Tag des Monats, sowie Anzahl Tage im Monat feststellen  ***

	var intStart = datStart.getDay();
	if (intStart == 0) intStart = 7;
	var intDays = getDaysInMonth(mon+1, yr);

	// Kalender mit Datumswerten füllen  ************************

	for (var i = 1; i <= 42; i++)	 {			// Elemente vor Beginn und nach Ende leeren
		if (i >= intStart && i < intStart+intDays) continue;
		if (DOM)
			obj = document.getElementById("z"+i);
		else
			obj = eval("document.all.z"+i);
		obj.innerHTML = "&nbsp;";
		obj.className = "";
	}

	for (i = 0; i < intDays; i++) {			// Datumswerte für Monat schreiben
		if (DOM)
			obj = document.getElementById("z"+(i+intStart));
		else
			obj = eval("document.all.z"+(i+intStart));

		obj.innerHTML = (i+1);

		if (IsOpen(new Date(yr, mon, i+1)))
			obj.className = "calVal";
		else
			obj.className = "";
	}
}

/**********************************************************************************************
* Blendet Kalender ein. Für NS6 erfolgt die Darstellung in X leicht versetzt zum Klickpunkt,
* für IE wird an einer festen X-Position eingeblendet, die ausserhalb des Formularbereichs
* liegt (Formularfelder scheinen sonst durch).
**********************************************************************************************/

function CalOn(strID, e) {

	// Show calendar DIV  **********************

	CalOff();
	SetCal();
	BuildCal();

	cal.style.visibility = 'visible';

	// Set output objects according to button clicked  ******

	var frm = document.forms["frmMain"];

	if (strID == "cmdOut") {
		txtDate = eval("frm.Abflugtag" + kum);
		txtDay = eval("frm.Anmiettag" + kum);
		txtMonth = eval("frm.Anmietmonat" + kum);
		txtYear = eval("frm.Anmietjahr" + kum);
	}
	else {
		txtDate = eval("frm.Rueckflugtag" + kum);
		txtDay = eval("frm.Rueckgabetag" + kum);
		txtMonth = eval("frm.Rueckgabemonat" + kum);
		txtYear = eval("frm.Rueckgabejahr" + kum);
	}
}

/**********************************************************************************************
* Blendet Kalender aus
**********************************************************************************************/

function CalOff() {

	cal.style.visibility = 'hidden';
}


/**********************************************************************************************
* Bestimmt Anzahl der Tage pro Monat
**********************************************************************************************/

function getDaysInMonth (month, year) {

	var days;
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
		days=31;
	else if (month==4 || month==6 || month==9 || month==11)
		days=30;
	else if (month==2) {
		if (isLeapYear(year))
			days=29;
		else
			days=28;
	}
	return (days);
}

/**********************************************************************************************
* Prüft, ob das angegebene Jahr ein Schaltjahr ist
**********************************************************************************************/

function isLeapYear (Year) {

    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0))
	    return (true);
    else
        return (false);
}

/***********************************************************************************************
* Initialisieren von globalen Variablen, Aufruf nach vollständigem Laden des Dokuments
* Die left-Eigenschaft (X-Position) des Kalenders ist bei IE fix (um durchscheinen von evtl.
* unterliegenden Formularelementen zu verhindern), bei NS6 (das diesen Effekt nicht kennt) wird
* die left-Position entsprechend Klickposition auf den "Kalender"-Button in CalOn() berechnet.
***********************************************************************************************/

function InitCal(strMode, intTop, intLeft) {

	//  Arbeitsmodus (nur Rental oder Flight/Rental)  ***************************************

	if (typeof strMode == "undefined" || strMode == "rental") blFlight = false;

	//  Setzen der globalen Variablen  ******************************************************

	if (DOM) {
		cal = document.getElementById("Kalender");
		var main = document.getElementById("main");
	  
  }
	else if (All) {
		cal = document.all.Kalender;
		var main = document.all.main;
	}

	// Kalender positionieren (bei IE automatisch neben dem Formularbereich)  ***************

	if (typeof intTop != "undefined") cal.style.top = intTop;

	//* Funktion stillgelegt: if (IE)
	//* Funktion stillgelegt: 	cal.style.left = main.clientWidth + parseInt(main.style.left) + 10;
	//* Funktion stillgelegt: else {

	if (typeof intLeft != "undefined") cal.style.left = intLeft;

	// globale Variablen setzen  ************************************************************

	var frm = document.forms["frmCal"];
	lstM = frm.lstMonth;
	lstY = frm.lstYear;

	// Test auf Formular für kumulierte Mieten, Namenssuffix setzen  ************************

	if (document.forms["frmMain"].Anmiettag2) kum = "2";
	
	
}


/***********************************************************************************************
* Prüft, ob das als Argument übergebene Datum ein gültiger Tag ist. Festgelegt werden die
* gültigen Tage durch die globalen Variablen datBeginSch, datEndSch (= Beginn und Ende der
* Mietperiode), sowie araReg und araIrr (Arrays mit Wochentagen bzw. Datumswerten).
* Wenn die globale Variable blFlight (gesetzt in InitCal()) auf true steht, nimmt die Funktion
* an, dass die Arrays die gültigen Flugtage enthalten. Ist blFlight false, dann nimmt die
* Funktion an, dass die Arrays die Schliessungstage des Fahrzeugvermieters enthalten.
***********************************************************************************************/

function IsOpen(datCheck) {

 var blCheckReg = true; // araReg bei Flugtagen nur checken, wenn innerhalb gültigen Zeitraums

 // document.frmMain.Anmietland.value==1 -- Australien
 // document.frmMain.Anmietland.value==2 -- Neuseeland
 // document.frmMain.Anmietland.value==3 -- Namibia
 
 if (document.frmMain.Anmietland.value==1){
	 datBeginSchChk = datBeginSch;
	 datEndSchChk = datEndSch;
 }
 
 if (document.frmMain.Anmietland.value==2){
	 datBeginSchChk = datBeginSchNeu;
	 datEndSchChk = datEndSchNeu;
 }
 
 if (document.frmMain.Anmietland.value==3){
	 datBeginSchChk = datBeginSchNam;
	 datEndSchChk = datEndSchNam;
 }

 // Datum innerhalb der gültigen Mietperiode ?  ******************************************

if (datCheck < datBeginSchChk || datCheck > datEndSchChk)
  if (!blFlight)
   return false;
  else
   blCheckReg = false;

 // An diesem Wochentag geöffnet / Flugangebot ?  ****************************************

 var intDay = datCheck.getDay();
 if (araReg != null && blCheckReg)
  for (i = 0; i < araReg.length; i++)
   if (intDay == araReg[i]) return blFlight;

 // Ist das Datum ein Feiertag, an dem geschlossen ist / zusätzlicher Flugtag ?  *********

 if (araIrr != null)
  for (i = 0; i < araIrr.length; i++)
   if (datCheck.toString() == araIrr[i].toString()) return blFlight;

 return (!blFlight);
}

/*******************************************************************************************
* Schaltet Kalender einen Monat weiter, aufgerufen durch Klick auf Pfeil im Kalender-Kopf
*******************************************************************************************/

function NextMonth() {

	// aktuelle Werte der Listboxen lesen  **********************

	var mon_new = lstM.selectedIndex;
	var y = lstY.selectedIndex;

	// Nächsten Monat einstellen, ggf. Jahr einstellen  *********

	if (mon_new == 11) {
		mon_new = 0;
		y++;
		if (y == lstY.options.length) return false;
		lstY.selectedIndex = y;
	}
	else mon_new++;

	lstM.selectedIndex = mon_new;
	BuildCal();
}

/*******************************************************************************************
* Schaltet Kalender einen Monat zurück, aufgerufen durch Klick auf Pfeil im Kalender-Kopf
*******************************************************************************************/

function PrevMonth() {

	// abbrechen, falls eingestellter Monat/Jahr gleich Monat/Jahr aus datNow  ***********

	if (new Date(yr, mon, 1) <= datNow) return;

	// aktuelle Werte der Listboxen lesen  **********************

	var mon_new = lstM.selectedIndex;
	var y = lstY.selectedIndex;

	// Vorigen Monat einstellen, ggf. Jahr einstellen  *********

	if (mon_new == 0) {
		mon_new = 11;
		y--;
		if (y < 0) return false;
		lstY.selectedIndex = y;
	}
	else mon_new--;

	lstM.selectedIndex = mon_new;
	BuildCal();
}


/***********************************************************************************************
* Setzen des Startmonats bei erstmaligem Aufruf des Kalenders, vor erstem Aufbau
* des Kalenders durch BuildCal(). Die globale Variable datBeginSch (Beginn der Mietperiode)
* wird vermieterspezifisch in der Berechnungsseite gesetzt, die den Kalender aufruft.
***********************************************************************************************/

function SetCal() {

	// Testen, ob aktuelles Datum oder Beginn der Gültigkeitsperiode zum Startdatum wird **
//
// Hier rumgepfuscht 
//
	//ORIGINAL 
	datNow = new Date();
	// EDIT datNow = new Date(2005,04,03);

	if (datNow < datBeginSch) datNow = datBeginSch;

	// Falls irreguläre Tage früher beginnen, setze diese als Startdatum ******************

	if (araIrr != null) {
		var datIrr = new Date(araIrr[0]);
		if (datIrr < datNow && datIrr > new Date()) datNow = datIrr;
	}

	// Listbox für Monat einstellen  ******************************************************

	lstM.selectedIndex = datNow.getMonth();

	// Listbox für Jahr füllen / einstellen  ***********************************************

	lstY.options.length = 0;	// alte Werte löschen

	var yr1 = datNow.getFullYear();
	var yr2 = datEndSch.getFullYear();

	for (var i=yr1; i<=yr2; i++)
		lstY.options[lstY.options.length] = new Option(i);

	// Falls Kalender bereits angezeigt war, Monat/Jahr (soweit einstellbar) übernehmen ****

	if (mon != null)
		for (i=0; i<lstY.options.length; i++)
			if (lstY.options[i].text == yr) {
				lstY.selectedIndex = i;
				lstM.selectedIndex = mon;
				break;
			}

	// Array mit regelmäßigen Schließungstagen umwandeln in Format aus Date.getDay()  ******

	if (araReg != null) {

		var araDays = new Array("So","Mo","Di","Mi","Do","Fr","Sa")

		if (typeof araReg[0] == "string")
			for (var i = 0; i < araReg.length; i++)
				for (var j = 0; j < araDays.length; j++)
					if (araReg[i].substr(0,2) == araDays[j]) {
						araReg[i] = j;
						break;
					}
	}

	// Array mit Feiertags-Schliessungen in Date-Objekte umwandeln  ************************

	if (araIrr == null) return;
	if (typeof araIrr[0] == "string")
		for (var i = 0; i < araIrr.length; i++)
			araIrr[i] = new Date(araIrr[i]);
}

/**********************************************************************************************
* Schreibt Datumswert in ein Formularfeld, falls es ein gültiger Reisetag ist (Kennzeichen:
* Attribut class ist "calVal"). Aufgerufen durch Klick auf ein beliebiges Datum im
* Kalender. Nach Klick auf gültiges Datum wird der Kalender geschlossen.
**********************************************************************************************/

function WriteDate(obj) {

	if (obj.className == "calVal") {	 		// clicks on "valid" table cells only

		if (txtDate) txtDate.value = obj.innerHTML + "." + (mon+1) + "." + yr;

		txtDay.value = obj.innerHTML;
		txtMonth.value = (mon+1);
		txtYear.value = yr;

		CalOff();
	}
}
