/**
 * Простая проверялка формы. Смотрит, заполнены ли все required-поля в форме
 * и при необходимости проверяет правильность введенных данных
 * @param {Element, jQuery} form Форма, которую нужно проверять
 */
function FormChecker(form){
	/** Корневой элемент (форма) */
	this.root = jQuery(form);
	/** Кнопка отправки данных */
	this.submit_btn = this.root.find('input:submit');

	/** Поля, которые должны быть заполненными */
	this.required_fields = this.root.find('.required');

	this.attachEvents();
	this.check();
};

FormChecker.prototype = {
	/**
	 * Вешает необходимые события на элементы формы
	 */
	attachEvents: function(){
		var me = this;

		var f = function(){
			return me.check();
		};

		this.root.submit(f);

		this.required_fields.blur(f).keyup(f).change(f);
	},

	/**
	 * Проверяет правильность заполения всей формы
	 * @return {Boolean}
	 */
	check: function(){
		var ok_fields = 0;
		var me = this;
		this.required_fields.each(function(){
			var obj = jQuery(this), fld = obj.find('input, textarea, select');

			var result = false;

			if(obj.is('.check-email')){
				result = me.checkEmail(fld);
			}
            else if(obj.is('.sameas')){
                result=me.checkSame(fld);
            }
			else{
				result = me.checkField(fld);
               
			}

			if(result)
				obj.addClass('required-ok');
			else
				obj.removeClass('required-ok');

			ok_fields += Number(result);
		});

		var is_ok = (ok_fields == this.required_fields.length) ;
		this.submit_btn.attr('disabled', !is_ok);
		return is_ok;
	},

	/**
	 * Проверяет, заполнено ли поле
	 * @param {jQuery} fld Поле, которое нужно проверить
	 * @return {Boolean}
	 */
	checkField: function(fld){
		if(fld.attr('type')=='checkbox'){
			return Boolean(fld.is(':checked'));		
		}
		return Boolean(jQuery.trim( fld.val() ));
	},

	/**
	 * Проверяет, заполнено ли поле и имеет ли оно
	 * правильный формат электронной почты
	 * @param {jQuery} fld Поле, которое нужно проверить
	 * @return {Boolean}
	 */
	checkEmail: function(fld){
		var re = /^\s*[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\s*$/i;
		if(this.checkField(fld)){
			var is_correct = re.test(fld.val());
			if(is_correct)
				fld.removeClass('error');
			else
				fld.addClass('error');

			return is_correct;
		}

		return false;
	},

    checkSame: function(fld){
		if(this.checkField(fld)){
            var obj = jQuery('.same'), fld1 = obj.find('input, textarea');
			var is_correct = (fld.val()==fld1.val());
			if(is_correct)
				fld.removeClass('error');
			else
				fld.addClass('error');

			return is_correct;
		}

		return false;
	}
};


jQuery(function(){
	jQuery('form').each(function(){
		new FormChecker(this);
	})
});

