]> gitweb @ CieloNegro.org - Rakka.git/blob - js/hashedParam.js
misc changes
[Rakka.git] / js / hashedParam.js
1 $(document).ready(function () {
2
3     /* Example of hashed params:
4      *
5      * /Foo/Bar.html#Redirect:Baz
6      * /Foo/Bar.html#EditPage
7      * /Foo/Bar.html#Redirect:Baz|EditPage
8      */
9
10     var cached_rawHash;
11     var cached_map;
12
13     /*
14     var re_key   = /^[^:|]+$/;
15     var re_value = /^[^|]*$/;
16      */
17
18     var getRawHash = function () {
19         /* Don't use window.location.hash as it isn't portable due to
20          * an ambiguous specification.
21          */
22         var r = window.location.href;
23         var i = r.indexOf("#");
24         return (i >= 0
25                 ? r.substr(i + 1)
26                 : "");
27     };
28
29     /*
30     var setRawHash = function (hash) {
31         var r = window.location.href;
32         var i = r.indexOf("#");
33         var b = (i >= 0
34                  ? r.substr(0, i)
35                  : r);
36         window.location.href = b + "#" + hash;
37     };
38      */
39
40     var getHashedParamMap = function () {
41         var raw = getRawHash();
42
43         if (cached_rawHash != raw) {
44             var src = decodeURIComponent(raw);
45
46             // Split the source by '|' letters.
47             cached_map = {};
48             $.each(src.split("|"), function () {
49                 // tuple ::= key ':' value
50                 //         | key           (value is the same as key)
51                 var i = this.indexOf(":");
52                 if (i >= 0) {
53                     var key = this.substr(0, i);
54                     var val = this.substr(i + 1);
55                     cached_map[key] = val;
56                 }
57                 else {
58                     var key = this;
59                     cached_map[key] = key;
60                 }
61             });
62
63             cached_rawHash = raw;
64         }
65
66         return cached_map;
67     };
68
69     Rakka.getHashedParam = function (key) {
70         return getHashedParamMap()[key];
71     };
72
73     /*
74     var setHashedParamMap = function (map) {
75         var tuples = "";
76
77         $.each(map, function(key, val) {
78             var tuple = (key == val
79                          ? key
80                          : key + ":" + val);
81
82             tuples = (tuples == ""
83                       ? tuple
84                       : tuples + "|" + tuple);
85         });
86
87         cached_map = map;
88         cached_raw = encodeURIComponent(tuples);
89
90         setRawHash(cached_raw);
91     };
92
93     Rakka.setHashedParam = function (key, value) {
94         var diff = {};
95         diff[key] = value;
96         Rakka.setHashedParams(diff);
97     };
98
99     Rakka.setHashedParams = function (diff) {
100         var orig = getHashedParamMap();
101         var next = {};
102
103         // Copy 'orig' to 'next'.
104         $.each(orig, function (key, val) {
105             next[key] = val;
106         });
107
108         // Overwrite the content of 'next' with 'diff'.
109         $.each(diff, function (key, val) {
110
111             if (!key.match(re_key)) {
112                 throw new Error("Invalid key: " + key);
113             }
114             if (!val.match(re_value)) {
115                 throw new Error("Invalid value: " + val);
116             }
117
118             if (diff[key] == null) {
119                 delete next[key];
120             }
121             else {
122                 next[key] = val;
123             }
124         });
125
126         setHashedParamMap(next);
127     };
128      */
129 });