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.