var formValidator = Class.create();
formValidator.prototype = {
	initialize: function(options) {
		$H(options.fields).each(function(i){
			if (i.value($(i.key))) {
				$(i.key).removeClassName('invalid');
				if ($$(".invalid").size() == 0) {
					$('submit').removeClassName('buttonDisabled');
				}
			} else {
				$('submit').addClassName('buttonDisabled');
				$(i.key).addClassName('invalid');
			}
			this.validate.bind({i: i}) ? null : $('submit').addClassName('buttonDisabled');
			
			Event.observe($(i.key), 'focus', function(){this.validate()}.bind({i: i, path: options.path, validate: this.validate}));
			Event.observe($(i.key), 'blur', function(){this.validate()}.bind({i: i, path: options.path, validate: this.validate}));
			Event.observe($(i.key), 'keyup', function(){this.validate()}.bind({i: i, path: options.path, validate: this.validate}));
			Event.observe($(i.key), 'change', function(){this.validate()}.bind({i: i, path: options.path, validate: this.validate}));
		}.bind(this));
		additionalValid = options.additionalValidation;
		if($('reset')) {
			Event.observe($('reset'), 'click', function() {
				$(options.formId).reset();
				$('submit').addClassName('buttonDisabled');
			});
		};
		Event.observe($('submit'), 'click', function() {
			if(!$('submit').hasClassName('buttonDisabled')) {
				if(additionalValid()) {
					$(options.formId).submit();
				}
			}
		});
	},
	
	validate: function(){
		if (this.i.value($(this.i.key))) {
			$(this.i.key).removeClassName('invalid');
			if ($$(".invalid").size() == 0) {
				$('submit').removeClassName('buttonDisabled');
			}
		} else {
			$('submit').addClassName('buttonDisabled');
			$(this.i.key).addClassName('invalid');
		}
	}
};