37ff048479e2218a3eaabc2a7d2af37c6cfe0b7c
[OpenSRF.git] / src / javascript / JSON_v1.js
1 var JSON_CLASS_KEY    = '__c';
2 var JSON_DATA_KEY    = '__p';
3
4
5
6 function JSON_version() { return 'wrapper'; }
7
8 function JSON2js(text) {
9     return decodeJS(JSON2jsRaw(text));
10 }
11
12 JSON2js.fallbackObjectifier = null;
13
14 function JSON2jsRaw(text) {
15     var obj;
16     eval('obj = ' + text);
17     return obj;
18 }
19
20
21 /* iterates over object, arrays, or fieldmapper objects */
22 function jsIterate( arg, callback ) {
23     if( arg && typeof arg == 'object' ) {
24         if( arg.constructor == Array ) {
25             for( var i = 0; i < arg.length; i++ ) 
26                 callback(arg, i);
27
28         }  else if( arg.constructor == Object ) {
29                 for( var i in arg ) 
30                     callback(arg, i);
31
32         } else if( arg._isfieldmapper && arg.a ) {
33             for( var i = 0; i < arg.a.length; i++ ) 
34                 callback(arg.a, i);
35         }
36     }
37 }
38
39
40 /* removes the class/paylod wrapper objects */
41 function decodeJS(arg) {
42
43     if(arg == null) return null;
44
45     if(    arg && typeof arg == 'object' &&
46             arg.constructor == Object &&
47             arg[JSON_CLASS_KEY] ) {
48
49         try {
50             arg = eval('new ' + arg[JSON_CLASS_KEY] + '(arg[JSON_DATA_KEY])');    
51         } catch(E) {
52             if (JSON2js.fallbackObjectifier)
53                 arg = JSON2js.fallbackObjectifier(arg, JSON_CLASS_KEY, JSON_DATA_KEY );
54         }
55
56     }
57
58     if(arg._encodehash) {
59         jsIterate( arg.hash, 
60             function(o, i) {
61                 o[i] = decodeJS(o[i]);
62             }
63         );
64     } else {
65         jsIterate( arg, 
66             function(o, i) {
67                 o[i] = decodeJS(o[i]);
68             }
69         );
70     }
71
72     return arg;
73 }
74
75
76 function jsClone(obj) {
77     if( obj == null ) return null;
78     if( typeof obj != 'object' ) return obj;
79
80     var newobj;
81     if (obj.constructor == Array) {
82         newobj = [];
83         for( var i = 0; i < obj.length; i++ ) 
84             newobj[i] = jsClone(obj[i]);
85
86     } else if( obj.constructor == Object ) {
87         newobj = {};
88         for( var i in obj )
89             newobj[i] = jsClone(obj[i]);
90
91     } else if( obj._isfieldmapper && obj.a ) {
92         eval('newobj = new '+obj.classname + '();');
93         for( var i = 0; i < obj.a.length; i++ ) 
94             newobj.a[i] = jsClone(obj.a[i]);
95     }
96
97     return newobj;
98 }
99     
100
101 /* adds the class/payload wrapper objects */
102 function encodeJS(arg) {
103     if( arg == null ) return null;    
104     if( typeof arg != 'object' ) return arg;
105
106     if( arg._isfieldmapper ) {
107       var newarr = [];
108       if(!arg.a) arg.a = [];
109       for( var i = 0; i < arg.a.length; i++ ) 
110           newarr[i] = encodeJS(arg.a[i]);
111
112       var a = {};
113       a[JSON_CLASS_KEY] = arg.classname;
114       a[JSON_DATA_KEY] = newarr;
115       return a;
116     }
117
118     var newobj;
119
120     if(arg.length != undefined) {
121         newobj = [];
122         for( var i = 0; i < arg.length; i++ ) 
123             newobj.push(encodeJS(arg[i]));
124         return newobj;
125     } 
126    
127     newobj = {};
128     for( var i in arg )
129         newobj[i] = encodeJS(arg[i]);
130     return newobj;
131 }
132
133 /* turns a javascript object into a JSON string */
134 function js2JSON(arg) {
135     return js2JSONRaw(encodeJS(arg));
136 }
137
138 function js2JSONRaw(arg) {
139
140     if( arg == null ) 
141         return 'null';
142
143     var o;
144
145     switch (typeof arg) {
146
147         case 'object':
148
149             if (arg.constructor == Array) {
150                 o = '';
151                 jsIterate( arg,
152                     function(obj, i) {
153                         if (o) o += ',';
154                         o += js2JSONRaw(obj[i]);
155                     }
156                 );
157                 return '[' + o + ']';
158
159             } else if (typeof arg.toString != 'undefined') {
160                 o = '';
161                 jsIterate( arg,
162                     function(obj, i) {
163                         if (o) o += ',';
164                         o = o + js2JSONRaw(i) + ':' + js2JSONRaw(obj[i]);
165                     }
166                 );
167                 return '{' + o + '}';
168
169             }
170
171             return 'null';
172
173         case 'number': return arg;
174
175         case 'string':
176             var s = String(arg);
177             s = s.replace(/\\/g, '\\\\');
178             s = s.replace(/"/g, '\\"');
179             s = s.replace(/\t/g, "\\t");
180             s = s.replace(/\n/g, "\\n");
181             s = s.replace(/\r/g, "\\r");
182             s = s.replace(/\f/g, "\\f");
183             return '"' + s + '"';
184
185         case 'boolean':
186             return (arg) ? 'true' : 'false';
187
188         default: return 'null';
189     }
190 }
191
192
193 function __tabs(c) { 
194     var s = ''; 
195     for( i = 0; i < c; i++ ) s += '\t';
196     return s;
197 }
198
199 function jsonPretty(str) {
200     if(!str) return "";
201     var s = '';
202     var d = 0;
203     for( var i = 0; i < str.length; i++ ) {
204         var c = str.charAt(i);
205         if( c == '{' || c == '[' ) {
206             s += c + '\n' + __tabs(++d);
207         } else if( c == '}' || c == ']' ) {
208             s += '\n' + __tabs(--d) + '\n';
209             if( str.charAt(i+1) == ',' ) {
210                 s += '\n' + __tabs(d);
211             }
212         } else if( c == ',' ) {
213             s += ',\n' + __tabs(d);
214         } else {
215             s += c;
216         }
217     }
218     return s;
219 }
220
221