(function($) {
    $.fn.contactForm = function(options) {
        var defaults = {
            requiredFields: [ ],
            onSubmit: null,
            onSuccess: null,
            onFailure: null
        };

        var options = $.extend(defaults, options);

        return $(this).each(function() {
            if (this.tagName != 'FORM') {
                return;
            }

            var form = $(this);
            var url = form.attr('action');

            form.submit(function(e) {
                e.preventDefault();

                var err = false;

                $('[name]', form).removeClass('error');

                $(options.requiredFields).each(function() {
                    var field = $('[name=' + this + ']', form);
                    if (!field) {
                        return false;
                    }

                    if (!field.val()) {
                        field.addClass('error');
                        err = true;
                    }
                });

                if (err) {
                    return false;
                }

                if (options.onSubmit) {
                    if (!options.onSubmit.call(form)) {
                        return false;
                    }
                }

                $.ajax({
                    url: url,
                    data: form.serialize(),
                    type: 'post',
                    success: function() { if (options.onSuccess) { options.onSuccess.call(form); } },
                    error: function() { if (options.onFailure) { options.onFailure.call(form); } }
                });

                return false;
            });
        });
    }
})(jQuery);
