(function($) {
    $.fn.form = function(options) {
        var ops = $.extend({
            onBeforeSubmit: null, onSuccess: null 
        }, options || {});
        $(this).bind('submit', function(e){
            $(this).find(':input').triggerHandler('change');
            var f = this;
            $(this).ajaxSubmit({
                dataType: 'json',
                beforeSubmit: function(){
                    $(':submit', f).attr('disabled', 'disabled');
                    if (typeof(ops.onBeforeSubmit) == 'function') {
                        ops.onBeforeSubmit(f);
                    }
                },
                complete: function(){
                    $(':submit', f).removeAttr('disabled');
                    if (typeof(ops.onComplete) == 'function') {
                        ops.onComplete(f);
                    }
                },
                success: function(data){
                    $('ul.errors', f).remove();
                    if (data.errors) {
    	                $.each(data.errors, function(name, messages){
    	                    var ul = $('<ul/>').addClass('errors');
    	                    $.each(messages, function(code, text){
    	                        $('<li/>').text(text).appendTo(ul);
    	                    });
    	                    $(':input[name="' + name + '"]', f).parent().append(ul);
    	                });
    	            }
    	            $('.message', f).remove();
    	            if (data.message) {
    	                $('<div/>').text(data.message)
    	                .addClass('message').addClass((data.errors) ? 'fail' : 'success')
    	                .prependTo(f);
    	            }
    	            if (typeof(ops.onSuccess) == 'function') {
    	                ops.onSuccess(f, data);
    	            }
                }
            });
            return false;
        });
    };
})(jQuery);