]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
tweaks
[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                                 try { obj.error.sdump('D_SES_ERROR','method: ' + name + '\nparams: '+ js2JSON(params) + '\nReturned null with a NETWORK_FAILURE = ' + obj.NETWORK_FAILURE + ( typeof obj.NETWORK_FAILURE.status == 'function' ? '.status() == ' + obj.NETWORK_FAILURE.status() : '') + '\n'); } catch(E) { alert(E); }
146                                 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) + ' thrown = ' + obj.NETWORK_FAILURE + (obj.NETWORK_FAILURE.status == 'function' ? '.status() == ' + obj.NETWORK_FAILURE.status() : '') + '.','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
147                                 if (r == 1) {
148                                         data.proceed_offline = true; data.stash('proceed_offline');
149                                         dump('Remembering proceed_offline for 200000 ms.\n');
150                                         setTimeout(
151                                                 function() {
152                                                         data.proceed_offline = false; data.stash('proceed_offline');
153                                                         dump('Setting proceed_offline back to false.\n');
154                                                 }, 200000
155                                         );
156                                 }
157                         }
158
159                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
160
161                         switch(r) {
162                                 case 0: 
163                                         req = obj._request(app,name,params,null,o_params);
164                                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
165                                         return req;
166                                 break;
167                                 case 1: 
168                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
169                                 break;
170                         }
171                 }
172         },
173
174         'reset_titlebars' : function(data) {
175                 var obj = this;
176                 data.stash_retrieve();
177                 try {
178                         JSAN.use('util.window'); var win =  new util.window();
179                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
180                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
181                         var enumerator = windowManagerInterface.getEnumerator(null);
182
183                         var w; // set title on all appshell windows
184                         while ( w = enumerator.getNext() ) {
185                                 if (w.document.title.match(/^\d/)) {
186                                         w.document.title = 
187                                                 win.appshell_name_increment() 
188                                                 + ': ' + data.list.au[0].usrname() 
189                                                 + '@' + data.ws_name;
190                                                 + '.' + data.server_unadorned 
191                                 }
192                         }
193                 } catch(E) {
194                         obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
195                 }
196         },
197
198         'get_new_session' : function(name,xulG,text) {
199                 var obj = this;
200                 try {
201
202                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
203                 var url = urls.XUL_AUTH_SIMPLE;
204                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
205                 window.open(
206                         url
207                         + '?login_type=staff'
208                         + '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
209                         + '&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.'),
210                         'simple_auth' + (new Date()).toString(),
211                         'chrome,resizable,modal,width=700,height=500'
212                 );
213                 JSAN.use('OpenILS.data');
214                 var data = new OpenILS.data(); data.init({'via':'stash'});
215                 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
216                         data.session.key = data.temporary_session.key; 
217                         data.session.authtime = data.temporary_session.authtime; 
218                         data.stash('session');
219                         data.list.au[0] = JSON2js(data.temporary_session.usr);
220                         data.stash('list');
221                         obj.reset_titlebars(data);
222                         return true;
223                 }
224                 return false;
225
226                 } catch(E) {
227                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
228                 }
229         },
230
231         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
232                 try {
233                         var obj = this;
234                         var robj = obj.get_result(req);
235                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
236
237                                 if (obj.get_new_session(name,undefined,true)) {
238                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
239                                         params[0] = data.session.key;
240                                         req = obj._request(app,name,params,null,o_params);
241                                 }
242                         }
243                 } catch(E) {
244                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
245                 }
246                 return req;
247         },
248         
249         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
250                 try {
251                         var obj = this;
252                         var robj = obj.get_result(req);
253                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
254                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
255                                 if (location.href.match(/^chrome/)) {
256                                         //alert('Permission denied.');
257                                 } else {
258                                         window.open(
259                                                 urls.XUL_AUTH_SIMPLE
260                                                 + '?login_type=temp'
261                                                 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
262                                                 + '&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),
263                                                 'simple_auth' + (new Date()).toString(),
264                                                 'chrome,resizable,modal,width=700,height=500'
265                                         );
266                                         JSAN.use('OpenILS.data');
267                                         var data = new OpenILS.data(); data.init({'via':'stash'});
268                                         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
269                                                 params[0] = data.temporary_session.key;
270                                                 req = obj._request(app,name,params,null,o_params);
271                                         }
272                                 }
273                         }
274                 } catch(E) {
275                         this.error.sdump('D_ERROR',E);
276                 }
277                 return req;
278         },
279
280         'rerequest_on_override' : function (app,name,params,req,o_params) {
281                 var obj = this;
282                 try {
283                         if (!o_params.text) o_params.text = {};
284                         function override(r) {
285                                 try {
286                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
287                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
288                                                 '<groupbox><caption label="Exceptions"/>' + 
289                                                 '<grid><columns><column/><column/></columns><rows>';
290                                         for (var i = 0; i < r.length; i++) {
291                                                 xml += '<row>' + 
292                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
293                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
294                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
295                                         }
296                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
297                                                 '<description>Force this action?</description>' + 
298                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
299                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
300                                         window.open(
301                                                 urls.XUL_FANCY_PROMPT
302                                                 + '?xml=' + window.escape(xml)
303                                                 + '&title=' + window.escape(o_params.title),
304                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
305                                         );
306                                         JSAN.use('OpenILS.data');
307                                         var data = new OpenILS.data(); data.init({'via':'stash'});
308                                         if (data.fancy_prompt_data != '') {
309                                                 req = obj._request(app,name + '.override',params);
310                                         }
311                                         return req;
312                                 } catch(E) {
313                                         alert('in util.network, rerequest_on_override, override:' + E);
314                                 }
315                         }
316
317                         var result = obj.get_result(req);
318                         if (!result) return req;
319
320                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
321                                 req = override([result]);
322                         } else {
323                                 var found_good = false; var found_bad = false;
324                                 for (var i = 0; i < result.length; i++) {
325                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
326                                                 found_good = true;
327                                         } else {
328                                                 found_bad = true;
329                                         }
330                                 }
331                                 if (found_good && (!found_bad)) req = override(result);
332                         }
333
334                         return req;
335                 } catch(E) {
336                         throw(E);
337                 }
338         },
339
340
341 }
342
343 /*
344 function sample_callback(request) {
345         var result = request.getResultObject();
346 }
347 */
348
349 dump('exiting util/network.js\n');