function FormValidator(f, lang) {
	this.form = f;
	this.lang = 'nl';
	if (lang) this.lang = lang;
	this.errors = [];
	this.errorElements = [];
	this.listErrors = true;
	
	switch (this.lang) {
		case 'en': this.errorMessage = 'Sorry, some of the required fields are either missing or incorrect:\t'; break;
		default:	this.errorMessage = 'Sorry, enkele verpichte velden zijn niet ingevuld of onjuist: \t';
	}
	
	this.alphabet = 'abcdefghijklmnopqrstuvwxyz'
	this.numberString = '0123456789';
	this.alphaString = 'abcdefghijklmnopqrstuvwxyz \'-';
	this.alphaNummericString = this.alphaString + this.numberString;
}

FormValidator.prototype.isEmpty = function(name) {
	// check if element has a value
	var result = false;
	if (this.form.elements[name]) {
		var element = this.form.elements[name];
		switch (element.type) {
			case 'radio':
				result = this.isChecked(name);
				break;
			case 'checkbox':
				result = this.isChecked(name);
				break;
			case 'select':
				result = this.isSelected(name);
				break;
			default:
				if (element.value == '') result = true;
		}
	}
	return result;
}

FormValidator.prototype.checkChars = function(str, validCharStr) {
	// checks if a string contains of only chars of another string
	var result = true;
	for (var i=0; i<str.length; i++) {
		if (validCharStr.indexOf(str.charAt(i)) == -1) result = false;
	}
	return result;
}

FormValidator.prototype.isChecked = function(name) {
	// checks if a radiobutton or checkbox is checked
	var result = false;
	var element = this.form.elements[name];
	if (element.length == null) {
		if (element.checked) result = true;
	} else {
		for (var i=0; i<element.length; i++) {
			if (element[i].checked) result = true;
		}
	}
	return result;
}

FormValidator.prototype.isSelected = function(name) {
	var result = true;
	var element = this.form.elements[name];
	for (var i=0; i<element.options.length; i++) {
		if (element.options[i].selected) {
			if (element.options[i].value == '') result = false;
		}
	}
	return result;
}

FormValidator.prototype.isEmail = function(name) {
	// checks if a string is a valid e-mail address
	var result = true;
	var str = this.form.elements[name].value;
	if (str != '') {
		if (str.length < 6) result = false;
		var badChars = ', ';
		for (var i=0; i<badChars.length; i++) {
			if (str.indexOf(badChars.charAt(i)) != -1) result = false;
		}
		var splittedStr = str.split('@');
		if (splittedStr.length != 2) {
			result = false;
		} else {
			var name = splittedStr[0].toLowerCase();
			var domain = splittedStr[1].toLowerCase();
			if (domain.lastIndexOf('.') == -1) {
				result = false;
			} else {
				var extensionLength = domain.length - domain.lastIndexOf('.') - 1;
				if ((extensionLength < 2) || (extensionLength > 4)) result = false;
			}
		}
	} else {
		result = false;
	}
	return result;
}

FormValidator.prototype.addError = function(str) {
	// check for duplicates
	var isDuplicate = false;
	for (var i=0; i<this.errors.length; i++) {
		if (this.errors[i].toLowerCase() == str.toLowerCase()) isDuplicate = true;
	}
	if (!isDuplicate) {
		this.errors[this.errors.length] = str;
	}
}

FormValidator.prototype.validate = function() {
	if (this.errors.length == 0) {
		return true;
	} else {
		if (this.listErrors) {
			for (var i=0; i<this.errors.length; i++) {
				this.errorMessage += '';
				this.errorMessage += '\n\t- ' + this.errors[i] + '\t';
			}
			this.errorMessage += '\n';
		}
		alert(this.errorMessage);
		return false;
	}
}

