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); } }; // Encodes an operator list into the // corresponding hash: the # component // of the narrow URL exports.operators_to_hash = function (operators) { var hash = '#'; if (operators !== undefined) { hash = '#narrow'; $.each(operators, function (idx, elem) { hash += '/' + hashchange.encodeHashComponent(elem[0]) + '/' + hashchange.encodeHashComponent(elem[1]); }); } return hash; }; exports.save_narrow = function (operators) { if (changing_hash) { return; } var new_hash = exports.operators_to_hash(operators); exports.changehash(new_hash); }; function parse_narrow(hash) { var i, operators = []; for (i=1; i