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