]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - js/hashedParam.js
misc changes
[Rakka.git] / js / hashedParam.js
index 89426268496ab7cac35f7622babd0b0db16c5999..bfb3c77e1e383d2e8a3006c5e96d0c2b26eb71eb 100644 (file)
@@ -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