(function($) {
	
// Функции доступные для вызова пользователем

	$.fn.add_rule = function(obj){
		var element_list = this[0].element_list || new Object;
		for(index in obj){
			if($("#"+index,this).length==0){continue;}
			element_list[index]=obj[index];
			$("#"+index,this)[0].owner_form = this[0];
			$("#"+index,this)[0].owner_line = get_container($("#"+index,this)[0],"#"+index);
			$("#"+index,this).bind("blur",test_element);
		}
		this[0].element_list = element_list;
	}
	
	$.fn.add_single_rule = function(index,obj){
		var element_list = this[0].element_list || new Object;
		if($("#"+index,this).length==0){return;}
		element_list[index]=obj;
		$("#"+index,this)[0].owner_form = this[0];
		$("#"+index,this)[0].owner_line = get_container($("#"+index,this)[0],"#"+index);
		$("#"+index,this).bind("blur",test_element);
		this[0].element_list = element_list;
	}
	
	$.fn.restore_rules = function(){
		var form = get_owner_form(this[0]);
		var rule = new Object();
		var id = this.attr("id");
		rule[id] = form.element_list[id];
		$(form).add_rule(rule);
	}
	
	$.fn.test_form = function(){
		//Если есть ошибки
		if($(".validation_err",this).length>0){
			this.block_submitB();
			return false;
		}
		
		//Есть ли есть незаполненные обязательные поля
		i = $(".required",this).length;
		while(i--){
			if($(".required",this)[i].className.indexOf("required_ack")==-1){
				this.block_submitB();
				return false;
			}
		}
				
		//Если форма пуста и все элементы необязательны, но надо что бы хоть что то было заполнено
		if(this.if_any()==false){
			this.block_submitB();
			return false;
		}
		
		//Позволяем отправку
		this.unblock_submitB();
		return true;
	}
	
	$.fn.show_error_for = function(obj,text){
		show_error(obj,text);
	}
	
	function show_error(obj,text){
		var container = get_container(obj);
		container.toggleClass("required_nak",true);
		container.toggleClass("required_ack",false);

		if(text!=$(".validation_err",container).text()){
			if($(".validation_err",container).length==0){
				container.append("<div class='validation_err'>"+text+"</div>");
				$(".validation_err",container).slideDown();
			}else{
				$(".validation_err",container).text(text);
			}
		}
		$(obj.owner_form).test_form();
		$("section.abstract").css("height",parseInt($("form.orderForm fieldset").height()-24,10)+"px");
	}

	function clear_error(obj){
		var container = get_container(obj);
		container.toggleClass("required_nak",false);
		if($(obj).val().length>0){
			container.toggleClass("required_ack",true);
		}else{
			container.toggleClass("required_ack",false);
		}
		
		$(".validation_err",container).remove();
		$(obj.owner_form).test_form();
		$("section.abstract").css("height",parseInt($("form.orderForm fieldset").height()-24,10)+"px");
	}

	$.fn.set_submitB = function(selector,callback){
		var submitB = $(selector,this)[0];
		this[0].submitB = submitB;
		if(callback!=undefined){
			this[0].submitB.callback = callback;
		}
		this[0].submitB.owner_form = this[0];
		$(this[0].submitB).bind("click",accept);
		$(this).bind("submitB",accept);
	}
	
	$.fn.if_any = function(){
		var input_list = $(":input:not(input[type=submitB],input[type=image],input[type=button],input[type=hidden])",$(this));
		for(i=0;i<input_list.length;i++){
			if($(input_list[i]).val()!=""){
				return true;
			}
		}
		return false;
	}

	$.fn.clear_form = function(){
		this[0].reset();
		$(".required_ack",this).removeClass("required_ack");
		$(".required_nak",this).removeClass("required_nak");
	}
	
	$.fn.block_form = function(){
		$("input:not(input[type='image'],input[type='submitB']),select,textarea",$(this[0])).attr("disabled","disabled");
		$(this[0]).stop();
		//$(this[0]).fadeTo("normal", 0.33);
		$(this[0]).block_submitB();
	}

	$.fn.unblock_form = function(){
		$("input:not(input[type='image'],input[type='submitB']),select,textarea",$(this[0])).removeAttr("disabled");
		$(this[0]).stop();
		//$(this[0]).fadeTo("normal", 1);
		$(this[0]).unblock_submitB();
	}
	
	$.fn.block_submitB = function(){
		submitB = this[0].submitB;
		if(submitB==undefined){return;}
		$(submitB).stop();
		//$(submitB).fadeTo("fast", 0.33);
		//$(submitB).css("cursor","default");
		$(submitB).toggleClass('unaccepted',true);	
	}
	
	$.fn.unblock_submitB = function(){
		submitB = this[0].submitB;
		if(submitB==undefined){return;}
		$(submitB).stop();
		//$(submitB).fadeTo("fast",1);
		//$(submitB).css("cursor","pointer");
		$(submitB).toggleClass('unaccepted',false);
	}

// Обслуживающие функции
	function get_owner_form(obj){
		var form = obj.parentNode;
		var i=10;
		while((form.tagName!="FORM")&&(i>0)){
			form = form.parentNode;
			i--;
		}
		if(i==0){return false;}
		return form;
	}
	
	function accept(event){
		
		if(event!=undefined){
			this.blur();
			if(($(this).hasClass('unaccepted'))||(this.callback!=undefined)){
				$("input,select,textarea",this.owner_form).trigger("blur");
				event.preventDefault();
			}
		}
		if((!$(this).hasClass('unaccepted'))&&(this.callback!=undefined)){
			this.callback();
		}
	}
	
	function get_container(selector){
		var container = $(selector).parent();
		var i=5;
		while((!container.hasClass("line"))&&(i>0)){
			container = container.parent();
			i--;
		}
		if(!container.hasClass("line")){
			return $(selector).parent();	
		}
		return container;
	}
	
	function test_element(){
		var element_list = this.owner_form.element_list;
		var err = null;
		var index = $(this).attr("id");
		//обрезаем пробелы в начале и конце значения
		$("#"+index).val($("#"+index).val().replace(/(^[\s]+)|([\s]+$)/ig,""));
		for(test in element_list[index]){
			switch(test){
				case "required":
					  err = test_required(index);
					break;
				case "length":
					if(element_list[index]["length"].max!=undefined){
						err = test_max(index,element_list[index]["length"].max);
					}
					if((element_list[index]["length"].min!=undefined)&&(err==null)){
						err = test_min(index,element_list[index]["length"].min);
					}
					break;
				case "email":
						err = test_email(index);
					break;
				case "cyrillic":
						err = test_cyrillic(index);
					break;
				case "number":
						err = test_number(index);
					break;
				case "url":
						err = test_url(index);
					break;
				case "checkCoupon":
						err = test_checkCoupon(index);
					break;
				case "custom":
						err = test_custom(index,element_list[index]["custom"].regexp,element_list[index]["custom"].flags);
					break;
			}
			if(err!=null){
				show_error(this,err);
				return false;
			}
		}
		clear_error(this);
		return true;
	}

	function test_custom(index,regexp,flags){
		var reg = new RegExp(regexp,flags);
		if(!reg.test($("#"+index).val())){
			return "Введенное значение не соответствует установленному формату.";
		}
		return null;
	}
	
	function test_required(index){			
		validRegExp0 = /^[\s\r\n]*$/ig;
		if(validRegExp0.test($("#"+index).val())){
			return "Вы не заполнили обязательное поле.";
		}
		return null;
	}	

	function test_min(index,min){
		if(
			($("#"+index).val().length>0)&&
			($("#"+index).val().length<min)
		){
			return "Минимальная длина: "+min;
		}
		return null;
	}

	function test_max(index,max){
		if(
			($("#"+index).val().length>0)&&
			($("#"+index).val().length>max)
		){
			return "Максимальная длина: "+max;
		}
		return null;
	}

	function test_email(index){
		//validRegExp0 = /^[a-zA-Z]+[a-zA-Z0-9\.\-+]*@[a-zA-Z0-9]+[a-zA-Z0-9\.\-]*[.][A-Za-z]{2,6}$/i;
		validRegExp0 = /^[^@]+@[^@]{2,}[.][A-Za-z]{2,6}$/i;
		if ($("#"+index).val().length>0){
			if (!validRegExp0.test($("#"+index).val())){
				return "Вы не правильно заполнили поле содержащее адрес электронной почты.";
			}
		}
		return null;
	}

	function test_cyrillic(index){
		validRegExp0 = /^[а-яА-ЯіїєІЇЄёэъЁЭЪ\s]*$/i;
		if ($("#"+index).val().length>0){
			if (!validRegExp0.test($("#"+index).val())){
				return "Поле может содержать только кирилицу.";
			}
		}
		return null;
	}
	
	function test_url(index){
		validRegExp0 = /^http:\/\/[a-zA-Z0-9]+[a-zA-Z0-9\.\-_+]*.[A-Za-z]{2,6}[\\\/a-zA-Z\.?&-_%0-9+]*$/i;
		if ($("#"+index).val().length>0){
			if (!validRegExp0.test($("#"+index).val())){
				return "Поле должно содержать URL.";
			}
		}
		return null;
	}

	function test_number(index){
		if ($("#"+index).val().length>0){
			if (isNaN($("#"+index).val()) == true){
				return "Поле может содержать только цифры.";
			}
		}
		return null;
	}
	/*
	function test_checkCoupon(index){
		if ($("#"+index).val().length>0){
			if (isNaN($("#"+index).val()) == true){
				return "Поле может содержать только цифры.";
			}
			
			$.ajax({
				type: 'POST',
				url: '/checkcoupon.php',
				dataType:'html',
				data: {
					coupon: $("#coupon").val()
				},
				success: function(res) {
					if (res.length > 0) {
						$("#coupon").after('<div class="validation_err">'+res+'</div>');
						return "err";
					}
				}
			});
			
		}
		
		return null;
	}*/

})(jQuery);
