]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
Operator Change Fun
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5
6 if (typeof util == 'undefined') util = {};
7 util.network = function () {
8
9     try {
10
11         JSAN.use('util.error'); this.error = new util.error();
12         JSAN.use('util.sound'); this.sound = new util.sound();
13
14         offlineStrings = document.getElementById('offlineStrings');
15
16     } catch(E) {
17         alert('error in util.network constructor: ' + E);
18         throw(E);
19     }
20
21     return this;
22 };
23
24 util.network.prototype = {
25
26     'link_id' : 0,
27
28     'network_timeout' : 55, /* seconds */
29
30     'NETWORK_FAILURE' : null,
31
32     'simple_request' : function(method_id,params,f,override_params) {
33         //var obj = this;
34         //var sparams = js2JSON(params);
35         //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
36         //    '\noverride_params = ' + override_params + '\n');
37         if (typeof api[method_id] == 'undefined') {
38             throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
39         }
40         var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
41         return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
42     },
43
44     'get_result' : function (req) {
45         var obj = this;
46         var result;
47         var fake_ilsevent_for_network_errors = { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; 
48         try {
49             if (req.cancelled) {
50                 result = fake_ilsevent_for_network_errors;
51             } else {
52                 result = req.getResultObject();   
53                 if(result && req._reported_events) {
54                     if(typeof result.ilsevent != 'undefined') {
55                         result._reported_events = req._reported_events;
56                     } else {
57                         result[0]._reported_events = req._reported_events;
58                     }
59                 } 
60             }
61         } catch(E) {
62             try {
63                 if (instanceOf(E, NetworkFailure)) {
64                     obj.NETWORK_FAILURE = E;
65                 } else {
66                     try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
67                 }
68             } catch(I) { 
69                 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
70             }
71             result = fake_ilsevent_for_network_errors;
72         }
73         return result;
74     },
75
76     'request' : function (app,name,params,f,override_params,_params) {
77
78         var obj = this;
79         
80         //var sparams = js2JSON(params);
81         //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
82         //    '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
83
84         try {
85
86             if (typeof _params == 'undefined') {
87                 // If we're not using simple_request to get here, let's assume secure by default
88                 _params = { 'secure' : true };
89             }
90
91             var request =  this._request(app,name,params,f,override_params,_params);
92             if (request) {
93                 return this.get_result(request);
94             } else {
95                 return null;
96             }
97     
98         } catch(E) {
99             alert('1: ' + E); 
100         }
101     },
102
103     '_request' : function (app,name,params,f,override_params,_params) {
104         var obj = this;
105         try {
106             var sparams = js2JSON(params);
107             obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
108                 '\noverride_params = ' + override_params + '\n_params = ' + _params +
109                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) +
110                 '\nlocation.href = ' + location.href );
111
112             if (document.getElementById('network_progress')) {
113                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name);
114             } else if (typeof xulG != 'undefined') {
115                 if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name);
116             }
117
118             var request = new RemoteRequest( app, name );
119             if (_params && _params.secure) {
120                 request.setSecure(true);
121             } else {
122                 request.setSecure(false);
123             }
124             for(var index in params) {
125                 request.addParam(params[index]);
126             }
127
128             var start_timer = (new Date).getTime();    
129             if (f)  {
130                 request.setCompleteCallback(
131                     function(req) {
132                         try {
133                             var duration = ( (new Date).getTime() - start_timer )/1000;
134                             if ( obj.get_result(req) == null && duration > obj.network_timeout ) req.cancelled = true;
135
136                             if (document.getElementById('network_progress')) {
137                                 if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
138                             } else if (typeof xulG != 'undefined') {
139                                 if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
140                             }
141
142                             var json_string = js2JSON(obj.get_result(req));
143                             obj.error.sdump('D_SES_RESULT','asynced result #' 
144                                 + obj.link_id + '\n\n' 
145                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
146                                 + '\n\nOriginal Request:\n\n' 
147                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
148                             obj.play_sounds( request );
149                             req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
150                             req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
151                             if (override_params) {
152                                 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
153                             }
154                             req = obj.check_for_offline(app,name,params,req,override_params,_params);
155                             f(req);
156                             obj.NETWORK_FAILURE = null;
157                         } catch(E) {
158                             try {
159                                 E.ilsevent = -2;
160                                 E.textcode = offlineStrings.getString('network.server_or_method.error');
161                             } catch(F) {}
162                             f( { 'getResultObject' : function() { return E; } } );
163                         }
164                     }
165                 );
166                 try {
167                     request.send(false);
168                 } catch(E) {
169                     throw(E);
170                 }
171                 return null;
172             } else {
173                 try {
174                     request.send(true);
175                     var duration = ( (new Date).getTime() - start_timer )/1000;
176                     if ( obj.get_result(request) == null && duration > obj.network_timeout ) request.cancelled = true;
177
178                     if (document.getElementById('network_progress')) {
179                         if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name);
180                     } else if (typeof xulG != 'undefined') {
181                         if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name);
182                     }
183
184                 } catch(E) {
185                     throw(E);
186                 }
187                 var result = obj.get_result(request);
188                 var json_string = js2JSON(result);
189                 this.error.sdump('D_SES_RESULT','synced result #' 
190                     + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
191                     + '\n\nOriginal Request:\n\n' 
192                     + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
193                 obj.play_sounds( request );
194                 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
195                 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
196                 if (override_params) {
197                     request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
198                 }
199                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
200                 obj.NETWORK_FAILURE = null;
201                 return request;
202             }
203
204         } catch(E) {
205             alert('2: ' + E);
206             if (instanceOf(E,perm_ex)) {
207                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
208             }
209             throw(E);
210         }
211     },
212
213     'check_for_offline' : function (app,name,params,req,override_params,_params) {
214         try {
215             var obj = this;
216             var result = obj.get_result(req);
217             if (result == null) return req;
218             if (typeof result.ilsevent == 'undefined') return req;
219             if (result.ilsevent != -1) return req;
220
221             JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
222             var proceed = true;
223
224             while(proceed) {
225
226                 proceed = false;
227
228                 var r;
229
230                 if (data.proceed_offline) {
231
232                     r = 1;
233
234                 } else {
235
236                     var network_failure_string;
237                     var network_failure_status_string;
238                     var msg;
239
240                     try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
241                     try { network_failure_status_string = typeof obj.NETWORK_FAILURE == 'object' && typeof obj.NETWORK_FAILURE != 'null' && typeof obj.NETWORK_FAILURE.status == 'function' ? obj.NETWORK_FAILURE.status() : ''; } catch(E) { network_failure_status_string = ''; obj.error.sdump('D_ERROR', 'setting network_failure_status_string: ' + E); }
242                     
243                     try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
244                                 offlineStrings.getFormattedString('network.server.method', [name]) + '\n' + 
245                                 offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' + 
246                                 offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' + 
247                                 offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
248                     } catch(E) { msg = E; }
249
250                     try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert('3: ' + E); }
251
252                     r = obj.error.yns_alert(
253                         msg,
254                         offlineStrings.getString('network.network_failure'),
255                         offlineStrings.getString('network.retry_network'),
256                         offlineStrings.getString('network.ignore_errors'),
257                         null,
258                         offlineStrings.getString('common.confirm')
259                     );
260                     if (r == 1) {
261                         data.proceed_offline = true; data.stash('proceed_offline');
262                         dump('Remembering proceed_offline for 200000 ms.\n');
263                         setTimeout(
264                             function() {
265                                 data.proceed_offline = false; data.stash('proceed_offline');
266                                 dump('Setting proceed_offline back to false.\n');
267                             }, 200000
268                         );
269                     }
270                 }
271
272                 dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
273
274                 switch(r) {
275                     case 0: 
276                         req = obj._request(app,name,params,null,override_params,_params);
277                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
278                         return req;
279                     break;
280
281                     case 1: 
282                         return req;
283                     break;
284                 }
285             }
286         } catch(E) {
287             alert('4: ' + E);
288             throw(E);
289         }
290     },
291
292     'reset_titlebars' : function(data) {
293         var obj = this;
294         data.stash_retrieve();
295         try {
296             JSAN.use('util.window'); var win =  new util.window();
297             var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
298             var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
299             var enumerator = windowManagerInterface.getEnumerator('eg_menu');
300
301             var w; // set title on all appshell windows
302             while ( w = enumerator.getNext() ) {
303                 w.document.title = 
304                     w.egwinid
305                     + ': ' + data.list.au[0].usrname() 
306                     + '@' + data.ws_name
307                     + '.' + data.server_unadorned; 
308             }
309         } catch(E) {
310             obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
311         }
312     },
313
314     'set_user_status' : function() {
315         data.stash_retrieve();
316         try {
317             var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
318             var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
319             var permlist = windowManagerInterface.getMostRecentWindow('eg_main').get_menu_perms(null);
320             var offlinestrings;
321             var enumerator = windowManagerInterface.getEnumerator('eg_menu');
322
323             var w;
324             var x;
325             while ( w = enumerator.getNext() ) {
326                 x = w.document.getElementById('oc_menuitem');
327
328                 if(!offlinestrings) offlinestrings = w.document.getElementById('offlineStrings');
329                 if(permlist) w.g.menu.set_menu_access(permlist);
330                 if(data.list.au.length > 1) {
331                     addCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
332                     x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [data.list.au[1].usrname()]) );
333                 }
334                 else {
335                     removeCSSClass(w.document.getElementById('main_tabbox'),'operator_change');
336                     x.setAttribute('label', x.getAttribute('label_orig'));
337                 }
338             }
339         } catch(E) {
340             obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
341         }
342     },
343
344     'get_new_session' : function(name,xulG,text) {
345         var obj = this;
346         try {
347
348         var url = urls.XUL_AUTH_SIMPLE;
349         if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
350         JSAN.use('util.window'); var win = new util.window();
351         JSAN.use('OpenILS.data');
352         var data = new OpenILS.data(); data.init({'via':'stash'});
353         var my_xulG = win.open(
354             url,
355             //+ '?login_type=staff'
356             //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
357             //+ '&desc_full=' + window.escape( text ? 'Please enter the credentials for a new login session.' : 'Please enter the credentials for the new login session.  Note that the previous session is still active.'),
358             //'simple_auth' + (new Date()).toString(),
359             offlineStrings.getString('network.new_session.authorize'),
360             'chrome,resizable,modal,width=700,height=500',
361             {
362                 'login_type' : text ? (data.session.login_type ? data.session.login_type : 'staff') : 'ochange',
363                 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
364                 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
365                 //'simple_auth' : (new Date()).toString(),
366             }
367         );
368         data.stash_retrieve();
369         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
370             data.session.key = data.temporary_session.key; 
371             data.session.authtime = data.temporary_session.authtime; 
372             data.session.is_perm = data.temporary_session.is_perm; // For operator change, otherwise ignorable.
373             data.session.login_type = data.temporary_session.login_type; // For timeouts *after* operator change.
374             data.stash('session');
375             try {
376                 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
377                 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
378                 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
379
380                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key + "; secure;", null);
381
382             } catch(E) {
383                 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
384             }
385             if (! data.list.au ) data.list.au = [];
386             data.list.au[0] = JSON2js( data.temporary_session.usr );
387             data.stash('list');
388             obj.reset_titlebars(data);
389             return true;
390         } else {
391             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
392         }
393         return false;
394
395         } catch(E) {
396             obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
397         }
398     },
399
400     'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
401         try {
402             var obj = this;
403             var robj = obj.get_result(req);
404             if (robj != null && robj.ilsevent && robj.ilsevent == 1001 /* NO_SESSION */) {
405
406                 if (obj.get_new_session(name,undefined,true)) {
407                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
408                     params[0] = data.session.key;
409                     req = obj._request(app,name,params,null,override_params,_params);
410                 }
411             }
412         } catch(E) {
413             this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
414         }
415         return req;
416     },
417     
418     'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
419         try {
420             var obj = this;
421             var robj = obj.get_result(req);
422             if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
423                 if (location.href.match(/^chrome/)) {
424                     //alert('Permission denied.');
425                 } else {
426                     JSAN.use('util.window'); var win = new util.window();
427                     var my_xulG = win.open(
428                         urls.XUL_AUTH_SIMPLE,
429                         //+ '?login_type=temp'
430                         //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
431                         //+ '&desc_full=' + window.escape('Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, inform your friendly Evergreen developers of the above permission and this debug information: ' + name),
432                         //'simple_auth' + (new Date()).toString(),
433                         offlineStrings.getFormattedString('network.permission.authorize'),
434                         'chrome,resizable,modal,width=700,height=500',
435                         {
436                             'login_type' : 'temp',
437                             'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
438                             'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
439                             //'simple_auth' : (new Date()).toString(),
440                         }
441                     );
442                     JSAN.use('OpenILS.data');
443                     //var data = new OpenILS.data(); data.init({'via':'stash'});
444                     if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
445                         params[0] = my_xulG.temporary_session.key;
446                         req = obj._request(app,name,params,null,override_params,_params);
447                     }
448                 }
449             }
450         } catch(E) {
451             this.error.sdump('D_ERROR',E);
452         }
453         return req;
454     },
455
456     'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
457         var obj = this;
458         try {
459             if (!override_params.text) override_params.text = {};
460             if (!override_params.auto_override_these_events) override_params.auto_override_these_events = [];
461             if (!override_params.report_override_on_events) override_params.report_override_on_events = [];
462             function override(r) {
463                 try {
464                     // test to see if we can suppress this dialog and auto-override
465                     var auto_override = false;
466                     if (override_params.auto_override_these_events.length > 0) {
467                         auto_override = true;
468                         for (var i = 0; i < r.length; i++) {
469                             if ( 
470                                 (typeof r[i].ilsevent != 'undefined') && 
471                                 (
472                                     (override_params.auto_override_these_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) ||
473                                     (override_params.auto_override_these_events.indexOf( r[i].textcode ) != -1) 
474                                 )
475                             ) {
476                                 // so far so good
477                             } else {
478                                 // showstopper
479                                 auto_override = false;
480                             }
481                         }
482                     }
483                     if (auto_override) {
484                         obj.sound.bad();
485                         req = obj._request(app,name + '.override',params);
486                         return req;
487                     }
488
489                     var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
490                         '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' + 
491                         '<grid><columns><column/><column flex="1"/></columns><rows>';
492                     for (var i = 0; i < r.length; i++) {
493                         var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
494                         var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
495                         var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
496                         var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
497                         xml += '<row>' + 
498                             '<description class="oils_event" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
499                             '<description>' + t3 + '</description>' + 
500                             '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
501                     }
502                     xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' + 
503                         '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' + 
504                         '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' + 
505                         '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
506                     //JSAN.use('OpenILS.data');
507                     //var data = new OpenILS.data(); data.init({'via':'stash'});
508                     //data.temp_override_xml = xml; data.stash('temp_override_xml');
509                     JSAN.use('util.window'); var win = new util.window();
510                     var fancy_prompt_data = win.open(
511                         urls.XUL_FANCY_PROMPT,
512                         //+ '?xml_in_stash=temp_override_xml'
513                         //+ '&title=' + window.escape(override_params.title),
514                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
515                         { 'xml' : xml, 'title' : override_params.title, 'sound' : 'bad', 'sound_object' : obj.sound }
516                     );
517                     if (fancy_prompt_data.fancy_status == 'complete') {
518                         req = obj._request(app,name + '.override',params);
519                         if (req && override_params.report_override_on_events.length > 0 && typeof result == 'object') {
520                             var reported_events = [];
521                             for (var i = 0; i < r.length; i++) {
522                                 if (typeof r[i].ilsevent != 'undefined') {
523                                     if (override_params.report_override_on_events.indexOf( r[i].ilsevent == null ? null : Number(r[i].ilsevent) ) != -1) {
524                                         reported_events.push(Number(r[i].ilsevent));
525                                     }
526                                     if (override_params.report_override_on_events.indexOf( r[i].textcode ) != -1) {
527                                         reported_events.push(r[i].textcode);
528                                     }
529                                 }
530                             }
531                             req._reported_events = reported_events;
532                         }
533                     }
534                     return req;
535                 } catch(E) {
536                     alert('in util.network, rerequest_on_override, override:' + E);
537                 }
538             }
539
540             var result = obj.get_result(req);
541             if (!result) return req;
542
543             if ( 
544                 (typeof result.ilsevent != 'undefined') && 
545                 (
546                     (override_params.overridable_events.indexOf( result.ilsevent == null || result.ilsevent == '' ? null : Number(result.ilsevent) ) != -1) ||
547                     (override_params.overridable_events.indexOf( result.textcode ) != -1)
548                 )
549             ) {
550                 req = override([result]);
551             } else {
552                 var found_good = false; var found_bad = false;
553                 for (var i = 0; i < result.length; i++) {
554                     if ( 
555                         (typeof result[i].ilsevent != 'undefined') && 
556                         (
557                             (override_params.overridable_events.indexOf( result[i].ilsevent == null || result[i].ilsevent == '' ? null : Number(result[i].ilsevent) ) != -1) ||
558                             (override_params.overridable_events.indexOf( result[i].textcode ) != -1) 
559                         )
560                     ) {
561                         found_good = true;
562                     } else {
563                         found_bad = true;
564                     }
565                 }
566                 if (found_good && (!found_bad)) req = override(result);
567             }
568
569             return req;
570         } catch(E) {
571             throw(E);
572         }
573     },
574
575     'ping' : function() {
576         try {
577             JSAN.use('util.file'); JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
578             var file = new util.file('ping.bat');
579             var path = file._file.path;
580             file.write_content('truncate+exec',
581                 '#!/bin/sh\n' +
582                 'ping -n 15 ' + data.server_unadorned + ' > "' + path + '.txt"\n' + /* windows */
583                 'ping -c 15 ' + data.server_unadorned + ' >> "' + path + '.txt"\n'  /* unix */
584             );
585             file.close();
586             file = new util.file('ping.bat');
587
588             var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
589             process.init(file._file);
590
591             var args = [];
592
593             dump('process.run = ' + process.run(true, args, args.length) + '\n');
594
595             file.close();
596
597             var file = new util.file('ping.bat.txt');
598             var output = file.get_content();
599             file.close();
600
601             return output;
602         } catch(E) {
603             alert(E);
604         }
605     },
606
607     'play_sounds' : function(req) {
608         var obj = this;
609         try {
610             var result = req.getResultObject();
611             if (result == null) { return; }
612             if (typeof result.textcode != 'undefined') {
613                 obj.sound.event( result );
614             } else {
615                 if (typeof result.length != 'undefined') {
616                     for (var i = 0; i < result.length; i++) {
617                         if (typeof result[i].textcode != 'undefined') {
618                             obj.sound.event( result[i] );
619                         }
620                     }
621                 }
622             }
623         } catch(E) {
624             dump('Error in network.js, play_sounds() : ' + E + '\n');
625         }
626     }
627 }
628
629 /*
630 function sample_callback(request) {
631     var result = request.getResultObject();
632 }
633 */
634
635 dump('exiting util/network.js\n');