Permalink
Browse files

adding ajaxCrawlable (code name: fragbango) functionality. code and u…

…nit tests are done, just needs documentation and examples.
  • Loading branch information...
1 parent aa12c92 commit 8a8530f26e2398cd65aef6a044f0438233ca3dd6 @cowboy cowboy committed Aug 27, 2010
View
@@ -1,7 +1,7 @@
# jQuery BBQ: Back Button & Query Library #
[http://benalman.com/projects/jquery-bbq-plugin/](http://benalman.com/projects/jquery-bbq-plugin/)
-Version: 1.3pre, Last updated: 8/20/2010
+Version: 1.3pre, Last updated: 8/26/2010
jQuery BBQ enables simple, yet powerful bookmarkable #hash history via a cross-browser window.onhashchange event. In addition, jQuery BBQ provides a full jQuery.deparam() method, along with both fragment and query string parse and merge utility methods.
@@ -54,7 +54,7 @@ Safari: Back Button from a different domain
## Release History ##
-1.3pre - (8/20/2010) Integrated jQuery hashchange event v1.3, which adds document.title and document.domain support in IE6/7, BlackBerry support, better Iframe hiding for accessibility reasons, and the new jQuery.fn.hashchange "shortcut" method. Added the jQuery.param.sorted method which reduces the possibility of extraneous hashchange event triggering.
+1.3pre - (8/26/2010) Integrated jQuery hashchange event v1.3, which adds document.title and document.domain support in IE6/7, BlackBerry support, better Iframe hiding for accessibility reasons, and the new jQuery.fn.hashchange "shortcut" method. Added the jQuery.param.sorted method which reduces the possibility of extraneous hashchange event triggering. Added the jQuery.param.fragment.ajaxCrawlable method which can be used to enable Google "AJAX Crawlable mode."
1.2.1 - (2/17/2010) Actually fixed the stale window.location Safari bug from jQuery hashchange event in BBQ, which was the main reason for the previous release!
1.2 - (2/16/2010) Integrated jQuery hashchange event v1.2, which fixes a Safari bug, the event can now be bound before DOM ready, and IE6/7 page should no longer scroll when the event is first bound. Also added the jQuery.param.fragment.noEscape method, and reworked the hashchange event (BBQ) internal "add" method to be compatible with changes made to the jQuery 1.4.2 special events API.
1.1.1 - (1/22/2010) Integrated jQuery hashchange event v1.1, which fixes an obscure IE8 EmulateIE7 meta tag compatibility mode bug.
Oops, something went wrong.
@@ -13,7 +13,7 @@
<div id=Index><div class=IPageTitle>File Index</div><div class=INavigationBar>$#! &middot; 0-9 &middot; A &middot; B &middot; C &middot; D &middot; E &middot; F &middot; G &middot; H &middot; I &middot; <a href="#J">J</a> &middot; K &middot; L &middot; M &middot; N &middot; O &middot; P &middot; Q &middot; R &middot; S &middot; T &middot; U &middot; V &middot; W &middot; X &middot; Y &middot; Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=IHeading id=IFirstHeading><a name="J"></a>J</td><td></td></tr><tr><td class=ISymbolPrefix id=IFirstSymbolPrefix>&nbsp;</td><td class=IEntry><a href="../files/jquery-ba-bbq-js.html#jQuery_BBQ:Back_ButtonQuery_Library" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=ISymbol>jQuery BBQ:<wbr>Back Button&amp;Query Library</a></td></tr><tr><td class=ISymbolPrefix id=ILastSymbolPrefix>&nbsp;</td><td class=IEntry><a href="../files/jquery-ba-bbq-js.html#jQuery_hashchange_event" id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')" class=ISymbol>jQuery hashchange event</a></td></tr></table>
<!--START_ND_TOOLTIPS-->
-<div class=CToolTip id="tt1"><div class=CFile><b>Version: 1.3pre, Last updated: 8/20/2010</b></div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.3, Last updated: 7/21/2010</b></div></div><!--END_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFile><b>Version: 1.3pre, Last updated: 8/26/2010</b></div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.3, Last updated: 7/21/2010</b></div></div><!--END_ND_TOOLTIPS-->
</div><!--Index-->
Oops, something went wrong.
Oops, something went wrong.
@@ -32,7 +32,7 @@ var indexSectionsWithContent = {
"Functions": {
"Symbols": false,
"Numbers": false,
- "A": false,
+ "A": true,
"B": false,
"C": false,
"D": true,
@@ -1,4 +1,4 @@
1.4
JavaScript
-/srv/projects/jquery-bbq-dev/jquery.ba-bbq.js 1282314036 1 jQuery BBQ: Back Button & Query Library
-/srv/projects/jquery-bbq-dev/jquery.ba-bbq.min.js 1282316475 0 /srv/projects/jquery-bbq-dev/jquery.ba-bbq.min.js
+/srv/projects/jquery-bbq-dev/jquery.ba-bbq.js 1282876144 1 jQuery BBQ: Back Button & Query Library
+/srv/projects/jquery-bbq-dev/jquery.ba-bbq.min.js 1282876213 0 /srv/projects/jquery-bbq-dev/jquery.ba-bbq.min.js
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.4 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_ajaxCrawlable><div class=IEntry><a href="../files/jquery-ba-bbq-js.html#jQuery.param.fragment.ajaxCrawlable" target=_parent class=ISymbol>ajaxCrawlable</a>, <span class=IParent>jQuery.<wbr>param.<wbr>fragment</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!-- Generated by Natural Docs, version 1.4 -->
+<!-- http://www.naturaldocs.org -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_ajaxCrawlable><div class=IEntry><a href="../files/jquery-ba-bbq-js.html#jQuery.param.fragment.ajaxCrawlable" target=_parent class=ISymbol>ajaxCrawlable</a>, <span class=IParent>jQuery.<wbr>param.<wbr>fragment</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
View
@@ -1,5 +1,5 @@
/*!
- * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/20/2010
+ * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/26/2010
* http://benalman.com/projects/jquery-bbq-plugin/
*
* Copyright (c) 2010 "Cowboy" Ben Alman
@@ -9,7 +9,7 @@
// Script: jQuery BBQ: Back Button & Query Library
//
-// *Version: 1.3pre, Last updated: 8/20/2010*
+// *Version: 1.3pre, Last updated: 8/26/2010*
//
// Project Home - http://benalman.com/projects/jquery-bbq-plugin/
// GitHub - http://github.com/cowboy/jquery-bbq/
@@ -45,12 +45,14 @@
//
// About: Release History
//
-// 1.3pre - (8/20/2010) Integrated <jQuery hashchange event> v1.3, which adds
+// 1.3pre - (8/26/2010) Integrated <jQuery hashchange event> v1.3, which adds
// document.title and document.domain support in IE6/7, BlackBerry
// support, better Iframe hiding for accessibility reasons, and the new
// <jQuery.fn.hashchange> "shortcut" method. Added the
// <jQuery.param.sorted> method which reduces the possibility of
-// extraneous hashchange event triggering.
+// extraneous hashchange event triggering. Added the
+// <jQuery.param.fragment.ajaxCrawlable> method which can be used to
+// enable Google "AJAX Crawlable mode."
// 1.2.1 - (2/17/2010) Actually fixed the stale window.location Safari bug from
// <jQuery hashchange event> in BBQ, which was the main reason for the
// previous release!
@@ -108,15 +110,18 @@
str_querystring = 'querystring',
str_fragment = 'fragment',
str_elemUrlAttr = 'elemUrlAttr',
- str_location = 'location',
str_href = 'href',
str_src = 'src',
// Reused RegExp.
- re_trim_querystring = /^.*\?|#.*$/g,
- re_trim_fragment = /^.*\#/,
+ re_params_querystring = /^.*\?|#.*$/g,
+ re_params_fragment,
+ re_fragment,
re_no_escape,
+ ajax_crawlable,
+ fragment_prefix,
+
// Used by jQuery.elemUrlAttr.
elemUrlAttr_cache = {};
@@ -139,7 +144,7 @@
// Get location.hash (or what you'd expect location.hash to be) sans any
// leading #. Thanks for making this necessary, Firefox!
function get_fragment( url ) {
- return url.replace( /^[^#]*#?(.*)$/, '$1' );
+ return url.replace( re_fragment, '$2' );
};
// Get location.search (or what you'd expect location.search to be) sans any
@@ -259,15 +264,15 @@
// matches[1] = url part that precedes params, not including trailing ?/#
// matches[2] = params, not including leading ?/#
// matches[3] = if in 'querystring' mode, hash including leading #, otherwise ''
- matches = url.match( is_fragment ? /^([^#]*)\#?(.*)$/ : /^([^#?]*)\??([^#]*)(#?.*)/ );
+ matches = url.match( is_fragment ? re_fragment : /^([^#?]*)\??([^#]*)(#?.*)/ );
// Get the hash if in 'querystring' mode, and it exists.
hash = matches[3] || '';
if ( merge_mode === 2 && is_string( params ) ) {
// If merge_mode is 2 and params is a string, merge the fragment / query
// string into the URL wholesale, without converting it into an object.
- qs = params.replace( is_fragment ? re_trim_fragment : re_trim_querystring, '' );
+ qs = params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' );
} else {
// Convert relevant params in url to object.
@@ -299,12 +304,12 @@
// Build URL from the base url, querystring and hash. In 'querystring'
// mode, ? is only added if a query string exists. In 'fragment' mode, #
// is always added.
- result = matches[1] + ( is_fragment ? '#' : qs || !matches[1] ? '?' : '' ) + qs + hash;
+ result = matches[1] + ( is_fragment ? fragment_prefix : qs || !matches[1] ? '?' : '' ) + qs + hash;
} else {
// If URL was passed in, parse params from URL string, otherwise parse
// params from window.location.
- result = get_func( url !== undefined ? url : window[ str_location ][ str_href ] );
+ result = get_func( url !== undefined ? url : location.href );
}
return result;
@@ -401,6 +406,41 @@
// "uglifying up the URL" the most.
jq_param_fragment.noEscape( ',/' );
+ // Method: jQuery.param.fragment.ajaxCrawlable
+ //
+ // TODO: DESCRIBE
+ //
+ // Usage:
+ //
+ // > jQuery.param.fragment.ajaxCrawlable( [ state ] );
+ //
+ // Arguments:
+ //
+ // state - (Boolean) TODO: DESCRIBE
+ //
+ // Returns:
+ //
+ // (Boolean) The current ajaxCrawlable state.
+
+ jq_param_fragment.ajaxCrawlable = function( state ) {
+ if ( state !== undefined ) {
+ if ( state ) {
+ re_params_fragment = /^.*(?:#!|#)/;
+ re_fragment = /^([^#]*)(?:#!|#)?(.*)$/;
+ fragment_prefix = '#!';
+ } else {
+ re_params_fragment = /^.*#/;
+ re_fragment = /^([^#]*)#?(.*)$/;
+ fragment_prefix = '#';
+ }
+ ajax_crawlable = !!state;
+ }
+
+ return ajax_crawlable;
+ };
+
+ jq_param_fragment.ajaxCrawlable( 0 );
+
// Section: Deparam (from string)
//
// Method: jQuery.deparam
@@ -566,7 +606,7 @@
url_or_params = jq_param[ is_fragment ? str_fragment : str_querystring ]();
} else {
url_or_params = is_string( url_or_params )
- ? url_or_params.replace( is_fragment ? re_trim_fragment : re_trim_querystring, '' )
+ ? url_or_params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' )
: url_or_params;
}
@@ -770,13 +810,12 @@
var has_args = params !== undefined,
// Merge params into window.location using $.param.fragment.
- url = jq_param_fragment( window[ str_location ][ str_href ],
+ url = jq_param_fragment( location.href,
has_args ? params : {}, has_args ? merge_mode : 2 );
- // Set new window.location.href. If hash is empty, use just # to prevent
- // browser from reloading the page. Note that Safari 3 & Chrome barf on
- // location.hash = '#'.
- window[ str_location ][ str_href ] = url + ( /#/.test( url ) ? '' : '#' );
+ // Set new window.location.href. Note that Safari 3 & Chrome barf on
+ // location.hash = '#' so the entire URL is set.
+ location.href = url;
};
// Method: jQuery.bbq.getState
@@ -1,12 +1,12 @@
/*
- * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/20/2010
+ * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/26/2010
* http://benalman.com/projects/jquery-bbq-plugin/
*
* Copyright (c) 2010 "Cowboy" Ben Alman
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
-(function($,q){var i,n=Array.prototype.slice,s=decodeURIComponent,a=$.param,j,c,m,w,b=$.bbq=$.bbq||{},r,v,k,e=$.event.special,d="hashchange",B="querystring",E="fragment",z="elemUrlAttr",g="location",l="href",u="src",y=/^.*\?|#.*$/g,x=/^.*\#/,h,D={};function F(G){return typeof G==="string"}function C(H){var G=n.call(arguments,1);return function(){return H.apply(this,G.concat(n.call(arguments)))}}function o(G){return G.replace(/^[^#]*#?(.*)$/,"$1")}function p(G){return G.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(I,N,G,J,H){var P,M,L,O,K;if(J!==i){L=G.match(I?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);K=L[3]||"";if(H===2&&F(J)){M=J.replace(I?x:y,"")}else{O=m(L[2]);J=F(J)?m[I?E:B](J):J;M=H===2?J:H===1?$.extend({},J,O):$.extend({},O,J);M=j(M);if(I){M=M.replace(h,s)}}P=L[1]+(I?"#":M||!L[1]?"?":"")+M+K}else{P=N(G!==i?G:q[g][l])}return P}a[B]=C(f,0,p);a[E]=c=C(f,1,o);a.sorted=j=function(H,I){var G=[],J={};$.each(a(H,I).split("&"),function(N,K){var M=K.replace(/(?:%5B|=).*$/,""),L=J[M];if(!L){L=J[M]=[];G.push(M)}L.push(K)});return $.map(G.sort(),function(K){return J[K]}).join("&")};c.noEscape=function(H){H=H||"";var G=$.map(H.split(""),encodeURIComponent);h=new RegExp(G.join("|"),"g")};c.noEscape(",/");$.deparam=m=function(J,G){var I={},H={"true":!0,"false":!1,"null":null};$.each(J.replace(/\+/g," ").split("&"),function(M,R){var L=R.split("="),Q=s(L[0]),K,P=I,N=0,S=Q.split("]["),O=S.length-1;if(/\[/.test(S[0])&&/\]$/.test(S[O])){S[O]=S[O].replace(/\]$/,"");S=S.shift().split("[").concat(S);O=S.length-1}else{O=0}if(L.length===2){K=s(L[1]);if(G){K=K&&!isNaN(K)?+K:K==="undefined"?i:H[K]!==i?H[K]:K}if(O){for(;N<=O;N++){Q=S[N]===""?P.length:S[N];P=P[Q]=N<O?P[Q]||(S[N+1]&&isNaN(S[N+1])?{}:[]):K}}else{if($.isArray(I[Q])){I[Q].push(K)}else{if(I[Q]!==i){I[Q]=[I[Q],K]}else{I[Q]=K}}}}else{if(Q){I[Q]=G?i:""}}});return I};function A(I,G,H){if(G===i||typeof G==="boolean"){H=G;G=a[I?E:B]()}else{G=F(G)?G.replace(I?x:y,""):G}return m(G,H)}m[B]=C(A,0);m[E]=w=C(A,1);$[z]||($[z]=function(G){return $.extend(D,G)})({a:l,base:l,iframe:u,img:u,input:u,form:"action",link:l,script:u});k=$[z];function t(J,H,I,G){if(!F(I)&&typeof I!=="object"){G=I;I=H;H=i}return this.each(function(){var M=$(this),K=H||k()[(this.nodeName||"").toLowerCase()]||"",L=K&&M.attr(K)||"";M.attr(K,a[J](L,I,G))})}$.fn[B]=C(t,B);$.fn[E]=C(t,E);b.pushState=r=function(J,G){if(F(J)&&/^#/.test(J)&&G===i){G=2}var I=J!==i,H=c(q[g][l],I?J:{},I?G:2);q[g][l]=H+(/#/.test(H)?"":"#")};b.getState=v=function(G,H){return G===i||typeof G==="boolean"?w(G):w(H)[G]};b.removeState=function(G){var H={};if(G!==i){H=v();$.each($.isArray(G)?G:arguments,function(J,I){delete H[I]})}r(H,2)};e[d]=$.extend(e[d],{add:function(G){var I;function H(K){var J=K[E]=c();K.getState=function(L,M){return L===i||typeof L==="boolean"?m(J,L):m(J,M)[L]};I.apply(this,arguments)}if($.isFunction(G)){I=G;return H}else{I=G.handler;G.handler=H}}})})(jQuery,this);
+(function($,r){var h,n=Array.prototype.slice,t=decodeURIComponent,a=$.param,j,c,m,y,b=$.bbq=$.bbq||{},s,x,k,e=$.event.special,d="hashchange",B="querystring",F="fragment",z="elemUrlAttr",l="href",w="src",p=/^.*\?|#.*$/g,u,H,g,i,C,E={};function G(I){return typeof I==="string"}function D(J){var I=n.call(arguments,1);return function(){return J.apply(this,I.concat(n.call(arguments)))}}function o(I){return I.replace(H,"$2")}function q(I){return I.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(K,P,I,L,J){var R,O,N,Q,M;if(L!==h){N=I.match(K?H:/^([^#?]*)\??([^#]*)(#?.*)/);M=N[3]||"";if(J===2&&G(L)){O=L.replace(K?u:p,"")}else{Q=m(N[2]);L=G(L)?m[K?F:B](L):L;O=J===2?L:J===1?$.extend({},L,Q):$.extend({},Q,L);O=j(O);if(K){O=O.replace(g,t)}}R=N[1]+(K?C:O||!N[1]?"?":"")+O+M}else{R=P(I!==h?I:location.href)}return R}a[B]=D(f,0,q);a[F]=c=D(f,1,o);a.sorted=j=function(J,K){var I=[],L={};$.each(a(J,K).split("&"),function(P,M){var O=M.replace(/(?:%5B|=).*$/,""),N=L[O];if(!N){N=L[O]=[];I.push(O)}N.push(M)});return $.map(I.sort(),function(M){return L[M]}).join("&")};c.noEscape=function(J){J=J||"";var I=$.map(J.split(""),encodeURIComponent);g=new RegExp(I.join("|"),"g")};c.noEscape(",/");c.ajaxCrawlable=function(I){if(I!==h){if(I){u=/^.*(?:#!|#)/;H=/^([^#]*)(?:#!|#)?(.*)$/;C="#!"}else{u=/^.*#/;H=/^([^#]*)#?(.*)$/;C="#"}i=!!I}return i};c.ajaxCrawlable(0);$.deparam=m=function(L,I){var K={},J={"true":!0,"false":!1,"null":null};$.each(L.replace(/\+/g," ").split("&"),function(O,T){var N=T.split("="),S=t(N[0]),M,R=K,P=0,U=S.split("]["),Q=U.length-1;if(/\[/.test(U[0])&&/\]$/.test(U[Q])){U[Q]=U[Q].replace(/\]$/,"");U=U.shift().split("[").concat(U);Q=U.length-1}else{Q=0}if(N.length===2){M=t(N[1]);if(I){M=M&&!isNaN(M)?+M:M==="undefined"?h:J[M]!==h?J[M]:M}if(Q){for(;P<=Q;P++){S=U[P]===""?R.length:U[P];R=R[S]=P<Q?R[S]||(U[P+1]&&isNaN(U[P+1])?{}:[]):M}}else{if($.isArray(K[S])){K[S].push(M)}else{if(K[S]!==h){K[S]=[K[S],M]}else{K[S]=M}}}}else{if(S){K[S]=I?h:""}}});return K};function A(K,I,J){if(I===h||typeof I==="boolean"){J=I;I=a[K?F:B]()}else{I=G(I)?I.replace(K?u:p,""):I}return m(I,J)}m[B]=D(A,0);m[F]=y=D(A,1);$[z]||($[z]=function(I){return $.extend(E,I)})({a:l,base:l,iframe:w,img:w,input:w,form:"action",link:l,script:w});k=$[z];function v(L,J,K,I){if(!G(K)&&typeof K!=="object"){I=K;K=J;J=h}return this.each(function(){var O=$(this),M=J||k()[(this.nodeName||"").toLowerCase()]||"",N=M&&O.attr(M)||"";O.attr(M,a[L](N,K,I))})}$.fn[B]=D(v,B);$.fn[F]=D(v,F);b.pushState=s=function(L,I){if(G(L)&&/^#/.test(L)&&I===h){I=2}var K=L!==h,J=c(location.href,K?L:{},K?I:2);location.href=J};b.getState=x=function(I,J){return I===h||typeof I==="boolean"?y(I):y(J)[I]};b.removeState=function(I){var J={};if(I!==h){J=x();$.each($.isArray(I)?I:arguments,function(L,K){delete J[K]})}s(J,2)};e[d]=$.extend(e[d],{add:function(I){var K;function J(M){var L=M[F]=c();M.getState=function(N,O){return N===h||typeof N==="boolean"?m(L,N):m(L,O)[N]};K.apply(this,arguments)}if($.isFunction(I)){K=I;return J}else{K=I.handler;I.handler=J}}})})(jQuery,this);
/*
* jQuery hashchange event - v1.3 - 7/21/2010
* http://benalman.com/projects/jquery-hashchange-plugin/
Oops, something went wrong.

0 comments on commit 8a8530f

Please sign in to comment.