PageSourceSearch

https://www.knoll.com/js/jquery/jquery.routes.bbqhashchange-min.js

js knoll.com collected 2026-09-24 08:39:18 UTC 12,082 bytes, 298 lines download raw bytes

1/*
2 * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
3 * http://benalman.com/projects/jquery-bbq-plugin/
4 * 
5 * Copyright (c) 2010 "Cowboy" Ben Alman
6 * Dual licensed under the MIT and GPL licenses.
7 * http://benalman.com/about/license/
8 */
9(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
10/*
11 * jQuery hashchange event - v1.2 - 2/11/2010
12 * http://benalman.com/projects/jquery-hashchange-plugin/
13 * 
14 * Copyright (c) 2010 "Cowboy" Ben Alman
15 * Dual licensed under the MIT and GPL licenses.
16 * http://benalman.com/about/license/
17 */
18(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
19/*
20 * jQuery routes - v1.0
21 * Routing in javascript using hashchange event.
22 * http://thorsteinsson.is/projects/jquery-routes/
23 *
24 * Copyright (c) 2010 Ægir Þorsteinsson
25 * Licensed under a Creative Commons Attribution 3.0 license
26 * http://creativecommons.org/licenses/by/3.0/
27 */
28(function($) {
29	var routecount = 0;
30	var datelpad = function(d) {
31		d = d + '';
32		return d.length < 2 ? '0' + d : d;
33	}
34	$.extend({
35		routes: {
36			// datatypes for parameters, regexp groups are passed as parameters to parsers
37			datatypes: {
38				'int':		{
39					regexp: /\d+?/,
40					parse: function(d) { return parseInt(d, 10); }
41				},
42				'float':	{
43					regexp: /\d+\.\d+?/,
44					parse: function(d) { return parseFloat(d); }
45				},
46				'word':		{
47					regexp: /\w+?/
48				},
49				'string':	{
50					regexp: /\w+?/
51				},
52				'date':		{
53					regexp: /(\d{2})\-(\d{2})\-(\d{4})/,
54					parse: function(d, dd, mm, yyyy) { return new Date(yyyy, mm - 1, dd); },
55					stringify: function(date) {
56						return datelpad(date.getDate()) + '-' + datelpad(date.getMonth() + 1) + '-' + date.getFullYear();
57					}
58				},	
59				'dateend':  { 
60					regexp: /(\d{2})\-(\d{2})\-(\d{4})/,
61					parse: function(d, dd, mm, yyyy) { return new Date(yyyy, mm - 1, dd, 23, 59, 59, 999); },
62					stringify: function(date) { return datelpad(date.getDate()) + '-' + datelpad(date.getMonth() + 1) + '-' + date.getFullYear(); }
63				}
64			},
65			// object containing all the routes by name
66			list: {},
67			// current executed route with parameter info
68			current: null,
69			// reload the current route with same or different parameters
70			reload: function(args) {
71				if (this.current) {
72					args = $.extend(this.current.arguments, args);
73					var url = this.current.url(args);
74					if (url !== location.hash) {
75						location.hash = url;
76					} else {
77						this.current.execute(args);
78					}
79				} else {
80					location.href.replace(location.href);
81				}
82			},
83			// add a route, they can be named and with default parameters
84			add: function(route, name, defaults, func) {
85				// parameter overload
86				if (typeof(name) === 'function') { func = name; name = undefined; }
87				if (typeof(defaults) === 'function') { func = defaults; defaults = undefined; }
88				if (typeof(name) === 'object') { defaults = name; name = undefined; }
89				
90				// all routes have a name
91				if (name === undefined) { name = 'route' + (++routecount); }
92
93				var regex = /\{\s*?([a-zA-Z0-9:\|\\*\?\.]*?)\s*?\}/gim;
94				var items = ['var s="#' + route + '";'];
95				var item = route;
96				var routeexp = '^' + route;
97				var vars = [];
98				
99				// find parameters in route and create a regexp
100				while (match = regex.exec(item)) {
101					var arr = match[1].split(':');
102					var first = arr[0];
103					var extra = arr[1];
104					items.push('s=s.replace("' + match[0] + '",p.' + first + ');');
105					item = item.replace(match[0], '');
106					if (extra) {
107						// check for known datatype
108						if ($.routes.datatypes[extra]) {
109							extra = $.routes.datatypes[extra].regexp.toString();
110							extra = extra.substring(1, extra.length - 2).replace(/\(/g, '').replace(/\)/g, ''); // remove groups
111						}
112						routeexp = routeexp.replace(match[0], '(' + extra + ')');
113					} else {
114						routeexp = routeexp.replace(match[0], '(.*?)');
115					}
116					vars.push(match[1].split(':'));
117					regex.lastIndex = match.index;
118				}
119				items.push('return s;');
120				
121				// find a datatype
122				var getDatatype = function(parameter) {
123					for (var i = 0, len = vars.length; i < len; i++) {
124						if (vars[i][0] === parameter) {
125							return $.routes.datatypes[vars[i][1]];
126						}
127					}
128				};
129
130				// prepare parameters for url
131				var getParams = function(obj) {
132					var args = $.extend({}, defaults, obj), dt;
133					for (var item in args) {
134						if (args.hasOwnProperty(item)) {
135							dt = getDatatype(item);
136							if (dt && dt.stringify) {
137								args[item] = dt.stringify(args[item]);
138							}
139						}
140					}
141					return args;
142				};
143				
144				// convert route with parameters to url
145				var combine = new Function('p', items.join(''));
146				var url = function(p) {
147					return combine(getParams(p));
148				};
149
150
151				// extract parameters from hash
152				var extract = function(hash) {
153					// load the defaults
154					var context = defaults ? defaults : {};
155					// get parameters
156					$.each(vars, function(x, vars) {
157						var datatype = $.routes.datatypes[vars[1]];
158						var val = args[x+1];
159						// parse parameter
160						if (datatype && datatype.parse) {
161							val = [val];
162							// get arguments for parse
163							if (datatype.regexp) {
164								var p = datatype.regexp.exec(args[x+1]);
165								for (var y = 1; y < p.length; y++) {
166									val.push(p[y]);
167								}
168							}
169							val = datatype.parse.apply(datatype, val);
170						}
171						context[vars[0]] = val;
172					});
173					return context;
174				};
175
176				// add to list of routes
177				return this.list[name] = {
178					name: name,
179					exp: new RegExp(routeexp, 'i'),
180					route: route,
181					func: func,
182					url: url,
183					routeTo: function(data) {
184						location.href = this.url(data);
185					},
186					execute: function(data) {
187						this.func.apply($.extend({}, defaults, data));
188					},
189					vars: vars,
190					defaults: defaults,
191					level: route.length - route.replace(new RegExp("/", "g"), '').length,
192					extract: extract
193				};
194			},
195			addDataType: function(name, dt) {
196				$.routes.datatypes[name] = dt;
197				createDatatypeArray(name);
198			},
199			// get a registered route with name
200			find: function(name) {
201				return this.list[name];
202			},
203			findRoute: function(hash) {
204				var route;
205				// search for routes
206				$.each(this.list, function(i, match) {
207					// check for a match
208					var exp = match.exp.exec(hash);
209					if (exp) {
210						if ((route && match.level > route.level) || !route) {
211							route = match;
212							args = exp;
213						}
214					}
215				});
216				return route;
217			},
218			// load a hash and find the correct route to execute
219			load: function(hash) {
220				var route = $.routes.findRoute(hash.substr(1));
221				
222				// route not found
223				if (!route) { return; }
224				
225				// extract parameters from url
226				var params = route.extract(hash);
227				
228				// execute route
229				$.routes.current = route;
230				$.routes.current.arguments = params;
231				route.execute(params);
232			}
233		}
234	});
235
236	$.expr[':'].hasRoute = function(elem, index, match) {
237		return $(elem).has('a[href$=' + location.hash + ']').length > 0;
238	};
239
240	$.fn.updateRoutes = function(params) {
241		$('a', this).each(function() {
242			var item = $(this),
243				hash = item.attr('href').substr(1),
244				route = $.routes.findRoute(hash);
245			if (!route) { return; }
246
247			var linkparams = route.extract(hash);
248			var newhash = route.url($.extend({}, linkparams, params));
249			item.attr('href', newhash);
250		});
251	};
252
253	function createDatatypeArray(name) {
254		var dt = $.routes.datatypes[name];
255		$.routes.datatypes[name + 'array'] = {
256			datatype: name,
257			regexp: new RegExp('[' + dt.regexp.toString().slice(1, dt.regexp.toString().length - 1) + '\\/\?]*', 'i'),
258			parse: function(d) {
259				var arr = d.split('/'),
260					newarr = [],
261					dt = $.routes.datatypes[this.datatype];
262				for (var i = 0; i < arr.length; i++) {
263					var groups = dt.regexp.exec(arr[i]).slice(1);
264					var args = [arr[i]].concat(groups);
265					newarr.push(dt.parse.apply(dt, args));
266				}
267				return newarr;
268			},
269			stringify: function(arr) {
270				for (var i = 0; i < arr.length; i++) {
271					var dt = $.routes.datatypes[this.datatype];
272					arr[i] = (!!dt.stringify ? dt.stringify(arr[i]) : arr[i].toString());
273				}
274				return arr.join('/');
275			}
276		};
277	}
278	
279	// create array data types
280	var dts = $.extend({},$.routes.datatypes);
281	for (var name in dts) {
282		if (dts.hasOwnProperty(name)) {
283			createDatatypeArray(name);
284		}
285	}
286
287	// Listen for hash change event
288	$(window).bind('hashchange', function() {
289		$.routes.load(location.hash);
290	});
291	
292	// Run route on document ready
293	$(function() {
294		if (location.hash.length > 0) {
295			$.routes.load(location.hash);
296		}
297	});
298}(jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.