]> git.wh0rd.org - tt-rss.git/blob - lib/dojo/io-query.js.uncompressed.js
update dojo to 1.7.3
[tt-rss.git] / lib / dojo / io-query.js.uncompressed.js
1 define("dojo/io-query", ["./_base/lang"], function(lang){
2 // module:
3 // dojo/io-query
4 // summary:
5 // This module defines query string processing functions.
6
7 var backstop = {};
8
9 function objectToQuery(/*Object*/ map){
10 // summary:
11 // takes a name/value mapping object and returns a string representing
12 // a URL-encoded version of that object.
13 // example:
14 // this object:
15 //
16 // | {
17 // | blah: "blah",
18 // | multi: [
19 // | "thud",
20 // | "thonk"
21 // | ]
22 // | };
23 //
24 // yields the following query string:
25 //
26 // | "blah=blah&multi=thud&multi=thonk"
27
28 // FIXME: need to implement encodeAscii!!
29 var enc = encodeURIComponent, pairs = [];
30 for(var name in map){
31 var value = map[name];
32 if(value != backstop[name]){
33 var assign = enc(name) + "=";
34 if(lang.isArray(value)){
35 for(var i = 0, l = value.length; i < l; ++i){
36 pairs.push(assign + enc(value[i]));
37 }
38 }else{
39 pairs.push(assign + enc(value));
40 }
41 }
42 }
43 return pairs.join("&"); // String
44 }
45
46 function queryToObject(/*String*/ str){
47 // summary:
48 // Create an object representing a de-serialized query section of a
49 // URL. Query keys with multiple values are returned in an array.
50 //
51 // example:
52 // This string:
53 //
54 // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
55 //
56 // results in this object structure:
57 //
58 // | {
59 // | foo: [ "bar", "baz" ],
60 // | thinger: " spaces =blah",
61 // | zonk: "blarg"
62 // | }
63 //
64 // Note that spaces and other urlencoded entities are correctly
65 // handled.
66
67 // FIXME: should we grab the URL string if we're not passed one?
68 var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val;
69 for(var i = 0, l = qp.length, item; i < l; ++i){
70 item = qp[i];
71 if(item.length){
72 var s = item.indexOf("=");
73 if(s < 0){
74 name = dec(item);
75 val = "";
76 }else{
77 name = dec(item.slice(0, s));
78 val = dec(item.slice(s + 1));
79 }
80 if(typeof ret[name] == "string"){ // inline'd type check
81 ret[name] = [ret[name]];
82 }
83
84 if(lang.isArray(ret[name])){
85 ret[name].push(val);
86 }else{
87 ret[name] = val;
88 }
89 }
90 }
91 return ret; // Object
92 }
93
94 return {
95 objectToQuery: objectToQuery,
96 queryToObject: queryToObject
97 };
98 });