]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/auth/controller.js
Rough cut at providing the staff client as a Firefox extension.
[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) {
528                 if (w.xulG) { w.close(); } // FIXME: kludge so we don't close Firefox windows as an extension.  We should define a @windowtype for all the staff client windows and have the enumerator just pull those
529             }
530         }
531
532         this.controller.render('ws_deck');
533
534         this.session.close();
535
536         /* FIXME - need some locking or object destruction for the async tests */
537         /* this.test_server( this.controller.view.server_prompt.value ); */
538
539         if (typeof this.on_logoff == 'function') {
540             this.error.sdump('D_AUTH','auth.controller.on_logoff()\n');
541             this.on_logoff();
542         }
543         
544     },
545     'close' : function() { 
546     
547         this.error.sdump('D_AUTH','close' + this.w + '\n');
548
549         if (window.confirm(document.getElementById('authStrings').getString('staff.auth.controller.confirm_close'))) {
550             this.logoff();
551             this.w.close(); /* Probably won't go any further */
552
553             if (typeof this.on_close == 'function') {
554                 this.error.sdump('D_AUTH','auth.controller.on_close()\n');
555                 this.on_close();
556             }
557         }
558         
559     }
560 }
561
562 dump('exiting auth/controller.js\n');