$.fn.formValidate = function(settings)
{
	settings = jQuery.extend({

		ajax_checkform: null,
		min_length_passwd: 5,
		min_length_username: 4,
		max_length_up: 32

		}, settings);

	return $(this).each(function () {

		var o = $(this);

		if (o.hasClass('novalidate')) return;

		o.bind('submit', function()
			{
//					var f = $(this);
				var f = o;
				var error = '';

				if (o.submit_oke) { return; }

				function submit_form (submt)
				{
					var err_el = $('.err', o);
		
					if (err_el.length)
					{
						if (error == '')
						{
							err_el.hide(150).text('');
//alert('oke');
//return false;
							o.submit_oke = true;
							if (submt)
							{
								o.submit();
							}
							return;
						}
						else
						{
							err_el.text(error).show(300);
							setTimeout( function()
								{
									err_el.hide(150);
								}, 3000);
						}
					}
					else
					{
						if (error == '')
						{
//alert('oke'); return false;
							o.submit_oke = true;
							if (submt) o.submit();
							return;
						}
						else
							alert(error);
					}
				
					return false;
				}

				function set_error (el, err)
				{
					if (err.length)
					{
						if (error == '') error = err[0];

						el.addClass('error');
						if (el.attr('id'))
						{
							$('label[for='+el.attr('id')+']', o).addClass('error');
						}
					}
					else
					{
						el.removeClass('error');
						if (el.attr('id'))
							$('label[for='+el.attr('id')+']', o).removeClass('error');
					}
				}

				$(':input', f).each(function()
					{
						var err = [];
						var inp = $(this);

						var vv = (inp.attr('type') == 'checkbox' && !inp.attr('checked')) ? '' : inp.val();

						if ($.isArray(vv)) vv = vv.join(', ');
						
						var v = $.trim(vv);

						if (inp.hasClass('required'))
						{
							if (inp.hasClass('rules') && v == '')
							{
								err.push('Вы не согласились с нашими правилами!');
							}
							else if (inp.hasClass('conditions') && v == '')
							{
								err.push('Вы не согласились с нашими условиями!');
							}
							else if (v == '')
							{
								err.push('Не заполнены обязательные поля!');
							}
						}
						
						if ( ! (err.length || v == ''))
						{
							if (inp.hasClass('email'))
							{
								if ( ! /^[\w_\-]+(\.[\w_\-]+)*@([\w_\-]+\.)+[a-zA-Z]{2,6}$/.test(v))
								{
									err.push('Неправильно указан e-mail адрес!');
								}
							}
							else if (inp.hasClass('passwd'))
							{
								var repasswd = $( '#' + inp.attr('id') + '_confirm' );
					
								if (repasswd && vv != repasswd.val())
								{
									err.push('Пароль не совпадает с повтором!');
								}
								else if (vv.length < settings.min_length_passwd)
								{
									err.push('Слишком короткий пароль!');
								}
								else if (vv.length > settings.max_length_up)
								{
									err.push('Пароль не должен превышать '+settings.max_length_up+'символов!');
								}
								
							}
							else if (inp.hasClass('username'))
							{
								if (/[\|\x7d'"!<\x7b>]/.test(v))
								{
									err.push('Логин содержит неразрешенные символы!');
								}
								else if (vv.length < settings.min_length_username)
								{
									err.push('Слишком короткий логин!');
								}
								else if (vv.length > settings.max_length_up)
								{
									err.push('Логин не должен превышать '+settings.max_length_up+'символов!');
								}
							}
						}

						set_error(inp, err);
					});

				if (error == '' && settings.ajax_checkform)
				{
					var buttn = $('input.submit', f)
						.addClass('disabled')
						.attr('disabled', 'disabled');
					var loadg = $('.loading', f).show();

					var fn_compl = function(res)
						{
							var data = null;
							try {
								eval('data = ' + res)
								}
							catch(e) {}

							if ( ! (data && data.response))
							{
								data = {response:"Ошибка!"};
							}
							buttn
								.removeClass('disabled')
								.attr('disabled', false)
							loadg.hide()
							error = data.response == 'oke' ? '' : data.response;
							submit_form(true);
						};

					jQuery.ajax({
//									timeout: 5000,
							type: "POST",
							url: settings.ajax_checkform,
							cache: false,
							data: f.serialize()+'&f='+f.attr('id'),
							success: fn_compl,
							error: function()
								{
									fn_compl('');
								}
						});

					return false;
				}

				return submit_form();
			});

		});
};


$(document).ready(function()
{
	$('form[method=post]').formValidate();

	$('a[rel=external]').each(function(){
		$(this).attr('target', '_blank');
		});
});

