jQuery.fn.validate=function(options)
{
	var result=true;
	var valrules=new validate_rules;

	if (!options.messages)
	{
		options.messages=new Array();
	}

	if (!options.error)
	{
		options.messages=function(){};
	}

	this.each(function()
	{
		var size=this.elements.length;
		for (var i=0; i<size; ++i)
		{
			if (this.elements[i].name)
			{
				var field_rules=false;
				if (jQuery(options.rules).size()*1==1 && options.rules['all'])
				{
					field_rules=field_rules=options.rules['all'];
				}
				else
				{
					field_rules=field_rules=options.rules[this.elements[i].name];
				}
				
				if (field_rules)
				{
					if (field_rules.indexOf("exists")==-1 && valrules.exists(this.elements[i].value)==false){}
					else
					{
						rules_methods=field_rules.split("|");
						var rules_methods_size=rules_methods.length;

						for (var j=0; j<rules_methods_size; ++j)
						{
							// Проверка, есть ли у правила аргументы
							regexp=/^(.*?)\[(.*?)\]$/;
							if ((matches=regexp.exec(rules_methods[j]))!=null)
							{
								rule=matches[1];
								arg=matches[2];

								if(valrules[rule](this.elements[i].value, arg)==false)
								{
									options.error(this.elements[i], options.messages[this.elements[i].name]);
									result=false;
									break;
								}
							}
							else
							{
								if(valrules[rules_methods[j]](this.elements[i].value)==false)
								{
									options.error(this.elements[i], options.messages[this.elements[i].name]);
									result=false;
									break;
								}
							}
						}
					}
				}
			}
		}
	});

	return result;
};

function validate_rules(){};

validate_rules.prototype=
{
	exists: function(value)
	{
		return new Boolean(value.length);
	},

	max_length: function(value, length)
	{
		return new Boolean(length-value.length+1);
	},

	min_length: function(value, length)
	{
		return new Boolean(value.length-length+1);
	},

	length: function(value, length)
	{
		return new Boolean((value.length==length));
	},

	alpha_dash: function(value)
	{
		regexp=/^([-a-zа-я0-9_-])+$/i;
		return new Boolean(regexp.test(value));
	},

	alpha_numeric: function(value)
	{
		regexp=/^([a-zа-я0-9_])+$/i;
		return new Boolean(regexp.test(value));
	},
	
	icq: function(value)
	{
		regexp=/^[0-9]+$/;
		return new Boolean(regexp.test(value));
	},

	email: function(value)
	{
		regexp=/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/i;
		return new Boolean(regexp.test(value));
	},

	phone: function(value)
	{
		regexp=/^([\+0-9\(\)\s])+$/i;
		return new Boolean(regexp.test(value));
	},

	min_value: function(value, min_value)
	{
		if ( value*1>min_value*1 )
		{
			return true;
		}

		return false;
	},

	max_value: function(value, max_value)
	{
		if ( value*1<max_value*1 )
		{
			return true;
		}

		return false;
	},

	integer: function(value)
	{
		regexp=/^[0-9]+$/i;

		return new Boolean(regexp.test(value));
	},

	numeric: function(value)
	{
		regexp=/^[0-9]+\.{0,1}[0-9]*$/i;

		return new Boolean(regexp.test(value));
	},
	
	www: function(value)
	{
		regexp=/^([\.a-z0-9_-])+$/i;

		return new Boolean(regexp.test(value));
	}
}
