details. No 8080. chain_exec
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / util / util.js
1 sdump('D_TRACE','Loading util.js\n');
2
3 var counter = {};
4 var consider_Timeout_default = false;
5
6 function a_get( obj, i ) { return obj[i]; } // for use in closures inside loops
7
8 // This executes a series of functions, but tries to give other events/functions a chance to
9 // execute between each one.
10 function chain_exec() {
11         sdump('D_UTIL',arg_dump(arguments));
12         var args = [];
13         for (var i = 0; i < arguments.length; i++) {
14                 var arg = arguments[i];
15                 if (typeof(arg)=='function') args.push( arg );
16                 else for (var j = 0; j < arg.length; j++) {
17                         if (typeof(arg[j])=='function') args.push( arg[j] );
18                 }
19         }
20         if (args.length > 0) setTimeout(
21                 function() {
22                         args[0]();
23                         if (args.length > 1 ) chain_exec( args.slice(1) );
24                 }, 0
25         );
26 }
27
28 function consider_Timeout( f, t, b) {
29         sdump('D_TIMEOUT', arg_dump(arguments,{0:true,1:true,2:true}));
30         if (b) {
31                 setTimeout(f,t);
32         } else {
33                 if (consider_Timeout_default)
34                         setTimeout(f,t);
35                 else
36                         f();
37         }
38 }
39
40 function parse_render_string( obj_string, render_string, regexp ) {
41         sdump('D_UTIL', arg_dump(arguments,{0:true,1:true}));
42         var cmd;
43         try {
44                 if (!regexp) regexp = /\$\$/g;
45                 if (render_string.slice(0,1) == '.') {
46                         cmd = obj_string + render_string;
47                 } else {
48                         cmd = render_string.replace( regexp, obj_string );
49                 }
50
51         } catch(E) {
52
53                 sdump('D_ERROR',E);
54         }
55         sdump('D_UTIL', 'cmd = ' + cmd + '\n');
56         return cmd;
57 }
58
59 function getString( key ) {
60         var s = '';
61         var bundles = mw.document.getElementById('string_bundles');
62         sdump('D_STRING','bundles = ' + bundles + ' bundles.childNodes.length = ' + bundles.childNodes.length + '\n');
63         for (var i = 0; i < bundles.childNodes.length; i++) {
64                 var bundle = bundles.childNodes[i];
65                 sdump('D_STRING','\ttrying bundle = ' + bundle + '\n');
66                 try {
67
68                         var string = bundle.getString( key );
69                         if (string) {
70                                 s = string;
71                                 sdump('D_STRING','\tfound\n');
72                         } else {
73                                 sdump('D_STRING','\tnot found\n');
74                         }
75
76                 } catch(E) {
77                         sdump('D_ERROR','string: ' + key + ' not found\n');
78                         s = key;
79                 }
80         }
81         sdump('D_STRING',key + '=' + s + '\n');
82         return s;
83 }
84
85 function getFormattedString( key, strArray ) {
86         var s = '';
87         var bundles = mw.document.getElementById('string_bundles');
88         for (var i = i; i < bundles.childNodes.length; i++) {
89                 var bundle = bundles[i];
90                 try {
91
92                         var string = bundle.getFormattedString( key, strArray );
93                         if (string)
94                                 s = string;
95
96                 } catch(E) {
97                         sdump('D_ERROR','string: ' + key + ' not found\n');
98                         s = key;
99                 }
100         }
101         sdump('D_STRING',key + '(' + strArray + ')=' + s + '\n');
102         return s;
103 }
104
105 function string_to_array(s) {
106         var my_array = [];
107         for (var i = 0; i < s.length; i++ ) {
108                 my_array.push( s.charAt(i) );
109         }
110         return my_array;
111 }
112
113 function yesno(value) {
114         switch(value) {
115                 case true: case 'true': case '1': case 'on':
116                         return 'Yes';
117                 default: 
118                         return 'No';
119         }
120 }
121
122 function dollars_float_to_cents_integer( money ) {
123         // careful to avoid fractions of pennies
124         var money_s = money.toString();
125         // FIXME: strip miscellaneous characters
126         var marray = money_s.split(".");
127         var dollars = marray[0];
128         var cents = marray[1];
129         try {
130                 if (cents.length < 2) {
131                         cents = cents + '0';
132                 }
133         } catch(E) {
134                 // I'm not sure why these are getting thrown, especially with the code still working
135                 sdump('D_ERROR',"cents.length? " + E + "\n");
136         }
137         try {
138                 if (cents.length > 2) {
139                         sdump('D_ERROR',"We don't round money\n");
140                         cents = cents.substr(0,2);
141                 }
142         } catch(E) {
143                 sdump('D_ERROR',"cents.length? " + E + "\n");
144         }
145         var total = 0;
146         try {
147                 if (parseInt(cents)) total += parseInt(cents);
148         } catch(E) {
149                 sdump('D_ERROR',"parseInt(cents)? " + E + "\n");
150         }
151         try {
152                 if (parseInt(dollars)) total += (parseInt(dollars) * 100);
153         } catch(E) {
154                 sdump('D_ERROR',"parseInt(dollars)? " + E + "\n");
155         }
156         return total;   
157 }
158
159 function cents_as_dollars( cents ) {
160         cents = cents.toString(); 
161         // FIXME: strip miscellaneous characters
162         try {
163                 switch( cents.length ) {
164                         case 0: cents = '000'; break;
165                         case 1: cents = '00' + cents; break;
166                 }
167         } catch(E) {
168                 sdump('D_ERROR',"cents_as_dollars: cents.length? " + E + "\n");
169         }
170         return cents.substr(0,cents.length-2) + '.' + cents.substr(cents.length - 2);
171 }
172
173 function debug() {
174         var s = '';
175         for (var i = 0; i < arguments.length; i++) {
176                 s = s + arguments[i];
177         }
178         //sdump('D_UTIL','debug:' + s + '\n');
179         dump('debug:' + s + '\n');
180 }
181
182 function counter_init(id) {
183         counter[id] = 0;
184 }
185
186 function counter_incr(id) {
187         if (! counter[id]) { counter_init(id); }
188         return ++counter[id];
189 }
190
191 function counter_peek(id) {
192         if (! counter[id]) { return 0; }
193         return counter[id];
194 }
195
196 function dump_ns_node( node ) {
197         return (
198         'id=<' + 
199         node[fieldmap["Fieldmapper::biblio::record_node"].fields.id.position] 
200         + '>  intra-id=<' + 
201         node[fieldmap["Fieldmapper::biblio::record_node"].fields.intra_doc_id.position]
202         + '>  name=<' + 
203         node[fieldmap["Fieldmapper::biblio::record_node"].fields.name.position]
204         + '>  node_type=<' + 
205         node[fieldmap["Fieldmapper::biblio::record_node"].fields.type.position]
206         + '>  parent_node=<' + 
207         node[fieldmap["Fieldmapper::biblio::record_node"].fields.parent_node.position]
208         + '>  '
209         );
210 }
211
212 function nodeset2tree(ns) {
213         for (var i in ns) {
214                 if (ns[i].parent_node) {
215                         ns_addChild( 
216                                 ns, 
217                                 ns[i].parent_node, 
218                                 ns[i].intra_doc_id 
219                         );
220                 }
221         }
222         return ns;
223 }
224
225 function ns_addChild(ns,p,c) {
226         if (! ns[p].children ) { ns[p].children = []; }
227         ns[p].children.push(ns[c]);
228 }
229
230 function print_tabs(t) {
231         var r = '';
232         for (var j = 0; j < t; j++ ) { r = r + "\t"; }
233         return r;
234 }
235
236 function pretty_print(s) {
237         var r = ''; var t = 0;
238         for (var i in s) {
239                 if (s[i] == '{') {
240                         r = r + "\n" + print_tabs(t) + s[i]; t++;
241                         r = r + "\n" + print_tabs(t);
242                 } else if (s[i] == '[') {
243                         r = r + "\n" + print_tabs(t) + s[i]; t++;
244                         r = r + "\n" + print_tabs(t);
245                 } else if (s[i] == '}') {
246                         t--; r = r + "\n" + print_tabs(t) + s[i]; 
247                         r = r + "\n" + print_tabs(t);
248                 } else if (s[i] == ']') { 
249                         t--; r = r + "\n" + print_tabs(t) + s[i];
250                         r = r + "\n" + print_tabs(t);
251                 } else if (s[i] == ',') {
252                         r = r + s[i]; 
253                         r = r + "\n" + print_tabs(t);
254                 } else {
255                         r = r + s[i];
256                 }
257         }
258         return r;
259 }
260
261 function super_dump(o,t) {
262         var s = "\n";
263         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
264         s = s + "=-=-=\n";
265         s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
266         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
267         s = s + "typeof = " + typeof(o) + "\n";
268         try {
269                 var string = new XMLSerializer().serializeToString(o);
270                 return( string + "\n" );
271         } catch( E ) {
272                 var i;
273                 var c = 0;
274                 for (i in o) {
275                         switch(typeof(i)) {
276                                 case 'object':
277                                         s = s + super_dump(i,t+1);
278                                         break;
279                                 default :
280                                         var value = o[i];
281                                         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
282                                         s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
283                                         if (typeof(value) == 'object') {
284                                                 value = super_dump(value,t+1);
285                                         }
286                                         s = s + "\ttoString:" + i.toString() + "\tvalue:" + value + "\n";
287                                         break;
288                         }
289                 }
290                 return( s + "\n" );
291         }
292 }
293
294 function super_dump_norecurse(o,t) {
295         var s = "\n";
296         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
297         s = s + "=-=-=\n";
298         s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
299         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
300         s = s + "typeof = " + typeof(o) + "\n";
301         try {
302                 var string = new XMLSerializer().serializeToString(o);
303                 return( string + "\n" );
304         } catch( E ) {
305                 var i;
306                 var c = 0;
307                 for (i in o) {
308                         switch(typeof(i)) {
309                                 default :
310                                         var value = o[i];
311                                         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
312                                         s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
313                                         s = s + "\ttoString:" + i.toString() + "\n";
314                                         break;
315                         }
316                 }
317                 return( s + "\n" );
318         }
319 }
320
321