Javascript Deparam - decode querystring

Opposite of $.param. Sparked by SO discussion: http://stackoverflow.com/questions/2090551/parse-query-string-in-javascript

by Thomas Orthbandt

HTML

<pre id="output"></pre>

JavaScript

deparam = (function(d,x,params,pair,i) {
  return function (qs) {
      // start bucket; can't cheat by setting it in scope declaration or it overwrites
      params = {};
      // remove preceding non-querystring, correct spaces, and split
      qs = qs.substring(qs.indexOf('?')+1).replace(x,' ').split('&');
      // march and parse
      for (i = qs.length; i > 0;) {
        pair = qs[--i].split('=');
        params[d(pair[0])] = d(pair[1]);
      }
      return params;
  };//--  fn  deparam
})(decodeURIComponent);

var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?third=c&fourth=d&fifth=e";
tests['just ?'] = '?animal=bear&fruit=apple&building=Empire State Building&spaces=these+are+pluses';

var $output = document.getElementById('output');

function output(msg) {
  $output.innerHTML += "\n" + Array.prototype.slice.call(arguments, 0).join("\n");
}
var results = {}; // save results, so we can confirm we're not incorrectly referencing

$.each(tests, function(msg, test) {
  var q = deparam(test);
  results[msg] = q;
  output(msg, test, JSON.stringify(q), $.param(q));
  output('-------------------');
});

output('=== confirming results non-overwrite ===');

$.each(results, function(msg, result) {
    output(msg, JSON.stringify(result));
    output('-------------------');
});