var cached_rawHash;
var cached_map;
- Rakka.getRawHash = function () {
- // Don't use window.location.hash as it isn't portable.
- var r = window.location.hash;
+ /*
+ 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)
: "");
};
- Rakka.getHashedParamMap = function () {
- var raw = Rakka.getRawHash();
+ /*
+ 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);
cached_map = {};
$.each(src.split("|"), function () {
// tuple ::= key ':' value
- // | key (value is empty)
+ // | key (value is the same as key)
var i = this.indexOf(":");
if (i >= 0) {
- cached_map[this.substr(0, i)] = this.substr(i + 1);
+ var key = this.substr(0, i);
+ var val = this.substr(i + 1);
+ cached_map[key] = val;
}
else {
- cached_map[this.substr(0, i)] = "";
+ var key = this;
+ cached_map[key] = key;
}
});
};
Rakka.getHashedParam = function (key) {
- return Rakka.getHashedParamMap()[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.setHashedParamMap = function (map) {
- //////////
+ 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);
};
+ */
});
\ No newline at end of file