////////////////////////////////////////////////////////////////////////////////
// DEFINICION DE CAMPOS:
// <input textname="field_name" validate="v_type" class="CSS" errorclass="CSS">

////////////////////////////////////////////////////////////////////////////////
// V_TYPE: tipos de validacion
	var V_NONE		= 0;
	var V_NULL		= 1;
	var V_NUM		= 2;
	var V_MAIL		= 4;
	var V_SIZE		= 8;
	var V_CHAR		= 16;
	var V_MAX_VALUE	= 32;
	var V_MIN_VALUE	= 64;
	var V_MAX_SIZE	= 128;
	var V_MIN_SIZE	= 256;
	var V_MIRROR	= 512;

////////////////////////////////////////////////////////////////////////////////
// v_validateField: hace la validacion devolviendo que validaciones fallaron.
	function v_validateField(field,v_type) {
		var ret = V_NONE;
		if ((v_type & V_NULL) == V_NULL) if (field.value == "")  ret = ret | V_NULL; 
		if ((v_type & V_NUM ) == V_NUM ) if (isNaN(field.value)) ret = ret | V_NUM; 
		if ((v_type & V_SIZE) == V_SIZE) {
			if ((field.value.length != parseInt(field.fsize))&&(field.value.length != 0)) ret = ret | V_SIZE; 
		}
		if ((v_type & V_MAX_SIZE) == V_MAX_SIZE) {
			if ((field.value.length > parseInt(field.fmaxsize))&&(field.value.length != 0)) ret = ret | V_MAX_SIZE; 
		}
		if ((v_type & V_MIN_SIZE) == V_MIN_SIZE) {
			if ((field.value.length < parseInt(field.fminsize))&&(field.value.length != 0)) ret = ret | V_MIN_SIZE; 
		}
		if ((v_type & V_MAX_VALUE) == V_MAX_VALUE) {
			if (field.value > parseInt(field.fmaxvalue)) ret = ret | V_MAX_VALUE; 
		}
		if ((v_type & V_MIN_VALUE) == V_MIN_VALUE) {
			if ((field.value < parseInt(field.fminvalue))&&(field.value != "")) ret = ret | V_MIN_VALUE; 
		}
		if ((v_type & V_MAIL) == V_MAIL) { 
			var at_pos = field.value.indexOf("@");
			var dot_pos = field.value.lastIndexOf(".");
			var len = field.value.length;
			if	((at_pos < 1)||(dot_pos < at_pos+2)||(dot_pos+1 == len)) ret = ret | V_MAIL;	
		}
		if ((v_type & V_MIRROR) == V_MIRROR) {
			if ((!field.form.elements[field.fmirror])||(field.value != field.form.elements[field.fmirror].value)) ret = ret | V_MIRROR; 
		}
		if ((v_type & V_CHAR ) == V_CHAR ) if (!isNaN(field.value)) ret = ret | V_CHAR; 
		return ret;
	}
////////////////////////////////////////////////////////////////////////////////
// v_buildMessage: genera un mansaje de error en base al resultado de 
//				   validateField.
	function v_buildMessage(field,field_name,error) {
		var msg = "";
		if ((error & V_NULL		) == V_NULL		) msg += "The text field "+field_name+" can't be empty.\n";
		if ((error & V_NUM		) == V_NUM		) msg += "The text field "+field_name+" must be a number.\n";
		if ((error & V_MAIL		) == V_MAIL		) msg += "The text field "+field_name+" must contain a valid e-mail.\n";
		if ((error & V_SIZE		) == V_SIZE		) msg += "The text field "+field_name+" must have "+field.fsize+" character(s) exactly.\n";
		if ((error & V_MAX_VALUE) == V_MAX_VALUE) msg += "The text field "+field_name+" can't be more than "+field.fmaxvalue+".\n";
		if ((error & V_MIN_VALUE) == V_MIN_VALUE) msg += "The text field "+field_name+" can't be less than "+field.fminvalue+".\n";
		if ((error & V_CHAR		) == V_CHAR		) msg += "The text field "+field_name+" can't be a number.\n";
		if ((error & V_MAX_SIZE	) == V_MAX_SIZE	) msg += "The text field "+field_name+" can't have more than "+field.fmaxsize+" character(s).\n";
		if ((error & V_MIN_SIZE	) == V_MIN_SIZE	) msg += "The text field "+field_name+" can't have less than "+field.fminsize+" character(s).\n";
		if ((error & V_MIRROR	) == V_MIRROR	) 
		{
			if (!field.form.elements[field.fmirror])
			{	
				msg += "This text field does not exist: "+field.fmirror+".\n";
			}
			else
			{
				msg += "This text field: "+field_name+" must be as "+field.form.elements[field.fmirror].textname+".\n";
			}
		}
		return msg;
	}
////////////////////////////////////////////////////////////////////////////////
// v_swapClass: cambia la clase CSS.
	function v_swapClass(item,error) {
		if (error) {
			if (item.errorclass)
				item.className = item.errorclass;
		} else {
			if (item.okclass)
				item.className = item.okclass;
		}
	}
	
////////////////////////////////////////////////////////////////////////////////
// doFormValidate: valida un formulario completo devuelve TRUE o FALSE.
	function doFormValidate(form) {
		var msg = "";
		var v_type;
		var error;
		var item;
		var first_error;

		for (var i = 0 ; i < form.elements.length ; i++) {
			item = form.elements[i]; 

			// setup!!!!
			if (!item.okclass)
				item.okclass = item.className; 

			// validar
			if ((item.validate)&&((error = v_validateField(item,eval(item.validate))) != V_NONE)) {
				v_swapClass(item,true);

				if (msg == "") first_error = item;
				msg += v_buildMessage(item,item.textname,error);
			} else { 
				v_swapClass(item,false);
			}
		}
		
		if (msg != "") {
			alert('Please, complete the form correctly:\n\n' + msg);
			first_error.focus();
			return false;
		} else
			return true;
	}
