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