function FormValidator(f) {
	this.form = f;
	this.errors = [];
	
	this.errorMessage = 'De volgende velden zijn niet ingevuld of onjuist: \t\n';
	
	this.alphabet = 'abcdefghijklmnopqrstuvwxyz'
	this.numberString = '0123456789';
	this.alphaString = 'abcdefghijklmnopqrstuvwxyz \'-';
	this.alphaNummericString = this.alphaString + this.numberString;
}

FormValidator.prototype.isEmpty = FormValidator_isEmpty;
FormValidator.prototype.checkChars = FormValidator_checkChars;
FormValidator.prototype.isAlpha = FormValidator_isAlpha;
FormValidator.prototype.isAlphaNummeric = FormValidator_isAlphaNummeric;
FormValidator.prototype.isNumbers = FormValidator_isNumbers;
FormValidator.prototype.isNumber = FormValidator_isNumber;
FormValidator.prototype.isChecked = FormValidator_isChecked;
FormValidator.prototype.isSelected = FormValidator_isSelected;
FormValidator.prototype.isEmail = FormValidator_isEmail;
FormValidator.prototype.isDutchPostalCode = FormValidator_isDutchPostalCode;
FormValidator.prototype.isAmount = FormValidator_isAmount;
FormValidator.prototype.isDateTime = FormValidator_isDateTime;
FormValidator.prototype.isLength = FormValidator_isLength;
FormValidator.prototype.addError = FormValidator_addError;
FormValidator.prototype.validate = FormValidator_validate;

function FormValidator_isEmpty(name) {
	// check if element has a value
	var result = false;
	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;
}

function FormValidator_checkChars(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;
}

function FormValidator_isAlpha(name) {
	// checks for letters
	var str = this.form.elements[name].value.toLowerCase();
	return this.checkChars(str, this.alphaString);
}


function FormValidator_isAlphaNummeric(name) {
	// checks for letters and numbers
	var str = this.form.elements[name].value.toLowerCase();
	return this.checkChars(str, this.alphaNummericString);
}

function FormValidator_isNumbers(name) {
	// checks for numbers
	var str = this.form.elements[name].value.toLowerCase();
	return this.checkChars(str, this.numberString);
}

function FormValidator_isNumber(name) {
	return this.isNumbers(name);
}

function FormValidator_isChecked(name) {
	// checks if a radiobutton or checkbox is checked
	var result = false;
	var element = this.form.elements[name];
	if (element.length == 1) {
		if (element.checked) result = true;
	} else {
		for (var i=0; i<element.length; i++) {
			if (element[i].checked) result = true;
		}
	}
	return result;
}

function FormValidator_isSelected(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;
}

function FormValidator_isEmail(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 (this.alphabet.indexOf(name.charAt(0)) == -1) result = false;
			if (this.alphabet.indexOf(domain.charAt(0)) == -1) result = false;
			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;
}

function FormValidator_isDutchPostalCode(name) {
	// checks if a string is a valid dutch postal code
	var result = true;
	var str = this.form.elements[name].value;
	var numbers, letters;
	if (!((str.length == 6) || (str.length == 7))) {
		result = false;
	} else {
		var numbers, letters;
		numbers = str.substring(0,4);
		(str.length == 6) ? letters = str.substring(4,6) : letters = str.substring(5,7);
		if (!this.checkChars(numbers, this.numberString)) result = false;
		if (!this.checkChars(letters, this.alphabet)) result = false;
	}
	return result;
}

function FormValidator_isAmount(name, minValue, maxValue) {
	// checks if an amount is valid and within an optional range
	var result = true;
	var str = this.form.elements[name].value;
	if (str != '') {
		if ((str.indexOf('.') != -1) && (str.indexOf(',') != -1)) {
			do {
				str = str.replace('.', '');
			} while (str.indexOf('.') != -1)
		}
		if (str.indexOf(',') != -1) str = str.replace(',', '.');
		if (str.indexOf('.') != -1) {
			if ((str.substring(str.lastIndexOf('.') + 1, str.length).length) != 2) result = false;
		}
		var amount = parseFloat(str, 10);
		var amountStr = '' + amount;
		if (amountStr.indexOf('.') == -1) amountStr += '.';
		amountStr += '0000000000000000000000000000';
		amountStr = amountStr.substring(0, str.length);
		if (amountStr != str) {
			result = false;
		} else {
			if (minValue) {
				if (amount < minValue) result = false;
			}
			if (maxValue) {
				if (amount > maxValue) result = false;
			}
		}
	}
	return result;
}

function FormValidator_isDateTime(name) {
	// checks if an amount is valid and within an optional range
	var result = true;
	var str = this.form.elements[name].value;
	var pattern = /^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}/;
	if (str.search(pattern) == -1) result = false;
	return result;
}


function FormValidator_isLength(name, n) {
	// checks if a value has a specified length
	return (this.form.elements[name].value.length == n);
}

function FormValidator_addError(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;
}

function FormValidator_validate() {
	if (this.errors.length == 0) {
		return true;
	} else {
		for (var i=0; i<this.errors.length; i++) {
			this.errorMessage += '\t- ' + this.errors[i] + '\t\n';
		}
		this.errorMessage += '\n';
		alert(this.errorMessage);
		return false;
	}
}


