var SERVICE_OFFLINE = false;

var BASE_DATE = 2010;
var MON_THU_CLOSETIME = 19;
var FRI_SAT_CLOSETIME = 21;
var MON_THU_CLOSETIME_TEXT = '19:00';
var FRI_SAT_CLOSETIME_TEXT = '21:00';
var ADMINISTRATOR_EMAIL = 'peter.mccarthy.0807@googlemail.com';

function validateForm()
{
	var errorCode = -1;
	
	var day = -1;
	var month = -1;
	var year = BASE_DATE;
	var hour = -1;
	var minutes = -1;

	var email = null;

	/* Get form object */

	var formObj = null;

	if (is_nav == true)
		formObj = document.reservation;
	else
		formObj = document.forms['reservation'];
			
	if (formObj != null)
	{
		errorCode = 0;
		
		var inputObj = null;
		var selectObj = null;
		
		var selection = -1;
		
		workString = null;
		
		if (errorCode == 0)
		{
			/* Get title input object */
			
			if (is_nav == true)
				inputObj = formObj.title;
			else
				inputObj = formObj.all['title'];

			if (inputObj != null)
			{
				var title = inputObj.value;

				if (title.indexOf('@') != -1)
					errorCode = -1;
					
				title = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get first-name input object */
			
			if (is_nav == true)
				inputObj = formObj.firstName;
			else
				inputObj = formObj.all['firstName'];

			if (inputObj != null)
			{
				var firstName = inputObj.value;

				if (firstName.length < 1)
					errorCode = -2;
				else if (firstName.indexOf('@') != -1)
					errorCode = -1;
					
				firstName = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get last-name input object */

			if (is_nav == true)
				inputObj = formObj.lastName;
			else
				inputObj = formObj.all['lastName'];
				
			if (inputObj != null)
			{
				var lastName = inputObj.value;

				if (lastName.length < 1)
					errorCode = -3;
				else if (lastName.indexOf('@') != -1)
					errorCode = -1;
				
				lastName = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get daytime telephone # input object */

			if (is_nav == true)
				inputObj = formObj.daytimeTel;
			else
				inputObj = formObj.all['daytimeTel'];
				
			if (inputObj != null)
			{
				var daytimeTel = inputObj.value;

				if (daytimeTel.length < 1)
					errorCode = -4;
				else if (daytimeTel.indexOf('@') != -1)
					errorCode = -1;
				
				daytimeTel = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get evening telephone # input object */

			if (is_nav == true)
				inputObj = formObj.eveningTel;
			else
				inputObj = formObj.all['eveningTel'];
				
			if (inputObj != null)
			{
				var eveningTel = inputObj.value;

				if (eveningTel.length < 1)
					errorCode = -5;
				else if (eveningTel.indexOf('@') != -1)
					errorCode = -1;
				
				eveningTel = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get email-address input object */

			if (is_nav == true)
				inputObj = formObj.email;
			else
				inputObj = formObj.all['email'];
				
			if (inputObj != null)
			{
				errorCode = -6;

				var emailAddr = inputObj.value;

				if (emailAddr.length > 0)
				{
					errorCode = -7;
				
					var nameDomainArr = emailAddr.split('@');

					if (nameDomainArr.length == 2)
					{
						if ((nameDomainArr[0].length > 0) && (nameDomainArr[1].length > 0))
						{
							errorCode = 0;

							var index = 0;
							var index1 = 0;

							if (errorCode == 0)
							{
								var nameArr = nameDomainArr[0].split('.');

								if (nameArr != null)
								{
									index = 0;
									index1 = nameArr.length;

									while ((errorCode == 0) && (index < index1))
									{
										if (nameArr[index] != null)
										{
											if (nameArr[index].length < 1)
												errorCode = -7;
										}
										else
											errorCode = -7;

										if (errorCode == 0)
											++index;
									}
								}
								else
									errorCode = -7;

								nameArr = null;
							}

							if (errorCode == 0)
							{
								var domainArr = nameDomainArr[1].split('.');

								if (domainArr != null)
								{
									if (domainArr.length >= 2)
									{
										index = 0;
										index1 = domainArr.length;

										while ((errorCode == 0) && (index < index1))
										{
											if (domainArr[index] != null)
											{
												if (domainArr[index].length < 1)
													errorCode = -7;
											}
											else
												errorCode = -7;

											if (errorCode == 0)
												++index;
										}
									}
									else
										errorCode = -7;
								}
								else
									errorCode = -7;

								domainArr = null;
							}
						}
					}

					nameDomainArr = null;
				}

				if (errorCode == 0)
					email = emailAddr;
					
				emailAddr = null;
			}
			else
				errorCode = -1;
			
			inputObj = null;
		}
		
		if (errorCode == 0)
		{
			/* Get how-many select-input object */
			
			if (is_nav == true)
				selectObj = formObj.howMany;
			else
				selectObj = formObj.all['howMany'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;
				
				if (selection != -1)
				{
					/* Get item-selected text-input object */
					
					if (is_nav == true)
						inputObj = formObj.howMany_selected;
					else
						inputObj = formObj.all['howMany_selected'];

					if (inputObj != null)
					{
						/* Set selected item */
						inputObj.value = selection;
						
						if (inputObj.value.indexOf('@') != -1)
							errorCode = -1;
					}
					else
						errorCode = -1;
						
					inputObj = null;
				}
				else
					errorCode = -8;
			}
			else
				errorCode = -1;
		}
		
		if (errorCode == 0)
		{
			/* Get day select-input object */

			if (is_nav == true)
				selectObj = formObj.day;
			else
				selectObj = formObj.all['day'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;

				if (selection != -1)
				{
					day = selection;
					
					/* Get item-selected text-input object */
					
					if (is_nav == true)
						inputObj = formObj.day_selected;
					else
						inputObj = formObj.all['day_selected'];

					if (inputObj != null)
					{
						if (selection < 10)
							workString = '0' + selection.toString();
						else
							workString = selection.toString();
						
						/* Set selected item */
						inputObj.value = workString;
						
						if (inputObj.value.indexOf('@') != -1)
							errorCode = -1;
					}
					else
						errorCode = -1;
						
					inputObj = null;
				}
				else
					errorCode = -9;
			}
			else
				errorCode = -1;
		}
		
		if (errorCode == 0)
		{
			/* Get month select-input object */

			if (is_nav == true)
				selectObj = formObj.month;
			else
				selectObj = formObj.all['month'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;

				if (selection != -1)
				{
					month = selection;
					
					/* Get item-selected text-input object */
					
					if (is_nav == true)
						inputObj = formObj.month_selected;
					else
						inputObj = formObj.all['month_selected'];

					if (inputObj != null)
					{
						if (selection < 10)
							workString = '0' + selection.toString();
						else
							workString = selection.toString();
							
						/* Set selected item */
						inputObj.value = workString;
						
						if (inputObj.value.indexOf('@') != -1)
							errorCode = -1;
					}
					else
						errorCode = -1;
						
					inputObj = null;
				}
				else
					errorCode = -10;
			}
			else
				errorCode = -1;
		}
		
		if (errorCode == 0)
		{
			/* Get hour select-input object */

			if (is_nav == true)
				selectObj = formObj.hour;
			else
				selectObj = formObj.all['hour'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;

				if (selection != -1)
				{
					hour = selection;
				
					/* Get item-selected text-input object */
					
					if (is_nav == true)
						inputObj = formObj.hour_selected;
					else
						inputObj = formObj.all['hour_selected'];

					if (inputObj != null)
					{
						if (selection < 10)
							workString = '0' + selection.toString();
						else
							workString = selection.toString();
							
						/* Set selected item */
						inputObj.value = workString;
						
						if (inputObj.value.indexOf('@') != -1)
							errorCode = -1;
					}
					else
						errorCode = -1;
						
					inputObj = null;
				}
				else
				{
					errorString = 'Please enter the preferred time of the reservation (i.e. hour).';
					error = -11;
				}
			}
			else
				errorCode = -1;
		}
		
		if (errorCode == 0)
		{
			/* Get minutes select-input object */

			if (is_nav == true)
				selectObj = formObj.minutes;
			else
				selectObj = formObj.all['minutes'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;

				if (selection != -1)
				{
					minutes = selection;

					/* Get item-selected text-input object */
					
					if (is_nav == true)
						inputObj = formObj.minutes_selected;
					else
						inputObj = formObj.all['minutes_selected'];

					if (inputObj != null)
					{
						if (selection < 10)
							workString = '0' + selection.toString();
						else
							workString = selection.toString();
							
						/* Set selected item */
						inputObj.value = workString;
						
						if (inputObj.value.indexOf('@') != -1)
							errorCode = -1;
					}
					else
						errorCode = -1;
						
					inputObj = null;
				}
				else
					errorCode = -12;
			}
			else
				errorCode = -1;
		}
		
		if (errorCode == 0)
		{
			/* Get occasion select-input object */

			if (is_nav == true)
				selectObj = formObj.occasion;
			else
				selectObj = formObj.all['occasion'];
				
			if (selectObj != null)
			{
				/* Get selected value */
				selection = selectObj.value;

				/* Get item-selected text-input object */
				
				if (is_nav == true)
					inputObj = formObj.occasion_selected;
				else
					inputObj = formObj.all['occasion_selected'];

				if (inputObj != null)
				{
					/* Set selected item */
					inputObj.value = selection;
					
					if (inputObj.value.indexOf('@') != -1)
						errorCode = -1;
				}
				else
					errorCode = -1;

				inputObj = null;
			}
			else
				errorCode = -1;
		}
		
		workString = null;
	}
	
	formObj = null;
	
	/* Validate day of month */
	
	if (errorCode == 0)
	{
		if ((day > 30) && ((month == 4) || (month == 6) || (month == 9) || (month == 11)))
			errorCode = -13;
		else if (month == 2)
		{
			var isLeap = false;
			
			if ((year % 4 == 0) || (year % 100 == 0) || (year % 400 == 0))
				isLeap = true;
				
			if (((isLeap == false) && (day > 28)) || ((isLeap == true) && (day > 29)))
				errorCode = -14;
		}
	}
	
	var currentDate = new Date();
	var bookingDate = new Date(year, (month - 1), day, hour, minutes, 0);

	/* Validate opening times */
	
	if (errorCode == 0)
	{
		var dayOfWeek = bookingDate.getDay();
		
		if (dayOfWeek == 0)
		{
			if (!((day == 24) && (month == 12)))
				errorCode = -15;
		}
		else if ((dayOfWeek >= 1) && (dayOfWeek <= 4))
		{
			if ((hour > MON_THU_CLOSETIME) || ((hour == MON_THU_CLOSETIME) && (minutes > 0)))
				errorCode = -16;
		}
		else if ((dayOfWeek == 5) || (dayOfWeek == 6))
		{
			if ((hour > FRI_SAT_CLOSETIME) || ((hour == FRI_SAT_CLOSETIME) && (minutes > 0)))
				errorCode = -17;
		}
		
		/* FUDGE */
		if ((day == 14) && (month == 2))
		{
			if ((hour > 21) || ((hour == 21) && (minutes > 0)))
				errorCode = -99;
			else
				errorCode = 0;
		}
	}


	/* Validate booking time */
	
	if (errorCode == 0)
	{
		var HOURS_48 = ((1000 * 60) * 60) * 48;
		var timeDiff = bookingDate.getTime() - currentDate.getTime();
		
		if (timeDiff < HOURS_48)
			errorCode = -18;
	}

	/* Service off-line? */
	
	if (SERVICE_OFFLINE == true)
	{
		if (errorCode == 0)
		{
			if (email != ADMINISTRATOR_EMAIL)
				errorCode = -19;
		}
	}
		
	bookingDate = null;
	date = null;
	
	email = null;
	
	var valid = false;
	
	/* Error */
		
	if (errorCode == -1)
		window.alert('Error! There is a problem with the booking form. Please contact webmaster@noelchadwick.co.uk.');
	else if (errorCode == -2)
		window.alert('Please enter your first name.');
	else if (errorCode == -3)
		window.alert('Please enter your last name.');
	else if (errorCode == -4)
		window.alert('Please enter your daytime telephone number.');
	else if (errorCode == -5)
		window.alert('Please enter your evening telephone number.');
	else if (errorCode == -6)
		window.alert('Please enter your email address.');
	else if (errorCode == -7)
		window.alert('Error! Invalid email address. Please re-enter.');
	else if (errorCode == -8)
		window.alert('Please enter how many you wish to make the reservation for.');
	else if (errorCode == -9)
		window.alert('Please enter the date of the reservation (i.e. day).');
	else if (errorCode == -10)
		window.alert('Please enter the date of the reservation (i.e. month).');
	else if (errorCode == -11)
		window.alert('Please enter the preferred time of the reservation (i.e. hour).');
	else if (errorCode == -12)
		window.alert('Please enter the preferred time of the reservation (i.e. minutes).');
	else if (errorCode == -13)
		window.alert('Error! Invalid day entered.');
	else if (errorCode == -14)
		window.alert('Error! Invalid day entered.');
	else if (errorCode == -15)
		window.alert('Sorry! 1817 does not open on Sundays.');
	else if (errorCode == -16)
		window.alert('Sorry! 1817 does not take bookings after ' + MON_THU_CLOSETIME_TEXT + 'pm (Monday to Thursday).');
	else if (errorCode == -17)
		window.alert('Sorry! 1817 does not take bookings after ' + FRI_SAT_CLOSETIME_TEXT + 'pm (Friday and Saturday).');
	else if (errorCode == -18)
		window.alert('Sorry! You must give us at least 48 hours notice.');
	else if (errorCode == -19)
		window.alert('Sorry! The electronic booking service is temporarily unavailable. Please try again shortly.');
	/* FUDGE */
	else if (errorCode == -99)
		window.alert('Sorry! 1817 does not take bookings after 21:00 on Valentine\'s Evening.');
	/* FUDGE */
	else
		valid = true;
		
	return valid;
}
