function _Abs_FormChecker(jQueryFormObj) {

    var debug = false;
    if(debug)console.warn('============================== _Abs_FormChecker =========================================');
    
    var init = function(){
		Abs_FormValidation = new _Abs_FormValidation();
	}

	this.checkForm = function(){
		var formError = false;
		if(debug)console.warn('============================== checkForm =========================================');
		jQueryFormObj.find('.form_field').each(function(){
			var checkFuncsStr = $(this).attr('check');
			var checkFieldId =  $(this).attr('field_id');
			if(debug)console.warn('checkFuncsStr = '+checkFuncsStr);
			if(debug)console.warn('field_id = '+checkFieldId);
			if( checkFuncsStr ){
				// получаем функции для валидации
				var funcs = checkFuncsStr.split(';');
				var errorsArr = [];
				var error = false;
				for(var i=0; i<funcs.length; i++){
					// пробуем получить параметры валидации
					var tryFuncArr = funcs[i].split('[');
					if(tryFuncArr.length > 1){
						var param = tryFuncArr[1].replace(']','');
						var current_check_function = tryFuncArr[0];
						var ff = 'absValidation_'+ tryFuncArr[0];
						//var error = !call_user_func_array(ff,[$(this).val(),param]);
						if(debug)console.warn('ff > 1 func = '+ff);
						var error = !call_user_func_array(ff,[checkFieldId,jQueryFormObj,param]);
					} else {
						var current_check_function = funcs[i];
						var ff = 'absValidation_'+ funcs[i];
						if(debug)console.warn('ff 1 func = '+ff);
						//var error = !call_user_func_array(ff,[$(this).val()]);
						var error = !call_user_func_array(ff,[checkFieldId,jQueryFormObj]);
					}
					if(error){
						if(debug)console.info('stop at '+ff);
                        if(debug)console.info('.check_'+checkFieldId+'[check_name = '+current_check_function+']');
                        if( !jQueryFormObj.find('.check_'+checkFieldId+'[check_name = '+current_check_function+']').length ){
                            console.error('FORM CHECKER: .check_'+checkFieldId+'[check_name = '+current_check_function+']'+ ' NOT FOUND');
                        }
						var errText = jQueryFormObj.find('.check_'+checkFieldId+'[check_name = '+current_check_function+']').attr('error_text');
                        if(debug)console.info('errText '+errText);
                        if(debug)console.info('.p_'+checkFieldId+'_error');
						jQueryFormObj.find('.p_'+checkFieldId+'_error').html( errText ).show();
						formError = true;
						break;
					} else {
						jQueryFormObj.find('.p_'+checkFieldId+'_error').html( '' ).hide();
					}
				}
			}
		});
		return !formError;
	}
	init();
}


function _Abs_FormValidation() {

	absValidation_not_empty = function(field_id,containerObj){
		if(!field_id){
			alert('Error in absValidation_notEmpty: field_id not defined');
		}
		if(containerObj){
			var val = trim( containerObj.find('.form_field[field_id = '+field_id+']').val() );
		} else {
			var val = trim( $('.form_field[field_id = '+field_id+']').val() );
		}
		return val;
	}

	absValidation_valid_email = function(field_id,containerObj){
		if(!field_id){
			alert('Error in absValidation_validateEmail: field_id not defined');
		}
		if(containerObj){
			var val = trim( containerObj.find('.form_field[field_id = '+field_id+']').val() );
		} else {
			var val = trim( $('.form_field[field_id = '+field_id+']').val() );
		}
		return emailValidate(val);
	}

	absValidation_valid_password = function(field_id,containerObj){
		if(!field_id){
			alert('Error in absValidation_valid_password: field_id not defined');
		}
		if(containerObj){
			var val = trim( containerObj.find('.form_field[field_id = '+field_id+']').val() );
		} else {
			var val = trim( $('.form_field[field_id = '+field_id+']').val() );
		}
		return passValidate(val);
	}

	absValidation_match = function(field_id,containerObj,field_to_match){
		if(!field_id){
			alert('Error in absValidation_match: field_id not defined');
		}
		if(!field_to_match){
			alert('Error in absValidation_match: field_to_match not defined');
		}
		if(containerObj){
			var val = trim( containerObj.find('.form_field[field_id = '+field_id+']').val() );
		} else {
			var val = trim( $('.form_field[field_id = '+field_id+']').val() );
		}
		if(containerObj){
			var valToMatch = trim( containerObj.find('.form_field[field_id = '+field_to_match+']').val() );
		} else {
			var valToMatch = trim( $('.form_field[field_id = '+field_to_match+']').val() );
		}
		if(valToMatch == val){
			return true;
		}
		return false;
	}

    /**
     * Length validation.
     * Parameters format: min,max[optional]
     * Examples:
     * '5':     min = 5 , max = 100000
     * '3,8':   min = 3 , max = 8
     */
	absValidation__length = function(field_id,containerObj,params){
        if(!params || typeof(params) == 'undefined'){
            return true;
        }
        var arr = params.split(',');
        if(arr.length < 2){
            var min = arr[0];
            var max = 100000;
        } else {
            var min = arr[0];
            var max = arr[1];
        }
		if(!field_id){
			alert('Error in absValidation__length: field_id not defined');
		}
		if(containerObj){
			var val = trim( containerObj.find('.form_field[field_id = '+field_id+']').val() );
		} else {
			var val = trim( $('.form_field[field_id = '+field_id+']').val() );
		}
		if(val.length < min || val.length > max){
			return false;
		}
		return true;
	}

    absValidation_value_not_null = function(field_id,containerObj){
		if(!field_id){
			alert('Error in absValidation_val_not_null: field_id not defined');
		}
		if(containerObj){
			var val = containerObj.find('.form_field[field_id = '+field_id+']').val();
		} else {
			var val = $('.form_field[field_id = '+field_id+']').val();
		}
        if(!val || val == 0){
            return false;
        }
		return true;
	}

}
