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