]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
*** empty log message ***
[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);
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);
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                                 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');
113                                 if (r == 1) {
114                                         data.proceed_offline = true; data.stash('proceed_offline');
115                                         dump('Remembering proceed_offline for 200000 ms.\n');
116                                         setTimeout(
117                                                 function() {
118                                                         data.proceed_offline = false; data.stash('proceed_offline');
119                                                         dump('Setting proceed_offline back to false.\n');
120                                                 }, 200000
121                                         );
122                                 }
123                         }
124
125                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
126
127                         switch(r) {
128                                 case 0: 
129                                         req = obj._request(app,name,params,null,o_params);
130                                         if (req.getResultObject() == null) proceed = true;
131                                         return req;
132                                 break;
133                                 case 1: 
134                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
135                                 break;
136                         }
137                 }
138         },
139
140         'reset_titlebars' : function(data) {
141                 var obj = this;
142                 data.stash_retrieve();
143                 try {
144                         JSAN.use('util.window'); var win =  new util.window();
145                         var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
146                         var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
147                         var enumerator = windowManagerInterface.getEnumerator(null);
148
149                         var w; // set title on all appshell windows
150                         while ( w = enumerator.getNext() ) {
151                                 if (w.document.title.match(/^\d/)) {
152                                         w.document.title = 
153                                                 win.appshell_name_increment() 
154                                                 + ': ' + data.list.au[0].usrname() 
155                                                 + '@' + data.ws_name;
156                                                 + '.' + data.server_unadorned 
157                                 }
158                         }
159                 } catch(E) {
160                         obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
161                 }
162         },
163
164         'get_new_session' : function(name,xulG) {
165                 var obj = this;
166                 try {
167
168                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
169                 var url = urls.XUL_AUTH_SIMPLE;
170                 if (typeof xulG != 'undefined' && typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
171                 window.open(
172                         url
173                         + '?login_type=staff'
174                         + '&desc_brief=' + window.escape('Your session has expired')
175                         + '&desc_full=' + window.escape('Please re-login.  If after you have re-authenticated, you still see session expired dialogs like this one, please note where they are occuring and inform your friendly Evergreen developers of this debug information: ' + name),
176                         'simple_auth' + (new Date()).toString(),
177                         'chrome,resizable,modal,width=700,height=500'
178                 );
179                 JSAN.use('OpenILS.data');
180                 var data = new OpenILS.data(); data.init({'via':'stash'});
181                 if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
182                         data.session.key = data.temporary_session.key; 
183                         data.session.authtime = data.temporary_session.authtime; 
184                         data.stash('session');
185                         data.list.au[0] = JSON2js(data.temporary_session.usr);
186                         data.stash('list');
187                         obj.reset_titlebars(data);
188                         return true;
189                 }
190                 return false;
191
192                 } catch(E) {
193                         obj.error.standard_unexpected_error_alert('util.network.get_new_session',E);
194                 }
195         },
196
197         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
198                 try {
199                         var obj = this;
200                         var robj = req.getResultObject();
201                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
202
203                                 if (obj.get_new_session(name)) {
204                                         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
205                                         params[0] = data.session.key;
206                                         req = obj._request(app,name,params,null,o_params);
207                                 }
208                         }
209                 } catch(E) {
210                         this.error.standard_unexpected_error_alert('rerequest_on_session_timeout',E);
211                 }
212                 return req;
213         },
214         
215         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
216                 try {
217                         var obj = this;
218                         var robj = req.getResultObject();
219                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
220                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
221                                 if (location.href.match(/^chrome/)) {
222                                         //alert('Permission denied.');
223                                 } else {
224                                         window.open(
225                                                 urls.XUL_AUTH_SIMPLE
226                                                 + '?login_type=temp'
227                                                 + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
228                                                 + '&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),
229                                                 'simple_auth' + (new Date()).toString(),
230                                                 'chrome,resizable,modal,width=700,height=500'
231                                         );
232                                         JSAN.use('OpenILS.data');
233                                         var data = new OpenILS.data(); data.init({'via':'stash'});
234                                         if (typeof data.temporary_session != 'undefined' && data.temporary_session != '') {
235                                                 params[0] = data.temporary_session.key;
236                                                 req = obj._request(app,name,params,null,o_params);
237                                         }
238                                 }
239                         }
240                 } catch(E) {
241                         this.error.sdump('D_ERROR',E);
242                 }
243                 return req;
244         },
245
246         'rerequest_on_override' : function (app,name,params,req,o_params) {
247                 var obj = this;
248                 try {
249                         if (!o_params.text) o_params.text = {};
250                         function override(r) {
251                                 try {
252                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
253                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
254                                                 '<groupbox><caption label="Exceptions"/>' + 
255                                                 '<grid><columns><column/><column/></columns><rows>';
256                                         for (var i = 0; i < r.length; i++) {
257                                                 xml += '<row>' + 
258                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
259                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
260                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
261                                         }
262                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
263                                                 '<description>Force this action?</description>' + 
264                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
265                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
266                                         window.open(
267                                                 urls.XUL_FANCY_PROMPT
268                                                 + '?xml=' + window.escape(xml)
269                                                 + '&title=' + window.escape(o_params.title),
270                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
271                                         );
272                                         JSAN.use('OpenILS.data');
273                                         var data = new OpenILS.data(); data.init({'via':'stash'});
274                                         if (data.fancy_prompt_data != '') {
275                                                 req = obj._request(app,name + '.override',params);
276                                         }
277                                         return req;
278                                 } catch(E) {
279                                         alert('in util.network, rerequest_on_override, override:' + E);
280                                 }
281                         }
282
283                         var result = req.getResultObject();
284                         if (!result) return req;
285
286                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
287                                 req = override([result]);
288                         } else {
289                                 var found_good = false; var found_bad = false;
290                                 for (var i = 0; i < result.length; i++) {
291                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
292                                                 found_good = true;
293                                         } else {
294                                                 found_bad = true;
295                                         }
296                                 }
297                                 if (found_good && (!found_bad)) req = override(result);
298                         }
299
300                         return req;
301                 } catch(E) {
302                         throw(E);
303                 }
304         },
305
306
307 }
308
309 /*
310 function sample_callback(request) {
311         var result = request.getResultObject();
312 }
313 */
314
315 dump('exiting util/network.js\n');