(function ($) {
    $.fn.formValidation = function (options) {
        var options = $.extend({}, $.fn.formValidation.defaults, options);
        
        return this.each(function () {
            $('optgroup', $(this)).each(function(){
                if (!$('option',$(this)).length) {
                    $(this).remove();
                }
            });
            
            $(this).submit(function() {
                var ret = true, 
                    form = $(this),
                    error_p = $('#error_message', form);
                    
                $(options.selector,form).each(function(index) {

                    var field = $(this);
                    options.removeError(field);
                    if (!field.hasClass('optional') && !field.val()) {
                        ret = false;
                        options.addError(field);
                    } else if (field.val() && field.hasClass('email') && !options.rx.test(field.val())) {
                        ret = false;
                        options.addError(field);
                    } else if (field.val() && field.hasClass('digits') && isNaN(parseInt(field.val()))) {
                        ret = false;
                        options.addError(field);
                    } else if (field.hasClass('mandatory') && field.attr('type') == 'checkbox' && !field.attr('checked')) {
                        ret = false;
                        options.addError(field);
                    }
                });
                
                if (!ret) {
                    if (options.doScroll) {
                        $.scrollTo(form, 400);
                    }
                    if (error_p) {
                        error_p.show();
                    };
                }
                return ret;
            });
        });
    };

    $.fn.formValidation.defaults = {
        rx: /.+@.+\..+/,
        digitsrx: /^[0-9]+$/g,
        addError: function(f) {
            var p = $(f).parents('p');
            p.addClass('error');
            $(f).blur(function() { 
                p.removeClass('error');
            });
        },
        removeError: function(f) {
            $(f).parents('p').removeClass('error');
        }, 
        selector: '.textfield, select',
        doScroll: true
    };
    
})(jQuery);
