
// error messages

var errors = new Array();

// helper definitions

function stringTrim() {
	return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
String.prototype.trim = stringTrim;


function clearErrorElem(elem) {
	while (elem.firstChild) {
		elem.removeChild(elem.firstChild);
	}
}

function setErrorElem(elem, msg_key) {
	var errorMessageNode = document.createTextNode(errors[msg_key]);
	elem.appendChild(errorMessageNode);
}

// regular expressions

var emailRegExp = new RegExp(/^\w[\w.&=+-]*@([\w-]+\.)+[a-z]{2,4}$/i);
var nameRegExp = new RegExp(/^[a-z. \u0080-\u00ff-]+$/i);
var nickRegExp = new RegExp(/^[\w. \u0080-\u00ff-]+$/i);
var postalRegExp = new RegExp(/^[1-9]\d{3}\s?[a-z]{2}$/i);


function validateEmail(email, errorElem) {
	clearErrorElem(errorElem);
	if (email) {
		email = email.trim();
		if (email.length == 0) {
			setErrorElem(errorElem, 'no_email');
		} else if (!emailRegExp.test(email)) {
			setErrorElem(errorElem, 'illegal_email');
		} else {
			return true;
		}
	} else {
		setErrorElem(errorElem, 'no_email');
	}
	// error occurred
	return false;
}

function validateNick(nick, errorElem) {
	clearErrorElem(errorElem);
	if (nick) {
		nick = nick.trim();
		if (nick.length < 4) {
			setErrorElem(errorElem, 'username_tooshort');
		} else if (nick.length > 20) {
			setErrorElem(errorElem, 'username_toolong');
		} else if (!nickRegExp.test(nick)) {
			setErrorElem(errorElem, 'illegal_username');
		} else {
			return true;
		}
	} else {
		setErrorElem(errorElem, 'no_username');
	}
	return false;
}

function validateFirstName(firstname, errorElem) {
	clearErrorElem(errorElem);
	if (firstname) {
		firstname = firstname.trim();
		if (!nameRegExp.test(firstname)) {
			setErrorElem(errorElem, 'illegal_firstname');
			return false;
		}
	}
	return true;
}

function validateLastName(lastname, errorElem) {
	clearErrorElem(errorElem);
	if (lastname) {
		lastname = lastname.trim();
		if (lastname.length == 0) {
			setErrorElem(errorElem, 'no_lastname');
		} else if (!nameRegExp.test(lastname.trim())) {
			setErrorElem(errorElem, 'illegal_lastname');
		} else {
			return true;
		}
	} else {
		setErrorElem(errorElem, 'no_lastname');
	}
	return false;
}


function validatePostalCode(pc, errorElem) {
	clearErrorElem(errorElem);
	if (pc) {
		pc = pc.trim();
		if (pc.length == 0) {
			setErrorElem(errorElem, 'no_zipcode');
		} else if (!postalRegExp.test(pc)) {
			setErrorElem(errorElem, 'invalid_zipcode');
		} else {
			return true;
		}
	} else {
		setErrorElem(errorElem, 'no_zipcode');
	}
	// error occurred
	return false;
}

function validateGender() {
	return true;
}

function validateSubscriber(form) {
	var errorElem = document.getElementById("subscriberError");
	clearErrorElem(errorElem);
	if (form.s_subscription_1.checked || form.s_subscription_2.checked || form.s_subscription_3.checked) {
		return true;
	}
	setErrorElem(errorElem, 'subscriber_not_checked');
	return false;
}


function validateInfoOptIn(form) {
	var errorElem = document.getElementById("infoOptInError");
	clearErrorElem(errorElem);
	if (form.s_info_1.checked || form.s_info_2.checked) {
		return true;
	}
	setErrorElem(errorElem, 'info_not_checked');
	return false;
}

function validateAdInfoOptIn(form) {
	var errorElem = document.getElementById("adInfoOptInError");
	clearErrorElem(errorElem);
	if (form.s_adinfo_1.checked || form.s_adinfo_2.checked) {
		return true;
	}
	setErrorElem(errorElem, 'adinfo_not_checked');
	return false;
}

function validateNieuwsbrief(form) {
	var errorElem = document.getElementById("nieuwsbriefError");
	clearErrorElem(errorElem);
	if (form.s_nbrief_1.checked || form.s_nbrief_2.checked) {
		return true;
	}
	setErrorElem(errorElem, 'newsletter_not_checked');
	return false;
}


function validateUserForm(form) {
	var valid = true;
	valid = validateEmail(form.email.value, document.getElementById("emailError")) && valid;
	valid = validateFirstName(form.firstName.value, document.getElementById("firstNameError")) && valid;
	valid = validateLastName(form.surName.value, document.getElementById("lastNameError")) && valid;
	valid = validatePostalCode(form.postNumber.value, document.getElementById("postalError")) && valid;
	valid = validateGender() && valid;
	valid = validateSubscriber(form) && valid;
	valid = validateInfoOptIn(form) && valid;
	valid = validateAdInfoOptIn(form) && valid;
	valid = validateNieuwsbrief(form) && valid;
	return valid;
}

// FORM VALIDATION


// New Password

function validateNewPasswordForm(form) {
	return validateEmail(form.userName.value, document.getElementById("emailError"));
}


// Change Password

function validateChangePasswordForm(form) {

	// check old password
	var errorElem = document.getElementById("oldPasswordError");
	clearErrorElem(errorElem);
	if (form.oldPassword.value == null || form.oldPassword.value.length == 0) {
		setErrorElem(errorElem, 'no_old_password');
		return false
	}

	// check for valid new password and confirmation of new password
	errorElem = document.getElementById("passwordError");
	clearErrorElem(errorElem);
	if (form.password.value == null || form.password.value.length == 0) {
		setErrorElem(errorElem, 'no_new_password');
	} else if (form.password.value.length < 4) {
		setErrorElem(errorElem, 'new_password_tooshort');
	} else if (form.password.value.length > 16) {
		setErrorElem(errorElem, 'new_password_toolong');
	} else {
		// new password valid, check for confirmation of password
		errorElem = document.getElementById("confirmPasswordError");
		clearErrorElem(errorElem);
		if (form.confirmPassword.value == null || form.confirmPassword.value.length == 0) {
			setErrorElem(errorElem, 'no_confirm_password');
		} else if (form.password.value !== form.confirmPassword.value) {
			setErrorElem(errorElem, 'password_mismatch');
		} else {
			return true;
		}
	}
	// error occurred
	return false;
}

// Signup

function validateSignupForm(form) {
	var valid = validateUserForm(form);
	valid = validateNick(form.s_username.value, document.getElementById("nickError")) && valid;
	return valid;
}


// Signup Check

function validateSignupCheckForm(form) {

	// clear old error, if any
	var errorElem = document.getElementById("termsOfUseError");
	clearErrorElem(errorElem);

	// check the checkbox
	if (form.termsOfUse.checked) {
		return true;
	}

	// error occurred
	setErrorElem(errorElem, 'terms_of_use');
	return false;
}

function validateUpdateForm(form) {
	var valid = validateUserForm(form);
	return valid;
}