//some functions require YUI

var ERROR_TEXT = {
	// code : text
	'mandatory' : 'Please enter information.  This is a required field.',  //from http://disneyworldsports.disney.go.com/dwws/en_US/action/detail?name=ContactUsInfoDetailPage
	'singleMandatory' : 'Please enter information.  This is a required field.',
	'alphabet' : '',
	'number' : '	',
	'email' : 'Please enter a valid email.',  //from http://disneyworldsports.disney.go.com/dwws/en_US/_lib/javascript/bassFishing
	'unselected' : 'Please select an option in necessary fields.',
	'' : ''
};

////////////////////////////////////////////////////////////////////

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, '');};	

//called by a form
	var isFirstMandatoryError = true;
	var errorPane = null;

////////////////////////////////////////////////////////////////////

	var labelPrefix = 'lbl_';  //a label's = lbl_ + field's id
	
	var getFieldName = function (field) {
		if (field.name) return field.name;
		if (isArray(field)) return field[0].name;
	}
	
	var getLabelElementFromField = function (field) {
		var $D = YAHOO.util.Dom; 
		
		//highlight label
		return document.getElementById(labelPrefix + getFieldName(field));

		//highlight field
		//return $D.getAncestorByTagName(field, 'label');
	}
	
	var insertFieldLabel = function (err, field) {
		var lbl = getLabelElementFromField(field).firstChild;
		var labelText = '';
		if (typeof lbl != 'undefined') labelText = lbl.nodeValue;
		return err.replace('[field_label]', '[' + labelText + ']', 'g');
	}
	
	var resetLabelOf = function (field) {
		var $D = YAHOO.util.Dom; 

		//highlight label
		if (typeof field  == 'string') {
			$D.removeClass(field, 'error'); //add style to label
		} else {		
			$D.removeClass(getLabelElementFromField(field), 'error');  //remove styl e from label
		}
		
		//highlight field
		//$D.removeClass(field, 'error');  //remove styl e from label
	}
	
	var highlightLabelOf = function (field) {
		var $D = YAHOO.util.Dom; 
		
		$D.addClass( getLabelElementFromField(field), 'error'); //add style to label
	}

	var highlightField = function (field) {
		var $D = YAHOO.util.Dom; 

		$D.addClass(field, 'error'); //add style to label
	}
	
	var resetError = function () {
		var $D = YAHOO.util.Dom; 

		isFirstMandatoryError = true;
		
		var errList = document.getElementById('error');
		if (typeof errList == 'undefined') return;
		errList.innerHTML = '';
		$D.addClass(errList, 'hide');
	}

	var promptError = function (field, err) {
		var $D = YAHOO.util.Dom; 

		if (typeof field  == 'string') {
			$D.addClass(field, 'error'); //add style to label
		} else {
			//highlight label
			highlightLabelOf(field);
			
			//highlight field
			//$D.batch(field, highlightField);
		}

		var errList = document.getElementById('error');
		if (typeof errList == 'undefined') return;

		
		var errText = '';
		//display mandatory field alert only once
		if ( (err == ERROR_TEXT.mandatory)) {
			if  (isFirstMandatoryError) {
				errText = err;
				//errText = insertFieldLabel(ERROR_TEXT.singleMandatory, field);
				isFirstMandatoryError = false;
			}
		} else {
			errText = err;
			//errText = insertFieldLabel(err, field);
		}//end if
		
		if (errText != '') {
			var li = document.createElement('li');
			li.appendChild( document.createTextNode(errText) );
			errList.appendChild(li);
		}//end if
		
		$D.removeClass(errList, 'init');
		$D.removeClass(errList, 'hide');
		
		return false;
	}

	var jumpToErrorPane = function () {
		window.location.replace(
			window.location.href.toString().replace('#err', '') + '#err'
		)
	}
	
	var isArray = function (obj) {
		return (typeof obj.length  == 'undefined') ? false : true;
	}

	var isChecked = function (field) {
		return field.checked;
	}
	
	//if any one of the radio fields is checked, return true.
	//if none is selected, return false.
	// @radioArray = an array of radio field
	var isRadioChecked = function (radioArray) {
		for (var i=0; i<radioArray.length; i++) {
			if (radioArray[i].checked) return true;
		}
		return false;
	}

	//if select box is selected
	// @sel = a select field
	var isSelected = function(sel) {
		return ( 
			(sel.nodeName.toLowerCase = 'select') 
			&& (sel.value != null)
			&& (sel.value != '')
		)
	}
	
	// @field = a text field, or an array of radio field
	var isFieldFilled = function (field) {
		if (isArray(field)) return isRadioChecked(field);
		else if ( (field.type == 'text') && (field.value.trim() == '') )  return false;
		else if ( (field.type == 'password') && (field.value.trim() == '') )  return false;
		else if ( (field.nodeName.toLowerCase() == 'textarea') && (field.value.trim() == '') )  return false;
		else return true;
	}	

	var isAlphabetSpace = function (str) {
		if (str.value.match(/[^a-zA-Z ]/)) return false;
		else return true;
	}
	
	var IsInteger = function (str) {
		return ( str.value.match(/\d+/) != null );
	}
	
	//  Generic email checker.  Looks for "name"@"somehwere"."something"
	//  This pattern follows scripts in https://disneyworld.disney.go.com/wdw/register/register
	isEmail = function(str) {
		return (str.match(/^[a-z0-9\._-]+@.+\..+$/i) != null);
	}

	isValidDate = function (y, m, d) {
		var myDate = new Date(y, m, d);
		if ( isNaN(myDate.getTime()) ) return false;
		return (myDate.getMonth() == m);
	}

	//str should be mm/dd/yyyy
	isDateInputValid = function (str) {
		var d = str.split('/');
		if (d.length != 3) return false;
		return isValidDate(d[2], d[0] * 1 - 1, d[1]);
	}
	
	//str should be mm/dd/yyyy
	//if dateStr1 represents a date before the date represented by dateStr2
	//also true if the two dates are equal
	isBeforeOrSame = function (dateStr1, dateStr2) {
		if (dateStr1 == dateStr2) return true;

		var d = dateStr1.split('/');
		var d1 = new Date(d[2], d[0]-1, d[1]);

		d = dateStr2.split('/');
		var d2 = new Date(d[2], d[0]-1, d[1]);

		return YAHOO.widget.DateMath.before(d1, d2);
	}
////////////////////////////////////////////////////////////////////


function validateformContactUs() {
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start
	
	//First name
	var field = f.firstName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Last name 
	field = f.lastName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);
	
	//Email
	field = f.email;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isEmail(field.value)) isValidated = promptError(field, ERROR_TEXT.email);
	else resetLabelOf(field);

	//Phone Number
	field = f.phone;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Interest
	field = f.interest;
	if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Status
	field = f.status;
	if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Message
	var field = f.message;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Age 13
	var field = f.age13;
	if (!isChecked(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

function validateformCredentials() {
	//local error text
	ERROR_TEXT.dateFormat = 'Your date entry is invalid.';
	ERROR_TEXT.dateLogic = 'End Date should not come before Start Date';

	var isValidated = true;
	var f = this;
	resetError();

	// check fields start
	
	//First name
	var field = f.firstName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Last name 
	field = f.lastName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);
	
	//Email
	field = f.email;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isEmail(field.value)) isValidated = promptError(field, ERROR_TEXT.email);
	else resetLabelOf(field);

	//Phone Number
	field = f.phone;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);
	
	//Affiliation
	field = f.affiliation;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Event Name
	field = f.eventName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);
	
	//Message
	field = f.message;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Start Date
	field = f.dateRequested;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isDateInputValid(field.value)) isValidated = promptError(field, ERROR_TEXT.dateFormat);
	else resetLabelOf(field);

	//End Date
	var startDate = f.dateRequested.value;
	var field = f.dateRequestedEndDate;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isDateInputValid(field.value)) isValidated = promptError(field, ERROR_TEXT.dateFormat);
	else if (!isBeforeOrSame(startDate, field.value)) isValidated = promptError(field, ERROR_TEXT.dateLogic);
	else resetLabelOf(field);

	//Age 13
	field = f.age13;
	if (!isChecked(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}


function validateformSearch() {
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start
	
	//text field
	var field = f.qt;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

function validateformRegis1() {
	//local error text
	ERROR_TEXT.yearNumber = 'Please input a valid year.';
	ERROR_TEXT.ageInvalid = 'The age you entered is invalid.  Please re-enter your Birthday.';  //from Registration notations.doc

	isDateInBound = function (y) {
		var thisYear = (new Date()).getFullYear();
		return  ( (y > 1890) && (y <= thisYear) );
	}
	
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Month
	var fieldId = 'lbl_birthday';
	var field = f.birthdayMonth;
	if (!isSelected(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Day
	field = f.birthdayDay;
	if (!isSelected(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Year
	field = f.birthdayYear;
	if (!isFieldFilled(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else if (!IsInteger(field)) isValidated = promptError(fieldId, ERROR_TEXT.yearNumber);
	else resetLabelOf(field);

	//validate date
	if (isValidated) {
		var m = f.birthdayMonth; //months start from 0
		var d = f.birthdayDay;
		var y = f.birthdayYear;
		
		if (!isValidDate(y.value, m.value-1, d.value)) isValidated = promptError([y, m, d], ERROR_TEXT.ageInvalid);
		else if ( !isDateInBound(y.value) ) isValidated = promptError([y, m, d], ERROR_TEXT.ageInvalid);
		else resetLabelOf([y, m, d]);
	}//end if isValidated
	
	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

function validateformRegis2() {
	//local error text
	ERROR_TEXT.mandatory = 'Please complete the required fields.';  //from doc
	ERROR_TEXT.passwordFormat = 'Your password entry is invalid.';
	ERROR_TEXT.passwordUnmatch = 'Please re-enter your Password. Your entry did not match your original password.';  // modified from https://secure-dwws.disney.go.com/dwws/en_US/action/register/register
	ERROR_TEXT.nameFormat = 'Your name entry is invalid.';
	ERROR_TEXT.addressFormat = 'Your address entry is invalid.';
	ERROR_TEXT.zipCodeFormat = 'Your zip code entry is invalid.';
	ERROR_TEXT.provinceFormat = 'Your province entry is invalid.';
	ERROR_TEXT.postalCodeFormat = 'Your postal code entry is invalid.';
	ERROR_TEXT.mustCertify = 'You must certify you have read the terms of use and agree with all of their terms before completing the registration process.';  //from doc

	var isPasswordValid = function (str) {
		//4-60 characters.  a-z 0-9 _
		if ( (str.length < 4) || (str.length > 60) ) return false;
		else if (str.match(/[^a-zA-Z0-9_]/) != null) return false;
		else return true;
	}
	
	var isNameValid = function (str) {
		//2-40 characters. a-z A-Z
		if ( (str.length < 2) || (str.length > 40) ) return false;
		else if (str.match(/[^a-zA-Z\s]/) != null) return false;
		else return true;
	}

	var isAddressValid = function (str) {
		//4-25 characters. a-z A-Z 0-9
		if ( (str.length < 4) || (str.length > 55) ) return false;
		else if (str.match(/[^a-zA-Z0-9\s]/) != null) return false;
		else return true;
	}

	var isZipCodeValid = function (str) {
		//5 digits 0-9
		if (str.match(/^\d{5}$/) == null) return false;
		else return true;
	}

	var isProvinceValid = function (str) {
		//4-20 characters. a-z A-Z
		if ( (str.length < 4) || (str.length > 20) ) return false;
		else if (str.match(/[^a-zA-Z\s]/) != null) return false;
		else return true;
	}

	var isPostalCodeValid = function (str) {
		//4-25 characters. a-z A-Z
		if ( (str.length < 4) || (str.length > 25) ) return false;
		else if (str.match(/[^a-zA-Z]/) != null) return false;
		else return true;
	}

	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Email Address
	var field = f.emailAddress;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isEmail(field.value)) isValidated = promptError(field, ERROR_TEXT.email);
	else resetLabelOf(field);

	//Password
	field = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isPasswordValid(field.value)) isValidated = promptError(field, ERROR_TEXT.passwordFormat);
	else resetLabelOf(field);

	//Password check
	field = f.passwordCheck;
	var fieldCompare = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	//case insensitive
	else if ( field.value.toLowerCase() != fieldCompare.value.toLowerCase() ) promptError(field, ERROR_TEXT.passwordUnmatch);
	else resetLabelOf(field);

	//First Name
	field = f.firstName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);

	//Middle Name
	field = f.initial;
	if (isFieldFilled(field) && !isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);
	
	//Last Name
	field = f.lastName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);

	//Street Address
	field = f.line1;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isAddressValid(field.value)) isValidated = promptError(field, ERROR_TEXT.addressFormat);
	else resetLabelOf(field);

	//unit Number
	field = f.line2;
	if (isFieldFilled(field) && !isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.addressFormat);
	else resetLabelOf(field);
	
	//City
	field = f.city;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.addressFormat);
	else resetLabelOf(field);

	//Country
	field = f.country;
	if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	if (f.country.value == 'US') //US
    {
		//State
		field = f.state;
		if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);

		//Zip Code
		field = f.zipcode;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else if (!isZipCodeValid(field.value)) isValidated = promptError(field, ERROR_TEXT.zipCodeFormat);
		else resetLabelOf(field);
	}
    else if (f.country.value == 'CA') //Canada
    {
		//province
		field = f.canadaProvince;
       	if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);
		
		//postal code
		field = f.canadaPostalCode;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else if (!isPostalCodeValid(field.value)) isValidated = promptError(field, ERROR_TEXT.postalCodeFormat);
		else resetLabelOf(field);
	}
    else if (f.country.value == 'MX') //Mexico
    {
		//state
		field = f.mexicoState;
       	if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);
		
		//postal code
		field = f.mexicoPostalCode;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else if (!isPostalCodeValid(field.value)) isValidated = promptError(field, ERROR_TEXT.postalCodeFormat);
		else resetLabelOf(field);
	}
    else //International address
    {
        //province
		field = f.province;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else if (!isProvinceValid(field.value)) isValidated = promptError(field, ERROR_TEXT.provinceFormat);
		else resetLabelOf(field);
		
		//postal code
		field = f.postalCode;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else if (!isPostalCodeValid(field.value)) isValidated = promptError(field, ERROR_TEXT.postalCodeFormat);
		else resetLabelOf(field);
	}

	//Terms of Use
	var field = f.termsOfUse;
	if (!isChecked(field)) isValidated = promptError(field, ERROR_TEXT.mustCertify);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		//jump to error pane
		window.location.replace(
			window.location.href.toString().replace('#error', '') + '#error'
		)
	}

	return isValidated;  //true if promptError has never been called
}

function validateformUpdate() {
    return true;
}

function validateformRegis2Less13() {
	//local error text
	ERROR_TEXT.mandatory = 'Please complete the required fields.';  //from doc
	ERROR_TEXT.passwordFormat = 'Your password entry is invalid.';
	ERROR_TEXT.passwordUnmatch = 'Please re-enter your Password. Your entry did not match your original password.';  // modified from https://secure-dwws.disney.go.com/dwws/en_US/action/register/register
	ERROR_TEXT.memberNameFormat = 'Your member name entry is invalid.';
	ERROR_TEXT.nameFormat = 'Your name entry is invalid.';

	var isMemberNameValid = function (str) {
		//4-64 characters.  a-z 0-9 _
		if ( (str.length < 4) || (str.length > 64) ) return false;
		else if (str.match(/[^a-zA-Z0-9_]/) != null) return false;
		else return true;
	}

	var isPasswordValid = function (str) {
		//4-25 characters.  a-z 0-9 _
		if ( (str.length < 4) || (str.length > 25) ) return false;
		else if (str.match(/[^a-zA-Z0-9_]/) != null) return false;
		else return true;
	}
	
	var isNameValid = function (str) {
		//4-25 characters. a-z A-Z
		if ( (str.length < 4) || (str.length > 25) ) return false;
		else if (str.match(/[^a-zA-Z\s]/) != null) return false;
		else return true;
	}

	var isAddressValid = function (str) {
		//4-25 characters. a-z A-Z 0-9
		if ( (str.length < 4) || (str.length > 55) ) return false;
		else if (str.match(/[^a-zA-Z0-9\s]/) != null) return false;
		else return true;
	}

	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Member Name
	var field = f.username;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isMemberNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.memberNameFormat);
	else resetLabelOf(field);

	//Password
	field = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isPasswordValid(field.value)) isValidated = promptError(field, ERROR_TEXT.passwordFormat);
	else resetLabelOf(field);

	//Password check
	field = f.passwordCheck;
	var fieldCompare = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	//case insensitive
	else if ( field.value.toLowerCase() != fieldCompare.value.toLowerCase() ) promptError(field, ERROR_TEXT.passwordUnmatch);
	else resetLabelOf(field);

	//Parent's Email Address
	var field = f.parentEmailAddress;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isEmail(field.value)) isValidated = promptError(field, ERROR_TEXT.email);
	else resetLabelOf(field);

	//First Name
	field = f.firstName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		//jump to error pane
		window.location.replace(
			window.location.href.toString().replace('#error', '') + '#error'
		)
	}

	return isValidated;  //true if promptError has never been called
}

function validateformUpdateLess13() {
	//local error text
	ERROR_TEXT.mandatory = 'Please complete the required fields.';  //from doc
	ERROR_TEXT.passwordFormat = 'Your password entry is invalid.';
	ERROR_TEXT.passwordUnmatch = 'Please re-enter your Password. Your entry did not match your original password.';  // modified from https://secure-dwws.disney.go.com/dwws/en_US/action/register/register
	ERROR_TEXT.nameFormat = 'Your name entry is invalid.';

	var isPasswordValid = function (str) {
		//4-25 characters.  a-z 0-9 _
		if ( (str.length < 4) || (str.length > 25) ) return false;
		else if (str.match(/[^a-zA-Z0-9_]/) != null) return false;
		else return true;
	}
	
	var isNameValid = function (str) {
		//4-25 characters. a-z A-Z
		if ( (str.length < 4) || (str.length > 25) ) return false;
		else if (str.match(/[^a-zA-Z\s]/) != null) return false;
		else return true;
	}

	var isAddressValid = function (str) {
		//4-25 characters. a-z A-Z 0-9
		if ( (str.length < 4) || (str.length > 55) ) return false;
		else if (str.match(/[^a-zA-Z0-9\s]/) != null) return false;
		else return true;
	}

	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Password
	field = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isPasswordValid(field.value)) isValidated = promptError(field, ERROR_TEXT.passwordFormat);
	else resetLabelOf(field);

	//Password check
	field = f.passwordCheck;
	var fieldCompare = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	//case insensitive
	else if ( field.value.toLowerCase() != fieldCompare.value.toLowerCase() ) promptError(field, ERROR_TEXT.passwordUnmatch);
	else resetLabelOf(field);

	//Parent's Email Address
	var field = f.parentEmailAddress;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isEmail(field.value)) isValidated = promptError(field, ERROR_TEXT.email);
	else resetLabelOf(field);

	//First Name
	field = f.firstName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		//jump to error pane
		window.location.replace(
			window.location.href.toString().replace('#error', '') + '#error'
		)
	}

	return isValidated;  //true if promptError has never been called
}

function validateformLogin() {
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Login
	field = f.username;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Password
	field = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

function validateformForgotPassword() {
	//local error text
	ERROR_TEXT.yearNumber = 'Please input a valid year.';
	ERROR_TEXT.ageInvalid = 'The age you entered is invalid.  Please re-enter your Birthday.';  //from Registration notations.doc

	isDateInBound = function (y) {
		var thisYear = (new Date()).getFullYear();
		return  ( (y > 1890) && (y <= thisYear) );
	}
	
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start

	//Login
	field = f.username;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Last Name
	field = f.lastName;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else if (!isNameValid(field.value)) isValidated = promptError(field, ERROR_TEXT.nameFormat);
	else resetLabelOf(field);

	//Month
	var fieldId = 'lbl_birthday';
	var field = f.birthdayMonth;
	if (!isSelected(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Day
	var field = f.birthdayDay;
	if (!isSelected(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	//Year
	field = f.birthdayYear;
	if (!isFieldFilled(field)) isValidated = promptError(fieldId, ERROR_TEXT.mandatory);
	else if (!IsInteger(field)) isValidated = promptError(fieldId, ERROR_TEXT.yearNumber);
	else resetLabelOf(field);

	//validate date
	if (isValidated) {
		var m = f.birthdayMonth; //months start from 0
		var d = f.birthdayDay;
		var y = f.birthdayYear;
		
		if (!isValidDate(y.value, m.value-1, d.value)) isValidated = promptError([y, m, d], ERROR_TEXT.ageInvalid);
		else if ( !isDateInBound(y.value) ) isValidated = promptError([y, m, d], ERROR_TEXT.ageInvalid);
		else resetLabelOf([y, m, d]);
	}//end if isValidated
	
	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

function validateformUploadPhotos() {
	//local error text
	ERROR_TEXT.mustCertify = 'You must certify you have read the terms of use and agree with all of their terms.';  //modified from regis2

	hasFileUpload = function () {
		for (var i=0; i<this.elements.length; i++) {
			if (
				(this.elements[i].type == 'file') && (this.elements[i].value != '')
			) return true;
		}
		return false;
	}
	
	var isValidated = true;
	var f = this;
	resetError();
	
	// check fields start

	if (f.page == '2') {
		//certify have read
		field = f.termsOfUse;
		if (!isChecked(field)) isValidated = promptError(field, ERROR_TEXT.mustCertify);
		else resetLabelOf(field);
	} else {
		//First name
		var field = f.username;
		if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);

		//Sport
		field = f.sport;
		if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);

		//Event
		field = f.event;
		if (!isSelected(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);

		//File Upload
		field = 'lbl_file';
		if (!hasFileUpload.call(f))  isValidated = promptError(field, ERROR_TEXT.mandatory);
		else resetLabelOf(field);
	}
	
	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}


//template for a certain form validation
function validateformGateSubmissions() {
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start
	
	//Password
	var field = f.password;
	if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}

//template for a certain form validation
function validateformxxx() {
	var isValidated = true;
	var f = this;
	resetError();

	// check fields start
	
	//First name
	//var field = f.firstName;
	//if (!isFieldFilled(field)) isValidated = promptError(field, ERROR_TEXT.mandatory);
	//else resetLabelOf(field);

	// check fields end

	if (!isValidated) {
		jumpToErrorPane();
	}

	return isValidated;  //true if promptError has never been called
}
