window.gj = window.gj || {};

(function (ns) {

    ns.ajaxForm = function (form, url, containerSelector, success, error) {
        var my = {};

        my.logger = gj.logging.getLogger('gj.ajaxForm');

        // ------------------------------------------------------------------
        // Private properties
        // ------------------------------------------------------------------

        var that = {};
        var $form = $(form);
        var method = form.method || 'POST';
        var $formContainer = $form.parents(containerSelector).first();

        // ------------------------------------------------------------------
        // Private methods
        // ------------------------------------------------------------------

        var doAjaxSubmit = function () {
            my.logger.debug('doAjaxSubmit()');

            var data = {};

            $form.find('input, textarea, select').each(function (i, elm) {
                var $elm = $(elm);
                var inputName = $elm.attr('name');
                var inputValue = $elm.val();
                var value = data[inputName] || new Array();
                value.push(inputValue);
                data[inputName] = value; // JS sucks bigtime
            });

            $.ajax({
                type: method,
                url: url || form.action,
                data: data,
                traditional: true,
                success: function (data, status, xhr) {
                    if (containerSelector && $formContainer.length) {
                        $formContainer.replaceWith($(data));
                    }
                    success && success(data, status, xhr);
                },
                error: error
            });
        };

        // setTimeout() because the originating form will be replaced
        setTimeout(doAjaxSubmit, 0);

        // ------------------------------------------------------------------
        // Public methods
        // ------------------------------------------------------------------

        // ------------------------------------------------------------------
        // Event handlers
        // ------------------------------------------------------------------

        // ------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------

        return that;
    };

})(window.gj);

