| /** | 
 |  * jQuery history event v0.1 | 
 |  * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com> | 
 |  * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license. | 
 |  */ | 
 | (function($) { | 
 |     var currentHash, previousNav, timer, hashTrim = /^.*#/; | 
 |  | 
 |     var msie = { | 
 |         iframe: null, | 
 |         getDoc: function() { | 
 |             return msie.iframe.contentWindow.document; | 
 |         }, | 
 |         getHash: function() { | 
 |             return msie.getDoc().location.hash; | 
 |         }, | 
 |         setHash: function(hash) { | 
 |             var d = msie.getDoc(); | 
 |             d.open(); | 
 |             d.close(); | 
 |             d.location.hash = hash; | 
 |         } | 
 |     }; | 
 |  | 
 |     var historycheck = function() { | 
 |         var hash = msie.iframe ? msie.getHash() : location.hash; | 
 |         if (hash != currentHash) { | 
 |             currentHash = hash; | 
 |             if (msie.iframe) { | 
 |                 location.hash = currentHash; | 
 |             } | 
 |             var current = $.history.getCurrent(); | 
 |             $.event.trigger('history', [current, previousNav]); | 
 |             previousNav = current; | 
 |         } | 
 |     }; | 
 |  | 
 |     $.history = { | 
 |         add: function(hash) { | 
 |             hash = '#' + hash.replace(hashTrim, ''); | 
 |             if (currentHash != hash) { | 
 |                 var previous = $.history.getCurrent(); | 
 |                 location.hash = currentHash = hash; | 
 |                 if (msie.iframe) { | 
 |                     msie.setHash(currentHash); | 
 |                 } | 
 |                 $.event.trigger('historyadd', [$.history.getCurrent(), previous]); | 
 |             } | 
 |             if (!timer) { | 
 |                 timer = setInterval(historycheck, 100); | 
 |             } | 
 |         }, | 
 |         getCurrent: function() { | 
 |             if (currentHash) { | 
 |               return currentHash.replace(hashTrim, ''); | 
 |             } else {  | 
 |               return "";  | 
 |             } | 
 |         } | 
 |     }; | 
 |  | 
 |     $.fn.history = function(fn) { | 
 |         $(this).bind('history', fn); | 
 |     }; | 
 |  | 
 |     $.fn.historyadd = function(fn) { | 
 |         $(this).bind('historyadd', fn); | 
 |     }; | 
 |  | 
 |     $(function() { | 
 |         currentHash = location.hash; | 
 |         if ($.browser.msie) { | 
 |             msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0]; | 
 |             msie.setHash(currentHash); | 
 |             currentHash = msie.getHash(); | 
 |         } | 
 |     }); | 
 | })(jQuery); |