]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
give user the option to retry on network timeouts
[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         // Place a test here for network connectivity
8         // this.offline = true;
9
10         return this;
11 };
12
13 util.network.prototype = {
14
15         // Flag for whether the staff client should act as if it were offline or not
16         'offline' : false,
17
18         'link_id' : 0,
19
20         'simple_request' : function(id,params,f) {
21                 return this.request(api[id].app,api[id].method,params,f);
22         },
23
24         'request' : function (app,name,params,f,o_params) {
25                 var request =  this._request(app,name,params,f,o_params);
26                 if (request) {
27                         return request.getResultObject();
28                 } else {
29                         return null;
30                 }
31         },
32
33         '_request' : function (app,name,params,f,o_params) {
34                 var obj = this;
35                 try {
36                         var sparams = js2JSON(params);
37                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
38                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
39                         var request = new RemoteRequest( app, name );
40                         for(var index in params) {
41                                 request.addParam(params[index]);
42                         }
43         
44                         if (f)  {
45                                 request.setCompleteCallback(
46                                         function(req) {
47                                                 try {
48                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
49                                                                 + obj.link_id + '\n\n' 
50                                                                 + obj.error.pretty_print(js2JSON(req.getResultObject())));
51                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
52                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
53                                                         if (o_params) {
54                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
55                                                         }
56                                                         req = obj.check_for_offline(app,name,params,req,o_params);
57                                                         f(req);
58                                                 } catch(E) {
59                                                         alert(E);
60                                                 }
61                                         }
62                                 );
63                                 request.send(false);
64                                 return null;
65                         } else {
66                                 request.send(true);
67                                 var result = request.getResultObject();
68                                 this.error.sdump('D_SES_RESULT','synced result #' + obj.link_id + '\n\n' + obj.error.pretty_print(js2JSON(result)));
69                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
70                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
71                                 if (o_params) {
72                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
73                                 }
74                                 request = obj.check_for_offline(app,name,params,request,o_params);
75                                 return request;
76                         }
77
78                 } catch(E) {
79                         if (instanceOf(E,perm_ex)) {
80                                 alert('permission exception: ' + js2JSON(E));
81                         }
82                         throw(E);
83                 }
84         },
85
86         'check_for_offline' : function (app,name,params,req,o_params) {
87                 var obj = this;
88                 var result = req.getResultObject();
89                 if (result != null) return req;
90
91                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
92                 var proceed = true;
93
94                 while(proceed) {
95
96                         proceed = false;
97
98                         var r = obj.error.yns_alert('Network failure.  Please check your Internet connection to ' + data.server_unadorned + ' and choose Reconnect.  If you need to enter Offline Mode, choose Abort Connection 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 "' + name + '".','Network Failure','Reconnect','Abort Connection',null,'Check here to confirm this message');
99
100                         switch(r) {
101                                 case 0: 
102                                         req = obj._request(app,name,params,null,o_params);
103                                         if (req.getResultObject() == null) proceed = true;
104                                         return req;
105                                 break;
106                                 case 1: 
107                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
108                                 break;
109                         }
110                 }
111         },
112
113         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
114                 try {
115                         var obj = this;
116                         var robj = req.getResultObject();
117                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
118                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
119                                 window.open(
120                                         urls.XUL_AUTH_SIMPLE
121                                         + '?login_type=staff'
122                                         + '&desc_brief=' + window.escape('Your session has expired')
123                                         + '&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),
124                                         'simple_auth',
125                                         'chrome,resizable,modal,width=700,height=500'
126                                 );
127                                 JSAN.use('OpenILS.data');
128                                 var data = new OpenILS.data(); data.init({'via':'stash'});
129                                 if (data.temporary_session != '') {
130                                         data.session = data.temporary_session; data.stash('session');
131                                         params[0] = data.session;
132                                         req = obj._request(app,name,params,null,o_params);
133                                 }
134                         }
135                 } catch(E) {
136                         this.error.sdump('D_ERROR',E);
137                 }
138                 return req;
139         },
140         
141         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
142                 try {
143                         var obj = this;
144                         var robj = req.getResultObject();
145                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
146                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
147                                 window.open(
148                                         urls.XUL_AUTH_SIMPLE
149                                         + '?login_type=temp'
150                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
151                                         + '&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),
152                                         'simple_auth',
153                                         'chrome,resizable,modal,width=700,height=500'
154                                 );
155                                 JSAN.use('OpenILS.data');
156                                 var data = new OpenILS.data(); data.init({'via':'stash'});
157                                 if (data.temporary_session != '') {
158                                         params[0] = data.temporary_session;
159                                         req = obj._request(app,name,params,null,o_params);
160                                 }
161                         }
162                 } catch(E) {
163                         this.error.sdump('D_ERROR',E);
164                 }
165                 return req;
166         },
167
168         'rerequest_on_override' : function (app,name,params,req,o_params) {
169                 var obj = this;
170                 try {
171                         function override(r) {
172                                 try {
173                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
174                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><groupbox><caption label="Exceptions"/><grid><columns><column/><column/><column/></columns><rows>';
175                                         for (var i = 0; i < r.length; i++) {
176                                                 xml += '<row style="color: red"><description>' + r[i].ilsevent + '</description><description>' + r[i].textcode + '</description><description>' +  (obj.error.get_ilsevent(r[i].ilsevent) ? obj.error.get_ilsevent(r[i].ilsevent) : "") + '</description></row>';
177                                         }
178                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox><description>Force this action?</description><button accesskey="C" label="Cancel" name="fancy_cancel"/><button id="override" accesskey="O" label="Override" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
179                                         window.open(
180                                                 '/xul/server/util/fancy_prompt.xul'
181                                                 + '?xml=' + window.escape(xml)
182                                                 + '&title=' + window.escape(o_params.title),
183                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
184                                         );
185                                         JSAN.use('OpenILS.data');
186                                         var data = new OpenILS.data(); data.init({'via':'stash'});
187                                         if (data.fancy_prompt_data != '') {
188                                                 req = obj._request(app,name + '.override',params);
189                                         }
190                                         return req;
191                                 } catch(E) {
192                                         alert(E);
193                                 }
194                         }
195
196                         var result = req.getResultObject();
197                         if (!result) return req;
198
199                         if ( o_params.overridable_events.indexOf(result.ilsevent) != -1 ) {
200                                 req = override([result]);
201                         } else {
202                                 var found_good = false; var found_bad = false;
203                                 for (var i = 0; i < result.length; i++) {
204                                         if (o_params.overridable_events.indexOf(result[i].ilsevent) != -1 ) {
205                                                 found_good = true;
206                                         } else {
207                                                 found_bad = true;
208                                         }
209                                 }
210                                 if (found_good && (!found_bad)) req = override(result);
211                         }
212
213                         return req;
214                 } catch(E) {
215                         throw(E);
216                 }
217         },
218
219
220 }
221
222 /*
223 function sample_callback(request) {
224         var result = request.getResultObject();
225 }
226 */
227
228 dump('exiting util/network.js\n');