
/* ---booking.js---   */

var eOpenMenu = null;

function validateForm() {
	var status = true;  // The status to return from this function.  Gets set to false if there are any errors on the form.
	var message = '';  // The message to display if there are errors on the form.  Populated as each condition is checked.
	var nameTitle = new getObj('nameTitle');
	var nameGiven = new getObj('nameGiven');
	var nameFamily = new getObj('nameFamily');
	var email = new getObj('email');
	var tripPrivate = new getObj('tripPrivate');
	var tripGroup = new getObj('tripGroup');
	var tripNone = new getObj('tripNone');
	var tripType = !(tripPrivate.element.checked || tripGroup.element.checked || tripNone.element.checked);
	
	// Make sure nameTitle field is not null
	if (nameTitle.element.value == 'null') {
		message+=('-   Title\n');
		status = false;
	}
	
	// Allowing nameGiven to be empty if nameFamily is Wookey is a private joke
	if ((nameGiven.element.value == '') && (nameFamily.element.value.toLowerCase() != 'wookey')) {
		message+=('-   Given name\n');
		status = false;
	}
	
	// Make sure nameFamily is not empty
	if (nameFamily.element.value == '') {
		message+=('-   Family name\n');
		status = false;
	}
	
	// Make sure email is not empty
	if (email.element.value == '') {
		message+=('-   Email address\n');
		status = false;
	}
	
	// Make sure a tripType has been selected
	if (tripType) {
		message+=('-   Trip type\n');
		status = false;
	}	
	
	// Adds a polite header to the error message, if one exists.
	if (message != '') {
		message = ('Please fill in the following fields:\n' + message);
	}
	
	if (tripPrivate.element.checked || tripGroup.element.checked) {
		var tripError = '';
		var tripCountTotal = 0;
		var tripCountAdults = new getObj('tripCountAdults');
		tripCountTotal += Number(tripCountAdults.element.value);
		
		var tripCountChildren = new getObj('tripCountChildren');
		tripCountTotal += Number(tripCountChildren.element.value);
		
		if ((isNaN(tripCountAdults.element.value)) || (tripCountAdults.element.value == '')) {
			tripError += '-   Number of adults\n';
		}
		if ((isNaN(tripCountChildren.element.value)) || (tripCountChildren.element.value == '')) {
			tripError += '-   Number of children\n';
		}
		if (tripError != '') {
			message += ((message == '') ? '' : '\n') + 'You selected a ' + (tripPrivate.element.checked ? 'private trip' : 'group trip') + ' but did not select:\n' + tripError;
			status = false;
		} else if (tripCountTotal == 0) {
			message += ((message == '') ? '' : '\n') + 'You selected a ' + (tripPrivate.element.checked ? 'private trip' : 'group trip') + ' but have set\n -  Number of adults\n -  Number of children\nto zero';
			status = false;
		}
	}
	
	if (tripNone.element.checked) {
		var equipmentError ='';
		var equipmentCount = 0;
		var shoeSizeMin = new getObj('shoeSizeMin');
		var shoeSizeMax = new getObj('shoeSizeMax');
		var shoeSizeIncrement = new getObj('shoeSizeIncrement');
		
		for (i = Number(shoeSizeMin.element.value); i <= Number(shoeSizeMax.element.value); i = i + Number(shoeSizeIncrement.element.value)) {
			var x = new getObj('hireCountShoesSize' + i);
			equipmentCount += Number(x.element.value);
		}
		var hireCountQuickdraws = new getObj('hireCountQuickdraws');
		equipmentCount += Number(hireCountQuickdraws.element.value);
		
		var hireCountHarnesses = new getObj('hireCountHarnesses');
		equipmentCount += Number(hireCountHarnesses.element.value);
		
		var hireCountHelmets = new getObj('hireCountHelmets');
		equipmentCount += Number(hireCountHelmets.element.value);
		
		if (equipmentCount == 0) {
			message += ((message == '') ? '' : '\n') + 'You selected equipment hire, but have not chosen any equipment\n';
			status = false;
		}
	}
	
	if (message) {
		alert (message);
	}
	return status;
}

function guidedTrip() {
	// Changes disabled property of fields when a guided trip is selected
	var x = new getObj('tripCountAdults');
	x.element.disabled = false;
	var x = new getObj('tripCountChildren');
	x.element.disabled = false;
	
	var x = new getObj('hireCountQuickdraws');
	x.element.disabled = true;
	x.element.value = '0';
	var x = new getObj('hireCountHarnesses');
	x.element.disabled = true;
	x.element.value = '0';
	var x = new getObj('hireCountHelmets');
	x.element.disabled = true;
	x.element.value = '0';
	
	var shoeSizeMin = new getObj('shoeSizeMin');
	var shoeSizeMax = new getObj('shoeSizeMax');
	var shoeSizeIncrement = new getObj('shoeSizeIncrement');
	
	for (i = Number(shoeSizeMin.element.value); i <= Number(shoeSizeMax.element.value); i = i + Number(shoeSizeIncrement.element.value)) {
		var x = new getObj('hireCountShoesSize' + i);
		x.element.disabled = true;
		x.element.value = 0;
	}
}

function equipmentHire() {
	// Changes disabled property of fields when equipment hire is selected
	var x = new getObj('tripCountAdults');
	x.element.disabled = true;
	x.element.value = '';
	var x = new getObj('tripCountChildren');
	x.element.disabled = true;
	x.element.value = '';
	
	var x = new getObj('hireCountQuickdraws');
	x.element.disabled = false;
	var x = new getObj('hireCountHarnesses');
	x.element.disabled = false;
	var x = new getObj('hireCountHelmets');
	x.element.disabled = false;
	
	var shoeSizeMin = new getObj('shoeSizeMin');
	var shoeSizeMax = new getObj('shoeSizeMax');
	var shoeSizeIncrement = new getObj('shoeSizeIncrement');
	
	for (i = Number(shoeSizeMin.element.value); i <= Number(shoeSizeMax.element.value); i = i + Number(shoeSizeIncrement.element.value)) {
		var x = new getObj('hireCountShoesSize' + i);
		x.element.disabled = false;
	}
}

function dateChange() {
	// when the month or year is changed, make sure that invalid dates are disabled
	var tripDateDay = new getObj('tripDateDay');
	var tripDateMonth = new getObj('tripDateMonth');
	var tripDateYear = new getObj('tripDateYear');
	var monthDays = getMonthDays(tripDateMonth.element.value, tripDateYear.element.value);
	
	// if currently selected date is greater than number of days in newly selected month
	// set date to the last day of the month
	if (Number(tripDateDay.element.value) > Number(monthDays)) {
		tripDateDay.element.value = monthDays;
	}
	// disable dates beyond the last day of the newly selected month
	for (i = 29; i <= 31; i++) {
		var day = new getObj ('day'+i);
		if (i <= monthDays) {
			day.element.disabled = false;
		} else {
			day.element.disabled = true;
		}
	}
	
	// get earliest date permitted from hidden fields on the form
	var earliestYear = new getObj('tripDateEarliestAllowedYear');
	var earliestMonth = new getObj('tripDateEarliestAllowedMonth');
	var earliestDay = new getObj('tripDateEarliestAllowedDay');
	
	if (tripDateYear.element.value == earliestYear.element.value) {
		// date chosen is in the current year, set flag to disable months before the earliest permitted
		var monthDisable = true;
		var monthColor = 'gray';
		if (Number(tripDateMonth.element.value) < Number(earliestMonth.element.value)) {
			// currently selected month is before earliest permitted, reset to earliest permitted
			tripDateMonth.element.value = earliestMonth.element.value;
		}
		if (tripDateMonth.element.value == earliestMonth.element.value) {
			// date chosen is in the earliest permitted month,
			// set flag to disable days before the earliest permitted
			var dayDisable = true;
			var dayColor = 'gray';
			if (Number(tripDateDay.element.value) < Number(earliestDay.element.value)) {
				// currently selected day is before earliest permitted, reset to earliest permitted
				tripDateDay.element.value = earliestDay.element.value;
			}
		} else {
			var dayDisable = false;
			var dayColor = 'black';
		}
	} else {
		var monthDisable = false;
		var monthColor = 'black';
		var dayDisable = false;
		var dayColor = 'black';
	}
	
	// disable months prior to the earliest permitted in the current year
	for (i = 1; i < Number(earliestMonth.element.value); i ++) {
		var month = new getObj ('month'+i);
		month.element.disabled = monthDisable;
		month.style.color = monthColor;
	}
	// disable days prior to the earliest permitted in the current month
	for (i = 1; i < Number(earliestDay.element.value); i ++) {
		var day = new getObj ('day'+i);
		day.element.disabled = dayDisable;
		day.style.color = dayColor;
	}
}

function getMonthDays(month, year) {
	// return the number of days in the month
	var monthsDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	monthDays = monthsDays[(month - 1)];
	if ((month == 2) && isLeapYear(year)) {
		monthDays = 29;
	}
	return monthDays;
}

function isLeapYear(year) {
	// check for leapyear - Any year divisible by 4, except those divisible by 100 (but NOT 400)
	if ( (Math.floor(year/4) == (year/4)) && ((Math.floor(year/100) != (year/100)) || (Math.floor(year/400) == (year/400))) )
		return true;
	else 
		return false;
}

function goBack() {
	var x = new getObj ('mode');
	x.element.value = 'amend';
	var x = new getObj ('booking');
	x.element.submit();
}

function finalSubmit() {
	var x = new getObj ('mode');
	x.element.value = 'submit';
	return true;
}
function getObj(name) {
	if (document.getElementById) {
		this.style = document.getElementById(name).style;
		this.element = document.getElementById(name);
	} 
	else if (document.all) {
		this.style = document.all[name].style;
		this.element = document.all[name];
	}
	else if (document.layers) {
		this.style = document.layers[name];
		this.element = document.layers[name];
	}
}