]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
more info
[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                                         params[0] = data.session.key;
156                                         req = obj._request(app,name,params,null,o_params);
157                                 }
158                         }
159                 } catch(E) {
160                         this.error.sdump('D_ERROR',E);
161                 }
162                 return req;
163         },
164         
165         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
166                 try {
167                         var obj = this;
168                         var robj = req.getResultObject();
169                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
170                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
171                                 window.open(
172                                         urls.XUL_AUTH_SIMPLE
173                                         + '?login_type=temp'
174                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
175                                         + '&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),
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 (data.temporary_session != '') {
182                                         params[0] = data.temporary_session.key;
183                                         req = obj._request(app,name,params,null,o_params);
184                                 }
185                         }
186                 } catch(E) {
187                         this.error.sdump('D_ERROR',E);
188                 }
189                 return req;
190         },
191
192         'rerequest_on_override' : function (app,name,params,req,o_params) {
193                 var obj = this;
194                 try {
195                         if (!o_params.text) o_params.text = {};
196                         function override(r) {
197                                 try {
198                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
199                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' + 
200                                                 '<groupbox><caption label="Exceptions"/>' + 
201                                                 '<grid><columns><column/><column/></columns><rows>';
202                                         for (var i = 0; i < r.length; i++) {
203                                                 xml += '<row>' + 
204                                                         '<description style="color: red" tooltiptext="' + r[i].ilsevent + '">' + r[i].textcode + '</description>' + 
205                                                         '<description>' + (o_params.text[r[i].ilsevent] ? o_params.text[r[i].ilsevent](r[i]) : '') + '</description>' + 
206                                                         '</row><row>' + '<description>' + r[i].desc + '</description>' + '</row>';
207                                         }
208                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox>' + 
209                                                 '<description>Force this action?</description>' + 
210                                                 '<button accesskey="N" label="No" name="fancy_cancel"/>' + 
211                                                 '<button id="override" accesskey="Y" label="Yes" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
212                                         window.open(
213                                                 urls.XUL_FANCY_PROMPT
214                                                 + '?xml=' + window.escape(xml)
215                                                 + '&title=' + window.escape(o_params.title),
216                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
217                                         );
218                                         JSAN.use('OpenILS.data');
219                                         var data = new OpenILS.data(); data.init({'via':'stash'});
220                                         if (data.fancy_prompt_data != '') {
221                                                 req = obj._request(app,name + '.override',params);
222                                         }
223                                         return req;
224                                 } catch(E) {
225                                         alert('in util.network, rerequest_on_override, override:' + E);
226                                 }
227                         }
228
229                         var result = req.getResultObject();
230                         if (!result) return req;
231
232                         if ( (typeof result.ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result.ilsevent) != -1) ) {
233                                 req = override([result]);
234                         } else {
235                                 var found_good = false; var found_bad = false;
236                                 for (var i = 0; i < result.length; i++) {
237                                         if ( (result[i].ilsevent != 'undefined') && (o_params.overridable_events.indexOf(result[i].ilsevent) != -1) ) {
238                                                 found_good = true;
239                                         } else {
240                                                 found_bad = true;
241                                         }
242                                 }
243                                 if (found_good && (!found_bad)) req = override(result);
244                         }
245
246                         return req;
247                 } catch(E) {
248                         throw(E);
249                 }
250         },
251
252
253 }
254
255 /*
256 function sample_callback(request) {
257         var result = request.getResultObject();
258 }
259 */
260
261 dump('exiting util/network.js\n');