]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
sound on override prompt
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.sound'); this.sound = new util.sound();
8
9         return this;
10 };
11
12 util.network.prototype = {
13
14         'link_id' : 0,
15
16         'NETWORK_FAILURE' : null,
17
18         'simple_request' : function(id,params,f,o_params) {
19                 return this.request(api[id].app,api[id].method,params,f,o_params);
20         },
21
22         'get_result' : function (req) {
23                 var obj = this;
24                 var result;
25                 try {
26                         result = req.getResultObject(); 
27                 } catch(E) {
28                         try {
29                                 if (instanceOf(E, NetworkFailure)) {
30                                         obj.NETWORK_FAILURE = E;
31                                 } else {
32                                         try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
33                                 }
34                         } catch(I) { 
35                                 obj.NETWORK_FAILURE = 'Unknown status';
36                         }
37                         result = null;
38                 }
39                 return result;
40         },
41
42         'request' : function (app,name,params,f,o_params) {
43                 var request =  this._request(app,name,params,f,o_params);
44                 if (request) {
45                         return this.get_result(request);
46                 } else {
47                         return null;
48                 }
49         },
50
51         '_request' : function (app,name,params,f,o_params) {
52                 var obj = this;
53                 try {
54                         var sparams = js2JSON(params);
55                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
56                                 '\no_params = ' + o_params + 
57                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
58                         var request = new RemoteRequest( app, name );
59                         for(var index in params) {
60                                 request.addParam(params[index]);
61                         }
62         
63                         if (f)  {
64                                 request.setCompleteCallback(
65                                         function(req) {
66                                                 try {
67                                                         var json_string = js2JSON(obj.get_result(req));
68                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
69                                                                 + obj.link_id + '\n\n' 
70                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
71                                                                 + '\n\nOriginal Request:\n\n' 
72                                                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
73                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
74                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
75                                                         if (o_params) {
76                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
77                                                         }
78                                                         req = obj.check_for_offline(app,name,params,req,o_params);
79                                                         f(req);
80                                                         obj.NETWORK_FAILURE = null;
81                                                 } catch(E) {
82                                                         try {
83                                                                 E.ilsevent = -2;
84                                                                 E.textcode = 'Server/Method Error';
85                                                         } catch(F) {}
86                                                         f( { 'getResultObject' : function() { return E; } } );
87                                                 }
88                                         }
89                                 );
90                                 try {
91                                         request.send(false);
92                                 } catch(E) {
93                                         throw(E);
94                                 }
95                                 return null;
96                         } else {
97                                 try {
98                                         request.send(true);
99                                 } catch(E) {
100                                         throw(E);
101                                 }
102                                 var result = obj.get_result(request);
103                                 var json_string = js2JSON(result);
104                                 this.error.sdump('D_SES_RESULT','synced result #' 
105                                         + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
106                                         + '\n\nOriginal Request:\n\n' 
107                                         + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
108                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
109                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
110                                 if (o_params) {
111                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
112                                 }
113                                 request = obj.check_for_offline(app,name,params,request,o_params);
114                                 obj.NETWORK_FAILURE = null;
115                                 return request;
116                         }
117
118                 } catch(E) {
119                         alert(E);
120                         if (instanceOf(E,perm_ex)) {
121                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
122                         }
123                         throw(E);
124                 }
125         },
126
127         'check_for_offline' : function (app,name,params,req,o_params) {
128                 var obj = this;
129                 var result = obj.get_result(req);
130                 if (result != null) return req;
131
132                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
133                 var proceed = true;
134
135                 while(proceed) {
136
137                         proceed = false;
138
139                         var r;
140
141                         if (data.proceed_offline) {
142
143                                 r = 1;
144
145                         } else {
146
147                                 var network_failure_string;
148                                 var network_failure_status_string;
149                                 var msg;
150
151                                 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
152                                 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); }
153                                 
154                                 try { msg = 'Network/server failure.  Please check your Internet connection to ' + data.server_unadorned + ' and choose Retry Network.  If you need to enter Offline Mode, choose Proceed Offline in this and subsequent dialogs.  If you believe this error is due to a bug in Evergreen and not network problems, please contact your helpdesk or friendly Evergreen admins, and give them this information:\nmethod=' + name + '\nparams=' + js2JSON(params) + '\nTHROWN:\n' + network_failure_string + '\nSTATUS:\n' + network_failure_status_string; } catch(E) { msg = E; }
155
156                                 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
157
158                                 r = obj.error.yns_alert(msg,'Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
159                                 if (r == 1) {
160                                         data.proceed_offline = true; data.stash('proceed_offline');
161                                         dump('Remembering proceed_offline for 200000 ms.\n');
162                                         setTimeout(
163                                                 function() {
164                                                         data.proceed_offline = false; data.stash('proceed_offline');
165                                                         dump('Setting proceed_offline back to false.\n');
166                                                 }, 200000
167                                         );
168                                 }
169                         }
170
171                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
172
173                         switch(r) {
174                                 case 0: 
175                                         req = obj._request(app,name,params,null,o_params);
176                                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
177                                         return req;
178                                 break;
179                                 case 1: 
180                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
181                                 break;
182                         }
183                 }
184         },
185
186         'reset_titlebars' : function(data) {
187                 var obj = this;
188                 data.stash_retrieve();
189                 try {
190                         JSAN.use('util.window'); var win =  new util.window();
191                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
192                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
193                         var enumerator = windowManagerInterface.getEnumerator(null);
194
195                         var w; // set title on all appshell windows
196                         while ( w = enumerator.getNext() ) {
197                                 if (w.document.title.match(/^\d/)) {
198                                         w.document.title = 
199                                                 win.appshell_name_increment() 
200                                                 + ': ' + data.list.au[0].usrname() 
201                                                 + '@' + data.ws_name;
202                                                 + '.' + data.server_unadorned 
203                                 }
204                         }
205                 } catch(E) {
206                         obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
207                 }
208         },
209
210         'get_new_session' : function(name,xulG,text) {
211                 var obj = this;
212                 try {
213
214                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
215                 var url = urls.XUL_AUTH_SIMPLE;
216                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
217                 window.open(
218                         url
219                         + '?login_type=staff'
220                         + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
221                         + '&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.'),
222                         'simple_auth' + (new Date()).toString(),
223                         'chrome,resizable,modal,width=700,height=500'
224                 );
225                 JSAN.use('OpenILS.data');
226                 var data = new OpenILS.data(); data.init({'via':'stash'});
227                 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
228                         data.session.key = data.temporary_session.key; 
229                         data.session.authtime = data.temporary_session.authtime; 
230                         data.stash('session');
231                         data.list.au[0] = JSON2js(data.temporary_session.usr);
232                         data.stash('list');
233                         obj.reset_titlebars(data);
234                         return true;
235                 }
236                 return false;
237
238                 } catch(E) {
239                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
240                 }
241         },
242
243         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
244                 try {
245                         var obj = this;
246                         var robj = obj.get_result(req);
247                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
248
249                                 if (obj.get_new_session(name,undefined,true)) {
250                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
251                                         params[0] = data.session.key;
252                                         req = obj._request(app,name,params,null,o_params);
253                                 }
254                         }
255                 } catch(E) {
256                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
257                 }
258                 return req;
259         },
260         
261         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
262                 try {
263                         var obj = this;
264                         var robj = obj.get_result(req);
265                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
266                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
267                                 if (location.href.match(/^chrome/)) {
268                                         //alert('Permission denied.');
269                                 } else {
270                                         window.open(
271                                                 urls.XUL_AUTH_SIMPLE
272                                                 + '?login_type=temp'
273                                                 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
274                                                 + '&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),
275                                                 'simple_auth' + (new Date()).toString(),
276                                                 'chrome,resizable,modal,width=700,height=500'
277                                         );
278                                         JSAN.use('OpenILS.data');
279                                         var data = new OpenILS.data(); data.init({'via':'stash'});
280                                         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
281                                                 params[0] = data.temporary_session.key;
282                                                 req = obj._request(app,name,params,null,o_params);
283                                         }
284                                 }
285                         }
286                 } catch(E) {
287                         this.error.sdump('D_ERROR',E);
288                 }
289                 return req;
290         },
291
292         'rerequest_on_override' : function (app,name,params,req,o_params) {
293                 var obj = this;
294                 try {
295                         if (!o_params.text) o_params.text = {};
296                         function override(r) {
297                                 try {
298                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
299                                         obj.sound.bad();
300                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
301                                                 '<groupbox><caption label="Exceptions"/>' + 
302                                                 '<grid><columns><column/><column/></columns><rows>';
303                                         for (var i = 0; i < r.length; i++) {
304                                                 xml += '<row>' + 
305                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
306                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
307                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
308                                         }
309                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
310                                                 '<description>Force this action?</description>' + 
311                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
312                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
313                                         window.open(
314                                                 urls.XUL_FANCY_PROMPT
315                                                 + '?xml=' + window.escape(xml)
316                                                 + '&title=' + window.escape(o_params.title),
317                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
318                                         );
319                                         JSAN.use('OpenILS.data');
320                                         var data = new OpenILS.data(); data.init({'via':'stash'});
321                                         if (data.fancy_prompt_data != '') {
322                                                 req = obj._request(app,name + '.override',params);
323                                         }
324                                         return req;
325                                 } catch(E) {
326                                         alert('in util.network, rerequest_on_override, override:' + E);
327                                 }
328                         }
329
330                         var result = obj.get_result(req);
331                         if (!result) return req;
332
333                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
334                                 req = override([result]);
335                         } else {
336                                 var found_good = false; var found_bad = false;
337                                 for (var i = 0; i < result.length; i++) {
338                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
339                                                 found_good = true;
340                                         } else {
341                                                 found_bad = true;
342                                         }
343                                 }
344                                 if (found_good && (!found_bad)) req = override(result);
345                         }
346
347                         return req;
348                 } catch(E) {
349                         throw(E);
350                 }
351         },
352
353
354 }
355
356 /*
357 function sample_callback(request) {
358         var result = request.getResultObject();
359 }
360 */
361
362 dump('exiting util/network.js\n');