rename swat => swat2, so that we don't conflict with samba3
[gd/samba/.git] / swat2 / scripting / client / encoder.js
diff --git a/swat2/scripting/client/encoder.js b/swat2/scripting/client/encoder.js
new file mode 100644 (file)
index 0000000..2a4d174
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+       client side js functions for encoding/decoding objects into linear strings
+
+       Copyright Andrew Tridgell 2005
+       released under the GNU GPL Version 3 or later
+*/
+/*
+       usage:
+
+         enc = encodeObject(obj);
+         obj = decodeObject(enc);
+
+       The encoded format of the object is a string that is safe to
+       use in URLs
+
+       Note that only data elements are encoded, not functions
+*/
+
+function count_members(o) {
+       var i, count = 0;
+       for (i in o) { 
+               count++;  
+       }
+       return count;
+}
+
+function encodeObject(o) {
+       var i, r = count_members(o) + ":";
+       for (i in o) {
+               var t = typeof(o[i]);
+               if (t == 'object') {
+                       r = r + "" + i + ":" + t + ":" + encodeObject(o[i]);
+               } else if (t == 'string') {
+                       var s = encodeURIComponent(o[i]).replace(/%/g,'#');
+                       r = r + "" + i + ":" + t + ":" + s + ":";
+               } else if (t == 'boolean' || t == 'number') {
+                       r = r + "" + i + ":" + t + ":" + o[i] + ":";
+               } else if (t == 'undefined' || t == 'null') {
+                       r = r + "" + i + ":" + t + ":";
+               } else if (t != 'function') {
+                       alert("Unable to encode type " + t);
+               }
+       }
+       return r;
+}
+
+function decodeObjectArray(a) {
+       var o = new Object();
+       var i, count = a[a.i]; a.i++;
+       for (i=0;i<count;i++) {
+               var name  = a[a.i]; a.i++;
+               var type  = a[a.i]; a.i++;
+               var value;
+               if (type == 'object') {
+                       o[name] = decodeObjectArray(a);
+               } else if (type == "string") {
+                       value = decodeURIComponent(a[a.i].replace(/#/g,'%')); a.i++;
+                       o[name] = value;
+               } else if (type == "boolean") {
+                       value = a[a.i]; a.i++;
+                       if (value == 'true') {
+                               o[name] = true;
+                       } else {
+                               o[name] = false;
+                       }
+               } else if (type == "undefined") {
+                       o[name] = undefined;
+               } else if (type == "null") {
+                       o[name] = null;
+               } else if (type == "number") {
+                       value = a[a.i]; a.i++;
+                       o[name] = value * 1;
+               } else {
+                       alert("Unable to delinearise type " + type);
+               }
+       }
+       return o;
+}
+
+function decodeObject(str) {
+       var a = str.split(':');
+       a.i = 0;
+       return decodeObjectArray(a);
+}