~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to swat2/scripting/client/encoder.js

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
        client side js functions for encoding/decoding objects into linear strings
 
3
 
 
4
        Copyright Andrew Tridgell 2005
 
5
        released under the GNU GPL Version 3 or later
 
6
*/
 
7
/*
 
8
        usage:
 
9
 
 
10
          enc = encodeObject(obj);
 
11
          obj = decodeObject(enc);
 
12
 
 
13
       The encoded format of the object is a string that is safe to
 
14
       use in URLs
 
15
 
 
16
       Note that only data elements are encoded, not functions
 
17
*/
 
18
 
 
19
function count_members(o) {
 
20
        var i, count = 0;
 
21
        for (i in o) { 
 
22
                count++;  
 
23
        }
 
24
        return count;
 
25
}
 
26
 
 
27
function encodeObject(o) {
 
28
        var i, r = count_members(o) + ":";
 
29
        for (i in o) {
 
30
                var t = typeof(o[i]);
 
31
                if (t == 'object') {
 
32
                        r = r + "" + i + ":" + t + ":" + encodeObject(o[i]);
 
33
                } else if (t == 'string') {
 
34
                        var s = encodeURIComponent(o[i]).replace(/%/g,'#');
 
35
                        r = r + "" + i + ":" + t + ":" + s + ":";
 
36
                } else if (t == 'boolean' || t == 'number') {
 
37
                        r = r + "" + i + ":" + t + ":" + o[i] + ":";
 
38
                } else if (t == 'undefined' || t == 'null') {
 
39
                        r = r + "" + i + ":" + t + ":";
 
40
                } else if (t != 'function') {
 
41
                        alert("Unable to encode type " + t);
 
42
                }
 
43
        }
 
44
        return r;
 
45
}
 
46
 
 
47
function decodeObjectArray(a) {
 
48
        var o = new Object();
 
49
        var i, count = a[a.i]; a.i++;
 
50
        for (i=0;i<count;i++) {
 
51
                var name  = a[a.i]; a.i++;
 
52
                var type  = a[a.i]; a.i++;
 
53
                var value;
 
54
                if (type == 'object') {
 
55
                        o[name] = decodeObjectArray(a);
 
56
                } else if (type == "string") {
 
57
                        value = decodeURIComponent(a[a.i].replace(/#/g,'%')); a.i++;
 
58
                        o[name] = value;
 
59
                } else if (type == "boolean") {
 
60
                        value = a[a.i]; a.i++;
 
61
                        if (value == 'true') {
 
62
                                o[name] = true;
 
63
                        } else {
 
64
                                o[name] = false;
 
65
                        }
 
66
                } else if (type == "undefined") {
 
67
                        o[name] = undefined;
 
68
                } else if (type == "null") {
 
69
                        o[name] = null;
 
70
                } else if (type == "number") {
 
71
                        value = a[a.i]; a.i++;
 
72
                        o[name] = value * 1;
 
73
                } else {
 
74
                        alert("Unable to delinearise type " + type);
 
75
                }
 
76
        }
 
77
        return o;
 
78
}
 
79
 
 
80
function decodeObject(str) {
 
81
        var a = str.split(':');
 
82
        a.i = 0;
 
83
        return decodeObjectArray(a);
 
84
}