]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
use smaller URI for fancy 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 Ignore Errors 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','Ignore Errors',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' : 'Ignore Errors\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                         if (! data.list.au ) data.list.au = [];
232                         data.list.au[0] = JSON2js(data.temporary_session.usr);
233                         data.stash('list');
234                         obj.reset_titlebars(data);
235                         return true;
236                 }
237                 return false;
238
239                 } catch(E) {
240                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
241                 }
242         },
243
244         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
245                 try {
246                         var obj = this;
247                         var robj = obj.get_result(req);
248                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
249
250                                 if (obj.get_new_session(name,undefined,true)) {
251                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
252                                         params[0] = data.session.key;
253                                         req = obj._request(app,name,params,null,o_params);
254                                 }
255                         }
256                 } catch(E) {
257                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
258                 }
259                 return req;
260         },
261         
262         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
263                 try {
264                         var obj = this;
265                         var robj = obj.get_result(req);
266                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
267                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
268                                 if (location.href.match(/^chrome/)) {
269                                         //alert('Permission denied.');
270                                 } else {
271                                         window.open(
272                                                 urls.XUL_AUTH_SIMPLE
273                                                 + '?login_type=temp'
274                                                 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
275                                                 + '&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),
276                                                 'simple_auth' + (new Date()).toString(),
277                                                 'chrome,resizable,modal,width=700,height=500'
278                                         );
279                                         JSAN.use('OpenILS.data');
280                                         var data = new OpenILS.data(); data.init({'via':'stash'});
281                                         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
282                                                 params[0] = data.temporary_session.key;
283                                                 req = obj._request(app,name,params,null,o_params);
284                                         }
285                                 }
286                         }
287                 } catch(E) {
288                         this.error.sdump('D_ERROR',E);
289                 }
290                 return req;
291         },
292
293         'rerequest_on_override' : function (app,name,params,req,o_params) {
294                 var obj = this;
295                 try {
296                         if (!o_params.text) o_params.text = {};
297                         function override(r) {
298                                 try {
299                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
300                                         obj.sound.bad();
301                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
302                                                 '<groupbox><caption label="Exceptions"/>' + 
303                                                 '<grid><columns><column/><column/></columns><rows>';
304                                         for (var i = 0; i < r.length; i++) {
305                                                 var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
306                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
307                                                 var t3 = String((o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
308                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
309                                                 xml += '<row>' + 
310                                                         '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
311                                                         '<description>' + t3 + '</description>' + 
312                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
313                                         }
314                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
315                                                 '<description>Force this action?</description>' + 
316                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
317                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
318                                         JSAN.use('OpenILS.data');
319                                         var data = new OpenILS.data(); data.init({'via':'stash'});
320                                         data.temp_override_xml = xml; data.stash('temp_override_xml');
321                                         window.open(
322                                                 urls.XUL_FANCY_PROMPT
323                                                 + '?xml_in_stash=temp_override_xml'
324                                                 + '&title=' + window.escape(o_params.title),
325                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
326                                         );
327                                         data.init({'via':'stash'});
328                                         if (data.fancy_prompt_data != '') {
329                                                 req = obj._request(app,name + '.override',params);
330                                         }
331                                         return req;
332                                 } catch(E) {
333                                         alert('in util.network, rerequest_on_override, override:' + E);
334                                 }
335                         }
336
337                         var result = obj.get_result(req);
338                         if (!result) return req;
339
340                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
341                                 req = override([result]);
342                         } else {
343                                 var found_good = false; var found_bad = false;
344                                 for (var i = 0; i < result.length; i++) {
345                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
346                                                 found_good = true;
347                                         } else {
348                                                 found_bad = true;
349                                         }
350                                 }
351                                 if (found_good && (!found_bad)) req = override(result);
352                         }
353
354                         return req;
355                 } catch(E) {
356                         throw(E);
357                 }
358         },
359
360
361 }
362
363 /*
364 function sample_callback(request) {
365         var result = request.getResultObject();
366 }
367 */
368
369 dump('exiting util/network.js\n');