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