merged cont.
[opensuse:yast-rest-service.git] / webyast / public / javascripts / jquery.query.js
1 /**\r
2  * Source: jQuery.query - Query String Modification and Creation for jQuery\r
3  * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)\r
4  * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).\r
5  * Date: 2009/02/08\r
6  *\r
7  * @author Blair Mitchelmore\r
8  * @version 2.1.2\r
9  *\r
10  **/\r
11 new function(settings) { \r
12   // Various Settings\r
13   var $separator = settings.separator || '&';\r
14   var $spaces = settings.spaces === false ? false : true;\r
15   var $suffix = settings.suffix === false ? '' : '[]';\r
16   var $prefix = settings.prefix === false ? false : true;\r
17   var $hash = $prefix ? settings.hash === true ? "#" : "?" : "";\r
18   var $numbers = settings.numbers === false ? false : true;\r
19   \r
20   jQuery.query = new function() {\r
21     var is = function(o, t) {\r
22       return o != undefined && o !== null && (!!t ? o.constructor == t : true);\r
23     };\r
24     var parse = function(path) {\r
25       var m, rx = /\[([^[]*)\]/g, match = /^(\S+?)(\[\S*\])?$/.exec(path), base = match[1], tokens = [];\r
26       while (m = rx.exec(match[2])) tokens.push(m[1]);\r
27       return [base, tokens];\r
28     };\r
29     var set = function(target, tokens, value) {\r
30       var o, token = tokens.shift();\r
31       if (typeof target != 'object') target = null;\r
32       if (token === "") {\r
33         if (!target) target = [];\r
34         if (is(target, Array)) {\r
35           target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));\r
36         } else if (is(target, Object)) {\r
37           var i = 0;\r
38           while (target[i++] != null);\r
39           target[--i] = tokens.length == 0 ? value : set(target[i], tokens.slice(0), value);\r
40         } else {\r
41           target = [];\r
42           target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));\r
43         }\r
44       } else if (token && token.match(/^\s*[0-9]+\s*$/)) {\r
45         var index = parseInt(token, 10);\r
46         if (!target) target = [];\r
47         target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);\r
48       } else if (token) {\r
49         var index = token.replace(/^\s*|\s*$/g, "");\r
50         if (!target) target = {};\r
51         if (is(target, Array)) {\r
52           var temp = {};\r
53           for (var i = 0; i < target.length; ++i) {\r
54             temp[i] = target[i];\r
55           }\r
56           target = temp;\r
57         }\r
58         target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);\r
59       } else {\r
60         return value;\r
61       }\r
62       return target;\r
63     };\r
64     \r
65     var queryObject = function(a) {\r
66       var self = this;\r
67       self.keys = {};\r
68       \r
69       if (a.queryObject) {\r
70         jQuery.each(a.get(), function(key, val) {\r
71           self.SET(key, val);\r
72         });\r
73       } else {\r
74         jQuery.each(arguments, function() {\r
75           var q = "" + this;\r
76           q = q.replace(/^[?#]/,''); // remove any leading ? || #\r
77           q = q.replace(/[;&]$/,''); // remove any trailing & || ;\r
78           if ($spaces) q = q.replace(/[+]/g,' '); // replace +'s with spaces\r
79           \r
80           jQuery.each(q.split(/[&;]/), function(){\r
81             var key = this.split('=')[0];\r
82             var val = this.split('=')[1];\r
83             \r
84             if (!key) return;\r
85             \r
86             if ($numbers) {\r
87               if (/^[+-]?[0-9]+\.[0-9]*$/.test(val)) // simple float regex\r
88                 val = parseFloat(val);\r
89               else if (/^[+-]?[0-9]+$/.test(val)) // simple int regex\r
90                 val = parseInt(val, 10);\r
91             }\r
92             \r
93             val = (!val && val !== 0) ? true : val;\r
94             \r
95             if (val !== false && val !== true && typeof val != 'number')\r
96               val = decodeURIComponent(val);\r
97             \r
98             self.SET(key, val);\r
99           });\r
100         });\r
101       }\r
102       return self;\r
103     };\r
104     \r
105     queryObject.prototype = {\r
106       queryObject: true,\r
107       has: function(key, type) {\r
108         var value = this.get(key);\r
109         return is(value, type);\r
110       },\r
111       GET: function(key) {\r
112         if (!is(key)) return this.keys;\r
113         var parsed = parse(key), base = parsed[0], tokens = parsed[1];\r
114         var target = this.keys[base];\r
115         while (target != null && tokens.length != 0) {\r
116           target = target[tokens.shift()];\r
117         }\r
118         return typeof target == 'number' ? target : target || "";\r
119       },\r
120       get: function(key) {\r
121         var target = this.GET(key);\r
122         if (is(target, Object))\r
123           return jQuery.extend(true, {}, target);\r
124         else if (is(target, Array))\r
125           return target.slice(0);\r
126         return target;\r
127       },\r
128       SET: function(key, val) {\r
129         var value = !is(val) ? null : val;\r
130         var parsed = parse(key), base = parsed[0], tokens = parsed[1];\r
131         var target = this.keys[base];\r
132         this.keys[base] = set(target, tokens.slice(0), value);\r
133         return this;\r
134       },\r
135       set: function(key, val) {\r
136         return this.copy().SET(key, val);\r
137       },\r
138       REMOVE: function(key) {\r
139         return this.SET(key, null).COMPACT();\r
140       },\r
141       remove: function(key) {\r
142         return this.copy().REMOVE(key);\r
143       },\r
144       EMPTY: function() {\r
145         var self = this;\r
146         jQuery.each(self.keys, function(key, value) {\r
147           delete self.keys[key];\r
148         });\r
149         return self;\r
150       },\r
151       load: function(url) {\r
152         var hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");\r
153         var search = url.replace(/^.*?[?](.+?)(?:#.+)?$/, "$1");\r
154         return new queryObject(url.length == search.length ? '' : search, url.length == hash.length ? '' : hash);\r
155       },\r
156       empty: function() {\r
157         return this.copy().EMPTY();\r
158       },\r
159       copy: function() {\r
160         return new queryObject(this);\r
161       },\r
162       COMPACT: function() {\r
163         function build(orig) {\r
164           var obj = typeof orig == "object" ? is(orig, Array) ? [] : {} : orig;\r
165           if (typeof orig == 'object') {\r
166             function add(o, key, value) {\r
167               if (is(o, Array))\r
168                 o.push(value);\r
169               else\r
170                 o[key] = value;\r
171             }\r
172             jQuery.each(orig, function(key, value) {\r
173               if (!is(value)) return true;\r
174               add(obj, key, build(value));\r
175             });\r
176           }\r
177           return obj;\r
178         }\r
179         this.keys = build(this.keys);\r
180         return this;\r
181       },\r
182       compact: function() {\r
183         return this.copy().COMPACT();\r
184       },\r
185       toString: function() {\r
186         var i = 0, queryString = [], chunks = [], self = this;\r
187         var addFields = function(arr, key, value) {\r
188           if (!is(value) || value === false) return;\r
189           var o = [key];\r
190           if (value !== true) {\r
191             o.push("=");\r
192             o.push(encodeURIComponent(value));\r
193           }\r
194           arr.push(o.join(""));\r
195         };\r
196         var build = function(obj, base) {\r
197           var newKey = function(key) {\r
198             return !base || base == "" ? [key].join("") : [base, "[", key, "]"].join("");\r
199           };\r
200           jQuery.each(obj, function(key, value) {\r
201             if (typeof value == 'object') \r
202               build(value, newKey(key));\r
203             else\r
204               addFields(chunks, newKey(key), value);\r
205           });\r
206         };\r
207         \r
208         build(this.keys);\r
209         \r
210         if (chunks.length > 0) queryString.push($hash);\r
211         queryString.push(chunks.join($separator));\r
212         \r
213         return queryString.join("");\r
214       }\r
215     };\r
216     \r
217     return new queryObject(location.search, location.hash);\r
218   };\r
219 }(jQuery.query || {}); // Pass in jQuery.query as settings object\r