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