var MyFormValidator = Class.create({
	form: null,
	visitedElements: $A(),
	initialize: function(form) {
		this.form = $(form);
		document.observe('dom:loaded', function()  {
			this.form.getElements().each(function(item){
				item.observe('blur', function(event){
					var elems = $A(this.form.select('[name='+item.name+']'));
					for (var index = 0; index < elems.length; ++index) {
					  this.visitedElements.push(elems[index]);
					}
					new Ajax.Request(this.form.action, {
						parameters: Form.serializeElements(this.visitedElements), 
						//parameters: form.serialize(),
						onSuccess: function(response) {
							var errors = $H(response.responseJSON);
							if ( errors.get(item.name) == undefined ) {
								var errCont = item.next('ul.errors');
								if ( errCont != undefined ) errCont.update('');
							}
							this.displayErrors(errors);
						}.bind(this)
					}); 
				}.bind(this));
			}.bind(this));
		}.bind(this));
	},
	displayErrors: function (errors) {
		errors.each(function(pair){
			var t;
			var element = this.form.down('[name='+pair.key+']');
			while ( t = element.next('[name='+pair.key+']') ) 
				element = t;
			var errorsContainer = element.next('ul.errors');
			if ( undefined == errorsContainer ) {
				errorsContainer = new Element('ul', {'class': 'errors'});
				element.insert({ after: errorsContainer	});
			} 
			errorsContainer.update('');

			if ( Object.isArray(pair.value) ) {
				$A(pair.value).each(function(val){
					var li = new Element('li');
					li.update(val);
					errorsContainer.insert({bottom: li});
				});
			}
			else {
				$H(pair.value).each(function(pair2){
					var li = new Element('li', {className: 'error_' + pair2.key});
					li.update(pair2.value);
					errorsContainer.insert({bottom: li});
				});
			}  
		}.bind(this));
	}
});
