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;
+};