Mercurial > code > home > repos > light9
diff static/QueryString.js @ 1041:a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Ignore-this: 8637b7b61cc5d38e8cf15bb1afd7466c
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Wed, 28 May 2014 05:54:23 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/static/QueryString.js Wed May 28 05:54:23 2014 +0000 @@ -0,0 +1,116 @@ +// This is public domain code written in 2011 by Jan Wolter and distributed +// for free at http://unixpapa.com/js/querystring.html +// +// Query String Parser +// +// qs= new QueryString() +// qs= new QueryString(string) +// +// Create a query string object based on the given query string. If +// no string is given, we use the one from the current page by default. +// +// qs.value(key) +// +// Return a value for the named key. If the key was not defined, +// it will return undefined. If the key was multiply defined it will +// return the last value set. If it was defined without a value, it +// will return an empty string. +// +// qs.values(key) +// +// Return an array of values for the named key. If the key was not +// defined, an empty array will be returned. If the key was multiply +// defined, the values will be given in the order they appeared on +// in the query string. +// +// qs.keys() +// +// Return an array of unique keys in the query string. The order will +// not necessarily be the same as in the original query, and repeated +// keys will only be listed once. +// +// QueryString.decode(string) +// +// This static method is an error tolerant version of the builtin +// function decodeURIComponent(), modified to also change pluses into +// spaces, so that it is suitable for query string decoding. You +// shouldn't usually need to call this yourself as the value(), +// values(), and keys() methods already decode everything they return. +// +// Note: W3C recommends that ; be accepted as an alternative to & for +// separating query string fields. To support that, simply insert a semicolon +// immediately after each ampersand in the regular expression in the first +// function below. + +function QueryString(qs) +{ + this.dict= {}; + + // If no query string was passed in use the one from the current page + if (!qs) qs= location.search; + + // Delete leading question mark, if there is one + if (qs.charAt(0) == '?') qs= qs.substring(1); + + // Parse it + var re= /([^=&]+)(=([^&]*))?/g; + while (match= re.exec(qs)) + { + var key= decodeURIComponent(match[1].replace(/\+/g,' ')); + var value= match[3] ? QueryString.decode(match[3]) : ''; + if (this.dict[key]) + this.dict[key].push(value); + else + this.dict[key]= [value]; + } +} + +QueryString.decode= function(s) +{ + s= s.replace(/\+/g,' '); + s= s.replace(/%([EF][0-9A-F])%([89AB][0-9A-F])%([89AB][0-9A-F])/gi, + function(code,hex1,hex2,hex3) + { + var n1= parseInt(hex1,16)-0xE0; + var n2= parseInt(hex2,16)-0x80; + if (n1 == 0 && n2 < 32) return code; + var n3= parseInt(hex3,16)-0x80; + var n= (n1<<12) + (n2<<6) + n3; + if (n > 0xFFFF) return code; + return String.fromCharCode(n); + }); + s= s.replace(/%([CD][0-9A-F])%([89AB][0-9A-F])/gi, + function(code,hex1,hex2) + { + var n1= parseInt(hex1,16)-0xC0; + if (n1 < 2) return code; + var n2= parseInt(hex2,16)-0x80; + return String.fromCharCode((n1<<6)+n2); + }); + s= s.replace(/%([0-7][0-9A-F])/gi, + function(code,hex) + { + return String.fromCharCode(parseInt(hex,16)); + }); + return s; +}; + +QueryString.prototype.value= function (key) +{ + var a= this.dict[key]; + return a ? a[a.length-1] : undefined; +}; + +QueryString.prototype.values= function (key) +{ + var a= this.dict[key]; + return a ? a : []; +}; + +QueryString.prototype.keys= function () +{ + var a= []; + for (var key in this.dict) + a.push(key); + return a; +};