]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/auth/controller.js
remember last configured server and use it by default
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / auth / controller.js
1 dump('entering auth/controller.js\n');
2
3 if (typeof auth == 'undefined') auth = {};
4 auth.controller = function (params) {
5         JSAN.use('util.error'); this.error = new util.error();
6         this.w = params.window;
7
8         return this;
9 };
10
11 auth.controller.prototype = {
12
13         'init' : function () {
14
15                 var obj = this;  // so the 'this' in event handlers don't confuse us
16                 var w = obj.w;
17
18                 JSAN.use('OpenILS.data');
19                 obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
20
21                 // MVC
22                 JSAN.use('util.controller'); obj.controller = new util.controller();
23                 obj.controller.init(
24                         {
25                                 'control_map' : {
26                                         'cmd_login' : [
27                                                 ['command'],
28                                                 function() {
29                                                         obj.login();
30                                                 }
31                                         ],
32                                         'cmd_standalone' : [
33                                                 ['command'],
34                                                 function() {
35                                                         obj.standalone();
36                                                 }
37                                         ],
38                                         'cmd_standalone_import' : [
39                                                 ['command'],
40                                                 function() {
41                                                         obj.standalone_import();
42                                                 }
43                                         ],
44                                         'cmd_standalone_export' : [
45                                                 ['command'],
46                                                 function() {
47                                                         obj.standalone_export();
48                                                 }
49                                         ],
50                                         'cmd_clear_cache' : [
51                                                 ['command'],
52                                                 function() {
53                                                         obj.debug('clear_cache');
54                                                 }
55                                         ],
56                                         'cmd_js_console' : [
57                                                 ['command'],
58                                                 function() {
59                                                         obj.debug('js_console');
60                                                 }
61                                         ],
62                                         'cmd_override' : [
63                                                 ['command'],
64                                                 function() {
65                                                         obj.override();
66                                                 }
67                                         ],
68                                         'cmd_logoff' : [
69                                                 ['command'],
70                                                 function() {
71                                                         obj.logoff()
72                                                 }
73                                         ],
74                                         'cmd_close_window' : [
75                                                 ['command'],
76                                                 function() {
77                                                         obj.close()
78                                                 }
79                                         ],
80                                         'test_server' : [
81                                                 ['command'],
82                                                 function() {
83                                                         obj.test_server( obj.controller.view.server_prompt.value );
84                                                 }
85                                         ],
86                                         'server_prompt' : [
87                                                 ['keypress'],
88                                                 handle_keypress
89                                         ],
90                                         'name_prompt' : [
91                                                 ['keypress'],
92                                                 handle_keypress
93                                         ],
94                                         'password_prompt' : [
95                                                 ['keypress'],
96                                                 handle_keypress
97                                         ],
98                                         'submit_button' : [
99                                                 ['render'],
100                                                 function(e) { return function() {} }
101                                         ],
102                                         'progress_bar' : [
103                                                 ['render'],
104                                                 function(e) { return function() {} }
105                                         ],
106                                         'status' : [
107                                                 ['render'],
108                                                 function(e) { return function() {
109                                                 } }
110                                         ],
111                                         'ws_deck' : [
112                                                 ['render'],
113                                                 function(e) { return function() {
114                                                         try {
115                                                                 JSAN.use('util.widgets'); util.widgets.remove_children(e);
116                                                                 var x = document.createElement('description');
117                                                                 e.appendChild(x);
118                                                                 if (obj.data.ws_info 
119                                                                         && obj.data.ws_info[ obj.controller.view.server_prompt.value ]) {
120                                                                         var ws = obj.data.ws_info[ obj.controller.view.server_prompt.value ];
121                                                                         x.appendChild(
122                                                                                 document.createTextNode(
123                                                                                         ws.name /*+ ' @  ' + ws.lib_shortname*/
124                                                                                 )
125                                                                         );
126                                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
127                                                                         JSAN.use('util.file'); var file = new util.file('last_ws_server');
128                                                                         file.set_object(obj.controller.view.server_prompt.value);
129                                                                         file.close();
130                                                                 } else {
131                                                                         x.appendChild(
132                                                                                 document.createTextNode(
133                                                                                         'Not yet configured for the specified server.'
134                                                                                 )
135                                                                         );
136                                                                 }
137                                                         } catch(E) {
138                                                                 alert(E);
139                                                         }
140                                                 } }
141                                         ],
142                                         'menu_spot' : [
143                                                 ['render'],
144                                                 function(e) { return function() {
145                                                 } }
146                                         ],
147
148                                 }
149                         }
150                 );
151                 obj.controller.view.name_prompt.focus();
152
153                 function handle_keypress(ev) {
154                         try {
155                                 if (ev.keyCode && ev.keyCode == 13) {
156                                         switch(this) {
157                                                 case obj.controller.view.server_prompt:
158                                                         ev.preventDefault();
159                                                         obj.controller.view.name_prompt.focus(); obj.controller.view.name_prompt.select();
160                                                 break;
161                                                 case obj.controller.view.name_prompt:
162                                                         ev.preventDefault();
163                                                         obj.controller.view.password_prompt.focus(); obj.controller.view.password_prompt.select();
164                                                 break;
165                                                 case obj.controller.view.password_prompt:
166                                                         ev.preventDefault();
167                                                         obj.controller.view.submit_button.focus(); 
168                                                         obj.login();
169                                                 break;
170                                                 default: break;
171                                         }
172                                 }
173                         } catch(E) {
174                                 alert(E);
175                         }
176                 }
177
178                 obj.controller.view.server_prompt.addEventListener(
179                         'change',
180                         function (ev) { 
181                                 obj.test_server(ev.target.value);
182                                 obj.controller.render('ws_deck'); 
183                         },
184                         false
185                 );
186
187                 // This talks to our ILS
188                 JSAN.use('auth.session');
189                 obj.session = new auth.session(obj.controller.view);
190
191                 obj.controller.render();
192                 obj.test_server( obj.controller.view.server_prompt.value );
193                 obj.controller.render('ws_deck'); 
194
195                 if (typeof this.on_init == 'function') {
196                         this.error.sdump('D_AUTH','auth.controller.on_init()\n');
197                         this.on_init();
198                 }
199         },
200
201         'test_server' : function(url) {
202                 var obj = this;
203                 if (!url) {
204                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
205                         JSAN.use('util.file'); var file = new util.file('last_ws_server');
206                         if (file._file.exists()) {
207                                 url = file.get_object(); file.close();
208                                 obj.controller.view.server_prompt.value = url;
209                         }
210                 }
211                 obj.controller.view.submit_button.disabled = true;
212                 obj.controller.view.server_prompt.disabled = true;
213                 var s = document.getElementById('status');
214                 s.setAttribute('value','Testing hostname...');
215                 s.setAttribute('style','color: orange;');
216                 document.getElementById('version').value = '';
217                 if (!url) {
218                         s.setAttribute('value','Please enter a server hostname.');
219                         s.setAttribute('style','color: red;');
220                         obj.controller.view.server_prompt.disabled = false;
221                         obj.controller.view.server_prompt.focus();
222                         return;
223                 }
224                 try {
225                         if ( ! url.match(/^http:\/\//) ) url = 'http://' + url;
226                         var x = new XMLHttpRequest();
227                         dump('server url = ' + url + '\n');
228                         x.open("GET",url,true);
229                         x.onreadystatechange = function() {
230                                 try {
231                                         if (x.readyState != 4) return;
232                                         s.setAttribute('value',x.status + ' : ' + x.statusText);
233                                         if (x.status == 200) {
234                                                 s.setAttribute('style','color: green;');
235                                         } else {
236                                                 s.setAttribute('style','color: red;');
237                                         }
238                                         obj.test_version(url);
239                                 } catch(E) {
240                                         obj.controller.view.server_prompt.disabled = false;
241                                         obj.controller.view.server_prompt.focus();
242                                         s.setAttribute('value','There was an error testing this hostname.');
243                                         s.setAttribute('style','color: red;');
244                                         obj.error.sdump('D_ERROR',E);
245                                 }
246                         }
247                         x.send(null);
248                 } catch(E) {
249                         s.setAttribute('value','There was an error testing this hostname.');
250                         s.setAttribute('style','color: brown;');
251                         obj.error.sdump('D_ERROR',E);
252                         obj.controller.view.server_prompt.disabled = false;
253                         obj.controller.view.server_prompt.focus();
254                 }
255         },
256
257         'test_version' : function(url) {
258                 var obj = this;
259                 var s = document.getElementById('version');
260                 s.setAttribute('value','Testing version...');
261                 s.setAttribute('style','color: orange;');
262                 try {
263                         var x = new XMLHttpRequest();
264                         var url2 = url + '/xul/server/';
265                         dump('version url = ' + url2 + '\n');
266                         x.open("GET",url2,true);
267                         x.onreadystatechange = function() {
268                                 try {
269                                         if (x.readyState != 4) return;
270                                         s.setAttribute('value',x.status + ' : ' + x.statusText);
271                                         if (x.status == 200) {
272                                                 s.setAttribute('style','color: green;');
273                                                 obj.controller.view.submit_button.disabled = false;
274                                         } else {
275                                                 s.setAttribute('style','color: red;');
276                                                 obj.test_upgrade_instructions(url);
277                                         }
278                                         obj.controller.view.server_prompt.disabled = false;
279                                 } catch(E) {
280                                         s.setAttribute('value','There was an error checking version support.');
281                                         s.setAttribute('style','color: red;');
282                                         obj.error.sdump('D_ERROR',E);
283                                         obj.controller.view.server_prompt.disabled = false;
284                                 }
285                         }
286                         x.send(null);
287                 } catch(E) {
288                         s.setAttribute('value','There was an error checking version support.');
289                         s.setAttribute('style','color: brown;');
290                         obj.error.sdump('D_ERROR',E);
291                         obj.controller.view.server_prompt.disabled = false;
292                 }
293         },
294
295         'test_upgrade_instructions' : function(url) {
296                 var obj = this;
297                 try {
298                         var x = new XMLHttpRequest();
299                         var url2 = url + '/xul/versions.html';
300                         dump('upgrade url = ' + url2 + '\n');
301                         x.open("GET",url2,true);
302                         x.onreadystatechange = function() {
303                                 try {
304                                         if (x.readyState != 4) return;
305                                         if (x.status == 200) {
306                                                 window.open('data:text/html,'+window.escape(x.responseText),'upgrade','chrome,resizable,modal,centered');
307                                         } else {
308                                                 alert('This server does not support your version of the staff client.  Please check with your system administrator.');
309                                         }
310                                         obj.controller.view.server_prompt.disabled = false;
311                                 } catch(E) {
312                                         obj.error.sdump('D_ERROR',E);
313                                         obj.controller.view.server_prompt.disabled = false;
314                                 }
315                         }
316                         x.send(null);
317                 } catch(E) {
318                         obj.error.sdump('D_ERROR',E);
319                         obj.controller.view.server_prompt.disabled = false;
320                 }
321         },
322
323         'login' : function() { 
324
325                 var obj = this;
326
327                 this.error.sdump('D_AUTH','login with ' 
328                         + this.controller.view.name_prompt.value + ' and ' 
329                         + this.controller.view.password_prompt.value + ' at ' 
330                         + this.controller.view.server_prompt.value + '\n'
331                 ); 
332                 this.controller.view.server_prompt.disabled = true;
333                 this.controller.view.name_prompt.disabled = true;
334                 this.controller.view.password_prompt.disabled = true;
335                 this.controller.view.submit_button.disabled = true;
336                 XML_HTTP_SERVER = this.controller.view.server_prompt.value;
337
338                 try {
339
340                         if (typeof this.on_login == 'function') {
341                                 this.error.sdump('D_AUTH','auth.controller.session.on_init = ' +
342                                         'auth.controller.on_login\n');
343                                 this.session.on_init = this.on_login;
344                                 this.session.on_error = function() { obj.logoff(); };
345                         }
346                         
347                         this.session.init();
348
349                 } catch(E) {
350                         var error = '!! ' + E + '\n';
351                         this.error.sdump('D_ERROR',error); 
352                         alert(error);
353                         this.logoff();
354                         if (E == 'open-ils.auth.authenticate.init returned false\n') {
355                                 this.controller.view.server_prompt.focus();
356                                 this.controller.view.server_prompt.select();
357                         }
358
359                         if (typeof this.on_login_error == 'function') {
360                                 this.error.sdump('D_AUTH','auth.controller.on_login_error()\n');
361                                 this.on_login_error(E);
362                         }
363                 }
364
365         },
366
367         'standalone' : function() {
368                 var obj = this;
369                 try {
370                         if (typeof this.on_standalone == 'function') {
371                                 obj.on_standalone();
372                         }
373                 } catch(E) {
374                         var error = '!! ' + E + '\n';
375                         obj.error.sdump('D_ERROR',error); 
376                         alert(error);
377                 }
378         },
379
380         'standalone_import' : function() {
381                 var obj = this;
382                 try {
383                         if (typeof this.on_standalone_import == 'function') {
384                                 obj.on_standalone_import();
385                         }
386                 } catch(E) {
387                         var error = '!! ' + E + '\n';
388                         obj.error.sdump('D_ERROR',error); 
389                         alert(error);
390                 }
391         },
392
393         'standalone_export' : function() {
394                 var obj = this;
395                 try {
396                         if (typeof this.on_standalone_export == 'function') {
397                                 obj.on_standalone_export();
398                         }
399                 } catch(E) {
400                         var error = '!! ' + E + '\n';
401                         obj.error.sdump('D_ERROR',error); 
402                         alert(error);
403                 }
404         },
405
406         'debug' : function(action) {
407                 var obj = this;
408                 try {
409                         if (typeof this.on_debug == 'function') {
410                                 obj.on_debug(action);
411                         }
412                 } catch(E) {
413                         var error = '!! ' + E + '\n';
414                         obj.error.sdump('D_ERROR',error);
415                         alert(error);
416                 }
417         },
418
419         'logoff' : function() { 
420         
421                 this.error.sdump('D_AUTH','logoff' + this.w + '\n'); 
422                 this.controller.view.progress_bar.value = 0; 
423                 this.controller.view.progress_bar.setAttribute('real','0.0');
424                 this.controller.view.submit_button.disabled = false;
425                 this.controller.view.password_prompt.disabled = false;
426                 this.controller.view.password_prompt.value = '';
427                 this.controller.view.name_prompt.disabled = false;
428                 this.controller.view.name_prompt.focus(); 
429                 this.controller.view.name_prompt.select();
430                 this.controller.view.server_prompt.disabled = false;
431
432                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
433                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
434                 var enumerator = windowManagerInterface.getEnumerator(null);
435
436                 var w; // close all other windows
437                 while ( w = enumerator.getNext() ) {
438                         if (w != window) w.close();
439                 }
440
441                 this.controller.render('ws_deck');
442
443                 this.session.close();
444
445                 /* FIXME - need some locking or object destruction for the async tests */
446                 /* this.test_server( this.controller.view.server_prompt.value ); */
447
448                 if (typeof this.on_logoff == 'function') {
449                         this.error.sdump('D_AUTH','auth.controller.on_logoff()\n');
450                         this.on_logoff();
451                 }
452                 
453         },
454         'close' : function() { 
455         
456                 this.error.sdump('D_AUTH','close' + this.w + '\n');
457                 this.logoff();
458                 //Basically, we want to close all the windows for this application (and in case we're running this as
459                 //a firefox extension, we don't want to merely shutdown mozilla).  I'll probably create an XPCOM for
460                 //tracking the windows.
461                 //for (var w in this.G.window.appshell_list) {
462                 //      this.G.window.appshell_list[w].close();
463                 //}
464                 this.w.close(); /* Probably won't go any further */
465
466                 if (typeof this.on_close == 'function') {
467                         this.error.sdump('D_AUTH','auth.controller.on_close()\n');
468                         this.on_close();
469                 }
470                 
471         }
472 }
473
474 dump('exiting auth/controller.js\n');