/*global jQuery */
(function($) {

    $.fn.formSubmitHandler = function(params) {

        // apply defaults and override with parameters
        params = $.extend({
            external_element_ids: [],
            disabled_button_ids: [],
            show_loader: true
        }, params);

        return this.each(function() {
            var form = $(this);

            params['form_enabled'] = true;
            form.data("fparams", params);

            // XXX: workaround for Safari. FF supports explicitOrigialTarget -
            //      IE equivalent is document.activeElement.
            if ($.browser.safari) {
                $("input[type=button],input[type=submit],button", form).click(function () {
                    document.activeElement = this;
                });
            }

            form.bind("submit", function (ev) {
                if (form.data("fparams")['form_enabled']) {
                    var target = document.activeElement || ev.originalEvent.explicitOriginalTarget;
                    form[0].disableForm(target);
                    return true;
                } else {
                    return false;
                }
            });

            // -----------------------------------------------------------------
            //     Public API
            // -----------------------------------------------------------------
            this.enableForm = function () {
                var params = form.data("fparams");
                params['form_enabled'] = true;

                if (params['original_target']) {
                    var target = $(params['original_target']);
                    target.text(target.attr("original_text"))
                          .removeAttr("disabled").removeAttr("original_text")
                          .removeClass("submitted").css({
                              width: "auto",
                              height: "auto"
                          });
                }

                $("button,input[type=button],input[type=submit]", form).removeClass("disabled").removeAttr("disabled");

                for (var i = 0; i < params.external_element_ids.length; i++) {
                    $("#" + params.external_element_ids[i]).removeAttr("disabled").removeClass("disabled");
                }

                form.data("fparams", params);
            };

            this.disableForm = function (original_target) {
                if (original_target) {
                    $(original_target).blur();
                }

                var params = form.data("fparams");
                params['form_enabled'] = false;

                if (params['show_loader'] && original_target
                        && (original_target.tagName.toLowerCase() == 'button'
                            || original_target.tagName.toLowerCase() == 'input'
                                && ($(original_target).attr('type') == 'button'
                                    || $(original_target).attr('type') == 'submit'))) {

                    params['original_target'] = original_target;
                    jtarget = $(original_target);

                    var dimensions = {
                        width: jtarget.outerWidth() + "px",
                        height: jtarget.outerHeight() + "px"
                    };

                    jtarget.attr("original_text", jtarget.text())
                        .addClass("submitted").css(dimensions)
                        .text("").attr("disabled", "disabled");
                }

                $("button,input[type=button],input[type=submit]", form).addClass("disabled").attr("disabled", "disabled");

                for (var i = 0; i < params.external_element_ids.length; i++) {
                    $("#" + params.external_element_ids[i]).attr("disabled", "disabled").addClass("disabled");
                }

                form.data("fparams", params);
            };

        });
    };

})(jQuery);
