User:Mike Dillon/Scripts/params.js

Note – after saving, you may have to bypass your browser’s cache to see the changes.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

// function getParameterMap(url): Parses a URL and extracts the query string parameters;
//     if no URL is provided, uses the current URL. Caches parsed parameters between invocations.
var getParameterMap = (function () {
    // URL parameters cache: key=url, value=paramMap
    var urlParamMaps = {};

    return function (url) {
        // If no URL is passed in, use the current page's URL
        if (!url) {
            url = location.href;
        }

        // Remove the anchor, if any
        url = url.replace(/#.*/, '');

        // If the parameters for this URL have already been parsed, return them
        if (urlParamMaps[url]) return urlParamMaps[url];

        // Set up a new map for the parameters to be parsed
        var paramMap = {};

        // Split the URL from the query string
        var search = url.split("?", 2)[1];
        if (search) {
            // Split query string on "&"
            var kvs = search.split("&");
            for (var i in kvs) {
                // Split each key-value pair on the equals sign
                var kv = kvs[i].split("=", 2);
                var key = kv[0];
                var value = decodeURIComponent(kv[1]);

                // On the first occurence of a key, seed an empty array into paramMap
                if (!paramMap[key]) {
                    paramMap[key] = [];
                }

                // Push the new value onto the value list for the key in paramMap
                paramMap[key].push(value);
            }
        }

        // Cache the paramMap to avoid parsing for all parameter requests
        urlParamMaps[url] = paramMap;

        return paramMap;
    };
})();

// function getParameterValues(key, url): Extracts the list of values for a particular key
//     from the given URL; if no URL is provided, uses the current URL.
//     Returns null if the parameter was not in the URL.
function getParameterValues(key, url) {
    return getParameterMap(url)[key];
}

// function getParameterValues(key, url): Extracts the values for a particular key
//     from the given URL; if no URL is provided, uses the current URL.
//     If there is more than one value for the given key, the first value is returned.
//     Returns null if the parameter was not in the URL.
function getParameter(key, url) {
    var values = getParameterValues(key, url);
    return values ? values[0] : null;
}

// function getParameterNames(url): Extracts the list of parameter names
//     from the given URL; if no URL is provided, uses the current URL.
function getParameterNames(url) {
    var names = [];
    for (var n in getParameterMap(url)) {
        names.push(n);
    }
    return names;
}