usernameRegExp = /^[a-zA-Z0-9_]+$/;
blankRegExp = /^ *$/;
emailRegExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; // fixme: use the one in the php code instead

correctEmailStr = ""; //Email OK";

correctPasswordStr = ""; //First password OK";
passwordsMatchStr = ""; //Second password OK";
genderSelectedStr = "";
ageSelectedStr = "";

usernameAvailable = false;

function msgWithClass(elId, theMsg, theClassName) {
	theEl = document.getElementById(elId);
	if (theEl==null) return;
	if (theEl.hasChildNodes()) {
	    theEl.firstChild.nodeValue = theMsg;
	} else {
	    var textNode = document.createTextNode(theMsg);
	    theEl.appendChild(textNode);
	}
	theEl.setAttribute("class", theClassName);
}

function validateUsername(validateFld, displayFld) {
    enteredUsername = validateFld.value;
    if (enteredUsername.match(usernameRegExp) && enteredUsername.length <= 20) {
		checkUsernameAvailability(enteredUsername, displayFld);
		return true;
    } else {
		msgWithClass(displayFld, wrongUsernameStr, "validationError");
		focus(validateFld);
		return false;
    }
}

function validateEmail(validateFld, displayFld) {
    enteredEmail = validateFld.value;
    if (enteredEmail == "") {
		msgWithClass(displayFld, "");
		return true;
    } else if (enteredEmail.match(emailRegExp) && enteredEmail.length <= 100) {
		msgWithClass(displayFld, correctEmailStr, "noValidationError");
		return true;
    } else {
		msgWithClass(displayFld, wrongEmailStr, "validationError");
		focus(validateFld);
		return false;
    }
}

function validatePassword(validateFld, displayFld) {

    enteredPw = validateFld.value;
    if (enteredPw.length < 5) {
		msgWithClass(displayFld, wrongPasswordStr, "validationError");
		focus(validateFld);
		return false;
    } else {
		msgWithClass(displayFld, correctPasswordStr, "noValidationError");
		return true;
    }
}

/*
function validateGender(validateName, displayFld) {
	for (var i=0; i < validateName.length; i++) {
		if (validateName[i].checked) {
			msgWithClass(displayFld, genderSelectedStr, "noValidationError");
			return true;
		}
	}
	msgWithClass(displayFld, noGenderStr, "validationError");
	focus(validateName[i]);
	return false;
}
*/

/*
function validateAge(validateName, displayFld) {
	for (var i=0; i < validateName.length; i++) {
		if (validateName[i].checked) {
			msgWithClass(displayFld, ageSelectedStr, "noValidationError");
			return true;
		}
	}
	msgWithClass(displayFld, noAgeStr, "validationError");
	focus(validateName[i]);
	return false;
}
*/

function validateRepeatedPassword(repeatedPwFld, previousPwFldName, displayFld) {
    previousPwFld = document.getElementById(previousPwFldName);
    if (repeatedPwFld.value != previousPwFld.value) {
		msgWithClass(displayFld, passwordsDontMatchStr, "validationError");
		focus(repeatedPwFld);
		return false;
    } else {
		msgWithClass(displayFld, passwordsMatchStr, "noValidationError");
		return true;
    }
}

function validateAllSignupFields() {
	//alert("validateallfields");
	returnval = validateUsername(document.forms.signup.signUpUsername, 'usernameErrInfo');
	returnval = returnval && validatePassword(document.forms.signup.signUpPassword, 'pwErrInfo');
	returnval = returnval && validateRepeatedPassword(document.forms.signup.repeatedPassword, 'signUpPassword', 'repeatedPwErrInfo');
	returnval = returnval && validateEmail(document.forms.signup.email, 'emailErrInfo');

	// returnval = returnval && checkUsernameAvailability(document.forms.signup.signUpUsername, 'usernameErrInfo');
	returnval = returnval && usernameAvailable;

	if (!returnval) {
		msgWithClass('allErrInfo',WHOOPS_NOT_FILLED_IN, "validationError");
	}

	return returnval;
}

function validateChangeEmailForm() {
	returnval = validateEmail(document.forms.changeEmailForm.email, 'emailErrInfo');

	if (!returnval) {
		msgWithClass('allChangeEmailErrInfo',PLEASE_VALID_EMAIL, "validationError");
	}

	return returnval;
}

function validateChangePasswordForm() {

	//var valPw = validatePassword(document.forms.changePasswordForm.newPassword, 'newPwErrInfo');
	//var valRepPw = validateRepeatedPassword(document.forms.changePasswordForm.repeatedNewPassword, 'newPassword', 'repeatedNewPwInfo');

	//alert("validatePassword: " + valPw);
	//alert("validatereppassword: " + valRepPw);
	//return false;	
	//if (!returnval) {
	//	msgWithClass('allChangePasswordErrInfo',PASSWORD_TWICE, "validationError");
	//}

	//return returnval;
	return true;
}


function checkUsernameAvailability(username, displayFld){
	var ajaxRequest;

	try {
		ajaxRequest = getAjaxRequest();
	} catch (e) {
		return -1;
	}

	ajaxRequest.onreadystatechange = function() {
		if (ajaxRequest.readyState == 4) {
			if (ajaxRequest.status == 200) {
				if (ajaxRequest.responseText == "OK") {
					// need to set this for the complete form validation later
					usernameAvailable = true;
					msgWithClass(displayFld, username + correctUsernameStr, "noValidationError");
				} else {
					usernameAvailable = false;
					msgWithClass(displayFld, usernameUnavailableStr, "validationError");
				}
			} else {
				msgWithClass(displayFld, "", "noValidationError"); // fixme: some error msg here? or just leave user oblivious for now?
			}
		}
	}

	ajaxRequest.open("POST", "http://www.animasher.com/comm/ajax_controller.php", true);
	ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	ajaxRequest.send("checkUsernameAvailability=true&username="+username);
}