$.fn.validateForm = function(rules){

    /* 
     * rules, requiredClass - хеш для проверок инпутов. Ключ - класс элемента
     * regExp - регулярка, или массив регулярок
     * f - функция, this будет указывать на проверяемый input. return false - неверно заполнено
     * 
     */

    var requiredClass = {
        validEmail: {
            regExp: /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
        }
    }
    
    if (rules) 
        $.extend(requiredClass, rules)
    
    $(this).each(function(){
    
        $(this).submit(function(){
        
            var errorField = [];
            
            $(this).find('.required').each(function(){
            
            
                var validateClass;
                
                for (class_name in requiredClass) {
                    if ($(this).hasClass(class_name)) {
                        validateClass = class_name;
                    }
                }
                validateClass = requiredClass[validateClass]
                
                if (this.tagName == 'INPUT' || this.tagName == 'SELECT' || this.tagName == 'TEXTAREA') {
                
                    if ($(this).is(':visible')) {
                    
                        var val = $.trim($(this).val());
                        if (!val) {
                            errorField.push($(this));
                        }
                        else {
                        
                            if (validateClass) {
                                if (validateClass.f) {
                                    if (!validateClass.f.apply(this)) 
                                        errorField.push($(this));
                                    
                                }
                                if (validateClass.regExp instanceof RegExp) {
                                    if (!validateClass.regExp.test(val)) 
                                        errorField.push($(this));
                                }
                                else 
                                    if (validateClass.regExp instanceof Array) {
                                        for (var i = 0; i < validateClass.regExp.length; i++) {
                                            if (!validateClass.regExp[i].test(val)) 
                                                errorField.push($(this));
                                        }
                                    }
                            }
                            
                        }
                        
                    }
                    
                }
                
                $(this).removeClass('fill_in');
                
            })
            
            if (errorField.length > 0) {
                alert('Заполните необходимые поля.')
                for (var i = 0; i < errorField.length; i++) {
                    $(errorField[i]).addClass('fill_in')
                }
                return false;
            }
            
            return true;
            
            
        })
        
    })
}



