d70aacdb95e481a6de320c08f91a8b4573cbcb69
[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/paylod 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                         } else {
170                                 return 'null';
171                         }
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