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