var hashchange = (function () { var exports = {}; var expected_hash; var changing_hash = false; // Some browsers zealously URI-decode the contents of // window.location.hash. So we hide our URI-encoding // by replacing % with . (like MediaWiki). exports.encodeHashComponent = function(str) { return encodeURIComponent(str) .replace(/\./g, '%2E') .replace(/%/g, '.'); }; function decodeHashComponent(str) { return decodeURIComponent(str.replace(/\./g, '%')); } exports.changehash = function (newhash) { if (changing_hash) { return; } $(document).trigger($.Event('hashchange.zephyr')); expected_hash = newhash; // Some browsers reset scrollTop when changing the hash to "", // so we save and restore it. // http://stackoverflow.com/questions/4715073/window-location-hash-prevent-scrolling-to-the-top var scrolltop = viewport.scrollTop(); window.location.hash = newhash; util.reset_favicon(); if (newhash === "" || newhash === "#") { viewport.scrollTop(scrolltop); } }; exports.save_narrow = function (operators) { if (changing_hash) { return; } if (operators === undefined) { exports.changehash('#'); } else { var new_hash = '#narrow'; $.each(operators, function (idx, elem) { new_hash += '/' + hashchange.encodeHashComponent(elem[0]) + '/' + hashchange.encodeHashComponent(elem[1]); }); exports.changehash(new_hash); } }; function parse_narrow(hash) { var i, operators = []; for (i=1; i