(function($) {
    $.fn.queryParamEdit = function(attr, param, value) {
        var url = $(this).attr(attr);
        if(!url) {
            return;
        }

        var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i");
        if (url.match(re)) {
            url = url.replace(re,'$1' + param + "=" + value + '$2');
        }
        else {
            var firstParam = false;
            if(url.lastIndexOf('?') == -1) {
                firstParam = true;
            }

            var hashPos = url.lastIndexOf('#');
            var hashPortion = '';
            if(hashPos != -1) {
                hashPortion = url.slice(hasPos);
                url = url.slice(0, hashPos);
            }
            
            if(!firstParam) {
                url = url + '&' + param + "=" + value + hashPortion;
            }
            else {
                url = url + '?' + param + '=' + value + hashPortion;
            }
        }
        
        return this.attr(attr, url);
    };
    
    $.fn.hashParamEdit = function(attr, param, value) {
        var url = $(this).attr(attr);
        if(!url) {
            return;
        }

        var firstParam = false;
        if(url.lastIndexOf('#') == -1) {
            firstParam = true;
        }

        var re = new RegExp("([#|&])" + param + "=.*?(&|$)","i");
        if (url.match(re)) {
            url = url.replace(re,'$1' + param + "=" + value + '$2');
        }
        else {
            if(!firstParam) {
                url = url + '&' + param + "=" + value;
            }
            else {
                url = url + '#' + param + '=' + value;
            }
        }
        
        return this.attr(attr, url);
    };
})(jQuery);