String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

function checkPostCode(toCheck) {
	// Permitted letters depend upon their position in the postcode.
  	var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
  	var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
  	var alpha3 = "[abcdefghjkstuw]";                                // Character 3
  	var alpha4 = "[abehmnprvwxy]";                                  // Character 4
  	var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5
  
  	// Array holds the regular expressions for the valid postcodes
  	var pcexp = new Array ();

  	// Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
  	pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  	// Expression for postcodes: ANA NAA
  	pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

  	// Expression for postcodes: AANA  NAA
  	pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  	// Exception for the special postcode GIR 0AA
  	pcexp.push (/^(GIR)(\s*)(0AA)$/i);
  
  	// Standard BFPO numbers
  	pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
  
  	// c/o BFPO numbers
  	pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);

  	// Load up the string to check
  	var postCode = toCheck;

  	// Assume we're not going to find a valid postcode
  	var valid = false;
  
  	// Check the string against the types of post codes
  	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(postCode)) {
    
			// The post code is valid - split the post code into component parts
      	pcexp[i].exec(postCode);
      
	      // Copy it back into the original string, converting it to uppercase and
	      // inserting a space between the inward and outward codes
	      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
      
	      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
	      postCode = postCode.replace (/C\/O\s*/,"c/o ");
      
	      // Load new postcode back into the form element
	      valid = true;
      
	      // Remember that we have found that the code is valid and break from loop
	      break;
		}
	}
  
	// Return with either the reformatted valid postcode or the original invalid 
	// postcode
 	if (valid) {return postCode;} 
 	else return false;
}

function checkUKTelephone (telephoneNumber) {
  // Convert into a string and check that we were provided with something
  var telnum = telephoneNumber + " ";
  if (telnum.length == 1)  {
     telNumberErrorNo = 1;
     return false
  }
  telnum.length = telnum.length - 1;
  
  // Don't allow country codes to be included (assumes a leading "+")
  var exp = /^(\+)[\s]*(.*)$/;
  if (exp.test(telnum) == true) {
     telNumberErrorNo = 2;
     return false;
  }
  
  // Remove spaces from the telephone number to help validation
  while (telnum.indexOf(" ")!= -1)  {
    telnum = telnum.slice (0,telnum.indexOf(" ")) + telnum.slice (telnum.indexOf(" ")+1)
  }
  
  // Remove hyphens from the telephone number to help validation
  while (telnum.indexOf("-")!= -1)  {
    telnum = telnum.slice (0,telnum.indexOf("-")) + telnum.slice (telnum.indexOf("-")+1)
  }  
  
  // Now check that all the characters are digits
  exp = /^[0-9]{10,11}$/
  if (exp.test(telnum) != true) {
     telNumberErrorNo = 3;
     return false;
  }
  
  // Now check that the first digit is 0
  exp = /^0[0-9]{9,10}$/
  if (exp.test(telnum) != true) {
     telNumberErrorNo = 4;
     return false;
  }
  
  // Finally check that the telephone number is appropriate.
  exp = /^(01|02|03|05|070|077|07624|078|079)[0-9]+$/;
  if (exp.test(telnum) != true) {
     telNumberErrorNo = 5;
     return false;
  }
  
  // Telephone number seems to be valid - return the stripped telehone number  
  return telnum;
}

function isValidEmail(emailStr) {
	 var checkTLD=1;
	 var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum|tv|la)$/;
	 var emailPat=/^(.+)@(.+)$/;
	 var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	 var validChars="\[^\\s" + specialChars + "\]";
	 var quotedUser="(\"[^\"]*\")";
	 var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	 var atom=validChars + '+';
	 var word="(" + atom + "|" + quotedUser + ")";
	 var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	 var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

	 var matchArray=emailStr.match(emailPat);

	 if (matchArray==null) {
	 	return false;
	 }

	 var user=matchArray[1];
	 var domain=matchArray[2];

	 for (i=0; i<user.length; i++) {
		  if (user.charCodeAt(i)>127) {
				return false;
		  }
	 }

	 for (i=0; i<domain.length; i++) {
		  if (domain.charCodeAt(i)>127) {
				return false;
		  }
	 }

	 if (user.match(userPat)==null) {
		  return false;
	 }

	 var IPArray=domain.match(ipDomainPat);
	 if (IPArray!=null) {
		  for (var i=1;i<=4;i++) {
				if (IPArray[i]>255) {
					 return false;
				}
		  }
		  return true;
	 }

	 var atomPat=new RegExp("^" + atom + "$");
	 var domArr=domain.split(".");
	 var len=domArr.length;
	 for (i=0;i<len;i++) {
		  if (domArr[i].search(atomPat)==-1) {
				return false;
		  }
	 }

	 /*if (checkTLD && domArr[domArr.length-1].length!=2 &&
	 domArr[domArr.length-1].search(knownDomsPat)==-1) {
	 alert("The address must end in a well-known domain or two letter " + "country.");
	 return false;
	 }*/

	 if (len<2) {
		  return false;
	 }

	 return true;
}

/*
=========================================================================================================================
FORM CHECK FUNCTIONS
=========================================================================================================================
*/
function setMessage(message_text, class_name) {
	 var objMessage = document.getElementById("message");

	 objMessage.className = class_name;
	 objMessage.innerHTML = message_text;
}

function emailCheck(email_address) {
	 if (!email_address.value || !isValidEmail(email_address.value)) {
		  document.getElementById("cont").value = "0"
	 }
	 else {
		  var objIFrm	= document.getElementById("dproc");
		  var objDoc 	= objIFrm.contentWindow.document;
		  var objForm = objDoc.getElementById("frmData");

		  objDoc.getElementById("email_address").value = email_address.value;
		  objDoc.getElementById("action").value = "echeck";
		  objForm.submit();
	 }
}

function emailSubmit() {
	 var objIFrm	= document.getElementById("dproc");
	 var objDoc 	= objIFrm.contentWindow.document;
	 var objForm = objDoc.getElementById("frmData");

	 objDoc.getElementById("email_address").value = document.getElementById("email_address").value;
	 objDoc.getElementById("cstr").value = document.getElementById("cstr").value;
	 objDoc.getElementById("opid").value = document.getElementById("opid").value;
	 objDoc.getElementById("ioid").value = document.getElementById("ioid").value;
	 objDoc.getElementById("action").value = "esubmit";
	 objForm.submit();
}

function getAddressList() {
	var post_code	= document.getElementById("post_code").value;
	var objIFrm		= document.getElementById("dproc");
	var objDoc 		= objIFrm.contentWindow.document;
	var objForm 	= objDoc.getElementById("frmData");

	if (post_code) {
		setMessage("Please wait, retrieving Address data...", "message_proc");
		objDoc.getElementById("post_code").value = post_code;
		objDoc.getElementById("action").value = "pcheck";
		objForm.submit();
	}
}

function signupCheck() {
	var step 	= document.getElementById("step").value;
	var retval	= false;
	
	var ttl	= document.getElementById("title");
	var fn 	= document.getElementById("first_name");
	var ln	= document.getElementById("last_name");

	var dy 	= document.getElementById("day");
	var mn 	= document.getElementById("month");
	var yr 	= document.getElementById("year");

	var ph1	= document.getElementById("telephone_1"); 
	var ph2	= document.getElementById("telephone_2"); 	
	var pc	= document.getElementById("post_code"); 	

	var al	= document.getElementById("address_list"); 	
	
	if (!ttl.value) {
		alert("Please select your Title!");
		ttl.focus();
		retval = false;
	}
  	else if (!fn.value) {
		alert("Please enter your First Name!");
		fn.focus();
		retval = false;
	}
	else if (!ln.value) {
		alert("Please enter your Last Name!");
		ln.focus();
		retval = false;
	}
	else if (!dy.value || !mn.value || !yr.value) {
		alert('Please enter your Date of Birth!');
		if (!dy.value)			dy.focus();
		else if (!mn.value)	mn.focus();
 		else if (!yr.value)	yr.focus();
		retval = false;
	}
	else if (!ph1.value || !checkUKTelephone(ph1.value) ) {
		alert("Please enter a valid Telephone!");
		ph1.focus();
		retval = false;
	}
	else if (!pc.value || !checkPostCode(pc.value.trim())) {
		alert("Please enter a valid Post Code!");
		pc.focus();
		retval = false;
	}
	else retval = true;
	
	if (step == 2) {
		if (!al.value) {
			alert("Please select your Address!");
			al.focus();
			retval = false;
		}
		else retval = true;
	}

	return(retval);
}

function signupCheck2() {
	var step 	= document.getElementById("step").value;
	var retval	= false;
	
	var ttl	= document.getElementById("title");
	var fn 	= document.getElementById("first_name");
	var ln	= document.getElementById("last_name");
	var ea	= document.getElementById("email_address");

	var dy 	= document.getElementById("day");
	var mn 	= document.getElementById("month");
	var yr 	= document.getElementById("year");

	var ph1	= document.getElementById("telephone_1"); 
	var ph2	= document.getElementById("telephone_2"); 	
	var pc	= document.getElementById("post_code"); 	

	var al	= document.getElementById("address_list"); 	
	
	if (!ttl.value) {
		alert("Please select your Title!");
		ttl.focus();
		retval = false;
	}
  	else if (!fn.value) {
		alert("Please enter your First Name!");
		fn.focus();
		retval = false;
	}
	else if (!ln.value) {
		alert("Please enter your Last Name!");
		ln.focus();
		retval = false;
	}
	else if (!ea.value) {
		alert("Please enter your Email Address!");
		ea.focus();
		retval = false;
	}
	else if (!dy.value || !mn.value || !yr.value) {
		alert('Please enter your Date of Birth!');
		if (!dy.value)			dy.focus();
		else if (!mn.value)	mn.focus();
 		else if (!yr.value)	yr.focus();
		retval = false;
	}
	else if (!ph1.value || !checkUKTelephone(ph1.value) ) {
		alert("Please enter a valid Telephone!");
		ph1.focus();
		retval = false;
	}
	else if (!pc.value || !checkPostCode(pc.value.trim())) {
		alert("Please enter a valid Post Code!");
		pc.focus();
		retval = false;
	}
	else retval = true;
	
	if (step == 2) {
		if (!al.value) {
			alert("Please select your Address!");
			al.focus();
			retval = false;
		}
		else retval = true;
	}

	return(retval);
}

function dataSubmit() {
	var objIFrm	= document.getElementById("dproc");
	var objDoc 	= objIFrm.contentWindow.document;
	var objForm = objDoc.getElementById("frmData");

	var ttl	= document.getElementById("title").value.trim();
	var fn 	= document.getElementById("first_name").value.trim();
	var ln	= document.getElementById("last_name").value.trim();
	var ea	= document.getElementById("email_address").value.trim();
	var dy 	= document.getElementById("day").value.trim();
	var mn 	= document.getElementById("month").value.trim();
	var yr 	= document.getElementById("year").value.trim();
	var ph1	= document.getElementById("telephone_1").value.trim();
	var ph2	= document.getElementById("telephone_2").value.trim();
	var pc	= document.getElementById("post_code").value.trim();
	var ad1	= document.getElementById("address_1").value.trim();
	var ad2	= document.getElementById("address_2").value.trim();
	var ad3	= document.getElementById("address_3").value.trim();
	var tn	= document.getElementById("town").value.trim();
	var cn	= document.getElementById("county").value.trim();

	objDoc.getElementById("cstr").value				= document.getElementById("cstr").value;
	objDoc.getElementById("opid").value				= document.getElementById("opid").value;
	objDoc.getElementById("ioid").value				= document.getElementById("ioid").value;
	
	objDoc.getElementById("title").value			= ttl;
	objDoc.getElementById("first_name").value		= fn;
	objDoc.getElementById("last_name").value 		= ln;
	objDoc.getElementById("email_address").value	= ea;
	objDoc.getElementById("day").value 				= dy;
	objDoc.getElementById("month").value 			= mn;
	objDoc.getElementById("year").value 			= yr;
	objDoc.getElementById("telephone_1").value 	= ph1;
	objDoc.getElementById("telephone_2").value 	= ph2;

	objDoc.getElementById("post_code").value 		= pc;

	objDoc.getElementById("address_1").value 		= ad1;
	objDoc.getElementById("address_2").value 		= ad2;
	objDoc.getElementById("address_3").value 		= ad3;
	objDoc.getElementById("town").value 			= tn;
	objDoc.getElementById("county").value 			= cn;

	objDoc.getElementById("action").value 			= "dsubmit";
	objForm.submit();
}

/*================================================================================================================================
	FUNCTION:	openExitPop()
	INPUT:		url
	USED IN:		opp.php, mos.php, moso.php
	PURPOSE:		opens an exit pop if page is being closed
================================================================================================================================*/
	openExitPop = function(url) {
		if (exitPop) {
			window.open(url, "",  "width=800,height=640,toolbar,resizable,location,status,scrollbars");
		}
	}