function FormChecker() {
	this.form = null;
	this.elements = null;
	this.namesToCheck = null;
	
	this.canSubmitCallback = null;
}

FormChecker.prototype = {
	setForm: function(form) {
		var lthis = this;
		var i;
		
		var inputs = form.getElementsByTagName('input');
		var textareas = form.getElementsByTagName('textarea');
		
		for (i = 0; i < inputs.length; i ++) {
			this.registerCallbacks(inputs[i]);
		}
		for (i = 0; i < textareas.length; i ++) {
			this.registerCallbacks(textareas[i]);
		}
		this.checkAll();
		this.checkCanSubmit();	
	},
	
	registerCallbacks: function(input) {
		var lthis = this;
		var name = input.name;
		if (this.namesToCheck[name]) {
			this.elements.push(input);
			this.namesToCheck[name] = input;
		}
		if (this.namesToCheck[name] != null) {
			input.onkeypress = function() {
				var inp = this;
				window.setTimeout(function() { lthis.inputValueChanged(inp);
			}, 1);};
			input.onblur = function() { lthis.inputValueChanged(this); };
		}
	},
	
	isValidEmail: function(email) {
		return /^..*@...*\....*$/.test(email) && ! /.*[, ].*/.test(email);
	},
	
	inputValueChanged: function(input) {
		var v;
		var passInputs = {'i_a_pass': 1, 'i_a_pass_alt': 1, 'i_a_pass2': 1};

		if (passInputs[input.name] == 1) {
			var inp;
			for (var i in passInputs) {
				inp = this.namesToCheck[i];
				if (inp != null && inp != false) {
					v = this.getValidator(inp);
					inp.className = v(inp.value) ? null : 'mandatory';
				}
			}
		} else {
			v = this.getValidator(input);
			input.className = v(input.value) ? null : 'mandatory';
		}
		
		this.checkCanSubmit();
	},
	
	getValidator: function(input) {
		var v = this.validators[input.name];
		if (v != null) {
			return v;
		} else {
			return this.validators[''];
		}
	},
	
	checkAll: function() {
		var v, i, el;
		for (i = 0; i < this.elements.length; i ++) {
			el = this.elements[i];
			v = this.getValidator(el);
			el.className = v(el.value) ? null : 'mandatory';
		}
	},
	
	checkCanSubmitInner: function() {
		var i, v, el;
		var valid = true;
		for (i = 0; i < this.elements.length; i ++) {
			el = this.elements[i];
			v = this.getValidator(el);
			if (! v(el.value)) {
				valid = false;
				break;
			}
		}

		return valid;		
	},
	
	
	checkCanSubmit: function() {
		var valid = this.checkCanSubmitInner();
		this.canSubmitCallback(valid);
		return valid;
	}
}

