function hideCabinWait(){
	byId('cabinDiv').style.height="";
	clearWait('cabinDiv');
}
function setCabinWait(){
	if(byId('cabinDiv').offsetHeight < 200)	byId('cabinDiv').style.height = "200px";
	setWait('cabinDiv',0);
}


// Prüfung ob die Passagiere des Outbound
// - vollständig angegeben wurden und
// - zu den Passagieren des Inbound identisch sind
// Fachliche Vorgabe: im Inbound MÜSSEN die Passagiere identisch zu denen des Outbound sein.
function checkPassangers(){
	var iCabin;
	var iPassanger;
	var passangerTypes = new Array();
	
	var cabinString = 'cabin_outbound_';
	var inCabinString = 'cabin_inbound_';
	var passangerString = '_passanger_';

	// loop all outbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(cabinString + iCabin);
		
		if (cabin != null){
			if(cabin.value == 1) {
				return false; // the "please select" option
			}
			
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(cabinString + iCabin + passangerString + iPassanger);
				if (item == null)
					break;
				if ((item.value == '') || (item.value == 0))
					return false;
				// remember outbound passanger type
				add2Array(passangerTypes,item.value);
			}
		}
	}
	
	// loop all inbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(inCabinString + iCabin);
		
		if (cabin != null){
			if(cabin.value == 1) {
				return false; // the "please select" option
			}
			
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(inCabinString + iCabin + passangerString + iPassanger);
				if (item == null)
					break;	
				if ((item.value == '') || (item.value == 0))
					return false;
				if (!checkArray(passangerTypes,item.value)) {
					// inbound passanger type was not found in outbound list
					return false;
				}
			}
		} else if (iCabin == 0) {
			// no inbound at all, so we are done
			return true;
		}	
	}
	
	// check for passenger type defined in outbound but not found in inbound
	// --> the value '-1' is set by method checkArray() while inbound processing
	for (var i = 0;i < passangerTypes.length;i++ ) {
		if (passangerTypes[i] != -1){
			return false;
		}
	}
	
	return true;
}

// Prüfung ob die Passagiere des Outbound
// - vollständig angegeben wurden und
// - zu den Passagieren des Inbound different sind
function arePassangerMissmatch(){

	var iCabin;
	var iPassanger;
	var passangerTypesO = new Array();
	var passangerCountO = 0;
	var passangerTypesI = new Array();
	var passangerCountI = 0;
	
	var cabinString = 'cabin_outbound_';
	var inCabinString = 'cabin_inbound_';
	var passangerString = '_passanger_';

	// outbound only
	if(!document.getElementById(inCabinString + 0)) return false;

	// loop all outbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(cabinString + iCabin);
		
		if (cabin != null){
			if(cabin.value == 1) {
				return false; // the "please select" option
			}
			
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(cabinString + iCabin + passangerString + iPassanger);
				if (item == null)
					break;
				if ((item.value == '') || (item.value == 0))
					return false;
				// remember outbound passanger type
				if(!passangerTypesO[item.value]){
					passangerTypesO[item.value]=1;
				}
				else{
					passangerTypesO[item.value]++;
				}
				passangerCountO++;
			}
		}
	}
	
	// loop all inbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(inCabinString + iCabin);
		
		if (cabin != null){
			if(cabin.value == 1) {
				return false; // the "please select" option
			}
			
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(inCabinString + iCabin + passangerString + iPassanger);
				if (item == null)
					break;	
				if ((item.value == '') || (item.value == 0))
					return false;
				// remember inbound passanger type
				if(!passangerTypesI[item.value]){
					passangerTypesI[item.value]=1;
				}
				else{
					passangerTypesI[item.value]++;
				}
				passangerCountI++;
			}
		}	
	}
	
	// check passenger
	
	// missmatch count?
	if (!(passangerCountI==passangerCountO)) return false;

	// missing inboundpassengertype?
	for (var i in passangerTypesO) {
		if (!passangerTypesI[i]) return true;
	}

	// missing outboundpassengertype?
	for (var i in passangerTypesI) {
		if (!passangerTypesO[i]) return true;
	}

	// missmatch passengertypecount?
	for (var i in passangerTypesI) {
		if (passangerTypesO[i]!=passangerTypesI[i]) return true;
	}
	return false;
	
}

function checkPassengerMissmatch(routedirection,id) {

	clearAllPassengerErrors();
	
	if(arePassangerMissmatch()) {
		if(routedirection=='outbound') {
			setError(id, 0, MESSAGE_CABIN_DIFFERENTOUTBOUNDCABINS);
		}
		else {
			setError(id, 0, MESSAGE_CABIN_DIFFERENTINBOUNDCABINS);
		}
	}	
}

function clearAllPassengerErrors(){
	var iCabin;
	var cabinString = 'cabinDescriptionDiv_outbound_';
	var inCabinString = 'cabinDescriptionDiv_inbound_';

	// loop all outbound cabins
	for (iCabin = 0;iCabin < 10;iCabin++) clearError(cabinString + iCabin);		
	// loop all outbound cabins
	for (iCabin = 0;iCabin < 10;iCabin++) clearError(inCabinString + iCabin);		
}


// Prüfung ob für die Kleinkinder
// - bereits die Geburtstage eingegeben wurden
// - die Geburtstage im Outbound zu denen des Inbound passen
function checkBabyBirthdays() {
	var iCabin;
	var iPassanger;
	var passangerTypes = new Array();
	
	var cabinString = 'cabin_outbound_';
	var inCabinString = 'cabin_inbound_';
	var passangerString = '_passanger_';
	var birthdayString = '_birthday_';

	// loop all outbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(cabinString + iCabin);
		
		if(cabin == null) {
			break;
		}
		else {
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(cabinString + iCabin + passangerString + iPassanger);
				if (item == null) {
					break;
				}
				else if(item.value == 3) {
					var birthday = checkBabyHasBirthday(cabinString, iCabin, iPassanger);
					if(birthday == '') {
						return false;
					}
					else {
						// remember outbound birthday
						add2Array(passangerTypes, item.value + "#" + birthday);				
					}
				}
			}
		}
	}
	
	// loop all inbound cabins and passanger
	// --> default: check 10 cabins and 10 passengers
	for (iCabin = 0;iCabin < 10;iCabin++){
		var cabin = document.getElementById(inCabinString + iCabin);
		
		if(cabin == null) {
			if (iCabin == 0) {
				// no inbound at all
				passangerTypes = new Array();
			}
			break;
		}
		else {
			for (iPassanger = 0;iPassanger < 10;iPassanger++){
				var item = document.getElementById(inCabinString + iCabin + passangerString + iPassanger);
				if (item == null) {
					break;
				}
				else if(item.value == 3) {
					var birthday = checkBabyHasBirthday(inCabinString, iCabin, iPassanger); 
					if(birthday == '') {
						return false;
					}
					else {
						// check inbound birthday
						checkArray(passangerTypes, item.value + '#' + birthday);
					}
				}
			}
		}
	}
	
	// check for baby birthdays defined in outbound but not found in inbound
	// --> the value '-1' is set by method checkArray() while inbound processing
	for (var i = 0;i < passangerTypes.length;i++ ) {
		if (passangerTypes[i] != -1){
			setMessage('cabinDiv', 0, ERROR_DATE_BABY_UNEQUAL_BIRTHDAY);
			return false;
		}
	}
	
	return true;
}

function checkBabyHasBirthday(cabinDirection, iCabin, iPassanger) {
	var birthdayString = '_birthday_';
	
	var controlBirthday = document.getElementById(cabinDirection + iCabin + birthdayString + iPassanger);
	if ((controlBirthday.value == '') || (controlBirthday.value == DATE_FORMAT_INPUT)) {
		setMessage('cabinDiv', 0, ERROR_DATE_INPUT);
		controlBirthday.focus();
		
		return '';
	}
	else {
		return controlBirthday.value;
	}
}


function add2Array(array,value) {
	// smart array resize if necessarry
	array[array.length] = value;
}

function checkArray(array,value){
	for (var i = 0;i < array.length;i++ ) {
		if (array[i] == value){
			if (value != ''){
				array[i] = -1;
			}	
			return true;//if it is matched in the array , return true	
		}
	}
	return false;
}


function validateBirthDay(passengerType,idBirthdayControl){

	var item = document.getElementById(idBirthdayControl);

	if (passengerType == "3"){
		item.className = "birthday-2";
		item.disabled = false;
		item.value = DATE_FORMAT_INPUT;
	}else{
		item.className = "birthday-1";
		item.disabled = true;
		item.value = "";
	}
	
	DoStates('changeInCabin');
}

function checkChildAge(controlBirthday, maxAge){
	if(controlBirthday.value.length > 0) {
		var birthday = getDate(controlBirthday);
		
		if(birthday == null) {
			setMessage('cabinDiv', 0, ERROR_DATE_INPUT);
			controlBirthday.focus();
			
			return;
		}
		else
		{
			var tripDate = getDate(document.getElementById('timetable.outboundTripDate'));
			var checkDate = new Date();
			checkDate.setTime(tripDate.getTime());
			checkDate.setFullYear(checkDate.getFullYear() - maxAge -1);
			checkDate.setDate(checkDate.getDate() + 1);
			
			if( (checkDate > birthday) || (birthday > tripDate) ){
				var maxBirthdate =
					( (checkDate.getDate() < 10) ? "0" : "" ) 
					+ checkDate.getDate() + "."
					+ ( (checkDate.getMonth() < 9) ? "0" : "" )
					+ (checkDate.getMonth()+1) + "."
					+ checkDate.getFullYear();
				
				setMessage('cabinDiv', 0, ERROR_DATE_BABY_BORN_AFTER.replace(/%1/i, maxBirthdate));
				controlBirthday.value = maxBirthdate;
				controlBirthday.focus();
				
				return;
			}
			else {
				controlBirthday.value =
					( (birthday.getDate() < 10)  ? "0" : "" )
					+ birthday.getDate() + "."
					+ ( (birthday.getMonth() < 9) ? "0" : "" )
					+ (birthday.getMonth()+1) + "."
					+ birthday.getFullYear();
			}
		}
	}
}

function getDate(dateTextField)
{
	if ( (dateTextField) && (typeof dateTextField.value=='string') ) {
		var Value=dateTextField.value;
		var Pos1=Value.indexOf('.');
		var Pos2=Value.lastIndexOf('.');
		
		if (Pos1!=Pos2) {
			var Tag=Value.substring(0,Pos1);
			var Monat=Value.substring(Pos1+1,Pos2);
			var Jahr=Value.substring(Pos2+1,Value.length);
			
			if(Jahr.length == 2) {
				Jahr = "20" + Jahr;
			}
			if(Jahr.length != 4) {
				return null;
			}
			
			var Temp=new Date();
			Temp.setHours(0);
			Temp.setMinutes(0);
			Temp.setSeconds(0);
			Temp.setMilliseconds(0);
			Temp.setFullYear(Jahr, Monat-1, Tag);
			
			if ( (!isNaN(Temp.getDate())) && (!isNaN(Temp.getMonth())) && (!isNaN(Temp.getFullYear())) ) {
				return Temp;
			}
			else {
				return null;
			}
		}
		else {
			return null;
		}
	}
	else {
		return null;
	}
}
