/* Copyright (c) Motoki, 2010 */
/*   motokisensei@gmail.com   */
/*  Developed for FarGate.RU  */

$(document).ready(function() {

	$('form div.validator').each(function() {
	
		var form = this;
		while(form && form.tagName.toLowerCase() != 'form') form = form.parentNode;
		if (!form) return;
		var type = this.getAttribute('type');
		var field = form[this.getAttribute('field')];
			
		var validator = null;
		switch (type)
		{
			case 'required': validator = new RequiredFieldValidator(field, this); break;
			case 'length': validator = new FieldLengthValidator(field, this); break;
			case 'format': validator = new FieldFormatValidator(field, this); break;
			default: validator = new GenericValidator(field, this);
		}
			
		if (!validator) return;
		validator.markup = this;
		if (typeof(form.validators) == 'undefined') form.validators = [];
		form.validators.push(validator);
		if (typeof(form.processed) != 'undefined') return;
		
		form.processed = true;
		$(form).submit(function() {
			if (typeof(this.validators) == 'undefined') return true;
			var result = true;
			for (var index = 0; index < this.validators.length; index++)
			{
				var validator = this.validators[index];
				var isValid = validator.isValid();
				if (!isValid) $(validator.markup).addClass('invalid');
					else $(validator.markup).removeClass('invalid');
				result = result && isValid;
			}
			stretcher.refresh();
			return result;
		});
		
	});

});

/* *********************************************************** */

function GenericValidator(field, element)
{
	this.field = field;

	this.isValid = function()
	{
		return true;
	}
}

function RequiredFieldValidator(field, element)
{
	this.field = field;

	this.isValid = function()
	{
		return this.field.value != null && trimString(this.field.value) != "";
	}
}

function FieldLengthValidator(field, element)
{
	this.field = field;
	this.maxLength = parseInt(element.getAttribute('maxlength'));

	this.isValid = function()
	{
		return this.field.value.length <= this.maxLength;
	}
}

function FieldFormatValidator(field, element)
{
	this.field = field;
	this.pattern = element.getAttribute('pattern');

	this.isValid = function()
	{
		if (this.field.value != null && trimString(this.field.value) != "")
		{
			return false;
		}
		return true;
	}
}
