]> 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                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
49                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
50                                                         if (o_params) {
51                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
52                                                         }
53                                                         req = obj.check_for_offline(app,name,params,req,o_params);
54                                                         f(req);
55                                                 } catch(E) {
56                                                         try {
57                                                                 E.ilsevent = -2;
58                                                                 E.textcode = 'Server/Method Error';
59                                                         } catch(F) {}
60                                                         f( { 'getResultObject' : function() { return E; } } );
61                                                 }
62                                         }
63                                 );
64                                 request.send(false);
65                                 return null;
66                         } else {
67                                 request.send(true);
68                                 var result = request.getResultObject();
69                                 var json_string = js2JSON(result);
70                                 this.error.sdump('D_SES_RESULT','synced result #' + obj.link_id + '\n\n' + ( json_string.length > 80 ? obj.error.pretty_print(json_string) : json_string ) );
71                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
72                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
73                                 if (o_params) {
74                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
75                                 }
76                                 request = obj.check_for_offline(app,name,params,request,o_params);
77                                 return request;
78                         }
79
80                 } catch(E) {
81                         if (instanceOf(E,perm_ex)) {
82                                 alert('in util.network, _request : permission exception: ' + js2JSON(E));
83                         }
84                         throw(E);
85                 }
86         },
87
88         'check_for_offline' : function (app,name,params,req,o_params) {
89                 var obj = this;
90                 var result = req.getResultObject();
91                 if (result != null) return req;
92
93                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
94                 var proceed = true;
95
96                 while(proceed) {
97
98                         proceed = false;
99
100                         var r;
101
102                         if (data.proceed_offline) {
103
104                                 r = 1;
105
106                         } else {
107                                 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');
108                                 if (r == 1) {
109                                         data.proceed_offline = true; data.stash('proceed_offline');
110                                         dump('Remembering proceed_offline for 200000 ms.\n');
111                                         setTimeout(
112                                                 function() {
113                                                         data.proceed_offline = false; data.stash('proceed_offline');
114                                                         dump('Setting proceed_offline back to false.\n');
115                                                 }, 200000
116                                         );
117                                 }
118                         }
119
120                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
121
122                         switch(r) {
123                                 case 0: 
124                                         req = obj._request(app,name,params,null,o_params);
125                                         if (req.getResultObject() == null) proceed = true;
126                                         return req;
127                                 break;
128                                 case 1: 
129                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
130                                 break;
131                         }
132                 }
133         },
134
135         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
136                 try {
137                         var obj = this;
138                         var robj = req.getResultObject();
139                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
140                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
141                                 window.open(
142                                         urls.XUL_AUTH_SIMPLE
143                                         + '?login_type=staff'
144                                         + '&desc_brief=' + window.escape('Your session has expired')
145                                         + '&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),
146                                         'simple_auth' + (new Date()).toString(),
147                                         'chrome,resizable,modal,width=700,height=500'
148                                 );
149                                 JSAN.use('OpenILS.data');
150                                 var data = new OpenILS.data(); data.init({'via':'stash'});
151                                 if (data.temporary_session != '') {
152                                         data.session.key = data.temporary_session.key; 
153                                         data.session.authtime = data.temporary_session.authtime; 
154                                         data.stash('session');
155                                         data.list.au[0] = JSON2js(data.temporary_session.usr);
156                                         data.stash('list');
157                                         try {
158                                                 JSAN.use('util.window'); var win =  new util.window();
159                                                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
160                                                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
161                                                 var enumerator = windowManagerInterface.getEnumerator(null);
162
163                                                 var w; // set title on all appshell windows
164                                                 while ( w = enumerator.getNext() ) {
165                                                         if (w.document.title.match(/^\d/)) {
166                                                                 w.document.title = 
167                                                                         win.appshell_name_increment() 
168                                                                         + ': ' + data.list.au[0].usrname() 
169                                                                         + '@' + data.ws_name;
170                                                                         + '.' + data.server_unadorned 
171                                                         }
172                                                 }
173                                         } catch(E) {
174                                                 obj.error.standard_unexpected_error_alert('Error setting window titles to match new login',E);
175                                         }
176
177                                         params[0] = data.session.key;
178                                         req = obj._request(app,name,params,null,o_params);
179                                 }
180                         }
181                 } catch(E) {
182                         this.error.sdump('D_ERROR',E);
183                 }
184                 return req;
185         },
186         
187         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
188                 try {
189                         var obj = this;
190                         var robj = req.getResultObject();
191                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
192                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
193                                 window.open(
194                                         urls.XUL_AUTH_SIMPLE
195                                         + '?login_type=temp'
196                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
197                                         + '&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),
198                                         'simple_auth' + (new Date()).toString(),
199                                         'chrome,resizable,modal,width=700,height=500'
200                                 );
201                                 JSAN.use('OpenILS.data');
202                                 var data = new OpenILS.data(); data.init({'via':'stash'});
203                                 if (data.temporary_session != '') {
204                                         params[0] = data.temporary_session.key;
205                                         req = obj._request(app,name,params,null,o_params);
206                                 }
207                         }
208                 } catch(E) {
209                         this.error.sdump('D_ERROR',E);
210                 }
211                 return req;
212         },
213
214         'rerequest_on_override' : function (app,name,params,req,o_params) {
215                 var obj = this;
216                 try {
217                         if (!o_params.text) o_params.text = {};
218                         function override(r) {
219                                 try {
220                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
221                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
222                                                 '<groupbox><caption label="Exceptions"/>' + 
223                                                 '<grid><columns><column/><column/></columns><rows>';
224                                         for (var i = 0; i < r.length; i++) {
225                                                 xml += '<row>' + 
226                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
227                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
228                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
229                                         }
230                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
231                                                 '<description>Force this action?</description>' + 
232                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
233                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
234                                         window.open(
235                                                 urls.XUL_FANCY_PROMPT
236                                                 + '?xml=' + window.escape(xml)
237                                                 + '&title=' + window.escape(o_params.title),
238                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
239                                         );
240                                         JSAN.use('OpenILS.data');
241                                         var data = new OpenILS.data(); data.init({'via':'stash'});
242                                         if (data.fancy_prompt_data != '') {
243                                                 req = obj._request(app,name + '.override',params);
244                                         }
245                                         return req;
246                                 } catch(E) {
247                                         alert('in util.network, rerequest_on_override, override:' + E);
248                                 }
249                         }
250
251                         var result = req.getResultObject();
252                         if (!result) return req;
253
254                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
255                                 req = override([result]);
256                         } else {
257                                 var found_good = false; var found_bad = false;
258                                 for (var i = 0; i < result.length; i++) {
259                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
260                                                 found_good = true;
261                                         } else {
262                                                 found_bad = true;
263                                         }
264                                 }
265                                 if (found_good && (!found_bad)) req = override(result);
266                         }
267
268                         return req;
269                 } catch(E) {
270                         throw(E);
271                 }
272         },
273
274
275 }
276
277 /*
278 function sample_callback(request) {
279         var result = request.getResultObject();
280 }
281 */
282
283 dump('exiting util/network.js\n');