]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
Fix the syntax error (thanks phasefx) and get one more string
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5 offlineStrings = document.getElementById('offlineStrings');
6
7 if (typeof util == 'undefined') util = {};
8 util.network = function () {
9
10         JSAN.use('util.error'); this.error = new util.error();
11         JSAN.use('util.sound'); this.sound = new util.sound();
12
13         return this;
14 };
15
16 util.network.prototype = {
17
18         'link_id' : 0,
19
20         'NETWORK_FAILURE' : null,
21
22         'simple_request' : function(method_id,params,f,override_params) {
23                 //var obj = this;
24                 //var sparams = js2JSON(params);
25                 //obj.error.sdump('D_SES','simple_request '+ method_id +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
26                 //      '\noverride_params = ' + override_params + '\n');
27                 if (typeof api[method_id] == 'undefined') {
28                         throw( offlineStrings.getFormattedString('network.method_not_found.error', [method_id]) );
29                 }
30                 var secure = true; if (typeof api[method_id].secure != 'undefined') secure = api[method_id].secure;
31                 return this.request(api[method_id].app,api[method_id].method,params,f,override_params,{ 'secure' : secure, 'method_id' : method_id });
32         },
33
34         'get_result' : function (req) {
35                 var obj = this;
36                 var result;
37                 try {
38                         result = req.getResultObject(); 
39                 } catch(E) {
40                         try {
41                                 if (instanceOf(E, NetworkFailure)) {
42                                         obj.NETWORK_FAILURE = E;
43                                 } else {
44                                         try { obj.NETWORK_FAILURE = js2JSON(E); } catch(F) { dump(F + '\n'); obj.NETWORK_FAILURE = E; };
45                                 }
46                         } catch(I) { 
47                                 obj.NETWORK_FAILURE = offlineStrings.getString('network.unknown_status');
48                         }
49                         result = null;
50                 }
51                 return result;
52         },
53
54         'request' : function (app,name,params,f,override_params,_params) {
55
56                 var obj = this;
57                 
58                 //var sparams = js2JSON(params);
59                 //obj.error.sdump('D_SES','request '+ app + ' ' + name +' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
60                 //      '\noverride_params = ' + override_params + '\n_params = ' + _params + '\n');
61
62                 try { 
63
64                         var request =  this._request(app,name,params,f,override_params,_params);
65                         if (request) {
66                                 return this.get_result(request);
67                         } else {
68                                 return null;
69                         }
70         
71                 } catch(E) {
72                         alert(E); 
73                 }
74         },
75
76         '_request' : function (app,name,params,f,override_params,_params) {
77                 var obj = this;
78                 try {
79                         var sparams = js2JSON(params);
80                         obj.error.sdump('D_SES','_request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
81                                 '\noverride_params = ' + override_params + '\n_params = ' + _params +
82                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
83
84                         var request = new RemoteRequest( app, name );
85                         if (_params && _params.secure) {
86                                 request.setSecure(true);
87                         } else {
88                                 request.setSecure(false);
89                         }
90                         for(var index in params) {
91                                 request.addParam(params[index]);
92                         }
93         
94                         if (f)  {
95                                 request.setCompleteCallback(
96                                         function(req) {
97                                                 try {
98                                                         var json_string = js2JSON(obj.get_result(req));
99                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
100                                                                 + obj.link_id + '\n\n' 
101                                                                 + (json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string) 
102                                                                 + '\n\nOriginal Request:\n\n' 
103                                                                 + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
104                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,override_params,_params);
105                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,override_params,_params);
106                                                         if (override_params) {
107                                                                 req = obj.rerequest_on_override(app,name,params,req,override_params,_params);
108                                                         }
109                                                         req = obj.check_for_offline(app,name,params,req,override_params,_params);
110                                                         f(req);
111                                                         obj.NETWORK_FAILURE = null;
112                                                 } catch(E) {
113                                                         try {
114                                                                 E.ilsevent = -2;
115                                                                 E.textcode = offlineStrings.getString('network.server_or_method.error');
116                                                         } catch(F) {}
117                                                         f( { 'getResultObject' : function() { return E; } } );
118                                                 }
119                                         }
120                                 );
121                                 try {
122                                         request.send(false);
123                                 } catch(E) {
124                                         throw(E);
125                                 }
126                                 return null;
127                         } else {
128                                 try {
129                                         request.send(true);
130                                 } catch(E) {
131                                         throw(E);
132                                 }
133                                 var result = obj.get_result(request);
134                                 var json_string = js2JSON(result);
135                                 this.error.sdump('D_SES_RESULT','synced result #' 
136                                         + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) 
137                                         + '\n\nOriginal Request:\n\n' 
138                                         + 'request '+app+' '+name+' '+ sparams.slice(1,sparams.length-1));
139                                 request = obj.rerequest_on_session_timeout(app,name,params,request,override_params,_params);
140                                 request = obj.rerequest_on_perm_failure(app,name,params,request,override_params,_params);
141                                 if (override_params) {
142                                         request = obj.rerequest_on_override(app,name,params,request,override_params,_params);
143                                 }
144                                 request = obj.check_for_offline(app,name,params,request,override_params,_params);
145                                 obj.NETWORK_FAILURE = null;
146                                 return request;
147                         }
148
149                 } catch(E) {
150                         alert(E);
151                         if (instanceOf(E,perm_ex)) {
152                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
153                         }
154                         throw(E);
155                 }
156         },
157
158         'check_for_offline' : function (app,name,params,req,override_params,_params) {
159                 var obj = this;
160                 var result = obj.get_result(req);
161                 if (result != null) return req;
162
163                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
164                 var proceed = true;
165
166                 while(proceed) {
167
168                         proceed = false;
169
170                         var r;
171
172                         if (data.proceed_offline) {
173
174                                 r = 1;
175
176                         } else {
177
178                                 var network_failure_string;
179                                 var network_failure_status_string;
180                                 var msg;
181
182                                 try { network_failure_string = String( obj.NETWORK_FAILURE ); } catch(E) { network_failure_string = E; }
183                                 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); }
184                                 
185                                 try { msg = offlineStrings.getFormattedString('network.server.failure.exception', [data.server_unadorned]) + '\n' +
186                                                         offlineStrings.getFormattedString('network.server.method', [name]) + '\n' + 
187                                                         offlineStrings.getFormattedString('network.server.params', [js2JSON(params)]) + '\n' + 
188                                                         offlineStrings.getString('network.server.thrown_label') + '\n' + network_failure_string + '\n' + 
189                                                         offlineStrings.getString('network.server.status_label') + '\n' + network_failure_status_string;
190                                 } catch(E) { msg = E; }
191
192                                 try { obj.error.sdump('D_SES_ERROR',msg); } catch(E) { alert(E); }
193
194                                 r = obj.error.yns_alert(
195                                         msg,
196                                         offlineStrings.getString('network.network_failure'),
197                                         offlineStrings.getString('network.retry_network'),
198                                         offlineStrings.getString('network.ignore_errors'),
199                                         null,
200                                         offlineStrings.getString('common.confirm')
201                                 );
202                                 if (r == 1) {
203                                         data.proceed_offline = true; data.stash('proceed_offline');
204                                         dump('Remembering proceed_offline for 200000 ms.\n');
205                                         setTimeout(
206                                                 function() {
207                                                         data.proceed_offline = false; data.stash('proceed_offline');
208                                                         dump('Setting proceed_offline back to false.\n');
209                                                 }, 200000
210                                         );
211                                 }
212                         }
213
214                         dump( r == 0 ? 'Retry Network\n' : 'Ignore Errors\n' );
215
216                         switch(r) {
217                                 case 0: 
218                                         req = obj._request(app,name,params,null,override_params,_params);
219                                         if (obj.get_result(req)) proceed = true; /* daily WTF, why am I even doing this? :) */
220                                         return req;
221                                 break;
222
223                                 case 1: 
224                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : offlineStrings.getString('network.server_or_method.error') }; } };
225                                 break;
226                         }
227                 }
228         },
229
230         'reset_titlebars' : function(data) {
231                 var obj = this;
232                 data.stash_retrieve();
233                 try {
234                         JSAN.use('util.window'); var win =  new util.window();
235                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
236                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
237                         var enumerator = windowManagerInterface.getEnumerator(null);
238
239                         var w; // set title on all appshell windows
240                         while ( w = enumerator.getNext() ) {
241                                 if (w.document.title.match(/^\d/)) {
242                                         w.document.title = 
243                                                 win.appshell_name_increment() 
244                                                 + ': ' + data.list.au[0].usrname() 
245                                                 + '@' + data.ws_name;
246                                                 + '.' + data.server_unadorned 
247                                 }
248                         }
249                 } catch(E) {
250                         obj.error.standard_unexpected_error_alert(offlineStrings.getString('network.window_title.error'),E);
251                 }
252         },
253
254         'get_new_session' : function(name,xulG,text) {
255                 var obj = this;
256                 try {
257
258                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
259                 var url = urls.XUL_AUTH_SIMPLE;
260                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
261                 JSAN.use('util.window'); var win = new util.window();
262                 var my_xulG = win.open(
263                         url,
264                         //+ '?login_type=staff'
265                         //+ '&desc_brief=' + window.escape( text ? 'Session Expired' : 'Operator Change' )
266                         //+ '&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.'),
267                         //'simple_auth' + (new Date()).toString(),
268                         offlineStrings.getString('network.new_session.authorize'),
269                         'chrome,resizable,modal,width=700,height=500',
270                         {
271                                 'login_type' : 'staff',
272                                 'desc_brief' : text ? offlineStrings.getString('network.new_session.expired') : offlineStrings.getString('network.new_session.operator_change'),
273                                 'desc_full' : text ? offlineStrings.getString('network.new_session.expired.prompt') : offlineStrings.getString('network.new_session.operator_change.prompt')
274                                 //'simple_auth' : (new Date()).toString(),
275                         }
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                         data.session.key = data.temporary_session.key; 
281                         data.session.authtime = data.temporary_session.authtime; 
282                         data.stash('session');
283             try {
284                 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
285                 var cookieUri = ios.newURI("http://" + data.server_unadorned, null, null);
286                 var cookieUriSSL = ios.newURI("https://" + data.server_unadorned, null, null);
287                 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
288
289                 cookieSvc.setCookieString(cookieUri, null, "ses="+data.session.key, null);
290                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+data.session.key, null);
291
292             } catch(E) {
293                 alert(offineStrings.getFormattedString('main.session_cookie.error', [E]));
294             }
295                         if (! data.list.au ) data.list.au = [];
296                         data.list.au[0] = JSON2js( data.temporary_session.usr );
297                         data.stash('list');
298                         obj.reset_titlebars(data);
299                         return true;
300         } else {
301             obj.error.sdump('D_TRACE','No new session key after simple_auth in util/network\n');
302         }
303                 return false;
304
305                 } catch(E) {
306                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
307                 }
308         },
309
310         'rerequest_on_session_timeout' : function(app,name,params,req,override_params,_params) {
311                 try {
312                         var obj = this;
313                         var robj = obj.get_result(req);
314                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
315
316                                 if (obj.get_new_session(name,undefined,true)) {
317                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
318                                         params[0] = data.session.key;
319                                         req = obj._request(app,name,params,null,override_params,_params);
320                                 }
321                         }
322                 } catch(E) {
323                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
324                 }
325                 return req;
326         },
327         
328         'rerequest_on_perm_failure' : function(app,name,params,req,override_params,_params) {
329                 try {
330                         var obj = this;
331                         var robj = obj.get_result(req);
332                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
333                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
334                                 if (location.href.match(/^chrome/)) {
335                                         //alert('Permission denied.');
336                                 } else {
337                                         JSAN.use('util.window'); var win = new util.window();
338                                         var my_xulG = win.open(
339                                                 urls.XUL_AUTH_SIMPLE,
340                                                 //+ '?login_type=temp'
341                                                 //+ '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
342                                                 //+ '&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),
343                                                 //'simple_auth' + (new Date()).toString(),
344                                                 offlineStrings.getFormattedString('network.permission.authorize'),
345                                                 'chrome,resizable,modal,width=700,height=500',
346                                                 {
347                                                         'login_type' : 'temp',
348                                                         'desc_brief' : offlineStrings.getFormattedString('network.permission.description.brief', [robj.ilsperm]),
349                                                         'desc_full' : offlineStrings.getFormattedString('network.permission.description.full', [name])
350                                                         //'simple_auth' : (new Date()).toString(),
351                                                 }
352                                         );
353                                         JSAN.use('OpenILS.data');
354                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
355                                         if (typeof my_xulG.temporary_session != 'undefined' && my_xulG.temporary_session != '') {
356                                                 params[0] = my_xulG.temporary_session.key;
357                                                 req = obj._request(app,name,params,null,override_params,_params);
358                                         }
359                                 }
360                         }
361                 } catch(E) {
362                         this.error.sdump('D_ERROR',E);
363                 }
364                 return req;
365         },
366
367         'rerequest_on_override' : function (app,name,params,req,override_params,_params) {
368                 var obj = this;
369                 try {
370                         if (!override_params.text) override_params.text = {};
371                         function override(r) {
372                                 try {
373                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
374                                         obj.sound.bad();
375                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
376                                                 '<groupbox><caption label="' + offlineStrings.getString('network.override.exceptions') + '"/>' + 
377                                                 '<grid><columns><column/><column/></columns><rows>';
378                                         for (var i = 0; i < r.length; i++) {
379                                                 var t1 = String(r[i].ilsevent).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
380                                                 var t2 = String(r[i].textcode).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
381                                                 var t3 = String((override_params.text[r[i].ilsevent] ? override_params.text[r[i].ilsevent](r[i]) : '')).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
382                                                 var t4 = String(r[i].desc).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
383                                                 xml += '<row>' + 
384                                                         '<description style="color: red" tooltiptext="' + t1 + '">' + t2 + '</description>' + 
385                                                         '<description>' + t3 + '</description>' + 
386                                                         '</row><row>' + '<description>' + t4 + '</description>' + '</row>';
387                                         }
388                                         xml += '</rows></grid></groupbox><groupbox><caption label="' + offlineStrings.getString('network.override.override') +'"/><hbox>' + 
389                                                 '<description>' + offlineStrings.getString('network.override.force.prompt') + '</description>' + 
390                                                 '<button accesskey="' + offlineStrings.getString('common.no.accesskey') + '" label="' + offlineStrings.getString('common.no') + '" name="fancy_cancel"/>' + 
391                                                 '<button id="override" accesskey="' + offlineStrings.getString('common.yes.accesskey') + '" label="' + offlineStrings.getString('common.yes') + '" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
392                                         //JSAN.use('OpenILS.data');
393                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
394                                         //data.temp_override_xml = xml; data.stash('temp_override_xml');
395                                         JSAN.use('util.window'); var win = new util.window();
396                                         var fancy_prompt_data = win.open(
397                                                 urls.XUL_FANCY_PROMPT,
398                                                 //+ '?xml_in_stash=temp_override_xml'
399                                                 //+ '&title=' + window.escape(override_params.title),
400                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
401                                                 { 'xml' : xml, 'title' : override_params.title }
402                                         );
403                                         if (fancy_prompt_data.fancy_status == 'complete') {
404                                                 req = obj._request(app,name + '.override',params);
405                                         }
406                                         return req;
407                                 } catch(E) {
408                                         alert('in util.network, rerequest_on_override, override:' + E);
409                                 }
410                         }
411
412                         var result = obj.get_result(req);
413                         if (!result) return req;
414
415                         if ( (typeof result.ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result.ilsevent) ) != -1) ) {
416                                 req = override([result]);
417                         } else {
418                                 var found_good = false; var found_bad = false;
419                                 for (var i = 0; i < result.length; i++) {
420                                         if ( (result[i].ilsevent != 'undefined') && (override_params.overridable_events.indexOf( Number(result[i].ilsevent) ) != -1) ) {
421                                                 found_good = true;
422                                         } else {
423                                                 found_bad = true;
424                                         }
425                                 }
426                                 if (found_good && (!found_bad)) req = override(result);
427                         }
428
429                         return req;
430                 } catch(E) {
431                         throw(E);
432                 }
433         }
434 }
435
436 /*
437 function sample_callback(request) {
438         var result = request.getResultObject();
439 }
440 */
441
442 dump('exiting util/network.js\n');