// remove multiple, leading or trailing spaces
function trim(s) {

// this is more elegant code
//	s = s.replace(/(^\s*)|(\s*$)/gi,"");

// this is less elegant but more efficient to remove spaces from each end separately.
// especially noticeable on long strings
	s = s.replace(/^\s\s*/, '').replace(/\s\s*$/, '');

// replace double spaces on one
	s = s.replace(/[ ]{2,}/gi," ");

//remove any spaces that come after a new line
	s = s.replace(/\n /,"\n");
	return s;
}


function isEmailValid(str)
{

 var at="@"
 var dot="."
 var lat=str.indexOf(at)
 var lstr=str.length
 var ldot=str.indexOf(dot)

 //starts from a letter or number
 //then zero or more times: letter or number or undescore or dot or dash
 //then @
 //ony a letter or a number after @
 //then 0 or more times: letter or number or undescore or dot or dash
 //ends with a dot and not less than 2 and not more than 6 letters (max domain =.travel )
 // (no special characters, but allowed undesrcores and dashes, although not first and not last)
 if (! str.match(/^([a-zA-Z0-9])+([a-zA-Z0-9_\.\-])*\@([a-zA-Z0-9])+([a-zA-Z0-9_\.\-])*\.([A-Za-z]{2,6})$/)) {return false;}	

 // Is there dot immediately before @ ?
 if (str.substring(lat-1,lat)==dot)  {return false}

 // Two dots ("..") in a row?
 if (str.indexOf(dot+dot)!=-1)  {return false}

 // Less than 6 chars? (should be at least a@b.travel)
 //	if (lstr < 6 ) {return false}
 // REDUNDANT, above tests it

 // No @ ? 
 // is @ first ?
 // is @ last?
 //	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) {return false}
 // REDUNDANT, above tests it

 // More than one @ ?
 //	 if (str.indexOf(at,(lat+1)) != -1)  {return false}
 // REDUNDANT, above tests it

 // no . present? 
 // is . first?
 // is . last?
 //	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) {return false}
 // REDUNDANT, above tests it

 // no . anywhere after @ present? 
 //	if (str.indexOf(dot,(lat+2))==-1)  {return false}
 // REDUNDANT, above tests it

 // is . immediately after @ ?
 //	 if (str.substring(lat+1,lat+2)==dot)  {return false}
 // REDUNDANT, above tests it

 // any spaces? 		
 //	if (str.indexOf(" ")!=-1)  {return false}
 // REDUNDANT, above tests it

 // All checks are OK
 return true;

}


function isNameValid(str)
{

 //starts from a letter
 //then zero or more times: letter or space or dash or apostrohe
 //ends on a letter
 //no special characters
 // not less than 2 letters
 if (str.match(/^([a-zA-Z])+([a-zA-Z\'\-\s])*([a-zA-Z])+$/)) {return true;}
	else {return false;}
}

function isCityValid(str)
{
 // same as name but could be numbers
 if (str.match(/^([a-zA-Z0-9])+([a-zA-Z0-9\'\-\s])*([a-zA-Z0-9])+$/)) {return true;}
	else {return false;}
}


function isPhoneValid(str)
{
// has one or more number or dot or space or dash and ends on a number
 if (str.match(/^([0-9\.\+\-\s])*([0-9])+$/)) {return true;}
	else {return false;}
}


function isPostalValid(str)
{
 // Same as City but no apostrophe
 if (str.match(/^([a-zA-Z0-9])+([a-zA-Z0-9\-\s])*([a-zA-Z0-9])+$/)) {return true;}
	else {return false;}
}



function isFormValid(form)
{

 if (form.CABIN.value=="") {
	alert( "Please select Cabin Category." );
	form.CABIN.focus();
	return false ;
 };


 if (form.GENDER.value=="") {
	alert( "Please select Gender." );
	form.GENDER.focus();
	return false ;
 };


 form.FNAME.value=trim(form.FNAME.value);
 if (! isNameValid(form.FNAME.value)) {
	alert( "Please enter your First Name using only letters(A-Z,a-z), dashes(-), spaces(  ) or apostrophes(')." );
	form.FNAME.focus();
	return false ;
 };


 form.LNAME.value=trim(form.LNAME.value);
 if (! isNameValid(form.LNAME.value)) {
	alert( "Please enter your Last Name using only letters(A-Z,a-z), dashes(-), spaces(  ) or apostrophes(')." );
	form.LNAME.focus();
	return false ;
 };

 form.ADDRESS1.value=trim(form.ADDRESS1.value);
 if (! isCityValid(form.ADDRESS1.value)) {
	alert( "Please enter your Address, using only letters(A-Z,a-z), numbers(0-9), dashes(-), spaces(  ) or apostrophes(')." );
	form.ADDRESS1.focus();
	return false ;
 };


 form.CITY.value=trim(form.CITY.value);
 if (! isCityValid(form.CITY.value)) {
	alert( "Please enter your City, using only letters(A-Z,a-z), numbers(0-9), dashes(-), spaces(  ) or apostrophes(')." );
	form.CITY.focus();
	return false ;
 };


 form.POSTAL.value=trim(form.POSTAL.value);
 if (! isPostalValid(form.POSTAL.value)) {
	alert( "Please enter your Postal Code using only letters(A-Z,a-z), numbers(0-9), dashes(-) or spaces(  )." );
	form.POSTAL.focus();
	return false ;
 };


 if (form.COUNTRY.value=="") {
	alert( "Please select Country." );
	form.COUNTRY.focus();
	return false ;
 };



 form.EMAIL.value=trim(form.EMAIL.value);
 if (! isEmailValid(form.EMAIL.value)) {
	alert( "Please enter a valid email address." );
	form.EMAIL.focus();
	return false ;
 };

 form.CONFIRMEMAIL.value=trim(form.CONFIRMEMAIL.value);
 if (form.EMAIL.value!=form.CONFIRMEMAIL.value) {
	alert( "eMail addresses do not match." );
	form.CONFIRMEMAIL.focus();
	return false ;
 };



 form.PHONE.value=trim(form.PHONE.value);
 if (! isPhoneValid(form.PHONE.value)) {
	alert( "Please enter your Phone using only numbers(0-9), dashes(-), dots (.), spaces(  ) or plus(+)." );
	form.PHONE.focus();
	return false ;
 };




 if (form.DOB_MONTH.value=="") {
	alert( "Please select Month of Birth." );
	form.DOB_MONTH.focus();
	return false ;
 };


 if (form.DOB_DAY.value=="") {
	alert( "Please select Day of Birth." );
	form.DOB_DAY.focus();
	return false ;
 };

 if (form.DOB_YEAR.value=="") {
	alert( "Please select Year of Birth." );
	form.DOB_YEAR.focus();
	return false ;
 };



 form.CITIZENSHIP.value=trim(form.CITIZENSHIP.value);
 if (! isNameValid(form.CITIZENSHIP.value)) {
	alert( "Please select your Citizenship, using only letters(A-Z,a-z), dashes(-), spaces(  ) or apostrophes(')." );
	form.CITIZENSHIP.focus();
	return false ;
 };




 if (form.SOURCE.value=="") {
	alert( "Please select How Did You Hear About Us." );
	form.SOURCE.focus();
	return false ;
 };


 return true ;
}
