$(document).ready(function () { /* Example of hashed params: * * /Foo/Bar.html#Redirect:Baz * /Foo/Bar.html#EditPage * /Foo/Bar.html#Redirect:Baz|EditPage */ var cached_rawHash; var cached_map; /* var re_key = /^[^:|]+$/; var re_value = /^[^|]*$/; */ var getRawHash = function () { /* Don't use window.location.hash as it isn't portable due to * an ambiguous specification. */ var r = window.location.href; var i = r.indexOf("#"); return (i >= 0 ? r.substr(i + 1) : ""); }; /* var setRawHash = function (hash) { var r = window.location.href; var i = r.indexOf("#"); var b = (i >= 0 ? r.substr(0, i) : r); window.location.href = b + "#" + hash; }; */ var getHashedParamMap = function () { var raw = getRawHash(); if (cached_rawHash != raw) { var src = decodeURIComponent(raw); // Split the source by '|' letters. cached_map = {}; $.each(src.split("|"), function () { // tuple ::= key ':' value // | key (value is the same as key) var i = this.indexOf(":"); if (i >= 0) { var key = this.substr(0, i); var val = this.substr(i + 1); cached_map[key] = val; } else { var key = this; cached_map[key] = key; } }); cached_rawHash = raw; } return cached_map; }; Rakka.getHashedParam = function (key) { return getHashedParamMap()[key]; }; /* var setHashedParamMap = function (map) { var tuples = ""; $.each(map, function(key, val) { var tuple = (key == val ? key : key + ":" + val); tuples = (tuples == "" ? tuple : tuples + "|" + tuple); }); cached_map = map; cached_raw = encodeURIComponent(tuples); setRawHash(cached_raw); }; Rakka.setHashedParam = function (key, value) { var diff = {}; diff[key] = value; Rakka.setHashedParams(diff); }; Rakka.setHashedParams = function (diff) { var orig = getHashedParamMap(); var next = {}; // Copy 'orig' to 'next'. $.each(orig, function (key, val) { next[key] = val; }); // Overwrite the content of 'next' with 'diff'. $.each(diff, function (key, val) { if (!key.match(re_key)) { throw new Error("Invalid key: " + key); } if (!val.match(re_value)) { throw new Error("Invalid value: " + val); } if (diff[key] == null) { delete next[key]; } else { next[key] = val; } }); setHashedParamMap(next); }; */ });