
// calendar_functions.js
// all rights austrian airlines group 2005-
// unauthorized use strictly prohibited

// set default error messages
var m_ErrDepToday = "Departure date has to be equal to or greater than today!";
var m_ErrRetToday = "Return date has to be equal to or greater than today!";
var m_ErrRetDep = "Return date has to be equal to or greater than Departure date!";
var m_ErrDepInvalid = "Departure date is not a valid date!";
var m_ErrRetInvalid = "Return date is not a valid date!";
var m_ErrCheckPersons = "The sum of children and adults must not be greater than 9.";
var m_ErrCheckInfants = "The number of infants must not be greater than the number of adults.";
var m_ErrOrigin = "Please specify your point of departure.";
var m_ErrDestination = "Please specify your destination.";

function os_PadLeft(myString, myChar, myLength) {
	// fills a string from the left
	// myString: the String to fill
	// myChar: the fill character
	// myNum: how many characters
	// returns: a String Object
	
	var newString = "";
	myLength = parseInt(myLength);
	if (isNaN(myLength)) {
		return myString;
	}
	if (!myString || !myChar || myLength == 0) {
		return "";
	}
	if (!myChar || myLength == 0) {
		return myString;
	}
	for (i=1; i<=myLength; i++) {
		newString = newString.concat(myChar);
	}
	newString = newString.concat(myString);
	//newString = os_Right(newString, myLength);
	newString = newString.substr(newString.length - myLength, myLength);
	
	return String(newString);
}

function os_IsValidDate(Jahr, Monat, Tag) {

var origMonatObj = Number(Monat);
var origMonat = origMonatObj.valueOf();
origMonat = origMonat - 1;

var dtTestDate = new Date(Number(Jahr), origMonat, Number(Tag));
if (Number(Jahr) != dtTestDate.getFullYear()) {
	return false;
}

if (origMonat != dtTestDate.getMonth()) {
	return false;
}
if (Number(Tag) != dtTestDate.getDate()) {
	return false;
}
return true;

}

function os_Concat(strMsg, strAddMsg, strDelim) {

if (strMsg == "") {
	return strAddMsg;
} else {
	return strMsg + strDelim + strAddMsg;
}

}

function setDate(id_day, id_yearmonth, jahr, monat, tag) {
//sets the date (day + yearmonth to the specified date

	tag = os_PadLeft(String(tag), "0", 2);
	monat = os_PadLeft(String(monat), "0", 2);

	var objTag  = document.getElementById(id_day);
	var objJahrMonat =document.getElementById(id_yearmonth);

	for (var i = 0; i < objTag.options.length; i++)  {
		if (objTag.options[i].value == tag) {
			objTag.selectedIndex = i;
			break;
		}
	}
	
	for (var i = 0; i < objJahrMonat.options.length; i++)  {
		var monthvalue = objJahrMonat.options[i].value.substr(5, 2);
		if (monthvalue == monat) {
			objJahrMonat.selectedIndex = i;
			break;
		}
	}	
	os_YearMonth_Change(id_day, id_yearmonth);
	
}

function saveDate(id_dropdown, id_hidden){
//saves the selected value from the dropdown in the hidden input
	var objDropDown  = document.getElementById(id_dropdown);
	var objHidden  = document.getElementById(id_hidden);
	
	if (objDropDown.selectedIndex != -1){
		//alert ('saving value of ' + id_dropdown + ' (' + objDropDown.options[objDropDown.selectedIndex].value + ') in ' + id_hidden);
		objHidden.value = objDropDown.options[objDropDown.selectedIndex].value;
	}
}

function os_DaysInMonth(jahr, monat)
{
	if ((monat - 1) < 0) return;
	return 32 - new Date(jahr, monat-1, 32).getDate();
}

function os_YearMonth_Change(id_day, id_yearmonth) {
// Year/Month has changed, so the weekday names have to be updated
	
	var objTag  = document.getElementById(id_day);
	var objJahrMonat =document.getElementById(id_yearmonth);

	if (!objTag || !objJahrMonat) return 0;

	var idxold = objTag.selectedIndex;
	var selold = objTag.options[idxold].value;
	var _JahrMonat = objJahrMonat.options[objJahrMonat.selectedIndex].value;

	if (!_JahrMonat || (_JahrMonat == ''))
	{
		objTag.selectedIndex = 0;
		return 0;
	}
	var _oldindex = objTag.selectedIndex;
	var _Jetzt = new Date();
	var _JetztJahr = _Jetzt.getFullYear();
	var _JetztMonat	= _Jetzt.getMonth() + 1; //JavaScript months start at 0!
	var _JetztTag = _Jetzt.getDate();
	var _Jahr = _JahrMonat.substr(0, 4);
	var _Monat = _JahrMonat.substr(5, 2);
	var _Tag = os_DaysInMonth( _Jahr,_Monat ); //number of days in the month
	var _Wochentage = os_Weekdays(); // array of day abbreviations
	var _Ausgabe = '';
	
	//remove all options from day selectbox
	objTag.options.length = 0;
	
  //now add all days with weekday
	for (var i=1; i<=_Tag; i++)
	{
		var option_padded = os_PadLeft(i, "0", 2);
		var option_Datum = new Date(_Jahr,_Monat-1, i);
		var option_Wochentag = _Wochentage[option_Datum.getDay()];
		var option_Text = i + ', ' + option_Wochentag;
		var option_Value = option_padded; 

		objTag.options[objTag.options.length] = new Option(option_Text, option_Value);
	}
	//now add mssing days to 31
	for (var j=i; j<=31; j++)
	{
		var option_padded = os_PadLeft(j, "0", 2);
		var option_Text = j + ', --';
		objTag.options[objTag.options.length] = new Option(option_Text, option_padded);
	}

	if (idxold > _Tag - 1) {
		objTag.selectedIndex = _Tag - 1;
	} else {
		var daySet = 0;
		for (var i=0; i<objTag.options.length; i++)
		{
			if (parseInt(objTag.options[i].value) == selold)
			{
				objTag.selectedIndex = i;
				daySet = 1;	
				break;
			}
		}
		if (daySet == 0) {
			objTag.selectedIndex = _oldindex;
		}
	}
	return (_JetztTag - 1);
}

function os_DateAdd(myDate, myInterval, myNum) {
		// adds to a date 
		// myDate: the date to add something to ==myInterval: the interval to add: 's' = sec., 'n' = min., 'h' = hours, 'd' = 'days', 'w' = weeks, 'm' = months, 'y' = years
		// myNum: number of days/weeks/... to add
		// returns: a Date object
		
  myInterval = myInterval.toLowerCase();
  myNum = parseInt(myNum);
  if (isNaN(myNum)) {
  	return (myDate);
	}
	if (!myInterval || myNum == 0) {
		return myDate;
	}
	switch (myInterval.toLowerCase()) {
		case "s":
			myDate.setSeconds(myDate.getSeconds() + myNum);
			break;
		case "n":
			myDate.setMinutes(myDate.getMinutes() + myNum);
			break;
		case "h":
			myDate.setHours(myDate.getHours() + myNum);
			break;
		case "d":
			myDate.setDate(myDate.getDate() + myNum);
			break;
		case "w":
			myDate.setDate(myDate.getDate() + myNum * 7);
			break;
		case "m":
			myDate.setMonth(myDate.getMonth() + myNum);
			break;
		case "y":
			myDate.setFullYear(myDate.getFullYear() + myNum);
			break;
	}
	return myDate;
}


function os_CheckDate(id_dep_day, id_dep_yearmonth, id_ret_day, id_ret_yearmonth) {
	
	var objDepartTag  = document.getElementById(id_dep_day);
	var objDepartJahrMonat = document.getElementById(id_dep_yearmonth);
	var DepartTag = objDepartTag.options[objDepartTag.selectedIndex].value;
	DepartTag = os_PadLeft(String(DepartTag), "0", 2);
	var DepartJahr = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(0, 4);
	var DepartMonat = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(5, 2);
	var DepartDatum = DepartJahr + DepartMonat + DepartTag;
	// DepartDatum now has the format yyyymmdd, e.g. 20051030

	var objReturnTag  = document.getElementById(id_ret_day);
	var objReturnJahrMonat = document.getElementById(id_ret_yearmonth);
	var ReturnTag = objReturnTag.options[objReturnTag.selectedIndex].value;
	ReturnTag = os_PadLeft(String(ReturnTag), "0", 2);
	var ReturnJahr = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(0, 4);
	var ReturnMonat = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(5, 2);
	var ReturnDatum = ReturnJahr + ReturnMonat + ReturnTag;
	// ReturnDatum now has the format yyyymmdd, e.g. 20051102

	//new Rule #3 2007: DepartDate has to be >= Today
	var todayDate = new Date();
	var todayDay = todayDate.getDate();
	todayDay = os_PadLeft(String(todayDay), "0", 2);
	var todayMonth = todayDate.getMonth() + 1;
	todayMonth = os_PadLeft(String(todayMonth), "0", 2);
	var todayYear = todayDate.getFullYear();
	var todayDatum = todayYear + todayMonth + todayDay;

	var tomorrowDate = os_DateAdd(todayDate, 'd', 1);
	var tomorrowDay = tomorrowDate.getDate();
	tomorrowDay = os_PadLeft(String(tomorrowDay), "0", 2);
	var tomorrowMonth = tomorrowDate.getMonth() + 1;
	tomorrowMonth = os_PadLeft(String(tomorrowMonth), "0", 2);
	var tomorrowYear = tomorrowDate.getFullYear();
	var tomorrowDatum = tomorrowYear + tomorrowMonth + tomorrowDay;
	//alert("tomorrowDatum: " + tomorrowDatum);
	//alert("DepartDatum - todayDatum: " + DepartDatum + " - " + todayDatum);
	if (DepartTag < todayDay) {
		//alert("DepartTag < todayDay: " + DepartTag + " - " + todayDay);
		if (DepartMonat <= todayMonth) {
			//alert("DepartMonat <= todayMonth: " + DepartMonat + " - " + todayMonth);
			//alert("DepartMonth: " + DepartMonth);
			//alert("DepartMonat: " + DepartMonat);
			if (DepartJahr == todayYear) {
				var DepartMonth = Number(DepartMonat) + 1;
				if (DepartMonth > 12) {
					DepartMonth = 1;
				}
			} else {
				DepartMonth = Number(DepartMonat);
			}
			//alert("DepartMonth: " + DepartMonth);
			DepartMonth = os_PadLeft(String(DepartMonth), "0", 2);
			//alert("DepartMonth: " + DepartMonth);
			//alert("Rule #3: Depart < Heute: " + DepartJahr + DepartMonat + DepartTag + " < " + ReturnJahr + todayMonth + todayDay + " -> " + DepartMonth + DepartTag);
			setDate(id_dep_day, id_dep_yearmonth, DepartJahr, DepartMonth, DepartTag);
			DepartMonat = DepartMonth;
			DepartDatum = DepartJahr + DepartMonat + DepartTag;
		}
	}

	
	//new Rule #4 2007: ReturnDate must be >= DepartDate
	var rbOneway = getElementByTypeAndID("input","rbDepartOnly");
	try {
		var isOneway = rbOneway.checked;
	}
	catch (error) {
		isOneway = true;
	}
	
	try {
		if (isOneway) {
			//
		} else {
			if (DepartDatum > ReturnDatum) {
				ReturnJahr = DepartJahr;
				ReturnMonat = DepartMonat;
				ReturnTag = DepartTag;
				// ReturnDate was < DepartDate -> set ReturnDate to DepartDate
				setDate(id_ret_day, id_ret_yearmonth, ReturnJahr, ReturnMonat, ReturnTag);
			}
		}
	}
	
	catch (error) {
		//
	}
	
}

// Created by Florian Bauer, 2007-10-29
// Overloads os_CheckDateSubmit (adds validation for Adults, Children and Infants count)
function os_CheckPersonsAndDateSubmit (id_Origin, id_Destination, 
	id_dep_day, id_dep_yearmonth, id_ret_day, id_ret_yearmonth, idButton
	, idAdults, idChildren, idInfants) {
	
	var abortSubmit = false;	
	var abortMsg = "";
	
	//check origin + destination
	var Origin = document.getElementById(id_Origin);
	var Destination = document.getElementById(id_Destination);
	if (Origin.value == "") {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrOrigin, "\n");
	}	
	if (Destination.value == "") {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrDestination, "\n");
	}
	
	//check number of adults/children/infants
	if( idAdults != null && idChildren != null && idInfants != null )
	{
		var Adults = document.getElementById(idAdults);
		var Children = document.getElementById(idChildren);
		var Infants = document.getElementById(idInfants);

		// Alle controls gefunden?
		if( Adults != null && Children != null && Infants != null )
		{
			var intAdults = parseInt(Adults.value);
			var intChildren = parseInt(Children.value);
			var intInfants = parseInt(Infants.value);
			
			// Check number of adults + children
			if (intAdults + intChildren > 9) {
				abortSubmit = true;
				abortMsg = os_Concat(abortMsg, m_ErrCheckPersons, "\n");
			}
			// Check number of infants
			if (intInfants > intAdults) {
				abortSubmit = true;
				abortMsg = os_Concat(abortMsg, m_ErrCheckInfants, "\n");
			}
		}
	}
	
	var objDepartTag  = document.getElementById(id_dep_day);
	var objDepartJahrMonat = document.getElementById(id_dep_yearmonth);
	
	var DepartTag = objDepartTag.options[objDepartTag.selectedIndex].value;
	DepartTag = os_PadLeft(String(DepartTag), "0", 2);
	var DepartJahr = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(0, 4);
	var DepartMonat = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(5, 2);
	var DepartDatum = DepartJahr + DepartMonat + DepartTag;
	// DepartDatum now has the format yyyymmdd, e.g. 20051030
	
	var objReturnTag  = document.getElementById(id_ret_day);
	var objReturnJahrMonat = document.getElementById(id_ret_yearmonth);
	var ReturnTag = objReturnTag.options[objReturnTag.selectedIndex].value;
	ReturnTag = os_PadLeft(String(ReturnTag), "0", 2);
	var ReturnJahr = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(0, 4);
	var ReturnMonat = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(5, 2);
	var ReturnDatum = ReturnJahr + ReturnMonat + ReturnTag;
	// ReturnDatum now has the format yyyymmdd, e.g. 20051102
	
	var todayDate = new Date();
	var todayDay = todayDate.getDate();
	todayDay = os_PadLeft(String(todayDay), "0", 2);
	var todayMonth = todayDate.getMonth() + 1;
	todayMonth = os_PadLeft(String(todayMonth), "0", 2);
	var todayYear = todayDate.getFullYear();
	var todayDatum = todayYear + todayMonth + todayDay;
	// todayDatum now has the format yyyymmdd, e.g. 20051102

	var rbOneway = getElementByTypeAndID("input","rbDepartOnly");
	try {
		var isOneway = rbOneway.checked;
	}
	catch (error) {
		isOneway = true;
	}
	
	//new rule #0 2007
	if (os_IsValidDate(DepartJahr, DepartMonat, DepartTag) == false) {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrDepInvalid, "\n");
	}
	if (isOneway) {
		//
	} else {
		if (os_IsValidDate(ReturnJahr, ReturnMonat, ReturnTag) == false) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetInvalid, "\n");
		}
	}
	//new Rule #2 2007
	if (DepartDatum < todayDatum) {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrDepToday, "\n");
	}
	
	//new Rule #5 2007
	if (isOneway) {
		//
	} else {
		if (ReturnDatum < todayDatum) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetToday, "\n");
		}
		if (ReturnDatum < DepartDatum) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetDep, "\n");
		}
	}
	
	if (abortSubmit == true) {
		alert(abortMsg);
		//return false;
	}
	else {
	
		var myButton = document.getElementById(idButton);
		myButton.click();
	}
}

function os_CheckDateSubmit(id_dep_day, id_dep_yearmonth, id_ret_day, id_ret_yearmonth, idButton) {

	var objDepartTag  = document.getElementById(id_dep_day);
	var objDepartJahrMonat = document.getElementById(id_dep_yearmonth);
	
	var DepartTag = objDepartTag.options[objDepartTag.selectedIndex].value;
	DepartTag = os_PadLeft(String(DepartTag), "0", 2);
	var DepartJahr = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(0, 4);
	var DepartMonat = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(5, 2);
	var DepartDatum = DepartJahr + DepartMonat + DepartTag;
	// DepartDatum now has the format yyyymmdd, e.g. 20051030
	
	var objReturnTag  = document.getElementById(id_ret_day);
	var objReturnJahrMonat = document.getElementById(id_ret_yearmonth);
	var ReturnTag = objReturnTag.options[objReturnTag.selectedIndex].value;
	ReturnTag = os_PadLeft(String(ReturnTag), "0", 2);
	var ReturnJahr = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(0, 4);
	var ReturnMonat = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(5, 2);
	var ReturnDatum = ReturnJahr + ReturnMonat + ReturnTag;
	// ReturnDatum now has the format yyyymmdd, e.g. 20051102
	
	var todayDate = new Date();
	var todayDay = todayDate.getDate();
	todayDay = os_PadLeft(String(todayDay), "0", 2);
	var todayMonth = todayDate.getMonth() + 1;
	todayMonth = os_PadLeft(String(todayMonth), "0", 2);
	var todayYear = todayDate.getFullYear();
	var todayDatum = todayYear + todayMonth + todayDay;
	// todayDatum now has the format yyyymmdd, e.g. 20051102

	var rbOneway = getElementByTypeAndID("input","rbDepartOnly");
	var abortSubmit = false;	
	var abortMsg = "";
	
	//new rule #0 2007
	if (os_IsValidDate(DepartJahr, DepartMonat, DepartTag) == false) {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrDepInvalid, "\n");
	}

	//new Rule #2 2007
	if (DepartDatum < todayDatum) {
		abortSubmit = true;
		abortMsg = os_Concat(abortMsg, m_ErrDepToday, "\n");
	}
	try {
		var isOneway = rbOneway.checked;
	}
	catch (error) {
		isOneway = true;
	}
	if (!isOneway) {
		if (os_IsValidDate(ReturnJahr, ReturnMonat, ReturnTag) == false) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetInvalid, "\n");
		}

		//new Rule #5 2007
		if (ReturnDatum < todayDatum) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetToday, "\n");
		}
		if (ReturnDatum < DepartDatum) {
			abortSubmit = true;
			abortMsg = os_Concat(abortMsg, m_ErrRetDep, "\n");
		}
	}
	
	if (abortSubmit == true) {
		alert(abortMsg);
		//return false;
	}
	else {
		var myButton = document.getElementById(idButton);
		myButton.click();
	}

}

function os_CheckDateReturn(id_dep_day, id_dep_yearmonth, id_ret_day, id_ret_yearmonth) {
	
	var objDepartTag  = document.getElementById(id_dep_day);
	var objDepartJahrMonat = document.getElementById(id_dep_yearmonth);
	var DepartTag = objDepartTag.options[objDepartTag.selectedIndex].value;
	DepartTag = os_PadLeft(String(DepartTag), "0", 2);
	var DepartJahr = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(0, 4);
	var DepartMonat = objDepartJahrMonat.options[objDepartJahrMonat.selectedIndex].value.substr(5, 2);
	var DepartDatum = DepartJahr + DepartMonat + DepartTag;
	// DepartDatum now has the format yyyymmdd, e.g. 20051030

	var objReturnTag  = document.getElementById(id_ret_day);
	var objReturnJahrMonat = document.getElementById(id_ret_yearmonth);
	var ReturnTag = objReturnTag.options[objReturnTag.selectedIndex].value;
	ReturnTag = os_PadLeft(String(ReturnTag), "0", 2);
	var ReturnJahr = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(0, 4);
	var ReturnMonat = objReturnJahrMonat.options[objReturnJahrMonat.selectedIndex].value.substr(5, 2);
	var ReturnDatum = ReturnJahr + ReturnMonat + ReturnTag;
	// ReturnDatum now has the format yyyymmdd, e.g. 20051102

	//new Rule #7 2007: if ReturnMonth = DepartMonth and ReturnDay < DepartDay => set Returnmonth to DepartMonth + 1
	if (DepartMonat == ReturnMonat) {
		if (ReturnTag < DepartTag) {
			ReturnMonat = Number(DepartMonat) + 1;
			if (ReturnMonat == 13) {
				ReturnMonat = 01;
				ReturnJahr = Number(ReturnJahr) + 1;
			}
			//do not advance month/year more than original
			var maxJahr = objReturnJahrMonat.options[objReturnJahrMonat.options.length-1].value.substr(0, 4);
			var maxMonat = objReturnJahrMonat.options[objReturnJahrMonat.options.length-1].value.substr(5, 2);
			if (ReturnJahr + ReturnMonat > maxJahr + maxMonat) {
				ReturnJahr = maxJahr;
				ReturnMonat = maxMonat;
			}
			setDate(id_ret_day, id_ret_yearmonth, ReturnJahr, ReturnMonat, ReturnTag);
		 }
	}
	

}


function setErrorMsg(strErrDepToday, strErrRetToday, strErrRetDep, strErrDepInvalid, strErrRetInvalid, strErrCheckPersons, strErrCheckInfants, strErrOrigin, strErrDestination)
{
	m_ErrDepToday = strErrDepToday;
	m_ErrRetToday = strErrRetToday;
	m_ErrRetDep = strErrRetDep;
	m_ErrDepInvalid = strErrDepInvalid;
	m_ErrRetInvalid = strErrRetInvalid;
	m_ErrCheckPersons = strErrCheckPersons;
	m_ErrCheckInfants = strErrCheckInfants;
	m_ErrOrigin = strErrOrigin;
	m_ErrDestination = strErrDestination;
}
