Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Integrated jQuery hashchange event v1.1, which fixes an obscure IE8 E…

…mulateIE7 meta tag compatibility mode bug. Also updated jQuery 1.4a to 1.4.
  • Loading branch information...
commit 935b660748707b185a2b9330b97bd671367284a0 1 parent 222b1b4
Ben Alman authored January 23, 2010
5  README.markdown
Source Rendered
... ...
@@ -1,7 +1,7 @@
1 1
 # jQuery BBQ: Back Button & Query Library #
2 2
 [http://benalman.com/projects/jquery-bbq-plugin/](http://benalman.com/projects/jquery-bbq-plugin/)
3 3
 
4  
-Version: 1.1, Last updated: 1/9/2010
  4
+Version: 1.1.1, Last updated: 1/22/2010
5 5
 
6 6
 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.
7 7
 
@@ -27,7 +27,7 @@ tested with, what browsers it has been tested in, and where the unit tests
27 27
 reside (so you can test it yourself).
28 28
 
29 29
 ### jQuery Versions ###
30  
-1.3.2, 1.4a2
  30
+1.3.2, 1.4
31 31
 
32 32
 ### Browsers Tested ###
33 33
 Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.
@@ -38,6 +38,7 @@ Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.
38 38
 
39 39
 ## Release History ##
40 40
 
  41
+1.1.1 - (1/22/2010) Integrated <jQuery hashchange event> v1.1, which fixes an obscure IE8 EmulateIE7 meta tag compatibility mode bug.  
41 42
 1.1   - (1/9/2010) Broke out the jQuery BBQ event.special window.onhashchange functionality into a separate plugin for users who want just the basic event & back button support, without all the extra awesomeness that BBQ provides. This plugin will be included as part of jQuery BBQ, but also be available separately. See jQuery hashchange event plugin for more information. Also added the $.bbq.removeState method.  
42 43
 1.0.3 - (12/2/2009) Fixed an issue in IE 6 where location.search and location.hash would report incorrectly if the hash contained the ? character. Also $.param.querystring and $.param.fragment will no longer parse params out of a URL that doesn't contain ? or #, respectively.  
43 44
 1.0.2 - (10/10/2009) Fixed an issue in IE 6/7 where the hidden IFRAME caused a "This page contains both secure and nonsecure items." warning when used on an https:// page.  
36  docs/files/jquery-ba-bbq-js.html
@@ -11,15 +11,15 @@
11 11
 
12 12
 
13 13
 
14  
-<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="jQuery_BBQ:Back_ButtonQuery_Library"></a>jQuery BBQ: Back Button &amp; Query Library</h1><div class=CBody><p><b>Version: 1.1, Last updated: 1/9/2010</b></p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Project Home</td><td class=CDLDescription><a href="http://benalman.com/projects/jquery-bbq-plugin/" class=LURL target=_top>http://benalman.com/projects/jquery-bbq-plugin/</a></td></tr><tr><td class=CDLEntry>GitHub</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/" class=LURL target=_top>http://github.com/cowboy/jquery-bbq/</a></td></tr><tr><td class=CDLEntry>Source</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-bbq<wbr>/raw<wbr>/master<wbr>/jquery.ba-bbq.js</a></td></tr><tr><td class=CDLEntry>(Minified)</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.min.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-bbq<wbr>/raw<wbr>/master<wbr>/jquery.ba-bbq.min.js</a> (3.7kb)</td></tr></table><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#jQuery_BBQ:Back_ButtonQuery_Library" >jQuery BBQ: Back Button &amp; Query Library</a></td><td class=SDescription><b>Version: 1.1, Last updated: 1/9/2010</b></td></tr><tr class="SGeneric SMarked"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>These working examples, complete with fully commented code, illustrate a few ways in which this plugin can be used.</td></tr><tr class="SGeneric SMarked"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SSection"><td class=SEntry><a href="#Param(to_string)" >Param (to string)</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.param.querystring" >jQuery.<wbr>param.<wbr>querystring</a></td><td class=SDescription>Retrieve the query string from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.param.querystring(build_url)" >jQuery.<wbr>param.<wbr>querystring (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing query string params, plus any object, params string or URL containing query string params into a new URL.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.param.fragment" >jQuery.<wbr>param.<wbr>fragment</a></td><td class=SDescription>Retrieve the fragment (hash) from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.param.fragment(build_url)" >jQuery.<wbr>param.<wbr>fragment (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing fragment (hash) params, plus any object, params string or URL containing fragment (hash) params into a new URL.</td></tr><tr class="SSection"><td class=SEntry><a href="#Deparam(from_string)" >Deparam (from string)</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.deparam" >jQuery.<wbr>deparam</a></td><td class=SDescription>Deserialize a params string into an object, optionally coercing numbers, booleans, null and undefined values; this method is the counterpart to the internal jQuery.param method.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.deparam.querystring" >jQuery.<wbr>deparam.<wbr>querystring</a></td><td class=SDescription>Parse the query string from a URL or the current window.location, deserializing it into an object, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.deparam.fragment" >jQuery.<wbr>deparam.<wbr>fragment</a></td><td class=SDescription>Parse the fragment (hash) from a URL or the current window.location, deserializing it into an object, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SSection"><td class=SEntry><a href="#Element_manipulation" >Element manipulation</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.elemUrlAttr" >jQuery.<wbr>elemUrlAttr</a></td><td class=SDescription>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.fn.querystring" >jQuery.<wbr>fn.<wbr>querystring</a></td><td class=SDescription>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute. </td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.fn.fragment" >jQuery.<wbr>fn.<wbr>fragment</a></td><td class=SDescription>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute. </td></tr><tr class="SSection"><td class=SEntry><a href="#History,hashchange_event" >History, hashchange event</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.bbq.pushState" >jQuery.<wbr>bbq.<wbr>pushState</a></td><td class=SDescription>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.bbq.getState" >jQuery.<wbr>bbq.<wbr>getState</a></td><td class=SDescription>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.bbq.removeState" >jQuery.<wbr>bbq.<wbr>removeState</a></td><td class=SDescription>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent2 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Files" >Files</a></td><td class=SDescription></td></tr><tr class="SFile SIndent2 SMarked"><td class=SEntry><a href="#jQuery_hashchange_event" >jQuery hashchange event</a></td><td class=SDescription><b>Version: 1.0, Last updated: 1/9/2010</b></td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric SIndent2 SMarked"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>This working example, complete with fully commented code, illustrate one way in which this plugin can be used.</td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric SIndent2 SMarked"><td class=SEntry><a href="#Known_issues" >Known issues</a></td><td class=SDescription>While this jQuery hashchange event implementation is quite stable and robust, there are a few unfortunate browser bugs surrounding expected hashchange event-based behaviors, independent of any JavaScript window.onhashchange abstraction. </td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Properties" >Properties</a></td><td class=SDescription></td></tr><tr class="SProperty SIndent2 SMarked"><td class=SEntry><a href="#jQuery.hashchangeDelay" >jQuery.<wbr>hashchangeDelay</a></td><td class=SDescription>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent2 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>Fired when window.location.hash changes. </td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
  14
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="jQuery_BBQ:Back_ButtonQuery_Library"></a>jQuery BBQ: Back Button &amp; Query Library</h1><div class=CBody><p><b>Version: 1.1.1, Last updated: 1/22/2010</b></p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Project Home</td><td class=CDLDescription><a href="http://benalman.com/projects/jquery-bbq-plugin/" class=LURL target=_top>http://benalman.com/projects/jquery-bbq-plugin/</a></td></tr><tr><td class=CDLEntry>GitHub</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/" class=LURL target=_top>http://github.com/cowboy/jquery-bbq/</a></td></tr><tr><td class=CDLEntry>Source</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-bbq<wbr>/raw<wbr>/master<wbr>/jquery.ba-bbq.js</a></td></tr><tr><td class=CDLEntry>(Minified)</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.min.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-bbq<wbr>/raw<wbr>/master<wbr>/jquery.ba-bbq.min.js</a> (3.7kb)</td></tr></table><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#jQuery_BBQ:Back_ButtonQuery_Library" >jQuery BBQ: Back Button &amp; Query Library</a></td><td class=SDescription><b>Version: 1.1.1, Last updated: 1/22/2010</b></td></tr><tr class="SGeneric SMarked"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>These working examples, complete with fully commented code, illustrate a few ways in which this plugin can be used.</td></tr><tr class="SGeneric SMarked"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SSection"><td class=SEntry><a href="#Param(to_string)" >Param (to string)</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.param.querystring" >jQuery.<wbr>param.<wbr>querystring</a></td><td class=SDescription>Retrieve the query string from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.param.querystring(build_url)" >jQuery.<wbr>param.<wbr>querystring (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing query string params, plus any object, params string or URL containing query string params into a new URL.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.param.fragment" >jQuery.<wbr>param.<wbr>fragment</a></td><td class=SDescription>Retrieve the fragment (hash) from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.param.fragment(build_url)" >jQuery.<wbr>param.<wbr>fragment (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing fragment (hash) params, plus any object, params string or URL containing fragment (hash) params into a new URL.</td></tr><tr class="SSection"><td class=SEntry><a href="#Deparam(from_string)" >Deparam (from string)</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.deparam" >jQuery.<wbr>deparam</a></td><td class=SDescription>Deserialize a params string into an object, optionally coercing numbers, booleans, null and undefined values; this method is the counterpart to the internal jQuery.param method.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.deparam.querystring" >jQuery.<wbr>deparam.<wbr>querystring</a></td><td class=SDescription>Parse the query string from a URL or the current window.location, deserializing it into an object, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.deparam.fragment" >jQuery.<wbr>deparam.<wbr>fragment</a></td><td class=SDescription>Parse the fragment (hash) from a URL or the current window.location, deserializing it into an object, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SSection"><td class=SEntry><a href="#Element_manipulation" >Element manipulation</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.elemUrlAttr" >jQuery.<wbr>elemUrlAttr</a></td><td class=SDescription>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.fn.querystring" >jQuery.<wbr>fn.<wbr>querystring</a></td><td class=SDescription>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute. </td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.fn.fragment" >jQuery.<wbr>fn.<wbr>fragment</a></td><td class=SDescription>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute. </td></tr><tr class="SSection"><td class=SEntry><a href="#History,hashchange_event" >History, hashchange event</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.bbq.pushState" >jQuery.<wbr>bbq.<wbr>pushState</a></td><td class=SDescription>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SFunction SIndent2"><td class=SEntry><a href="#jQuery.bbq.getState" >jQuery.<wbr>bbq.<wbr>getState</a></td><td class=SDescription>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent2 SMarked"><td class=SEntry><a href="#jQuery.bbq.removeState" >jQuery.<wbr>bbq.<wbr>removeState</a></td><td class=SDescription>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent2 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Files" >Files</a></td><td class=SDescription></td></tr><tr class="SFile SIndent2 SMarked"><td class=SEntry><a href="#jQuery_hashchange_event" >jQuery hashchange event</a></td><td class=SDescription><b>Version: 1.1, Last updated: 1/21/2010</b></td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric SIndent2 SMarked"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>This working example, complete with fully commented code, illustrate one way in which this plugin can be used.</td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric SIndent2 SMarked"><td class=SEntry><a href="#Known_issues" >Known issues</a></td><td class=SDescription>While this jQuery hashchange event implementation is quite stable and robust, there are a few unfortunate browser bugs surrounding expected hashchange event-based behaviors, independent of any JavaScript window.onhashchange abstraction. </td></tr><tr class="SGeneric SIndent2"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Properties" >Properties</a></td><td class=SDescription></td></tr><tr class="SProperty SIndent2 SMarked"><td class=SEntry><a href="#jQuery.hashchangeDelay" >jQuery.<wbr>hashchangeDelay</a></td><td class=SDescription>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent2 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>Fired when window.location.hash changes. </td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
15 15
 
16 16
 <div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="License"></a>License</h3><div class=CBody><p>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses.&nbsp; <a href="http://benalman.com/about/license/" class=LURL target=_top>http://benalman.com/about/license/</a></p></div></div></div>
17 17
 
18 18
 <div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Examples"></a>Examples</h3><div class=CBody><p>These working examples, complete with fully commented code, illustrate a few ways in which this plugin can be used.</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Basic AJAX</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/examples/fragment-basic/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/examples<wbr>/fragment-basic<wbr>/</a></td></tr><tr><td class=CDLEntry>Advanced AJAX</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/examples/fragment-advanced/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/examples<wbr>/fragment-advanced<wbr>/</a></td></tr><tr><td class=CDLEntry>jQuery UI Tabs</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/examples/fragment-jquery-ui-tabs/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/examples<wbr>/fragment-jquery-ui-tabs<wbr>/</a></td></tr><tr><td class=CDLEntry>Deparam</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/examples/deparam/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/examples<wbr>/deparam<wbr>/</a></td></tr></table></div></div></div>
19 19
 
20  
-<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Support_and_Testing"></a>Support and Testing</h3><div class=CBody><p>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>jQuery Versions</td><td class=CDLDescription>1.3.2, 1.4a2</td></tr><tr><td class=CDLEntry>Browsers Tested</td><td class=CDLDescription>Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.</td></tr><tr><td class=CDLEntry>Unit Tests</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/unit/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/unit<wbr>/</a></td></tr></table></div></div></div>
  20
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Support_and_Testing"></a>Support and Testing</h3><div class=CBody><p>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>jQuery Versions</td><td class=CDLDescription>1.3.2, 1.4</td></tr><tr><td class=CDLEntry>Browsers Tested</td><td class=CDLDescription>Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.</td></tr><tr><td class=CDLEntry>Unit Tests</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-bbq/unit/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-bbq<wbr>/unit<wbr>/</a></td></tr></table></div></div></div>
21 21
 
22  
-<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Release_History"></a>Release History</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>1.1</td><td class=CDLDescription>(1/9/2010) Broke out the jQuery BBQ event.special window.onhashchange functionality into a separate plugin for users who want just the basic event &amp; back button support, without all the extra awesomeness that BBQ provides.&nbsp; This plugin will be included as part of jQuery BBQ, but also be available separately.&nbsp; See <a href="#jQuery_hashchange_event" class=LFile id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">jQuery hashchange event</a> plugin for more information.&nbsp; Also added the $.bbq.removeState method and added additional $.deparam examples.</td></tr><tr><td class=CDLEntry>1.0.3</td><td class=CDLDescription>(12/2/2009) Fixed an issue in IE 6 where location.search and location.hash would report incorrectly if the hash contained the ? character.&nbsp; Also $.param.querystring and $.param.fragment will no longer parse params out of a URL that doesn&rsquo;t contain ? or #, respectively.</td></tr><tr><td class=CDLEntry>1.0.2</td><td class=CDLDescription>(10/10/2009) Fixed an issue in IE 6/7 where the hidden IFRAME caused a &ldquo;This page contains both secure and nonsecure items.&rdquo; warning when used on an <a href="https://" class=LURL target=_top>https://</a> page.</td></tr><tr><td class=CDLEntry>1.0.1</td><td class=CDLDescription>(10/7/2009) Fixed an issue in IE 8.&nbsp; Since both &ldquo;IE7&rdquo; and &ldquo;IE8 Compatibility View&rdquo; modes erroneously report that the browser supports the native window.onhashchange event, a slightly more robust test needed to be added.</td></tr><tr><td class=CDLEntry>1.0</td><td class=CDLDescription>(10/2/2009) Initial release</td></tr></table></div></div></div>
  22
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Release_History"></a>Release History</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>1.1.1</td><td class=CDLDescription>(1/22/2010) Integrated <a href="#jQuery_hashchange_event" class=LFile id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">jQuery hashchange event</a> v1.1, which fixes an obscure IE8 EmulateIE7 meta tag compatibility mode bug.</td></tr><tr><td class=CDLEntry>1.1</td><td class=CDLDescription>(1/9/2010) Broke out the jQuery BBQ event.special window.onhashchange functionality into a separate plugin for users who want just the basic event &amp; back button support, without all the extra awesomeness that BBQ provides.&nbsp; This plugin will be included as part of jQuery BBQ, but also be available separately.&nbsp; See <a href="#jQuery_hashchange_event" class=LFile id=link5 onMouseOver="ShowTip(event, 'tt2', 'link5')" onMouseOut="HideTip('tt2')">jQuery hashchange event</a> plugin for more information.&nbsp; Also added the $.bbq.removeState method and added additional $.deparam examples.</td></tr><tr><td class=CDLEntry>1.0.3</td><td class=CDLDescription>(12/2/2009) Fixed an issue in IE 6 where location.search and location.hash would report incorrectly if the hash contained the ? character.&nbsp; Also $.param.querystring and $.param.fragment will no longer parse params out of a URL that doesn&rsquo;t contain ? or #, respectively.</td></tr><tr><td class=CDLEntry>1.0.2</td><td class=CDLDescription>(10/10/2009) Fixed an issue in IE 6/7 where the hidden IFRAME caused a &ldquo;This page contains both secure and nonsecure items.&rdquo; warning when used on an <a href="https://" class=LURL target=_top>https://</a> page.</td></tr><tr><td class=CDLEntry>1.0.1</td><td class=CDLDescription>(10/7/2009) Fixed an issue in IE 8.&nbsp; Since both &ldquo;IE7&rdquo; and &ldquo;IE8 Compatibility View&rdquo; modes erroneously report that the browser supports the native window.onhashchange event, a slightly more robust test needed to be added.</td></tr><tr><td class=CDLEntry>1.0</td><td class=CDLDescription>(10/2/2009) Initial release</td></tr></table></div></div></div>
23 23
 
24 24
 <div class="CSection"><div class=CTopic><h2 class=CTitle><a name="Param(to_string)"></a>Param (to string)</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.param.querystring" >jQuery.<wbr>param.<wbr>querystring</a></td><td class=SDescription>Retrieve the query string from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent1"><td class=SEntry><a href="#jQuery.param.querystring(build_url)" >jQuery.<wbr>param.<wbr>querystring (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing query string params, plus any object, params string or URL containing query string params into a new URL.</td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.param.fragment" >jQuery.<wbr>param.<wbr>fragment</a></td><td class=SDescription>Retrieve the fragment (hash) from a URL or if no arguments are passed, the current window.location.</td></tr><tr class="SFunction SIndent1"><td class=SEntry><a href="#jQuery.param.fragment(build_url)" >jQuery.<wbr>param.<wbr>fragment (build url)</a></td><td class=SDescription>Merge a URL, with or without pre-existing fragment (hash) params, plus any object, params string or URL containing fragment (hash) params into a new URL.</td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
25 25
 
@@ -47,59 +47,59 @@
47 47
 
48 48
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
49 49
 
50  
-<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.elemUrlAttr"></a>jQuery.<wbr>elemUrlAttr</h3><div class=CBody><p>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</p><p>In the <a href="#jQuery.fn.querystring" class=LFunction id=link5 onMouseOver="ShowTip(event, 'tt3', 'link5')" onMouseOut="HideTip('tt3')">jQuery.fn.querystring</a> and <a href="#jQuery.fn.fragment" class=LFunction id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">jQuery.fn.fragment</a> methods, this list is used to determine which attribute contains the URL to be modified, if an &ldquo;attr&rdquo; param is not specified.</p><h4 class=CHeading>Default Tag-Attribute List</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>a</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>base</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>iframe</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>img</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>input</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>form</td><td class=CDLDescription>action</td></tr><tr><td class=CDLEntry>link</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>script</td><td class=CDLDescription>src</td></tr></table><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.elemUrlAttr( [ tag_attr ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>tag_attr</td><td class=CDLDescription>(Object) An object containing a list of tag names and their associated default attribute names in the format { tag: &lsquo;attr&rsquo;, ...&nbsp; } to be merged into the internal tag-attribute list.</td></tr></table><h4 class=CHeading>Returns</h4><p>(Object) An object containing all stored tag-attribute values.</p></div></div></div>
  50
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.elemUrlAttr"></a>jQuery.<wbr>elemUrlAttr</h3><div class=CBody><p>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</p><p>In the <a href="#jQuery.fn.querystring" class=LFunction id=link6 onMouseOver="ShowTip(event, 'tt3', 'link6')" onMouseOut="HideTip('tt3')">jQuery.fn.querystring</a> and <a href="#jQuery.fn.fragment" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')">jQuery.fn.fragment</a> methods, this list is used to determine which attribute contains the URL to be modified, if an &ldquo;attr&rdquo; param is not specified.</p><h4 class=CHeading>Default Tag-Attribute List</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>a</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>base</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>iframe</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>img</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>input</td><td class=CDLDescription>src</td></tr><tr><td class=CDLEntry>form</td><td class=CDLDescription>action</td></tr><tr><td class=CDLEntry>link</td><td class=CDLDescription>href</td></tr><tr><td class=CDLEntry>script</td><td class=CDLDescription>src</td></tr></table><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.elemUrlAttr( [ tag_attr ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>tag_attr</td><td class=CDLDescription>(Object) An object containing a list of tag names and their associated default attribute names in the format { tag: &lsquo;attr&rsquo;, ...&nbsp; } to be merged into the internal tag-attribute list.</td></tr></table><h4 class=CHeading>Returns</h4><p>(Object) An object containing all stored tag-attribute values.</p></div></div></div>
51 51
 
52  
-<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.fn.querystring"></a>jQuery.<wbr>fn.<wbr>querystring</h3><div class=CBody><p>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute.&nbsp; Like <a href="#jQuery.param.querystring(build_url)" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt5', 'link7')" onMouseOut="HideTip('tt5')">jQuery.param.querystring (build url)</a>, but for all elements in a jQuery collection.</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery('selector').querystring( [ attr, ] params [, merge_mode ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>attr</td><td class=CDLDescription>(String) Optional name of an attribute that will contain a URL to merge params or url into.&nbsp; See <a href="#jQuery.elemUrlAttr" class=LFunction id=link8 onMouseOver="ShowTip(event, 'tt6', 'link8')" onMouseOut="HideTip('tt6')">jQuery.elemUrlAttr</a> for a list of default attributes.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A URL containing query string params, or params string to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified, and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in attr URL.</li><li>1: any params in attr URL will override params in the params argument.</li><li>2: params argument will completely replace any query string in attr URL.</li></ul><h4 class=CHeading>Returns</h4><p>(jQuery) The initial jQuery collection of elements, but with modified URL attribute values.</p></div></div></div>
  52
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.fn.querystring"></a>jQuery.<wbr>fn.<wbr>querystring</h3><div class=CBody><p>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute.&nbsp; Like <a href="#jQuery.param.querystring(build_url)" class=LFunction id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">jQuery.param.querystring (build url)</a>, but for all elements in a jQuery collection.</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery('selector').querystring( [ attr, ] params [, merge_mode ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>attr</td><td class=CDLDescription>(String) Optional name of an attribute that will contain a URL to merge params or url into.&nbsp; See <a href="#jQuery.elemUrlAttr" class=LFunction id=link9 onMouseOver="ShowTip(event, 'tt6', 'link9')" onMouseOut="HideTip('tt6')">jQuery.elemUrlAttr</a> for a list of default attributes.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A URL containing query string params, or params string to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified, and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in attr URL.</li><li>1: any params in attr URL will override params in the params argument.</li><li>2: params argument will completely replace any query string in attr URL.</li></ul><h4 class=CHeading>Returns</h4><p>(jQuery) The initial jQuery collection of elements, but with modified URL attribute values.</p></div></div></div>
53 53
 
54  
-<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.fn.fragment"></a>jQuery.<wbr>fn.<wbr>fragment</h3><div class=CBody><p>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute.&nbsp; Like <a href="#jQuery.param.fragment(build_url)" class=LFunction id=link9 onMouseOver="ShowTip(event, 'tt7', 'link9')" onMouseOut="HideTip('tt7')">jQuery.param.fragment (build url)</a>, but for all elements in a jQuery collection.</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery('selector').fragment( [ attr, ] params [, merge_mode ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>attr</td><td class=CDLDescription>(String) Optional name of an attribute that will contain a URL to merge params into.&nbsp; See <a href="#jQuery.elemUrlAttr" class=LFunction id=link10 onMouseOver="ShowTip(event, 'tt6', 'link10')" onMouseOut="HideTip('tt6')">jQuery.elemUrlAttr</a> for a list of default attributes.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A URL containing fragment (hash) params, or params string to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified, and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in attr URL.</li><li>1: any params in attr URL will override params in the params argument.</li><li>2: params argument will completely replace any fragment (hash) in attr URL.</li></ul><h4 class=CHeading>Returns</h4><p>(jQuery) The initial jQuery collection of elements, but with modified URL attribute values.</p></div></div></div>
  54
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.fn.fragment"></a>jQuery.<wbr>fn.<wbr>fragment</h3><div class=CBody><p>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute.&nbsp; Like <a href="#jQuery.param.fragment(build_url)" class=LFunction id=link10 onMouseOver="ShowTip(event, 'tt7', 'link10')" onMouseOut="HideTip('tt7')">jQuery.param.fragment (build url)</a>, but for all elements in a jQuery collection.</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery('selector').fragment( [ attr, ] params [, merge_mode ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>attr</td><td class=CDLDescription>(String) Optional name of an attribute that will contain a URL to merge params into.&nbsp; See <a href="#jQuery.elemUrlAttr" class=LFunction id=link11 onMouseOver="ShowTip(event, 'tt6', 'link11')" onMouseOut="HideTip('tt6')">jQuery.elemUrlAttr</a> for a list of default attributes.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A URL containing fragment (hash) params, or params string to be merged into the URL attribute.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified, and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in attr URL.</li><li>1: any params in attr URL will override params in the params argument.</li><li>2: params argument will completely replace any fragment (hash) in attr URL.</li></ul><h4 class=CHeading>Returns</h4><p>(jQuery) The initial jQuery collection of elements, but with modified URL attribute values.</p></div></div></div>
55 55
 
56  
-<div class="CSection"><div class=CTopic><h2 class=CTitle><a name="History,hashchange_event"></a>History, hashchange event</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.bbq.pushState" >jQuery.<wbr>bbq.<wbr>pushState</a></td><td class=SDescription>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SFunction SIndent1"><td class=SEntry><a href="#jQuery.bbq.getState" >jQuery.<wbr>bbq.<wbr>getState</a></td><td class=SDescription>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.bbq.removeState" >jQuery.<wbr>bbq.<wbr>removeState</a></td><td class=SDescription>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SGroup"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent1 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</td></tr><tr class="SGroup"><td class=SEntry><a href="#Files" >Files</a></td><td class=SDescription></td></tr><tr class="SFile SIndent1 SMarked"><td class=SEntry><a href="#jQuery_hashchange_event" >jQuery hashchange event</a></td><td class=SDescription><b>Version: 1.0, Last updated: 1/9/2010</b></td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric SIndent1 SMarked"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>This working example, complete with fully commented code, illustrate one way in which this plugin can be used.</td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric SIndent1 SMarked"><td class=SEntry><a href="#Known_issues" >Known issues</a></td><td class=SDescription>While this jQuery hashchange event implementation is quite stable and robust, there are a few unfortunate browser bugs surrounding expected hashchange event-based behaviors, independent of any JavaScript window.onhashchange abstraction. </td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Properties" >Properties</a></td><td class=SDescription></td></tr><tr class="SProperty SIndent1 SMarked"><td class=SEntry><a href="#jQuery.hashchangeDelay" >jQuery.<wbr>hashchangeDelay</a></td><td class=SDescription>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes. </td></tr><tr class="SGroup"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent1 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>Fired when window.location.hash changes. </td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
  56
+<div class="CSection"><div class=CTopic><h2 class=CTitle><a name="History,hashchange_event"></a>History, hashchange event</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.bbq.pushState" >jQuery.<wbr>bbq.<wbr>pushState</a></td><td class=SDescription>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SFunction SIndent1"><td class=SEntry><a href="#jQuery.bbq.getState" >jQuery.<wbr>bbq.<wbr>getState</a></td><td class=SDescription>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#jQuery.bbq.removeState" >jQuery.<wbr>bbq.<wbr>removeState</a></td><td class=SDescription>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</td></tr><tr class="SGroup"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent1 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</td></tr><tr class="SGroup"><td class=SEntry><a href="#Files" >Files</a></td><td class=SDescription></td></tr><tr class="SFile SIndent1 SMarked"><td class=SEntry><a href="#jQuery_hashchange_event" >jQuery hashchange event</a></td><td class=SDescription><b>Version: 1.1, Last updated: 1/21/2010</b></td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#License" >License</a></td><td class=SDescription>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses. </td></tr><tr class="SGeneric SIndent1 SMarked"><td class=SEntry><a href="#Examples" >Examples</a></td><td class=SDescription>This working example, complete with fully commented code, illustrate one way in which this plugin can be used.</td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#Support_and_Testing" >Support and Testing</a></td><td class=SDescription>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</td></tr><tr class="SGeneric SIndent1 SMarked"><td class=SEntry><a href="#Known_issues" >Known issues</a></td><td class=SDescription>While this jQuery hashchange event implementation is quite stable and robust, there are a few unfortunate browser bugs surrounding expected hashchange event-based behaviors, independent of any JavaScript window.onhashchange abstraction. </td></tr><tr class="SGeneric SIndent1"><td class=SEntry><a href="#Release_History" >Release History</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Properties" >Properties</a></td><td class=SDescription></td></tr><tr class="SProperty SIndent1 SMarked"><td class=SEntry><a href="#jQuery.hashchangeDelay" >jQuery.<wbr>hashchangeDelay</a></td><td class=SDescription>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes. </td></tr><tr class="SGroup"><td class=SEntry><a href="#Events" >Events</a></td><td class=SDescription></td></tr><tr class="SEvent SIndent1 SMarked"><td class=SEntry><a href="#window.onhashchange" >window.<wbr>onhashchange</a></td><td class=SDescription>Fired when window.location.hash changes. </td></tr></table></div></div><!--END_ND_SUMMARY--></div></div></div>
57 57
 
58 58
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
59 59
 
60  
-<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.bbq.pushState"></a>jQuery.<wbr>bbq.<wbr>pushState</h3><div class=CBody><p>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</p><p>If no arguments are passed, an empty state is created, which is just a shortcut for jQuery.bbq.pushState( {}, 2 ).</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.bbq.pushState( [ params [, merge_mode ] ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A serialized params string or a hash string beginning with # to merge into location.hash.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to merge into location.hash.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified (unless a hash string beginning with # is specified, in which case merge behavior defaults to 2), and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in the current state.</li><li>1: any params in the current state will override params in the params argument.</li><li>2: params argument will completely replace current state.</li></ul><h4 class=CHeading>Returns</h4><p>Nothing.</p><h4 class=CHeading>Additional Notes</h4><ul><li>Setting an empty state may cause the browser to scroll.</li><li>Unlike the fragment and querystring methods, if a hash string beginning with # is specified as the params agrument, merge_mode defaults to 2.</li></ul></div></div></div>
  60
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.bbq.pushState"></a>jQuery.<wbr>bbq.<wbr>pushState</h3><div class=CBody><p>Adds a &lsquo;state&rsquo; into the browser history at the current position, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link15 onMouseOver="ShowTip(event, 'tt1', 'link15')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</p><p>If no arguments are passed, an empty state is created, which is just a shortcut for jQuery.bbq.pushState( {}, 2 ).</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.bbq.pushState( [ params [, merge_mode ] ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>params</td><td class=CDLDescription>(String) A serialized params string or a hash string beginning with # to merge into location.hash.</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>(Object) A params object to merge into location.hash.</td></tr><tr><td class=CDLEntry>merge_mode</td><td class=CDLDescription>(Number) Merge behavior defaults to 0 if merge_mode is not specified (unless a hash string beginning with # is specified, in which case merge behavior defaults to 2), and is as-follows:</td></tr></table><ul><li>0: params in the params argument will override any params in the current state.</li><li>1: any params in the current state will override params in the params argument.</li><li>2: params argument will completely replace current state.</li></ul><h4 class=CHeading>Returns</h4><p>Nothing.</p><h4 class=CHeading>Additional Notes</h4><ul><li>Setting an empty state may cause the browser to scroll.</li><li>Unlike the fragment and querystring methods, if a hash string beginning with # is specified as the params agrument, merge_mode defaults to 2.</li></ul></div></div></div>
61 61
 
62 62
 <div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.bbq.getState"></a>jQuery.<wbr>bbq.<wbr>getState</h3><div class=CBody><p>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.bbq.getState( [ key ] [, coerce ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>key</td><td class=CDLDescription>(String) An optional state key for which to return a value.</td></tr><tr><td class=CDLEntry>coerce</td><td class=CDLDescription>(Boolean) If true, coerces any numbers or true, false, null, and undefined to their actual value.&nbsp; Defaults to false.</td></tr></table><h4 class=CHeading>Returns</h4><p>(Anything) If key is passed, returns the value corresponding with that key in the location.hash &lsquo;state&rsquo;, or undefined.&nbsp; If not, an object representing the entire &lsquo;state&rsquo; is returned.</p></div></div></div>
63 63
 
64  
-<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.bbq.removeState"></a>jQuery.<wbr>bbq.<wbr>removeState</h3><div class=CBody><p>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link15 onMouseOver="ShowTip(event, 'tt1', 'link15')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</p><p>If no arguments are passed, an empty state is created, which is just a shortcut for jQuery.bbq.pushState( {}, 2 ).</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.bbq.removeState( [ key [, key ... ] ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>key</td><td class=CDLDescription>(String) One or more key values to remove from the current state, passed as individual arguments.</td></tr><tr><td class=CDLEntry>key</td><td class=CDLDescription>(Array) A single array argument that contains a list of key values to remove from the current state.</td></tr></table><h4 class=CHeading>Returns</h4><p>Nothing.</p><h4 class=CHeading>Additional Notes</h4><ul><li>Setting an empty state may cause the browser to scroll.</li></ul></div></div></div>
  64
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="jQuery.bbq.removeState"></a>jQuery.<wbr>bbq.<wbr>removeState</h3><div class=CBody><p>Remove one or more keys from the current browser history &lsquo;state&rsquo;, creating a new state, setting location.hash and triggering any bound <a href="#window.onhashchange" class=LEvent id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">window.onhashchange</a> event callbacks (provided the new state is different than the previous state).</p><p>If no arguments are passed, an empty state is created, which is just a shortcut for jQuery.bbq.pushState( {}, 2 ).</p><h4 class=CHeading>Usage</h4><blockquote><pre>jQuery.bbq.removeState( [ key [, key ... ] ] );</pre></blockquote><h4 class=CHeading>Arguments</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>key</td><td class=CDLDescription>(String) One or more key values to remove from the current state, passed as individual arguments.</td></tr><tr><td class=CDLEntry>key</td><td class=CDLDescription>(Array) A single array argument that contains a list of key values to remove from the current state.</td></tr></table><h4 class=CHeading>Returns</h4><p>Nothing.</p><h4 class=CHeading>Additional Notes</h4><ul><li>Setting an empty state may cause the browser to scroll.</li></ul></div></div></div>
65 65
 
66 66
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Events"></a>Events</h3></div></div>
67 67
 
68  
-<div class="CEvent"><div class=CTopic><h3 class=CTitle><a name="window.onhashchange"></a>window.<wbr>onhashchange</h3><div class=CBody><h4 class=CHeading>Usage in 1.4a2 and newer</h4><p>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</p><p>e.fragment is equivalent to the output of <a href="#jQuery.param.fragment" class=LFunction id=link16 onMouseOver="ShowTip(event, 'tt8', 'link16')" onMouseOut="HideTip('tt8')">jQuery.param.fragment</a>, and e.getState() is equivalent to <a href="#jQuery.bbq.getState" class=LFunction id=link17 onMouseOver="ShowTip(event, 'tt9', 'link17')" onMouseOut="HideTip('tt9')">jQuery.bbq.getState</a>, except that they refer to the event-specific state value stored in the event object, instead of the current window.location, allowing the event object to be referenced later, even if window.location has changed.</p><blockquote><pre>$(window).bind( 'hashchange', function(e) {
  68
+<div class="CEvent"><div class=CTopic><h3 class=CTitle><a name="window.onhashchange"></a>window.<wbr>onhashchange</h3><div class=CBody><h4 class=CHeading>Usage in 1.4 and newer</h4><p>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</p><p>e.fragment is equivalent to the output of <a href="#jQuery.param.fragment" class=LFunction id=link17 onMouseOver="ShowTip(event, 'tt8', 'link17')" onMouseOut="HideTip('tt8')">jQuery.param.fragment</a>, and e.getState() is equivalent to <a href="#jQuery.bbq.getState" class=LFunction id=link18 onMouseOver="ShowTip(event, 'tt9', 'link18')" onMouseOut="HideTip('tt9')">jQuery.bbq.getState</a>, except that they refer to the event-specific state value stored in the event object, instead of the current window.location, allowing the event object to be referenced later, even if window.location has changed.</p><blockquote><pre>$(window).bind( 'hashchange', function(e) {
69 69
   var hash_str = e.fragment,
70 70
     param_obj = e.getState(),
71 71
     param_val = e.getState( 'param_name' ),
72 72
     param_val_coerced = e.getState( 'param_name', true );
73 73
   ...
74  
-});</pre></blockquote><h4 class=CHeading>Usage in 1.3.2</h4><p>In 1.3.2, the event object is unable to be augmented as in 1.4a2+, so the fragment state isn&rsquo;t bound to the event object and must instead be parsed using the <a href="#jQuery.param.fragment" class=LFunction id=link18 onMouseOver="ShowTip(event, 'tt8', 'link18')" onMouseOut="HideTip('tt8')">jQuery.param.fragment</a> and <a href="#jQuery.bbq.getState" class=LFunction id=link19 onMouseOver="ShowTip(event, 'tt9', 'link19')" onMouseOut="HideTip('tt9')">jQuery.bbq.getState</a> methods.</p><blockquote><pre>$(window).bind( 'hashchange', function(e) {
  74
+});</pre></blockquote><h4 class=CHeading>Usage in 1.3.2</h4><p>In 1.3.2, the event object is unable to be augmented as in 1.4+, so the fragment state isn&rsquo;t bound to the event object and must instead be parsed using the <a href="#jQuery.param.fragment" class=LFunction id=link19 onMouseOver="ShowTip(event, 'tt8', 'link19')" onMouseOut="HideTip('tt8')">jQuery.param.fragment</a> and <a href="#jQuery.bbq.getState" class=LFunction id=link20 onMouseOver="ShowTip(event, 'tt9', 'link20')" onMouseOut="HideTip('tt9')">jQuery.bbq.getState</a> methods.</p><blockquote><pre>$(window).bind( 'hashchange', function(e) {
75 75
   var hash_str = $.param.fragment(),
76 76
     param_obj = $.bbq.getState(),
77 77
     param_val = $.bbq.getState( 'param_name' ),
78 78
     param_val_coerced = $.bbq.getState( 'param_name', true );
79 79
   ...
80  
-});</pre></blockquote><h4 class=CHeading>Additional Notes</h4><ul><li>See <a href="#jQuery_hashchange_event" class=LFile id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">jQuery hashchange event</a> for more detailed information.</li></ul></div></div></div>
  80
+});</pre></blockquote><h4 class=CHeading>Additional Notes</h4><ul><li>See <a href="#jQuery_hashchange_event" class=LFile id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt2')">jQuery hashchange event</a> for more detailed information.</li></ul></div></div></div>
81 81
 
82 82
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Files"></a>Files</h3></div></div>
83 83
 
84  
-<div class="CFile"><div class=CTopic><h3 class=CTitle><a name="jQuery_hashchange_event"></a>jQuery hashchange event</h3><div class=CBody><p><b>Version: 1.0, Last updated: 1/9/2010</b></p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Project Home</td><td class=CDLDescription><a href="http://benalman.com/projects/jquery-hashchange-plugin/" class=LURL target=_top>http://benalman.com<wbr>/projects<wbr>/jquery-hashchange-plugin<wbr>/</a></td></tr><tr><td class=CDLEntry>GitHub</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/" class=LURL target=_top>http://github.com/cowboy/jquery-hashchange/</a></td></tr><tr><td class=CDLEntry>Source</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-hashchange<wbr>/raw<wbr>/master<wbr>/jquery.ba-hashchange.js</a></td></tr><tr><td class=CDLEntry>(Minified)</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-hashchange<wbr>/raw<wbr>/master<wbr>/jquery.ba-hashchange.min.js</a> (1.1kb)</td></tr></table></div></div></div>
  84
+<div class="CFile"><div class=CTopic><h3 class=CTitle><a name="jQuery_hashchange_event"></a>jQuery hashchange event</h3><div class=CBody><p><b>Version: 1.1, Last updated: 1/21/2010</b></p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Project Home</td><td class=CDLDescription><a href="http://benalman.com/projects/jquery-hashchange-plugin/" class=LURL target=_top>http://benalman.com<wbr>/projects<wbr>/jquery-hashchange-plugin<wbr>/</a></td></tr><tr><td class=CDLEntry>GitHub</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/" class=LURL target=_top>http://github.com/cowboy/jquery-hashchange/</a></td></tr><tr><td class=CDLEntry>Source</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-hashchange<wbr>/raw<wbr>/master<wbr>/jquery.ba-hashchange.js</a></td></tr><tr><td class=CDLEntry>(Minified)</td><td class=CDLDescription><a href="http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js" class=LURL target=_top>http://github.com<wbr>/cowboy<wbr>/jquery-hashchange<wbr>/raw<wbr>/master<wbr>/jquery.ba-hashchange.min.js</a> (1.1kb)</td></tr></table></div></div></div>
85 85
 
86 86
 <div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="License"></a>License</h3><div class=CBody><p>Copyright &copy; 2010 &ldquo;Cowboy&rdquo; Ben Alman, Dual licensed under the MIT and GPL licenses.&nbsp; <a href="http://benalman.com/about/license/" class=LURL target=_top>http://benalman.com/about/license/</a></p></div></div></div>
87 87
 
88 88
 <div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Examples"></a>Examples</h3><div class=CBody><p>This working example, complete with fully commented code, illustrate one way in which this plugin can be used.</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>hashchange event</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/examples<wbr>/hashchange<wbr>/</a></td></tr></table></div></div></div>
89 89
 
90  
-<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Support_and_Testing"></a>Support and Testing</h3><div class=CBody><p>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>jQuery Versions</td><td class=CDLDescription>1.3.2, 1.4a2</td></tr><tr><td class=CDLEntry>Browsers Tested</td><td class=CDLDescription>Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.</td></tr><tr><td class=CDLEntry>Unit Tests</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/unit/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/unit<wbr>/</a></td></tr></table></div></div></div>
  90
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Support_and_Testing"></a>Support and Testing</h3><div class=CBody><p>Information about what version or versions of jQuery this plugin has been tested with, what browsers it has been tested in, and where the unit tests reside (so you can test it yourself).</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>jQuery Versions</td><td class=CDLDescription>1.3.2, 1.4</td></tr><tr><td class=CDLEntry>Browsers Tested</td><td class=CDLDescription>Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.</td></tr><tr><td class=CDLEntry>Unit Tests</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/unit/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/unit<wbr>/</a></td></tr></table></div></div></div>
91 91
 
92 92
 <div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Known_issues"></a>Known issues</h3><div class=CBody><p>While this jQuery hashchange event implementation is quite stable and robust, there are a few unfortunate browser bugs surrounding expected hashchange event-based behaviors, independent of any JavaScript window.onhashchange abstraction.&nbsp; See the following examples for more information:</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Chrome: Back Button</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/examples<wbr>/bug-chrome-back-button<wbr>/</a></td></tr><tr><td class=CDLEntry>Firefox: Remote XMLHttpRequest</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/examples<wbr>/bug-firefox-remote-xhr<wbr>/</a></td></tr><tr><td class=CDLEntry>WebKit: Back Button in an Iframe</td><td class=CDLDescription><a href="http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/" class=LURL target=_top>http://benalman.com<wbr>/code<wbr>/projects<wbr>/jquery-hashchange<wbr>/examples<wbr>/bug-webkit-hash-iframe<wbr>/</a></td></tr></table></div></div></div>
93 93
 
94  
-<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Release_History"></a>Release History</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>1.0</td><td class=CDLDescription>(1/9/2010) Initial Release.&nbsp; Broke out the jQuery BBQ event.special window.onhashchange functionality into a separate plugin for users who want just the basic event &amp; back button support, without all the extra awesomeness that BBQ provides.&nbsp; This plugin will be included as part of jQuery BBQ, but also be available separately.</td></tr></table></div></div></div>
  94
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="Release_History"></a>Release History</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>1.1</td><td class=CDLDescription>(1/21/2010) Incorporated document.documentMode test to fix IE8 bug where browser version is incorrectly reported as 8.0, despite inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.</td></tr><tr><td class=CDLEntry>1.0</td><td class=CDLDescription>(1/9/2010) Initial Release.&nbsp; Broke out the jQuery BBQ event.special window.onhashchange functionality into a separate plugin for users who want just the basic event &amp; back button support, without all the extra awesomeness that BBQ provides.&nbsp; This plugin will be included as part of jQuery BBQ, but also be available separately.</td></tr></table></div></div></div>
95 95
 
96 96
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Properties"></a>Properties</h3></div></div>
97 97
 
98  
-<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="jQuery.hashchangeDelay"></a>jQuery.<wbr>hashchangeDelay</h3><div class=CBody><p>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes.&nbsp; Defaults to 100.</p></div></div></div>
  98
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="jQuery.hashchangeDelay"></a>jQuery.<wbr>hashchangeDelay</h3><div class=CBody><p>The numeric interval (in milliseconds) at which the <a href="#window.onhashchange" class=LEvent id=link22 onMouseOver="ShowTip(event, 'tt1', 'link22')" onMouseOut="HideTip('tt1')">window.onhashchange</a> polling loop executes.&nbsp; Defaults to 100.</p></div></div></div>
99 99
 
100 100
 <div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Events"></a>Events</h3></div></div>
101 101
 
102  
-<div class="CEvent"><div class=CTopic><h3 class=CTitle><a name="window.onhashchange"></a>window.<wbr>onhashchange</h3><div class=CBody><p>Fired when window.location.hash changes.&nbsp; In browsers that support it, the native window.onhashchange event is used (IE8, FF3.6), otherwise a polling loop is initialized, running every <a href="#jQuery.hashchangeDelay" class=LProperty id=link22 onMouseOver="ShowTip(event, 'tt10', 'link22')" onMouseOut="HideTip('tt10')">jQuery.hashchangeDelay</a> milliseconds to see if the hash has changed.&nbsp; In IE 6 and 7, a hidden IFRAME is created to allow the back button and hash-based history to work.</p><h4 class=CHeading>Usage</h4><blockquote><pre>$(window).bind( 'hashchange', function(e) {
  102
+<div class="CEvent"><div class=CTopic><h3 class=CTitle><a name="window.onhashchange"></a>window.<wbr>onhashchange</h3><div class=CBody><p>Fired when window.location.hash changes.&nbsp; In browsers that support it, the native window.onhashchange event is used (IE8, FF3.6), otherwise a polling loop is initialized, running every <a href="#jQuery.hashchangeDelay" class=LProperty id=link23 onMouseOver="ShowTip(event, 'tt10', 'link23')" onMouseOut="HideTip('tt10')">jQuery.hashchangeDelay</a> milliseconds to see if the hash has changed.&nbsp; In IE 6 and 7, a hidden IFRAME is created to allow the back button and hash-based history to work.</p><h4 class=CHeading>Usage</h4><blockquote><pre>$(window).bind( 'hashchange', function(e) {
103 103
   var hash = location.hash;
104 104
   ...
105 105
 });</pre></blockquote><h4 class=CHeading>Additional Notes</h4><ul><li>The polling loop and iframe are not created until at least one callback is actually bound to &lsquo;hashchange&rsquo;.</li><li>If you need the bound callback(s) to execute immediately, in cases where the page &lsquo;state&rsquo; exists on page load (via bookmark or page refresh, for example) use $(window).trigger( &lsquo;hashchange&rsquo; );</li></ul></div></div></div>
@@ -117,7 +117,7 @@
117 117
 
118 118
 
119 119
 <!--START_ND_TOOLTIPS-->
120  
-<div class=CToolTip id="tt1"><div class=CEvent>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.0, Last updated: 1/9/2010</b></div></div><div class=CToolTip id="tt3"><div class=CFunction>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute. </div></div><div class=CToolTip id="tt4"><div class=CFunction>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute. </div></div><div class=CToolTip id="tt5"><div class=CFunction>Merge a URL, with or without pre-existing query string params, plus any object, params string or URL containing query string params into a new URL.</div></div><div class=CToolTip id="tt6"><div class=CFunction>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</div></div><div class=CToolTip id="tt7"><div class=CFunction>Merge a URL, with or without pre-existing fragment (hash) params, plus any object, params string or URL containing fragment (hash) params into a new URL.</div></div><div class=CToolTip id="tt8"><div class=CFunction>Retrieve the fragment (hash) from a URL or if no arguments are passed, the current window.location.</div></div><div class=CToolTip id="tt9"><div class=CFunction>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</div></div><div class=CToolTip id="tt10"><div class=CProperty>The numeric interval (in milliseconds) at which the window.onhashchange polling loop executes. </div></div><!--END_ND_TOOLTIPS-->
  120
+<div class=CToolTip id="tt1"><div class=CEvent>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.1, Last updated: 1/21/2010</b></div></div><div class=CToolTip id="tt3"><div class=CFunction>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing query string params) plus any params object or string into a new URL, which is then set into that attribute. </div></div><div class=CToolTip id="tt4"><div class=CFunction>Update URL attribute in one or more elements, merging the current URL (with or without pre-existing fragment/hash params) plus any params object or string into a new URL, which is then set into that attribute. </div></div><div class=CToolTip id="tt5"><div class=CFunction>Merge a URL, with or without pre-existing query string params, plus any object, params string or URL containing query string params into a new URL.</div></div><div class=CToolTip id="tt6"><div class=CFunction>Get the internal &ldquo;Default URL attribute per tag&rdquo; list, or augment the list with additional tag-attribute pairs, in case the defaults are insufficient.</div></div><div class=CToolTip id="tt7"><div class=CFunction>Merge a URL, with or without pre-existing fragment (hash) params, plus any object, params string or URL containing fragment (hash) params into a new URL.</div></div><div class=CToolTip id="tt8"><div class=CFunction>Retrieve the fragment (hash) from a URL or if no arguments are passed, the current window.location.</div></div><div class=CToolTip id="tt9"><div class=CFunction>Retrieves the current &lsquo;state&rsquo; from the browser history, parsing location.hash for a specific key or returning an object containing the entire state, optionally coercing numbers, booleans, null and undefined values.</div></div><div class=CToolTip id="tt10"><div class=CProperty>The numeric interval (in milliseconds) at which the window.onhashchange polling loop executes. </div></div><!--END_ND_TOOLTIPS-->
121 121
 
122 122
 
123 123
 
2  docs/index/Events.html
@@ -13,7 +13,7 @@
13 13
 
14 14
 <div id=Index><div class=IPageTitle>Event 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; J &middot; K &middot; L &middot; M &middot; N &middot; <a href="#O">O</a> &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="O"></a>O</td><td></td></tr><tr><td class=ISymbolPrefix id=IOnlySymbolPrefix>&nbsp;</td><td class=IEntry><a href="../files/jquery-ba-bbq-js.html#window.onhashchange" id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')" class=ISymbol>onhashchange</a>, <span class=IParent>window</span></td></tr></table>
15 15
 <!--START_ND_TOOLTIPS-->
16  
-<div class=CToolTip id="tt1"><div class=CEvent>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><!--END_ND_TOOLTIPS-->
  16
+<div class=CToolTip id="tt1"><div class=CEvent>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><!--END_ND_TOOLTIPS-->
17 17
 
18 18
 </div><!--Index-->
19 19
 
2  docs/index/Files.html
@@ -13,7 +13,7 @@
13 13
 
14 14
 <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>
15 15
 <!--START_ND_TOOLTIPS-->
16  
-<div class=CToolTip id="tt1"><div class=CFile><b>Version: 1.1, Last updated: 1/9/2010</b></div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.0, Last updated: 1/9/2010</b></div></div><!--END_ND_TOOLTIPS-->
  16
+<div class=CToolTip id="tt1"><div class=CFile><b>Version: 1.1.1, Last updated: 1/22/2010</b></div></div><div class=CToolTip id="tt2"><div class=CFile><b>Version: 1.1, Last updated: 1/21/2010</b></div></div><!--END_ND_TOOLTIPS-->
17 17
 
18 18
 </div><!--Index-->
19 19
 
4  docs/index/General.html
@@ -33,7 +33,7 @@
33 33
 
34 34
 
35 35
 <!--START_ND_TOOLTIPS-->
36  
-<div class=CToolTip id="tt10"><div class=CFile><b>Version: 1.1, Last updated: 1/9/2010</b></div></div><div class=CToolTip id="tt11"><div class=CFile><b>Version: 1.0, Last updated: 1/9/2010</b></div></div><!--END_ND_TOOLTIPS-->
  36
+<div class=CToolTip id="tt10"><div class=CFile><b>Version: 1.1.1, Last updated: 1/22/2010</b></div></div><div class=CToolTip id="tt11"><div class=CFile><b>Version: 1.1, Last updated: 1/21/2010</b></div></div><!--END_ND_TOOLTIPS-->
37 37
 
38 38
 
39 39
 <!--START_ND_TOOLTIPS-->
@@ -45,7 +45,7 @@
45 45
 
46 46
 
47 47
 <!--START_ND_TOOLTIPS-->
48  
-<div class=CToolTip id="tt14"><div class=CEvent>In 1.4a2 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><!--END_ND_TOOLTIPS-->
  48
+<div class=CToolTip id="tt14"><div class=CEvent>In 1.4 and newer, the event object that is passed into the callback is augmented with an additional e.fragment property that contains the current document location.hash state as a string, as well as an e.getState method.</div></div><!--END_ND_TOOLTIPS-->
49 49
 
50 50
 
51 51
 <!--START_ND_TOOLTIPS-->
BIN  docs/nd/Data/ConfigFileInfo.nd
Binary file not shown
4  docs/nd/Data/FileInfo.nd
... ...
@@ -1,4 +1,4 @@
1 1
 1.4
2 2
 JavaScript
3  
-/srv/projects/jquery-bbq2/jquery.ba-bbq.js	1263074809	1	jQuery BBQ: Back Button & Query Library
4  
-/srv/projects/jquery-bbq2/jquery.ba-bbq.min.js	1263074824	0	/srv/projects/jquery-bbq2/jquery.ba-bbq.min.js
  3
+/srv/projects/jquery-bbq/jquery.ba-bbq.min.js	1264209077	0	/srv/projects/jquery-bbq/jquery.ba-bbq.min.js
  4
+/srv/projects/jquery-bbq/jquery.ba-bbq.js	1264209045	1	jQuery BBQ: Back Button & Query Library
BIN  docs/nd/Data/PreviousMenuState.nd
Binary file not shown
BIN  docs/nd/Data/PreviousSettings.nd
Binary file not shown
BIN  docs/nd/Data/SymbolTable.nd
Binary file not shown
2  examples/config.php
@@ -13,7 +13,7 @@
13 13
 ob_end_clean();
14 14
 
15 15
 $shell['jquery'] = 'jquery-1.3.2.js';
16  
-//$shell['jquery'] = 'jquery-1.4a2.js';
  16
+//$shell['jquery'] = 'jquery-1.4.js';
17 17
 
18 18
 $shell['shBrush'] = array( 'JScript' );
19 19
 
28  jquery.ba-bbq.js
... ...
@@ -1,5 +1,5 @@
1 1
 /*!
2  
- * jQuery BBQ: Back Button & Query Library - v1.1 - 1/9/2010
  2
+ * jQuery BBQ: Back Button & Query Library - v1.1.1 - 1/22/2010
3 3
  * http://benalman.com/projects/jquery-bbq-plugin/
4 4
  * 
5 5
  * Copyright (c) 2010 "Cowboy" Ben Alman
@@ -9,7 +9,7 @@
9 9
 
10 10
 // Script: jQuery BBQ: Back Button & Query Library
11 11
 //
12  
-// *Version: 1.1, Last updated: 1/9/2010*
  12
+// *Version: 1.1.1, Last updated: 1/22/2010*
13 13
 // 
14 14
 // Project Home - http://benalman.com/projects/jquery-bbq-plugin/
15 15
 // GitHub       - http://github.com/cowboy/jquery-bbq/
@@ -38,12 +38,14 @@
38 38
 // tested with, what browsers it has been tested in, and where the unit tests
39 39
 // reside (so you can test it yourself).
40 40
 // 
41  
-// jQuery Versions - 1.3.2, 1.4a2
  41
+// jQuery Versions - 1.3.2, 1.4
42 42
 // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.
43 43
 // Unit Tests      - http://benalman.com/code/projects/jquery-bbq/unit/
44 44
 // 
45 45
 // About: Release History
46 46
 // 
  47
+// 1.1.1 - (1/22/2010) Integrated <jQuery hashchange event> v1.1, which fixes an
  48
+//         obscure IE8 EmulateIE7 meta tag compatibility mode bug.
47 49
 // 1.1   - (1/9/2010) Broke out the jQuery BBQ event.special window.onhashchange
48 50
 //         functionality into a separate plugin for users who want just the
49 51
 //         basic event & back button support, without all the extra awesomeness
@@ -746,9 +748,9 @@
746 748
   
747 749
   // Event: window.onhashchange
748 750
   // 
749  
-  // Usage in 1.4a2 and newer:
  751
+  // Usage in 1.4 and newer:
750 752
   // 
751  
-  // In 1.4a2 and newer, the event object that is passed into the callback is
  753
+  // In 1.4 and newer, the event object that is passed into the callback is
752 754
   // augmented with an additional e.fragment property that contains the current
753 755
   // document location.hash state as a string, as well as an e.getState method.
754 756
   // 
@@ -768,7 +770,7 @@
768 770
   // 
769 771
   // Usage in 1.3.2:
770 772
   // 
771  
-  // In 1.3.2, the event object is unable to be augmented as in 1.4a2+, so the
  773
+  // In 1.3.2, the event object is unable to be augmented as in 1.4+, so the
772 774
   // fragment state isn't bound to the event object and must instead be parsed
773 775
   // using the <jQuery.param.fragment> and <jQuery.bbq.getState> methods.
774 776
   // 
@@ -812,7 +814,7 @@
812 814
 })(jQuery,this);
813 815
 
814 816
 /*!
815  
- * jQuery hashchange event - v1.0 - 1/9/2010
  817
+ * jQuery hashchange event - v1.1 - 1/21/2010
816 818
  * http://benalman.com/projects/jquery-hashchange-plugin/
817 819
  * 
818 820
  * Copyright (c) 2010 "Cowboy" Ben Alman
@@ -822,7 +824,7 @@
822 824
 
823 825
 // Script: jQuery hashchange event
824 826
 //
825  
-// *Version: 1.0, Last updated: 1/9/2010*
  827
+// *Version: 1.1, Last updated: 1/21/2010*
826 828
 // 
827 829
 // Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
828 830
 // GitHub       - http://github.com/cowboy/jquery-hashchange/
@@ -848,7 +850,7 @@
848 850
 // tested with, what browsers it has been tested in, and where the unit tests
849 851
 // reside (so you can test it yourself).
850 852
 // 
851  
-// jQuery Versions - 1.3.2, 1.4a2
  853
+// jQuery Versions - 1.3.2, 1.4
852 854
 // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.
853 855
 // Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
854 856
 // 
@@ -865,13 +867,16 @@
865 867
 // 
866 868
 // About: Release History
867 869
 // 
  870
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
  871
+//         where browser version is incorrectly reported as 8.0, despite
  872
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
868 873
 // 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
869 874
 //         window.onhashchange functionality into a separate plugin for users
870 875
 //         who want just the basic event & back button support, without all the
871 876
 //         extra awesomeness that BBQ provides. This plugin will be included as
872 877
 //         part of jQuery BBQ, but also be available separately.
873 878
 
874  
-(function($,window){
  879
+(function($,window,undefined){
875 880
   '$:nomunge'; // Used by YUI compressor.
876 881
   
877 882
   // A convenient shortcut.
@@ -887,7 +892,8 @@
887 892
     // IE6/7 specifically need some special love when it comes to back-button
888 893
     // support, so let's do a little browser sniffing..
889 894
     browser = $.browser,
890  
-    is_old_ie = browser.msie && browser.version < 8,
  895
+    mode = document.documentMode,
  896
+    is_old_ie = browser.msie && ( mode === undefined || mode < 8 ),
891 897
     
892 898
     // Does the browser support window.onhashchange? Test for IE version, since
893 899
     // IE8 incorrectly reports this when in "IE7" or "IE8 Compatibility View"!
8  jquery.ba-bbq.min.js
... ...
@@ -1,18 +1,18 @@
1 1
 /*
2  
- * jQuery BBQ: Back Button & Query Library - v1.1 - 1/9/2010
  2
+ * jQuery BBQ: Back Button & Query Library - v1.1.1 - 1/22/2010
3 3
  * http://benalman.com/projects/jquery-bbq-plugin/
4 4
  * 
5 5
  * Copyright (c) 2010 "Cowboy" Ben Alman
6 6
  * Dual licensed under the MIT and GPL licenses.
7 7
  * http://benalman.com/about/license/
8 8
  */
9  
-(function($,c){var g,m=c.location,i=Array.prototype.slice,D=decodeURIComponent,a=$.param,n,d,q,o=$.bbq=$.bbq||{},p,C,e,k=$.event.special,b="hashchange",v="querystring",y="fragment",x="elemUrlAttr",h="href",B="src",r=/^.*\?|#.*$/g,z=/^.*\#/,t={};function s(E){return typeof E==="string"}function w(F){var E=i.call(arguments,1);return function(){return F.apply(this,E.concat(i.call(arguments)))}}function j(E){return E.replace(/^[^#]*#?(.*)$/,"$1")}function l(E){return E.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(F,M,E,G,J){var L,K,I,N,H;if(G!==g){I=E.match(F?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);H=I[3]||"";if(J===2&&s(G)){K=G.replace(F?z:r,"")}else{N=d(I[2]);G=s(G)?d[F?y:v](G):G;K=J===2?G:J===1?$.extend({},G,N):$.extend({},N,G);K=a(K)}L=I[1]+(F?"#":K||!I[1]?"?":"")+K+H}else{L=M(E!==g?E:m[h])}return L}a[v]=w(f,0,l);a[y]=n=w(f,1,j);$.deparam=d=function(H,F){var G={},E={"true":!0,"false":!1,"null":null};$.each(H.replace(/\+/g," ").split("&"),function(L,N){var K=N.split("="),O=D(K[0]),J,P=G,M=0,Q=O.split("]["),I=Q.length-1;if(/\[/.test(Q[0])&&/\]$/.test(Q[I])){Q[I]=Q[I].replace(/\]$/,"");Q=Q.shift().split("[").concat(Q);I=Q.length-1}else{I=0}if(K.length===2){J=D(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?g:E[J]!==g?E[J]:J}if(I){for(;M<=I;M++){O=Q[M]===""?P.length:Q[M];P=P[O]=M<I?P[O]||(Q[M+1]&&isNaN(Q[M+1])?{}:[]):J}}else{if($.isArray(G[O])){G[O].push(J)}else{if(G[O]!==g){G[O]=[G[O],J]}else{G[O]=J}}}}else{if(O){G[O]=F?g:""}}});return G};function u(G,F,E){if(F===g||typeof F==="boolean"){E=F;F=a[G?y:v]()}else{F=s(F)?F.replace(G?z:r,""):F}return d(F,E)}d[v]=w(u,0);d[y]=q=w(u,1);$[x]||($[x]=function(E){return $.extend(t,E)})({a:h,base:h,iframe:B,img:B,input:B,form:"action",link:h,script:B});e=$[x];function A(H,E,G,F){if(!s(G)&&typeof G!=="object"){F=G;G=E;E=g}return this.each(function(){var K=$(this),I=E||e()[(this.nodeName||"").toLowerCase()]||"",J=I&&K.attr(I)||"";K.attr(I,a[H](J,G,F))})}$.fn[v]=w(A,v);$.fn[y]=w(A,y);o.pushState=p=function(H,G){if(s(H)&&/^#/.test(H)&&G===g){G=2}var F=H!==g,E=n(m[h],F?H:{},F?G:2);m[h]=E+(/#/.test(E)?"":"#")};o.getState=C=function(F,E){return F===g||typeof F==="boolean"?q(F):q(E)[F]};o.removeState=function(E){var F={};if(E!==g){F=C();$.each($.isArray(E)?E:arguments,function(H,G){delete F[G]})}p(F,2)};k[b]=$.extend(k[b],{add:function(E,G,F){return function(I){var H=I[y]=n();I.getState=function(K,J){return K===g||typeof K==="boolean"?d(H,K):d(H,J)[K]};E.apply(this,arguments)}}})})(jQuery,this);
  9
+(function($,n){var g,o=n.location,k=Array.prototype.slice,q=decodeURIComponent,a=$.param,c,j,u,b=$.bbq=$.bbq||{},p,t,h,e=$.event.special,d="hashchange",z="querystring",C="fragment",x="elemUrlAttr",i="href",s="src",w=/^.*\?|#.*$/g,v=/^.*\#/,B={};function D(E){return typeof E==="string"}function A(F){var E=k.call(arguments,1);return function(){return F.apply(this,E.concat(k.call(arguments)))}}function l(E){return E.replace(/^[^#]*#?(.*)$/,"$1")}function m(E){return E.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(G,L,E,H,F){var N,K,J,M,I;if(H!==g){J=E.match(G?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);I=J[3]||"";if(F===2&&D(H)){K=H.replace(G?v:w,"")}else{M=j(J[2]);H=D(H)?j[G?C:z](H):H;K=F===2?H:F===1?$.extend({},H,M):$.extend({},M,H);K=a(K)}N=J[1]+(G?"#":K||!J[1]?"?":"")+K+I}else{N=L(E!==g?E:o[i])}return N}a[z]=A(f,0,m);a[C]=c=A(f,1,l);$.deparam=j=function(H,E){var G={},F={"true":!0,"false":!1,"null":null};$.each(H.replace(/\+/g," ").split("&"),function(K,P){var J=P.split("="),O=q(J[0]),I,N=G,L=0,Q=O.split("]["),M=Q.length-1;if(/\[/.test(Q[0])&&/\]$/.test(Q[M])){Q[M]=Q[M].replace(/\]$/,"");Q=Q.shift().split("[").concat(Q);M=Q.length-1}else{M=0}if(J.length===2){I=q(J[1]);if(E){I=I&&!isNaN(I)?+I:I==="undefined"?g:F[I]!==g?F[I]:I}if(M){for(;L<=M;L++){O=Q[L]===""?N.length:Q[L];N=N[O]=L<M?N[O]||(Q[L+1]&&isNaN(Q[L+1])?{}:[]):I}}else{if($.isArray(G[O])){G[O].push(I)}else{if(G[O]!==g){G[O]=[G[O],I]}else{G[O]=I}}}}else{if(O){G[O]=E?g:""}}});return G};function y(G,E,F){if(E===g||typeof E==="boolean"){F=E;E=a[G?C:z]()}else{E=D(E)?E.replace(G?v:w,""):E}return j(E,F)}j[z]=A(y,0);j[C]=u=A(y,1);$[x]||($[x]=function(E){return $.extend(B,E)})({a:i,base:i,iframe:s,img:s,input:s,form:"action",link:i,script:s});h=$[x];function r(H,F,G,E){if(!D(G)&&typeof G!=="object"){E=G;G=F;F=g}return this.each(function(){var K=$(this),I=F||h()[(this.nodeName||"").toLowerCase()]||"",J=I&&K.attr(I)||"";K.attr(I,a[H](J,G,E))})}$.fn[z]=A(r,z);$.fn[C]=A(r,C);b.pushState=p=function(H,E){if(D(H)&&/^#/.test(H)&&E===g){E=2}var G=H!==g,F=c(o[i],G?H:{},G?E:2);o[i]=F+(/#/.test(F)?"":"#")};b.getState=t=function(E,F){return E===g||typeof E==="boolean"?u(E):u(F)[E]};b.removeState=function(E){var F={};if(E!==g){F=t();$.each($.isArray(E)?E:arguments,function(H,G){delete F[G]})}p(F,2)};e[d]=$.extend(e[d],{add:function(E,G,F){return function(I){var H=I[C]=c();I.getState=function(J,K){return J===g||typeof J==="boolean"?j(H,J):j(H,K)[J]};E.apply(this,arguments)}}})})(jQuery,this);
10 10
 /*
11  
- * jQuery hashchange event - v1.0 - 1/9/2010
  11
+ * jQuery hashchange event - v1.1 - 1/21/2010
12 12
  * http://benalman.com/projects/jquery-hashchange-plugin/
13 13
  * 
14 14
  * Copyright (c) 2010 "Cowboy" Ben Alman
15 15
  * Dual licensed under the MIT and GPL licenses.
16 16
  * http://benalman.com/about/license/
17 17
  */
18  
-(function($,b){var g=b.location,h,i=$.event.special,d="hashchange",f=$.browser,c=f.msie&&f.version<8,e="on"+d in b&&!c;function a(j){j=j||g.href;return j.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;i[d]=$.extend(i[d],{setup:function(){if(e){return false}h.start()},teardown:function(){if(e){return false}h.stop()}});h=(function(){var k={},o,j,l,n;function m(){l=n=function(p){return p};if(c){j=$('<iframe src="javascript:0"/>').hide().appendTo("body")[0].contentWindow;n=function(){return a(j.document.location.href)};l=function(r,p){if(r!==p){var q=j.document;q.open().close();q.location.hash="#"+r}};l(a())}}k.start=function(){if(o){return}var q=a();l||m();(function p(){var s=a(),r=n(q);if(s!==q){l(q=s,r);$(b).trigger(d)}else{if(r!==q){g.href=g.href.replace(/#.*/,"")+"#"+r}}o=setTimeout(p,$[d+"Delay"])})()};k.stop=function(){if(!j){o&&clearTimeout(o);o=0}};return k})()})(jQuery,this);
  18
+(function($,i,b){var h=i.location,j,k=$.event.special,c="hashchange",e=$.browser,f=document.documentMode,g=e.msie&&(f===b||f<8),d="on"+c in i&&!g;function a(l){l=l||h.href;return l.replace(/^[^#]*#?(.*)$/,"$1")}$[c+"Delay"]=100;k[c]=$.extend(k[c],{setup:function(){if(d){return false}j.start()},teardown:function(){if(d){return false}j.stop()}});j=(function(){var l={},q,m,n,p;function o(){n=p=function(r){return r};if(g){m=$('<iframe src="javascript:0"/>').hide().appendTo("body")[0].contentWindow;p=function(){return a(m.document.location.href)};n=function(t,r){if(t!==r){var s=m.document;s.open().close();s.location.hash="#"+t}};n(a())}}l.start=function(){if(q){return}var s=a();n||o();(function r(){var u=a(),t=p(s);if(u!==s){n(s=u,t);$(i).trigger(c)}else{if(t!==s){h.href=h.href.replace(/#.*/,"")+"#"+t}}q=setTimeout(r,$[c+"Delay"])})()};l.stop=function(){if(!m){q&&clearTimeout(q);q=0}};return l})()})(jQuery,this);
1,788  shared/jquery-1.4a2.js → shared/jquery-1.4.js
... ...
@@ -1,14 +1,19 @@
1 1
 /*!
2  
- * jQuery JavaScript Library v1.4a2
  2
+ * jQuery JavaScript Library v1.4
3 3
  * http://jquery.com/
4 4
  *
5  
- * Copyright (c) 2009 John Resig
  5
+ * Copyright 2010, John Resig
6 6
  * Dual licensed under the MIT or GPL Version 2 licenses.
7 7
  * http://docs.jquery.com/License
8 8
  *
9  
- * Date: Fri Dec 18 19:58:11 2009 -0500
  9
+ * Includes Sizzle.js
  10
+ * http://sizzlejs.com/
  11
+ * Copyright 2010, The Dojo Foundation
  12
+ * Released under the MIT, BSD, and GPL Licenses.
  13
+ *
  14
+ * Date: Wed Jan 13 15:23:05 2010 -0500
10 15
  */
11  
-(function(window, undefined){
  16
+(function( window, undefined ) {
12 17
 
13 18
 // Define a local copy of jQuery
14 19
 var jQuery = function( selector, context ) {
@@ -45,7 +50,10 @@ var jQuery = function( selector, context ) {
45 50
 	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
46 51
 
47 52
 	// Keep a UserAgent string for use with jQuery.browser
48  
-	userAgent = navigator.userAgent.toLowerCase(),
  53
+	userAgent = navigator.userAgent,
  54
+
  55
+	// For matching the engine and version of the browser
  56
+	browserMatch,
49 57
 	
50 58
 	// Has the ready events already been bound?
51 59
 	readyBound = false,
@@ -166,7 +174,7 @@ jQuery.fn = jQuery.prototype = {
166 174
 	selector: "",
167 175
 
168 176
 	// The current version of jQuery being used
169  
-	jquery: "1.4a2",
  177
+	jquery: "1.4",
170 178
 
171 179
 	// The default length of a jQuery object is 0
172 180
 	length: 0,
@@ -176,7 +184,7 @@ jQuery.fn = jQuery.prototype = {
176 184
 		return this.length;
177 185
 	},
178 186
 
179  
-	toArray: function(){
  187
+	toArray: function() {
180 188
 		return slice.call( this, 0 );
181 189
 	},
182 190
 
@@ -270,7 +278,7 @@ jQuery.fn = jQuery.prototype = {
270 278
 	},
271 279
 
272 280
 	map: function( callback ) {
273  
-		return this.pushStack( jQuery.map(this, function(elem, i){
  281
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
274 282
 			return callback.call( elem, i, elem );
275 283
 		}));
276 284
 	},
@@ -325,10 +333,10 @@ jQuery.extend = jQuery.fn.extend = function() {
325 333
 					continue;
326 334
 				}
327 335
 
328  
-				// Recurse if we're merging object literal values
329  
-				if ( deep && copy && jQuery.isPlainObject(copy) ) {
330  
-					// Don't extend not object literals
331  
-					var clone = src && jQuery.isPlainObject(src) ? src : {};
  336
+				// Recurse if we're merging object literal values or arrays
  337
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
  338
+					var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
  339
+						: jQuery.isArray(copy) ? [] : {};
332 340
 
333 341
 					// Never move original objects, clone them
334 342
 					target[ name ] = jQuery.extend( deep, clone, copy );
@@ -391,7 +399,10 @@ jQuery.extend({
391 399
 	},
392 400
 	
393 401
 	bindReady: function() {
394  
-		if ( readyBound ) { return; }
  402
+		if ( readyBound ) {
  403
+			return;
  404
+		}
  405
+
395 406
 		readyBound = true;
396 407
 
397 408
 		// Catch cases where $(document).ready() is called after the
@@ -423,7 +434,7 @@ jQuery.extend({
423 434
 
424 435
 			try {
425 436
 				toplevel = window.frameElement == null;
426  
-			} catch(e){}
  437
+			} catch(e) {}
427 438
 
428 439
 			if ( document.documentElement.doScroll && toplevel ) {
429 440
 				doScrollCheck();
@@ -473,6 +484,8 @@ jQuery.extend({
473 484
 		return true;
474 485
 	},
475 486
 
  487
+	noop: function() {},
  488
+
476 489
 	// Evalulates a script in a global context
477 490
 	globalEval: function( data ) {
478 491
 		if ( data && rnotwhite.test(data) ) {
@@ -623,19 +636,75 @@ jQuery.extend({
623 636
 		return ret.concat.apply( [], ret );
624 637
 	},
625 638
 
  639
+	// A global GUID counter for objects
  640
+	guid: 1,
  641
+
  642
+	proxy: function( fn, proxy, thisObject ) {
  643
+		if ( arguments.length === 2 ) {
  644
+			if ( typeof proxy === "string" ) {
  645
+				thisObject = fn;
  646
+				fn = thisObject[ proxy ];
  647
+				proxy = undefined;
  648
+
  649
+			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
  650
+				thisObject = proxy;
  651
+				proxy = undefined;
  652
+			}
  653
+		}
  654
+
  655
+		if ( !proxy && fn ) {
  656
+			proxy = function() {
  657
+				return fn.apply( thisObject || this, arguments );
  658
+			};
  659
+		}
  660
+
  661
+		// Set the guid of unique handler to the same of original handler, so it can be removed
  662
+		if ( fn ) {
  663
+			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
  664
+		}
  665
+
  666
+		// So proxy can be declared as an argument
  667
+		return proxy;
  668
+	},
  669
+
626 670
 	// Use of jQuery.browser is frowned upon.
627 671
 	// More details: http://docs.jquery.com/Utilities/jQuery.browser
628  
-	browser: {
629  
-		version: (/.*?(?:firefox|safari|opera|msie)[\/ ]([\d.]+)/.exec(userAgent) || [0,'0'])[1],
630  
-		safari: /safari/.test( userAgent ),
631  
-		opera: /opera/.test( userAgent ),
632  
-		msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
633  
-		firefox: /firefox/.test( userAgent )
634  
-	}
  672
+	uaMatch: function( ua ) {
  673
+		var ret = { browser: "" };
  674
+
  675
+		ua = ua.toLowerCase();
  676
+
  677
+		if ( /webkit/.test( ua ) ) {
  678
+			ret = { browser: "webkit", version: /webkit[\/ ]([\w.]+)/ };
  679
+
  680
+		} else if ( /opera/.test( ua ) ) {
  681
+			ret = { browser: "opera", version:  /version/.test( ua ) ? /version[\/ ]([\w.]+)/ : /opera[\/ ]([\w.]+)/ };
  682
+			
  683
+		} else if ( /msie/.test( ua ) ) {
  684
+			ret = { browser: "msie", version: /msie ([\w.]+)/ };
  685
+
  686
+		} else if ( /mozilla/.test( ua ) && !/compatible/.test( ua ) ) {
  687
+			ret = { browser: "mozilla", version: /rv:([\w.]+)/ };
  688
+		}
  689
+
  690
+		ret.version = (ret.version && ret.version.exec( ua ) || [0, "0"])[1];
  691
+
  692
+		return ret;
  693
+	},
  694
+
  695
+	browser: {}
635 696
 });
636 697
 
637  
-// Deprecated
638  
-jQuery.browser.mozilla = /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent );
  698
+browserMatch = jQuery.uaMatch( userAgent );
  699
+if ( browserMatch.browser ) {
  700
+	jQuery.browser[ browserMatch.browser ] = true;
  701
+	jQuery.browser.version = browserMatch.version;
  702
+}
  703
+
  704
+// Deprecated, use jQuery.browser.webkit instead
  705
+if ( jQuery.browser.webkit ) {
  706
+	jQuery.browser.safari = true;
  707
+}
639 708
 
640 709
 if ( indexOf ) {
641 710
 	jQuery.inArray = function( elem, array ) {
@@ -720,10 +789,10 @@ function access( elems, key, value, exec, fn, pass ) {
720 789
 	// Setting one attribute
721 790
 	if ( value !== undefined ) {
722 791
 		// Optionally, function values get executed if exec is true
723  
-		exec = exec && jQuery.isFunction(value);
  792
+		exec = !pass && exec && jQuery.isFunction(value);
724 793
 		
725 794
 		for ( var i = 0; i < length; i++ ) {
726  
-			fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass );
  795
+			fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
727 796
 		}
728 797
 		
729 798
 		return elems;
@@ -736,7 +805,7 @@ function access( elems, key, value, exec, fn, pass ) {
736 805
 function now() {
737 806
 	return (new Date).getTime();
738 807
 }
739  
-(function(){
  808
+(function() {
740 809
 
741 810
 	jQuery.support = {};
742 811
 
@@ -746,7 +815,7 @@ function now() {
746 815
 		id = "script" + now();
747 816
 
748 817
 	div.style.display = "none";
749  
-	div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.55;">a</a><select><option>text</option></select>';
  818
+	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
750 819
 
751 820
 	var all = div.getElementsByTagName("*"),
752 821
 		a = div.getElementsByTagName("a")[0];
@@ -758,7 +827,7 @@ function now() {
758 827
 
759 828
 	jQuery.support = {
760 829
 		// IE strips leading whitespace when .innerHTML is used
761  
-		leadingWhitespace: div.firstChild.nodeType == 3,
  830
+		leadingWhitespace: div.firstChild.nodeType === 3,
762 831
 
763 832
 		// Make sure that tbody elements aren't automatically inserted
764 833
 		// IE will insert them into empty tables
@@ -785,6 +854,15 @@ function now() {
785 854
 		// (IE uses styleFloat instead of cssFloat)
786 855
 		cssFloat: !!a.style.cssFloat,
787 856
 
  857
+		// Make sure that if no value is specified for a checkbox
  858
+		// that it defaults to "on".
  859
+		// (WebKit defaults to "" instead)
  860
+		checkOn: div.getElementsByTagName("input")[0].value === "on",
  861
+
  862
+		// Make sure that a selected-by-default option has a working selected property.
  863
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
  864
+		optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
  865
+
788 866
 		// Will be defined later
789 867
 		scriptEval: false,
790 868
 		noCloneEvent: true,
@@ -794,7 +872,7 @@ function now() {
794 872
 	script.type = "text/javascript";
795 873
 	try {
796 874
 		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
797  
-	} catch(e){}
  875
+	} catch(e) {}
798 876
 
799 877
 	root.insertBefore( script, root.firstChild );
800 878
 
@@ -809,7 +887,7 @@ function now() {
809 887
 	root.removeChild( script );
810 888
 
811 889
 	if ( div.attachEvent && div.fireEvent ) {
812  
-		div.attachEvent("onclick", function click(){
  890
+		div.attachEvent("onclick", function click() {
813 891
 			// Cloning a node shouldn't copy over any
814 892
 			// bound event handlers (IE does this)
815 893
 			jQuery.support.noCloneEvent = false;
@@ -821,7 +899,7 @@ function now() {
821 899
 	// Figure out if the W3C box model works as expected
822 900
 	// document.body must exist before we can do this
823 901
 	// TODO: This timeout is temporary until I move ready into core.js.
824  
-	jQuery(function(){
  902
+	jQuery(function() {
825 903
 		var div = document.createElement("div");
826 904
 		div.style.width = div.style.paddingLeft = "1px";
827 905
 
@@ -849,7 +927,6 @@ function now() {
849 927
 	
850 928
 	jQuery.support.submitBubbles = eventSupported("submit");
851 929
 	jQuery.support.changeBubbles = eventSupported("change");
852  
-	jQuery.support.focusBubbles = eventSupported("focus");
853 930
 
854 931
 	// release memory in IE
855 932
 	root = script = div = all = a = null;
@@ -969,7 +1046,7 @@ jQuery.extend({
969 1046
 });
970 1047
 
971 1048
 jQuery.fn.extend({
972  
-	data: function( key, value ){
  1049
+	data: function( key, value ) {
973 1050
 		if ( typeof key === "undefined" && this.length ) {
974 1051
 			return jQuery.data( this[0] );
975 1052
 
@@ -992,56 +1069,68 @@ jQuery.fn.extend({
992 1069
 				this.data( parts[0] ) :
993 1070
 				data;
994 1071
 		} else {
995  
-			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
  1072
+			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
996 1073
 				jQuery.data( this, key, value );
997 1074
 			});
998 1075
 		}
999 1076
 	},
1000 1077
 
1001  
-	removeData: function( key ){
1002  
-		return this.each(function(){
  1078
+	removeData: function( key ) {
  1079
+		return this.each(function() {
1003 1080
 			jQuery.removeData( this, key );
1004 1081
 		});
1005 1082
 	}
1006 1083
 });
1007 1084
 jQuery.extend({
1008 1085
 	queue: function( elem, type, data ) {
1009  
-		if ( !elem ) { return; }
  1086
+		if ( !elem ) {
  1087
+			return;
  1088
+		}
1010 1089
 
1011 1090
 		type = (type || "fx") + "queue";
1012 1091
 		var q = jQuery.data( elem, type );
1013 1092
 
1014 1093
 		// Speed up dequeue by getting out quickly if this is just a lookup
1015  
-		if ( !data ) { return q || []; }
  1094
+		if ( !data ) {
  1095
+			return q || [];
  1096
+		}
1016 1097
 
1017 1098
 		if ( !q || jQuery.isArray(data) ) {
1018 1099
 			q = jQuery.data( elem, type, jQuery.makeArray(data) );
  1100
+
1019 1101
 		} else {
1020 1102
 			q.push( data );
1021 1103
 		}
  1104
+
1022 1105
 		return q;
1023 1106
 	},
1024 1107
 
1025  
-	dequeue: function( elem, type ){
  1108
+	dequeue: function( elem, type ) {
1026 1109
 		type = type || "fx";
1027 1110
 
1028 1111
 		var queue = jQuery.queue( elem, type ), fn = queue.shift();
1029 1112
 
1030 1113
 		// If the fx queue is dequeued, always remove the progress sentinel
1031  
-		if ( fn === "inprogress" ) { fn = queue.shift(); }
  1114
+		if ( fn === "inprogress" ) {
  1115
+			fn = queue.shift();
  1116
+		}
1032 1117
 
1033 1118
 		if ( fn ) {
1034 1119
 			// Add a progress sentinel to prevent the fx queue from being
1035 1120
 			// automatically dequeued
1036  
-			if ( type == "fx" ) { queue.unshift("inprogress"); }
  1121
+			if ( type === "fx" ) {
  1122
+				queue.unshift("inprogress");
  1123
+			}
1037 1124
 
1038  
-			fn.call(elem, function() { jQuery.dequeue(elem, type); });
  1125
+			fn.call(elem, function() {
  1126
+				jQuery.dequeue(elem, type);
  1127
+			});
1039 1128
 		}
1040 1129
 	}
1041 1130
 });
1042 1131
 
1043 1132
 jQuery.fn.extend({
1044  
-	queue: function(type, data){
  1133
+	queue: function( type, data ) {
1045 1134
 		if ( typeof type !== "string" ) {
1046 1135
 			data = type;
1047 1136
 			type = "fx";
@@ -1050,16 +1139,16 @@ jQuery.fn.extend({
1050 1139
 		if ( data === undefined ) {
1051 1140
 			return jQuery.queue( this[0], type );
1052 1141
 		}
1053  
-		return this.each(function(i, elem){
  1142
+		return this.each(function( i, elem ) {
1054 1143
 			var queue = jQuery.queue( this, type, data );
1055 1144
 
1056  
-			if ( type == "fx" && queue[0] !== "inprogress" ) {
  1145
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
1057 1146
 				jQuery.dequeue( this, type );
1058 1147
 			}
1059 1148
 		});
1060 1149
 	},
1061  
-	dequeue: function(type){
1062  
-		return this.each(function(){
  1150
+	dequeue: function( type ) {
  1151
+		return this.each(function() {
1063 1152
 			jQuery.dequeue( this, type );
1064 1153
 		});
1065 1154
 	},
@@ -1078,10 +1167,352 @@ jQuery.fn.extend({
1078 1167
 		});
1079 1168
 	},
1080 1169
 
1081  
-	clearQueue: function(type){
  1170
+	clearQueue: function( type ) {
1082 1171
 		return this.queue( type || "fx", [] );
1083 1172
 	}
1084 1173
 });
  1174
+var rclass = /[\n\t]/g,
  1175
+	rspace = /\s+/,
  1176
+	rreturn = /\r/g,
  1177
+	rspecialurl = /href|src|style/,
  1178
+	rtype = /(button|input)/i,
  1179
+	rfocusable = /(button|input|object|select|textarea)/i,
  1180
+	rclickable = /^(a|area)$/i,
  1181
+	rradiocheck = /radio|checkbox/;
  1182
+
  1183
+jQuery.fn.extend({
  1184
+	attr: function( name, value ) {
  1185
+		return access( this, name, value, true, jQuery.attr );
  1186
+	},
  1187
+
  1188
+	removeAttr: function( name, fn ) {
  1189
+		return this.each(function(){
  1190
+			jQuery.attr( this, name, "" );
  1191
+			if ( this.nodeType === 1 ) {
  1192
+				this.removeAttribute( name );
  1193
+			}
  1194
+		});
  1195
+	},
  1196
+
  1197
+	addClass: function( value ) {
  1198
+		if ( jQuery.isFunction(value) ) {
  1199
+			return this.each(function(i) {
  1200
+				var self = jQuery(this);
  1201
+				self.addClass( value.call(this, i, self.attr("class")) );
  1202
+			});
  1203
+		}
  1204
+
  1205
+		if ( value && typeof value === "string" ) {
  1206
+			var classNames = (value || "").split( rspace );
  1207
+
  1208
+			for ( var i = 0, l = this.length; i < l; i++ ) {
  1209
+				var elem = this[i];
  1210
+
  1211
+				if ( elem.nodeType === 1 ) {
  1212
+					if ( !elem.className ) {
  1213
+						elem.className = value;
  1214
+
  1215
+					} else {
  1216
+						var className = " " + elem.className + " ";
  1217
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
  1218
+							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
  1219
+								elem.className += " " + classNames[c];
  1220
+							}
  1221
+						}
  1222
+					}
  1223
+				}
  1224
+			}
  1225
+		}
  1226
+
  1227
+		return this;
  1228
+	},
  1229
+
  1230
+	removeClass: function( value ) {
  1231
+		if ( jQuery.isFunction(value) ) {
  1232
+			return this.each(function(i) {
  1233
+				var self = jQuery(this);
  1234
+				self.removeClass( value.call(this, i, self.attr("class")) );
  1235
+			});
  1236
+		}
  1237
+
  1238
+		if ( (value && typeof value === "string") || value === undefined ) {
  1239
+			var classNames = (value || "").split(rspace);
  1240
+
  1241
+			for ( var i = 0, l = this.length; i < l; i++ ) {
  1242
+				var elem = this[i];
  1243
+
  1244
+				if ( elem.nodeType === 1 && elem.className ) {
  1245
+					if ( value ) {
  1246
+						var className = (" " + elem.className + " ").replace(rclass, " ");
  1247
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
  1248
+							className = className.replace(" " + classNames[c] + " ", " ");
  1249
+						}
  1250
+						elem.className = className.substring(1, className.length - 1);
  1251
+
  1252
+					} else {
  1253
+						elem.className = "";
  1254
+					}
  1255
+				}
  1256
+			}
  1257
+		}
  1258
+
  1259
+		return this;
  1260
+	},
  1261
+
  1262
+	toggleClass: function( value, stateVal ) {
  1263
+		var type = typeof value, isBool = typeof stateVal === "boolean";
  1264
+
  1265
+		if ( jQuery.isFunction( value ) ) {
  1266
+			return this.each(function(i) {
  1267
+				var self = jQuery(this);
  1268
+				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
  1269
+			});
  1270
+		}
  1271
+
  1272
+		return this.each(function() {
  1273
+			if ( type === "string" ) {
  1274
+				// toggle individual class names
  1275
+				var className, i = 0, self = jQuery(this),
  1276
+					state = stateVal,
  1277
+					classNames = value.split( rspace );
  1278
+
  1279
+				while ( (className = classNames[ i++ ]) ) {
  1280
+					// check each className given, space seperated list
  1281
+					state = isBool ? state : !self.hasClass( className );
  1282
+					self[ state ? "addClass" : "removeClass" ]( className );
  1283
+				}
  1284
+
  1285
+			} else if ( type === "undefined" || type === "boolean" ) {
  1286
+				if ( this.className ) {
  1287
+					// store className if set
  1288
+					jQuery.data( this, "__className__", this.className );
  1289
+				}
  1290
+
  1291
+				// toggle whole className
  1292
+				this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
  1293
+			}
  1294
+		});
  1295
+	},
  1296
+
  1297
+	hasClass: function( selector ) {
  1298
+		var className = " " + selector + " ";
  1299
+		for ( var i = 0, l = this.length; i < l; i++ ) {
  1300
+			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
  1301
+				return true;
  1302
+			}
  1303
+		}
  1304
+
  1305
+		return false;
  1306
+	},
  1307
+
  1308
+	val: function( value ) {
  1309
+		if ( value === undefined ) {
  1310
+			var elem = this[0];
  1311
+
  1312
+			if ( elem ) {
  1313
+				if ( jQuery.nodeName( elem, "option" ) ) {
  1314
+					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
  1315
+				}
  1316
+
  1317
+				// We need to handle select boxes special
  1318
+				if ( jQuery.nodeName( elem, "select" ) ) {
  1319
+					var index = elem.selectedIndex,
  1320
+						values = [],
  1321
+						options = elem.options,
  1322
+						one = elem.type === "select-one";
  1323
+
  1324
+					// Nothing was selected
  1325
+					if ( index < 0 ) {
  1326
+						return null;
  1327
+					}
  1328
+
  1329
+					// Loop through all the selected options
  1330
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  1331
+						var option = options[ i ];
  1332
+
  1333
+						if ( option.selected ) {
  1334
+							// Get the specifc value for the option
  1335
+							value = jQuery(option).val();
  1336
+
  1337
+							// We don't need an array for one selects
  1338
+							if ( one ) {
  1339
+								return value;
  1340
+							}
  1341
+
  1342
+							// Multi-Selects return an array
  1343
+							values.push( value );
  1344
+						}
  1345
+					}
  1346
+
  1347
+					return values;
  1348
+				}
  1349
+
  1350
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
  1351
+				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
  1352
+					return elem.getAttribute("value") === null ? "on" : elem.value;
  1353
+				}
  1354
+				
  1355
+
  1356
+				// Everything else, we just grab the value
  1357
+				return (elem.value || "").replace(rreturn, "");
  1358
+
  1359
+			}
  1360
+
  1361
+			return undefined;
  1362
+		}
  1363
+
  1364
+		var isFunction = jQuery.isFunction(value);
  1365
+
  1366
+		return this.each(function(i) {
  1367
+			var self = jQuery(this), val = value;
  1368
+
  1369
+			if ( this.nodeType !== 1 ) {
  1370
+				return;
  1371
+			}
  1372
+
  1373
+			if ( isFunction ) {
  1374
+				val = value.call(this, i, self.val());
  1375
+			}
  1376
+
  1377
+			// Typecast each time if the value is a Function and the appended
  1378
+			// value is therefore different each time.
  1379
+			if ( typeof val === "number" ) {
  1380
+				val += "";
  1381
+			}
  1382
+
  1383
+			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
  1384
+				this.checked = jQuery.inArray( self.val(), val ) >= 0;
  1385
+
  1386
+			} else if ( jQuery.nodeName( this, "select" ) ) {
  1387
+				var values = jQuery.makeArray(val);
  1388
+
  1389
+				jQuery( "option", this ).each(function() {
  1390
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
  1391
+				});
  1392
+
  1393
+				if ( !values.length ) {
  1394
+					this.selectedIndex = -1;
  1395
+				}
  1396
+
  1397
+			} else {
  1398
+				this.value = val;
  1399
+			}
  1400
+		});
  1401
+	}
  1402
+});
  1403
+
  1404
+jQuery.extend({
  1405
+	attrFn: {
  1406
+		val: true,
  1407
+		css: true,
  1408
+		html: true,
  1409
+		text: true,
  1410
+		data: true,
  1411
+		width: true,
  1412
+		height: true,
  1413
+		offset: true
  1414
+	},
  1415
+		
  1416
+	attr: function( elem, name, value, pass ) {
  1417
+		// don't set attributes on text and comment nodes
  1418
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
  1419
+			return undefined;
  1420
+		}
  1421
+
  1422
+		if ( pass && name in jQuery.attrFn ) {
  1423
+			return jQuery(elem)[name](value);
  1424
+		}
  1425
+
  1426
+		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
  1427
+			// Whether we are setting (or getting)
  1428
+			set = value !== undefined;
  1429
+
  1430
+		// Try to normalize/fix the name
  1431
+		name = notxml && jQuery.props[ name ] || name;
  1432
+
  1433
+		// Only do all the following if this is a node (faster for style)
  1434
+		if ( elem.nodeType === 1 ) {
  1435
+			// These attributes require special treatment
  1436
+			var special = rspecialurl.test( name );
  1437
+
  1438
+			// Safari mis-reports the default selected property of an option
  1439
+			// Accessing the parent's selectedIndex property fixes it
  1440
+			if ( name === "selected" && !jQuery.support.optSelected ) {
  1441
+				var parent = elem.parentNode;
  1442
+				if ( parent ) {
  1443
+					parent.selectedIndex;
  1444
+	
  1445
+					// Make sure that it also works with optgroups, see #5701
  1446
+					if ( parent.parentNode ) {
  1447
+						parent.parentNode.selectedIndex;
  1448
+					}
  1449
+				}
  1450
+			}
  1451
+
  1452
+			// If applicable, access the attribute via the DOM 0 way
  1453
+			if ( name in elem && notxml && !special ) {
  1454
+				if ( set ) {
  1455
+					// We can't allow the type property to be changed (since it causes problems in IE)
  1456
+					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {