X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Rakka.git;a=blobdiff_plain;f=js%2FhashedParam.js;h=bfb3c77e1e383d2e8a3006c5e96d0c2b26eb71eb;hp=89426268496ab7cac35f7622babd0b0db16c5999;hb=f19a294d54f38faaeab0027ecb5d85388243b924;hpb=87df74aaf1fc55047bac7ac234546db7547cf166 diff --git a/js/hashedParam.js b/js/hashedParam.js index 8942626..bfb3c77 100644 --- a/js/hashedParam.js +++ b/js/hashedParam.js @@ -10,17 +10,35 @@ $(document).ready(function () { 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); @@ -29,13 +47,16 @@ $(document).ready(function () { 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; } }); @@ -46,10 +67,63 @@ $(document).ready(function () { }; 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