]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/querystring.js
Use querystring, stop manually building urls
[rails.git] / app / assets / javascripts / querystring.js
1 require=(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({"querystring":[function(require,module,exports){
2 module.exports=require('SIBfUI');
3 },{}],"SIBfUI":[function(require,module,exports){
4 var isArray = typeof Array.isArray === 'function'
5     ? Array.isArray
6     : function (xs) {
7         return Object.prototype.toString.call(xs) === '[object Array]'
8     };
9
10 var objectKeys = Object.keys || function objectKeys(object) {
11     if (object !== Object(object)) throw new TypeError('Invalid object');
12     var keys = [];
13     for (var key in object) if (object.hasOwnProperty(key)) keys[keys.length] = key;
14     return keys;
15 }
16
17
18 /*!
19  * querystring
20  * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
21  * MIT Licensed
22  */
23
24 /**
25  * Library version.
26  */
27
28 exports.version = '0.3.1';
29
30 /**
31  * Object#toString() ref for stringify().
32  */
33
34 var toString = Object.prototype.toString;
35
36 /**
37  * Cache non-integer test regexp.
38  */
39
40 var notint = /[^0-9]/;
41
42 /**
43  * Parse the given query `str`, returning an object.
44  *
45  * @param {String} str
46  * @return {Object}
47  * @api public
48  */
49
50 exports.parse = function(str){
51   if (null == str || '' == str) return {};
52
53   function promote(parent, key) {
54     if (parent[key].length == 0) return parent[key] = {};
55     var t = {};
56     for (var i in parent[key]) t[i] = parent[key][i];
57     parent[key] = t;
58     return t;
59   }
60
61   return String(str)
62     .split('&')
63     .reduce(function(ret, pair){
64       try{ 
65         pair = decodeURIComponent(pair.replace(/\+/g, ' '));
66       } catch(e) {
67         // ignore
68       }
69
70       var eql = pair.indexOf('=')
71         , brace = lastBraceInKey(pair)
72         , key = pair.substr(0, brace || eql)
73         , val = pair.substr(brace || eql, pair.length)
74         , val = val.substr(val.indexOf('=') + 1, val.length)
75         , parent = ret;
76
77       // ?foo
78       if ('' == key) key = pair, val = '';
79
80       // nested
81       if (~key.indexOf(']')) {
82         var parts = key.split('[')
83           , len = parts.length
84           , last = len - 1;
85
86         function parse(parts, parent, key) {
87           var part = parts.shift();
88
89           // end
90           if (!part) {
91             if (isArray(parent[key])) {
92               parent[key].push(val);
93             } else if ('object' == typeof parent[key]) {
94               parent[key] = val;
95             } else if ('undefined' == typeof parent[key]) {
96               parent[key] = val;
97             } else {
98               parent[key] = [parent[key], val];
99             }
100           // array
101           } else {
102             obj = parent[key] = parent[key] || [];
103             if (']' == part) {
104               if (isArray(obj)) {
105                 if ('' != val) obj.push(val);
106               } else if ('object' == typeof obj) {
107                 obj[objectKeys(obj).length] = val;
108               } else {
109                 obj = parent[key] = [parent[key], val];
110               }
111             // prop
112             } else if (~part.indexOf(']')) {
113               part = part.substr(0, part.length - 1);
114               if(notint.test(part) && isArray(obj)) obj = promote(parent, key);
115               parse(parts, obj, part);
116             // key
117             } else {
118               if(notint.test(part) && isArray(obj)) obj = promote(parent, key);
119               parse(parts, obj, part);
120             }
121           }
122         }
123
124         parse(parts, parent, 'base');
125       // optimize
126       } else {
127         if (notint.test(key) && isArray(parent.base)) {
128           var t = {};
129           for(var k in parent.base) t[k] = parent.base[k];
130           parent.base = t;
131         }
132         set(parent.base, key, val);
133       }
134
135       return ret;
136     }, {base: {}}).base;
137 };
138
139 /**
140  * Turn the given `obj` into a query string
141  *
142  * @param {Object} obj
143  * @return {String}
144  * @api public
145  */
146
147 var stringify = exports.stringify = function(obj, prefix) {
148   if (isArray(obj)) {
149     return stringifyArray(obj, prefix);
150   } else if ('[object Object]' == toString.call(obj)) {
151     return stringifyObject(obj, prefix);
152   } else if ('string' == typeof obj) {
153     return stringifyString(obj, prefix);
154   } else {
155     return prefix;
156   }
157 };
158
159 /**
160  * Stringify the given `str`.
161  *
162  * @param {String} str
163  * @param {String} prefix
164  * @return {String}
165  * @api private
166  */
167
168 function stringifyString(str, prefix) {
169   if (!prefix) throw new TypeError('stringify expects an object');
170   return prefix + '=' + encodeURIComponent(str);
171 }
172
173 /**
174  * Stringify the given `arr`.
175  *
176  * @param {Array} arr
177  * @param {String} prefix
178  * @return {String}
179  * @api private
180  */
181
182 function stringifyArray(arr, prefix) {
183   var ret = [];
184   if (!prefix) throw new TypeError('stringify expects an object');
185   for (var i = 0; i < arr.length; i++) {
186     ret.push(stringify(arr[i], prefix + '[]'));
187   }
188   return ret.join('&');
189 }
190
191 /**
192  * Stringify the given `obj`.
193  *
194  * @param {Object} obj
195  * @param {String} prefix
196  * @return {String}
197  * @api private
198  */
199
200 function stringifyObject(obj, prefix) {
201   var ret = []
202     , keys = objectKeys(obj)
203     , key;
204   for (var i = 0, len = keys.length; i < len; ++i) {
205     key = keys[i];
206     ret.push(stringify(obj[key], prefix
207       ? prefix + '[' + encodeURIComponent(key) + ']'
208       : encodeURIComponent(key)));
209   }
210   return ret.join('&');
211 }
212
213 /**
214  * Set `obj`'s `key` to `val` respecting
215  * the weird and wonderful syntax of a qs,
216  * where "foo=bar&foo=baz" becomes an array.
217  *
218  * @param {Object} obj
219  * @param {String} key
220  * @param {String} val
221  * @api private
222  */
223
224 function set(obj, key, val) {
225   var v = obj[key];
226   if (undefined === v) {
227     obj[key] = val;
228   } else if (isArray(v)) {
229     v.push(val);
230   } else {
231     obj[key] = [v, val];
232   }
233 }
234
235 /**
236  * Locate last brace in `str` within the key.
237  *
238  * @param {String} str
239  * @return {Number}
240  * @api private
241  */
242
243 function lastBraceInKey(str) {
244   var len = str.length
245     , brace
246     , c;
247   for (var i = 0; i < len; ++i) {
248     c = str[i];
249     if (']' == c) brace = false;
250     if ('[' == c) brace = true;
251     if ('=' == c && !brace) return i;
252   }
253 }
254
255 },{}]},{},[])
256 ;