/**
 * Serialize to json
 */
(function($) {
    $.fn.serializeJson = function() {
        var msg = {};
        var arr = this.serializeArray();
        for (var i = 0; i < arr.length; i ++) {
            msg[arr[i].name] = arr[i].value;
        }
        return msg;
    };
})(jQuery);

/**
 * Refresh fragment
 */
(function($) {
    $.fn.refreshFragment = function(params) {
        var obj = {};
        if (params === undefined || params == null) {
            obj.url = window.location.href;
        }
        else if (typeof params === 'string') {
            obj.url = params;
        }
        else {
            obj = params;
        }
        var cfg = $.extend({
            url:window.location.href,
            method: "GET",
            animate: false,
            global:true,
            data: {},
            success: $.noop
        }, obj);
        var targetUrl = new URL(cfg.url);
        $(this).each(function(idx, el) {
            var j = jQuery(el);
            cfg.data = $.extend({
                ajaxSource: '1',
                fragments: j.attr("id")
            }, cfg.data);
            if (j.attr("id") != "") {
                $.ajax({
                    method: cfg.method,
                    cache: false,
                    url: targetUrl.pathname() + targetUrl.search(),
                    data: cfg.data,
                    context: j,
                    global: cfg.global,
                    dataType: "html",
                    beforeSend: function(xhr) {
                        xhr.setRequestHeader("Accept", "text/html;type=ajax");
                        if (cfg.animate) {
                            j.empty().html('<div class="animate-loading-fragment"> </div>');
                        }
                        return true;
                    },
                    success: function(fragment) {
                        j.empty().html(fragment);
                        cfg.success.call(j);
                        processBubbleHints();
                    }
                });
            }
        });
        return true;
    };


    $.fn.ajaxifyLink = function(fragment) {
        $(this).click(function(e) {
            e.stopImmediatePropagation();
            $(fragment).refreshFragment(jQuery(this).attr("href"));
            return false;
        });
    };


    $.fn.ajaxSubmit = function(fragment) {
        var json = $(this).serializeJson();
        $(fragment).refreshFragment({
            url: $(this).attr("action"),
            data: json
        });
    };
})(jQuery);
