(function($) {
    /**
     * Replaces query parts in url with each key/value pair in parts.
     * @example
     * >>> jQuery.replaceUrlParts("http://google.com/?q=search&i=234", {i: 928, j: U})
     * "http://google.com/?q=search&i=928&j=U"
     * @param string url
     * @param object parts
     * @return string
     */
    $.replaceUrlParts = function(url, parts) {
        var url_parts = url.split('?', 2);
        if (url_parts.length <= 1) {
            return url;
        }
        var query_parts = $.query.load('?'+url_parts[1]);
        $.each(parts, function(k,v) { query_parts.SET(k,v); });
        return url_parts[0]+query_parts;
    };
    /**
     * Replaces query parts in dst_url with keys passed in parts from src_url.
     * @example
     * >>> jQuery.replaceUrlPartsFrom("http://google.com/?q=search&i=234", "http://yahoo.com/?q=NoSearch&i=768", ['src'])
     * "http://google.com/?q=NoSearch&i=234"
     * @param string dst_url
     * @param string src_url
     * @param array parts
     * @return string
     */
    $.replaceUrlPartsFrom = function(dst_url, src_url, parts) {
        var dst_url_parts = dst_url.split('?', 2);
        var src_url_parts = src_url.split('?', 2);
        if (src_url_parts.length <= 1 || dst_url_parts.length <= 1) {
            return dst_url;
        }
        var src_query_parts = $.query.load('?'+src_url_parts[1]);
        var dst_query_parts = $.query.load('?'+dst_url_parts[1]);
        $.each(parts, function(i,v) {
            dst_query_parts.SET(v, src_query_parts.get(v));
        });
        return dst_url_parts[0]+dst_query_parts;
    };
})(jQuery);