// 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 isPromoValid(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)
{


// form.PROMO.value=trim(form.PROMO.value);
// if (! isPromoValid(form.PROMO.value)) {
//	alert( "Please enter Promo Code using only letters(A-Z,a-z), numbers(0-9)." );
//	form.PROMO.focus();
//	return false ;
// };


 form.PromoCode.value=trim(form.PromoCode.value);
 if (! isPromoValid(form.PromoCode.value)) {
	alert( "This form cannot be submitted without a valid promo code." );
//	form.?????.focus();
	return false ;
 };


 if (form.BOOKINGTYPE.value=="") {
	alert( "Please select your Booking Type." );
	form.BOOKINGTYPE.focus();
	return false ;
 };


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

 if (form.PAYMENTFORM.value=="") {
	alert( "Please select your Payment Form." );
	form.PAYMENTFORM.focus();
	return false ;
 };

 if (form.PAYMENTSCHEDULE.value=="") {
	alert( "Please select your Payment Schedule." );
	form.PAYMENTSCHEDULE.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 ;
 };


 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 ;
 };



 if (form.CITIZENSHIP.value=="") {
	alert( "Please select your Citizenship." );
	form.CITIZENSHIP.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 ;
 };



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


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




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


 if (! form.TERMS.checked) {
	alert( "Please accept our TERMS and CONDITIONS to make your booking." );
	form.TERMS.focus();
	return false ;
 };



 return true ;
}m.TERMS.focus();
	return false ;
 };



 return true ;
}
