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