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