diff options
author | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 |
---|---|---|
committer | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 |
commit | aa48faa19166a1f31d3f2ba6a7c28cc7535b7c6d (patch) | |
tree | fdf7a81cf1c66f7c9d202084936ea9a24e85050b /share/www/script | |
parent | f4d88a0164ac42b3781ebd9d170668ff95f7d9ca (diff) |
Futon history browsing - applied patch from COUCHDB-186
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@732413 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'share/www/script')
-rw-r--r-- | share/www/script/jquery.history.js | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/share/www/script/jquery.history.js b/share/www/script/jquery.history.js new file mode 100644 index 00000000..14e40824 --- /dev/null +++ b/share/www/script/jquery.history.js @@ -0,0 +1,150 @@ +/* + * jQuery history plugin + * + * Copyright (c) 2006 Taku Sano (Mikage Sawatari) + * Licensed under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + * Modified by Lincoln Cooper to add Safari support and only call the callback once during initialization + * for msie when no initial hash supplied. + */ + + +jQuery.extend({ + historyCurrentHash: undefined, + + historyCallback: undefined, + + historyInit: function(callback){ + jQuery.historyCallback = callback; + var current_hash = location.hash; + + jQuery.historyCurrentHash = current_hash; + if(jQuery.browser.msie) { + // To stop the callback firing twice during initilization if no hash present + if (jQuery.historyCurrentHash == '') { + jQuery.historyCurrentHash = '#'; + } + + // add hidden iframe for IE + $("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>'); + var ihistory = $("#jQuery_history")[0]; + var iframe = ihistory.contentWindow.document; + iframe.open(); + iframe.close(); + iframe.location.hash = current_hash; + } + else if ($.browser.safari) { + // etablish back/forward stacks + jQuery.historyBackStack = []; + jQuery.historyBackStack.length = history.length; + jQuery.historyForwardStack = []; + + jQuery.isFirst = true; + } + jQuery.historyCallback(current_hash.replace(/^#/, '')); + setInterval(jQuery.historyCheck, 100); + }, + + historyAddHistory: function(hash) { + // This makes the looping function do something + jQuery.historyBackStack.push(hash); + + jQuery.historyForwardStack.length = 0; // clear forwardStack (true click occured) + this.isFirst = true; + }, + + historyCheck: function(){ + if(jQuery.browser.msie) { + // On IE, check for location.hash of iframe + var ihistory = $("#jQuery_history")[0]; + var iframe = ihistory.contentDocument || ihistory.contentWindow.document; + var current_hash = iframe.location.hash; + if(current_hash != jQuery.historyCurrentHash) { + + location.hash = current_hash; + jQuery.historyCurrentHash = current_hash; + jQuery.historyCallback(current_hash.replace(/^#/, '')); + + } + } else if ($.browser.safari) { + if (!jQuery.dontCheck) { + var historyDelta = history.length - jQuery.historyBackStack.length; + + if (historyDelta) { // back or forward button has been pushed + jQuery.isFirst = false; + if (historyDelta < 0) { // back button has been pushed + // move items to forward stack + for (var i = 0; i < Math.abs(historyDelta); i++) jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop()); + } else { // forward button has been pushed + // move items to back stack + for (var i = 0; i < historyDelta; i++) jQuery.historyBackStack.push(jQuery.historyForwardStack.shift()); + } + var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1]; + if (cachedHash != undefined) { + jQuery.historyCurrentHash = location.hash; + jQuery.historyCallback(cachedHash); + } + } else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) { + // back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark) + // document.URL doesn't change in Safari + if (document.URL.indexOf('#') >= 0) { + jQuery.historyCallback(document.URL.split('#')[1]); + } else { + var current_hash = location.hash; + jQuery.historyCallback(''); + } + jQuery.isFirst = true; + } + } + } else { + // otherwise, check for location.hash + var current_hash = location.hash; + if(current_hash != jQuery.historyCurrentHash) { + jQuery.historyCurrentHash = current_hash; + jQuery.historyCallback(current_hash.replace(/^#/, '')); + } + } + }, + historyLoad: function(hash){ + var newhash; + + if (jQuery.browser.safari) { + newhash = hash; + } + else { + newhash = '#' + hash; + location.hash = newhash; + } + jQuery.historyCurrentHash = newhash; + + if(jQuery.browser.msie) { + var ihistory = $("#jQuery_history")[0]; + var iframe = ihistory.contentWindow.document; + iframe.open(); + iframe.close(); + iframe.location.hash = newhash; + jQuery.historyCallback(hash); + } + else if (jQuery.browser.safari) { + jQuery.dontCheck = true; + // Manually keep track of the history values for Safari + this.historyAddHistory(hash); + + // Wait a while before allowing checking so that Safari has time to update the "history" object + // correctly (otherwise the check loop would detect a false change in hash). + var fn = function() {jQuery.dontCheck = false;}; + window.setTimeout(fn, 200); + jQuery.historyCallback(hash); + // N.B. "location.hash=" must be the last line of code for Safari as execution stops afterwards. + // By explicitly using the "location.hash" command (instead of using a variable set to "location.hash") the + // URL in the browser and the "history" object are both updated correctly. + location.hash = newhash; + } + else { + jQuery.historyCallback(hash); + } + } +}); + + |