
	/*	Re-usable form validation script
		Last updated 01-11-07 by Nick Thomson <nick@mojofuel.com>

		The script will look for the following special-case fields:
			- email_address	(regexp valid email)
			- myn_password	(regexp a-z, 0-9, mixed case, 6-10 chars)
			- confirmed_password	(matches myn_password)
			- telephone		(regexp optional + followed by 11 or 12 numbers. Spaces ok but stripped)

		These fields will be subjected to special checks. All other fields
		will simply be checked to ensure some data has been entered.

		This script will not handle radio boxes or check boxes. Only fields with .value properties
		that alter with data entry/selection will be validated.		*/

	var vForms = new Array();
	var fmOrigItems = new Array();

	/*** Begin configuration ***/

	// Define each element as a new array before use
	vForms['fmreg'] = new Array();
	vForms['frmcontact'] = new Array();
	vForms['frmfilmrequest'] = new Array();
	vForms['frmlostproperty'] = new Array();
	vForms['frmsuppliers'] = new Array();
	vForms['frmapply'] = new Array();
	vForms['frmreg_harrogate'] = new Array();
	vForms['frmseasonticket'] = new Array();
	vForms['frmflatfare'] = new Array();

	vForms['frmreg'] =	[	['title', 'Please select your title'],
							['forename', 'Please enter your first name'],
							['surname', 'Please enter your last name'],
							['email_address', 'Please enter a valid email address'],
							['myn_password', 'Please create a password'],
							['confirmed_password', 'The password entered does not match'],
							['home_station', 'Please select your home station'],
							['work_station', 'Please select your work station']	];

	vForms['frmcontact'] =	[	['name', 'Please tell us your name'],
								['enquiry', 'Please enter your message']	];

	vForms['frmfilmrequest'] =	[	['name', 'Please enter your name'],
									['telephone', 'Please enter your telephone number'],
									['email_address', 'Please enter your email address'],
									['organisation', 'Please enter your organisation name'],
									['programme', 'Please enter the programme name'],
									['purpose', 'Please enter the filming purpose'],
									['desiredday', 'Please tell us which day you desire'],
									['desiredtime', 'Please tell us your desired time'],
									['desiredlength', 'Please tell us how long you would like'],
									['venue', 'Please enter the venue for filming'],
									['numberofcrew', 'Please tell us how many crew there will be']	];

	vForms['frmlostproperty'] =	[	['lostitem', 'Please tell us what you have lost'],
									['itemdescription', 'Please give us a description of the item'],
									['location_lost', 'Please tell us where you lost the item'],
									['date_lost', 'Please let us know when your item was lost'],
									['title', 'Please select your title'],
									['firstname', 'Please enter your first name'],
									['surname', 'Please enter your surname'],
									['address1', 'Please fill in the first line of your address'],
									['postcode', 'Please enter your postcode'],
									['country', 'Please fill in your country of residence'],
									['email_address', 'Please enter your email address']	];

	vForms['frmsuppliers'] =	[	['firstname', 'Please enter your forename'],
									['surname', 'Please fill in your surname'],
									['email_address', 'Please enter your email address'],
									['enquiry', 'Please fill out your enquiry']	];

	vForms['frmapply'] =	[	['email_address', 'Please enter your email address'],
								['myn_password', 'Please enter your password'],
								['confirmed_password', 'Please re-enter your password']	];

	vForms['frmpress'] =	[	['title', 'Please select your title'],
								['forename', 'Please enter your forename'],
								['surname', 'Please tell us your surname'],
								['email_address', 'Please enter a valid email address'],
								['press_password', 'Please create a password'],
								['confirmed_press_password', '123'],
								['publication', '234'],
								['jobtitle', '345'],
								['bestdescribes', '456']	];

	vForms['frmreg_harrogate'] =	[	['title', 'Please select your title'],
										['forename', 'Please enter your first name'],
										['surname', 'Please enter your last name'],
										['email_address', 'Please enter a valid email address'],
										['myn_password', 'Please create a password'],
										['confirmed_password', 'The password entered does not match'],
										['home_station', 'Please select your home station'],
										['work_station', 'Please select your work station'],
										['harrogate_travel', 'Please tell us how you travel'] ];

	vForms['frmreg'] =	[	['title', 'Please select your title'],
							['forename', 'Please enter your first name'],
							['surname', 'Please enter your last name'],
							['address', 'Please enter 1 line of your address'],
							['city', 'Please enter your town or city'],
							['postcode', 'Please enter your postcode'],
							['email_address', 'Please enter a valid email address'],
							['myn_password', 'Please create a password'],
							['confirmed_password', 'The password entered does not match'],
							['home_station', 'Please select your home station'],
							['work_station', 'Please select your work station']	];

	vForms['frmseasonticket'] = [	['st_title', 'Please select your title'],
									['st_forename', 'Please enter your forename'],
									['st_surname', 'Please enter your surname'],
									['st_house', 'Please enter your house number or name'],
									['st_street', 'Please enter your street'],
									['st_towncity', 'Please enter your town or city'],
									['st_county', 'Please enter your county'],
									['st_postcode', 'Please enter a valid UK post code'],
									['st_telephone', 'Please enter a valid telephone number'],
									['st_mobile', 'Please enter a valid mobile number'],
									['st_email', 'Please enter a valid email address'],
									['st_company', 'Please enter your company name'],
									['st_tickettype', 'Please select your ticket type'],
									['st_startdate_dd', 'Please select a start date for your ticket'],
									['st_wy_metro', 'Please select which zones you will be travelling in'],
									['st_newcastle', 'Please select your ticket type'],
									['st_startdate_mm', 'Please select a start date for your ticket'],
									['st_startdate_yyyy', 'Please select a start date for your ticket'],
									['st_originstation', 'Please select your origin station'],
									['st_destinationstation', 'Please select your destination station'],
									['st_paymentmethod', 'Please select your payment method']	];

	vForms['frmflatfare'] =	[	['title', 'Please select your title'],
								['forename', 'Please enter your first name'],
								['surname', 'Please enter your last name'],
								['postcode', 'Please enter your postcode'],
								['email_address', 'Please enter a valid email address'],
								['myn_password', 'Please create a password'],
								['confirmed_password', 'The password entered does not match'],
								['home_station', 'Please select your home station'],
								['work_station', 'Please select your work station']	];

	vForms['frmloyalty'] =	[	['ld_firstname', 'Please enter your first name'],
								['ld_surname', 'Please enter your last name'],
								['ld_postcode', 'Please enter your postcode'],
								['ld_company_name', 'Please enter your company name'],
								['ld_address1', 'Please enter your address'],
								['ld_town', 'Please enter your town'],
								['ld_email', 'Please enter a valid email address'] ];
	// AJAX username check URL
	// Script will send 'username' and 'password'
	var respHandler =	'http://www.northernrail.org/includes/checkuser.php';


	/*** End configuration ***/

	var isErr = false;
	var btnSubmit = document.getElementById('submit');

	function setupItem(thArr, fName, fError)
	{
		thArr[fName] = new Object;
		thArr[fName].errorText = '&nbsp;&nbsp;<small>'+fError+'</small>';
		thArr[fName].objt = document.getElementById(fName);
		thArr[fName].tValue = thArr[fName].objt.value;
		thArr[fName].orHTML = thArr[fName].objt.parentNode.innerHTML;
	}
	function updateValues(thArr)
	{
		for (var thItem in thArr)
		{
			if (typeof(thArr[thItem]) == 'object')
			{
				thArr[thItem].tValue = thArr[thItem].objt.value;
			}

		}
	}
	function showError(thItem, errText)
	{
		// Does the object already exist?
		if (thItem.objt.parentNode.getElementsByTagName('span').length == 0)
		{
			var errObj = document.createElement('span');
			errObj.className = 'errormsg';
			if (errText) { errObj.innerHTML = '&nbsp;&nbsp;<small>'+errText+'</small>'; }
				else { errObj.innerHTML = thItem.errorText; }
			thItem.objt.parentNode.appendChild(errObj);
		}
		//thItem.objt.style.borderColor = '#EC174F';
		thItem.objt.className = 'error';
		isErr = true;
	}
	function clearErrors(thArr, indItem)
	{
		// If defined, only clear the specified error
		if (indItem)
		{
			var thSpans = thArr[indItem].objt.parentNode.getElementsByTagName('span');
			if (thSpans.length > 0)
			{
				for (var cnt=0; cnt < thSpans.length; cnt++)
				{
					thArr[indItem].objt.parentNode.removeChild(thSpans[cnt]);
					thArr[indItem].objt.style.borderColor = '#C1D82F';
					thArr[indItem].objt.className = '';
				}
			}
		}
		else
		{
			for (var thItem in thArr)
			{
				if (typeof(thArr[thItem]) == 'object')
				{
					var thSpans = thArr[thItem].objt.parentNode.getElementsByTagName('span');
					if (thSpans.length > 0)
					{
						for (var cnt=0; cnt < thSpans.length; cnt++)
						{
							thArr[thItem].objt.parentNode.removeChild(thSpans[cnt]);
							thArr[thItem].objt.style.borderColor = '#C1D82F';
							thArr[thItem].objt.className = '';
						}
					}
				}
			}
			isErr = false;
		}
	}
	function checkEmail(address)
	{
		var mRegexp = /^[a-z0-9!#$%&*+-=?^_`{|}~]+(\.[a-z0-9!#$%&*+-=?^_`{|}~]+)*@([-a-z0-9]+\.)+([a-z]{2,3}|info|arpa|aero|coop|name|museum)$/i;
		if (mRegexp.test(address)) { return true; }
		return false;
	}

	// Which form we are working with?
	for (var tcForm in vForms)
	{
		if (document.getElementById(tcForm))
		{
			var theForm = document.getElementById(tcForm);
			for (var cnt=0; cnt < vForms[tcForm].length; cnt++)
			{
				setupItem(fmOrigItems, vForms[tcForm][cnt][0], vForms[tcForm][cnt][1]);
			}
		}
	}

function doHttpRequest(sURL, ttUsername, ttEmail) {  // This function does the AJAX request

  //  Set our destination PHP page "ajaxpost.php"…
  http.open("POST", sURL, true);
  http.onreadystatechange = getHttpRes;

  // Make our POST parameters string…
  var params = "username=" + encodeURI(ttUsername)+
	"&email=" + encodeURI(ttEmail);

  // Set our POST header correctly…
  http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  http.setRequestHeader("Content-length", params.length);
  http.setRequestHeader("Connection", "close");

  // Send the parms data…
  http.send(params);

}

function getHttpRes( ) {
  if (http.readyState == 4) {
    res = http.responseText;  // These following lines get the response and update the page

	if (res == 'user')
	{
		showError(fmOrigItems['username'], 'That username is in use. Please select another');
	}
	else if (res == 'email')
	{
		showError(fmOrigItems['email_address'], 'That email address is in use. Please enter another');
	}
	else if (res == 'emailok')
	{
		clearErrors(fmOrigItems, 'email_address');
	}
	else if (res == 'userok')
	{
		clearErrors(fmOrigItems, 'username');
	}

  }
}

function getXHTTP( ) {
  var xhttp;
   try {   // The following "try" blocks get the XMLHTTP object for various browsers…
      xhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
 		 // This block handles Mozilla/Firefox browsers...
	    try {
	      xhttp = new XMLHttpRequest();
	    } catch (e3) {
	      xhttp = false;
	    }
      }
    }
  return xhttp; // Return the XMLHTTP object
}

var http = getXHTTP(); // This executes when the page first loads.

	for (var thItem in fmOrigItems)
	{
	if (typeof(fmOrigItems[thItem]) == 'object')
	{

		fmOrigItems[thItem].objt.onkeypress = function()
		{
			clearErrors(fmOrigItems, this.id);
			fmOrigItems[this.id].objt.style.borderColor = '';
		}
		fmOrigItems[thItem].objt.onblur = function()
		{
			updateValues(fmOrigItems);
			if (this.id == 'email_address')
			{
				if (checkEmail(this.value))
				{
					clearErrors(fmOrigItems, this.id);
					this.style.borderColor = '#C1D82F';
					if (theForm.id == 'frmreg' || theForm.id == 'frmreg_harrogate') { doHttpRequest(respHandler, '', fmOrigItems['email_address'].tValue); }
				}
				else
				{
					this.style.borderColor = '#EC174F';
					showError(fmOrigItems[this.id], 'Please enter a valid email address');
				}
			}
			else if ((this.id == 'myn_password') || (this.id == 'confirmed_password'))
			{
				var passA = fmOrigItems['myn_password'].tValue;
				var passB = fmOrigItems['confirmed_password'].tValue;
				clearErrors(fmOrigItems, 'myn_password');
				clearErrors(fmOrigItems, 'confirmed_password');

				if (!passA && !passB)
				{
					showError(fmOrigItems['myn_password']);
					showError(fmOrigItems['confirmed_password'], 'Please enter your password again');
				}
				else if (!passA && passB)
				{
					showError(fmOrigItems['myn_password']);
					fmOrigItems['confirmed_password'].objt.style.borderColor = '#C1D82F';
				}
				else if (passA && !passB)
				{
					showError(fmOrigItems['confirmed_password'], 'Please enter your password again');
					fmOrigItems['myn_password'].objt.style.borderColor = '#C1D82F';
				}
				else if ((passA && passB) && (passA != passB))
				{
					showError(fmOrigItems['confirmed_password']);
					fmOrigItems['myn_password'].objt.style.borderColor = '#C1D82F';
				}
				var regexpPassword = /^[A-Za-z0-9]{6,30}$/;
				if (passA)
				{
					if (!regexpPassword.test(passA)) { showError(fmOrigItems['myn_password'], 'Please enter a password between 6 and 30 letters or numbers long.'); clearErrors(fmOrigItems, 'confirmed_password'); }
				}
			}
			else if (this.id == 'username')
			{
				var regexpUsername = /^[A-Za-z0-9]{4,12}$/;
				if (this.value)
				{
					if (!regexpUsername.test(this.value)) { showError(fmOrigItems['username'], 'Please choose a username between 4 and 12 letters or numbers long.'); }
						else { if (theForm.id == 'frmreg') { this.style.borderColor = '#C1D82F'; doHttpRequest(respHandler, fmOrigItems['username'].tValue); } }
				}

			}
			else if ((this.id == 'home_station') || (this.id == 'work_station'))
			{
				var sHome = fmOrigItems['home_station'].tValue;
				var sWork = fmOrigItems['work_station'].tValue;
				if (sHome && sWork && (sHome == sWork))
				{
					showError(fmOrigItems['home_station'], 'This must be different to your work station.');
					showError(fmOrigItems['work_station'], 'This cannot be the same as your home station.');
				}
				else
				{
					clearErrors(fmOrigItems, 'home_station');
					clearErrors(fmOrigItems, 'work_station');
					if (fmOrigItems['home_station'].tValue) { fmOrigItems['home_station'].objt.style.borderColor = '#C1D82F'; } else { fmOrigItems['home_station'].objt.style.borderColor = ''; }
					if (fmOrigItems['work_station'].tValue) { fmOrigItems['work_station'].objt.style.borderColor = '#C1D82F'; } else { fmOrigItems['work_station'].objt.style.borderColor = ''; }
				}
			}
			else if (this.id == 'telephone')
			{
				//clearErrors(fmOrigItems, this.id);
				if (this.value)
				{
					regexpTelephone = /^\+{0,1}([0-9\s]{11,12})$/;
					var telno = fmOrigItems['telephone'].tValue;
					telno = telno.replace(' ', '');
					if (!regexpTelephone.test(telno))
					{
						showError(fmOrigItems['telephone'], 'Please enter a valid telephone number (numbers and + only)');
					}
					else
					{
						this.style.borderColor = '#C1D82F';
					}
				}
			}
			else
			{
				if (this.value)
				{
					clearErrors(fmOrigItems, this.id);
					this.style.borderColor = '#C1D82F';
				}
				else
				{
					showError(fmOrigItems[this.id]);
				}
			}
		}
	}
	}

	theForm.onsubmit = function()
	{

		updateValues(fmOrigItems);
		clearErrors(fmOrigItems);
		for (var tFm in fmOrigItems)
		{
			if (typeof(fmOrigItems[tFm].objt) == 'object')
			{
				if (!fmOrigItems[tFm].tValue)
				{
					showError(fmOrigItems[tFm]);
				}
			}
		}

		if (fmOrigItems['email_address'])
		{
			if (!checkEmail(fmOrigItems['email_address'].tValue))
			{
				showError(fmOrigItems['email_address']);
			}
		}
		if (fmOrigItems['myn_password'] && fmOrigItems['confirmed_password'])
		{
			if (fmOrigItems['myn_password'].tValue != fmOrigItems['confirmed_password'].tValue)
			{
				showError(fmOrigItems['confirmed_password']);
			}
		}

		if (fmOrigItems['home_station'] && fmOrigItems['work_station'])
		{
			var sHome = fmOrigItems['home_station'].tValue;
			var sWork = fmOrigItems['work_station'].tValue;
			if (sHome && sWork && (sHome == sWork))
			{
				showError(fmOrigItems['home_station'], 'This must be different to your work station.');
				showError(fmOrigItems['work_station'], 'This cannot be the same as your home station.');
			}
		}

		if (fmOrigItems['telephone'])
		{
			regexpTelephone = /^\+{0,1}([0-9\s]{11,12})$/;
			var telno = fmOrigItems['telephone'].tValue;
			telno = telno.replace(' ', '');
			if (!regexpTelephone.test(telno))
			{
				showError(fmOrigItems['telephone'], 'Please enter a valid telephone number (numbers and + only)');
			}
		}

		var regexpPassword = /^[A-Za-z0-9]{6,30}$/;
		var regexpUsername = /^[A-Za-z0-9]{4,12}$/;
		if (fmOrigItems['username'])
		{
			if (!regexpUsername.test(fmOrigItems['username'].tValue)) { showError(fmOrigItems['username'], 'Please choose a username between 4 and 12 letters or numbers long.'); }
		}
		if (fmOrigItems['myn_password'])
		{
			if (!regexpPassword.test(fmOrigItems['myn_password'].tValue)) { showError(fmOrigItems['myn_password'], 'Please choose a password between 6 and 10 letters or numbers long.'); }
		}

		if (!isErr) { return true; }
		return false;
	}
