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