1 $(document).ready(function () {
3 /* Example of hashed params:
5 * /Foo/Bar.html#Redirect:Baz
6 * /Foo/Bar.html#EditPage
7 * /Foo/Bar.html#Redirect:Baz|EditPage
14 var re_key = /^[^:|]+$/;
15 var re_value = /^[^|]*$/;
18 var getRawHash = function () {
19 /* Don't use window.location.hash as it isn't portable due to
20 * an ambiguous specification.
22 var r = window.location.href;
23 var i = r.indexOf("#");
30 var setRawHash = function (hash) {
31 var r = window.location.href;
32 var i = r.indexOf("#");
36 window.location.href = b + "#" + hash;
40 var getHashedParamMap = function () {
41 var raw = getRawHash();
43 if (cached_rawHash != raw) {
44 var src = decodeURIComponent(raw);
46 // Split the source by '|' letters.
48 $.each(src.split("|"), function () {
49 // tuple ::= key ':' value
50 // | key (value is the same as key)
51 var i = this.indexOf(":");
53 var key = this.substr(0, i);
54 var val = this.substr(i + 1);
55 cached_map[key] = val;
59 cached_map[key] = key;
69 Rakka.getHashedParam = function (key) {
70 return getHashedParamMap()[key];
74 var setHashedParamMap = function (map) {
77 $.each(map, function(key, val) {
78 var tuple = (key == val
82 tuples = (tuples == ""
84 : tuples + "|" + tuple);
88 cached_raw = encodeURIComponent(tuples);
90 setRawHash(cached_raw);
93 Rakka.setHashedParam = function (key, value) {
96 Rakka.setHashedParams(diff);
99 Rakka.setHashedParams = function (diff) {
100 var orig = getHashedParamMap();
103 // Copy 'orig' to 'next'.
104 $.each(orig, function (key, val) {
108 // Overwrite the content of 'next' with 'diff'.
109 $.each(diff, function (key, val) {
111 if (!key.match(re_key)) {
112 throw new Error("Invalid key: " + key);
114 if (!val.match(re_value)) {
115 throw new Error("Invalid value: " + val);
118 if (diff[key] == null) {
126 setHashedParamMap(next);