]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/javascript/JSON_v1.js
Deliberately break applications relying on pre-OpenSRF 1.0 behaviour.
[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         jsIterate( arg, 
50                 function(o, i) {
51                         o[i] = decodeJS(o[i]);
52                 }
53         );
54
55         return arg;
56 }
57
58
59 function jsClone(obj) {
60         if( obj == null ) return null;
61         if( typeof obj != 'object' ) return obj;
62
63         var newobj;
64         if (obj.constructor == Array) {
65                 newobj = [];
66                 for( var i = 0; i < obj.length; i++ ) 
67                         newobj[i] = jsClone(obj[i]);
68
69         } else if( obj.constructor == Object ) {
70                 newobj = {};
71                 for( var i in obj )
72                         newobj[i] = jsClone(obj[i]);
73
74         } else if( obj._isfieldmapper && obj.a ) {
75                 eval('newobj = new '+obj.classname + '();');
76                 for( var i = 0; i < obj.a.length; i++ ) 
77                         newobj.a[i] = jsClone(obj.a[i]);
78         }
79
80         return newobj;
81 }
82         
83
84 /* adds the class/paylod wrapper objects */
85 function encodeJS(arg) {
86         if( arg == null ) return null;  
87         if( typeof arg != 'object' ) return arg;
88
89         if( arg._isfieldmapper ) {
90       var newarr = []
91       if(!arg.a) arg.a = [];
92                 for( var i = 0; i < arg.a.length; i++ ) 
93                         newarr[i] = encodeJS(arg.a[i]);
94
95                 var a = {};
96                 a[JSON_CLASS_KEY] = arg.classname;
97                 a[JSON_DATA_KEY] = newarr;
98       return a;
99         }
100
101         var newobj;
102
103         if(arg.length != undefined) {
104                 newobj = [];
105                 for( var i = 0; i < arg.length; i++ ) 
106          newobj.push(encodeJS(arg[i]));
107       return newobj;
108         } 
109    
110         newobj = {};
111         for( var i in arg )
112                 newobj[i] = encodeJS(arg[i]);
113         return newobj;
114 }
115
116 /* turns a javascript object into a JSON string */
117 function js2JSON(arg) {
118         return js2JSONRaw(encodeJS(arg));
119 }
120
121 function js2JSONRaw(arg) {
122
123         if( arg == null ) 
124                 return 'null';
125
126         var o;
127
128         switch (typeof arg) {
129
130                 case 'object':
131
132                         if (arg.constructor == Array) {
133                                 o = '';
134                                 jsIterate( arg,
135                                         function(obj, i) {
136                                                 if (o) o += ',';
137                                                 o += js2JSONRaw(obj[i]);
138                                         }
139                                 );
140                                 return '[' + o + ']';
141
142                         } else if (typeof arg.toString != 'undefined') {
143                                 o = '';
144                                 jsIterate( arg,
145                                         function(obj, i) {
146                                                 if (o) o += ',';
147                                                 o = o + js2JSONRaw(i) + ':' + js2JSONRaw(obj[i]);
148                                         }
149                                 );
150                                 return '{' + o + '}';
151
152                         } else {
153                                 return 'null';
154                         }
155
156                 case 'number': return arg;
157
158                 case 'string':
159                         var s = String(arg);
160                         s = s.replace(/\\/g, '\\\\');
161                         s = s.replace(/"/g, '\\"');
162                         s = s.replace(/\t/g, "\\t");
163                         s = s.replace(/\n/g, "\\n");
164                         s = s.replace(/\r/g, "\\r");
165                         s = s.replace(/\f/g, "\\f");
166                         return '"' + s + '"';
167
168                 default: return 'null';
169         }
170 }
171
172
173 function __tabs(c) { 
174         var s = ''; 
175         for( i = 0; i < c; i++ ) s += '\t';
176         return s;
177 }
178
179 function jsonPretty(str) {
180         if(!str) return "";
181         var s = '';
182         var d = 0;
183         for( var i = 0; i < str.length; i++ ) {
184                 var c = str.charAt(i);
185                 if( c == '{' || c == '[' ) {
186                         s += c + '\n' + __tabs(++d);
187                 } else if( c == '}' || c == ']' ) {
188                         s += '\n' + __tabs(--d) + '\n';
189                         if( str.charAt(i+1) == ',' ) {
190                                 s += '\n' + __tabs(d);
191                         }
192                 } else if( c == ',' ) {
193                         s += ',\n' + __tabs(d);
194                 } else {
195                         s += c;
196                 }
197         }
198         return s;
199 }
200
201