]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/z3950.js
make the MARC editor optional with Z39.50
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / z3950.js
1 dump('entering cat.z3950.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof cat == 'undefined') cat = {};
6 cat.z3950 = function (params) {
7     try {
8         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
9         JSAN.use('util.error'); this.error = new util.error();
10         JSAN.use('util.network'); this.network = new util.network();
11     } catch(E) {
12         dump('cat.z3950: ' + E + '\n');
13     }
14 }
15
16 cat.z3950.prototype = {
17
18     'creds_version' : 2,
19
20     'number_of_result_sets' : 0,
21
22     'result_set' : [],
23
24     'limit' : 10,
25
26     'init' : function( params ) {
27
28         try {
29             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
30             JSAN.use('util.widgets');
31
32             var obj = this;
33
34             JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
35
36             obj.load_creds();
37
38             JSAN.use('circ.util');
39             var columns = circ.util.columns(
40                 {
41                     'tcn' : { 'hidden' : false },
42                     'isbn' : { 'hidden' : false },
43                     'title' : { 'hidden' : false, 'flex' : '1' },
44                     'author' : { 'hidden' : false },
45                     'edition' : { 'hidden' : false },
46                     'pubdate' : { 'hidden' : false },
47                     'publisher' : { 'hidden' : false },
48                     'service' : { 'hidden' : false }
49                 }
50             );
51
52             JSAN.use('util.list'); obj.list = new util.list('results');
53             obj.list.init(
54                 {
55                     'columns' : columns,
56                     'map_row_to_columns' : circ.util.std_map_row_to_columns(),
57                     'on_select' : function(ev) {
58                         try {
59                             JSAN.use('util.functional');
60                             var sel = obj.list.retrieve_selection();
61                             document.getElementById('sel_clip').setAttribute('disabled', sel.length < 1);
62                             var list = util.functional.map_list(
63                                 sel,
64                                 function(o) {
65                                     if ( $('jacket_image') ) {
66                                         // A side-effect in this map function, mu hahaha
67                                         if (o.getAttribute('isbn')) {
68                                             $('jacket_image').setAttribute('src',urls.ac_jacket_large+o.getAttribute('isbn'));
69                                             $('jacket_image').setAttribute('tooltiptext',urls.ac_jacket_large+o.getAttribute('isbn'));
70                                         } else {
71                                             $('jacket_image').setAttribute('src','');
72                                             $('jacket_image').setAttribute('tooltiptext','');
73                                         }
74                                     }
75                                     return o.getAttribute('retrieve_id');
76                                 }
77                             );
78                             obj.error.sdump('D_TRACE','cat/z3950: selection list = ' + js2JSON(list) );
79                             obj.controller.view.marc_import.disabled = false;
80                             obj.controller.view.marc_import.setAttribute('retrieve_id',list[0]);
81                             obj.data.init({'via':'stash'});
82                             if (obj.data.marked_record) {
83                                 obj.controller.view.marc_import_overlay.disabled = false;
84                             } else {
85                                 obj.controller.view.marc_import_overlay.disabled = true;
86                             }
87                             obj.controller.view.marc_import_overlay.setAttribute('retrieve_id',list[0]);
88                             obj.controller.view.marc_view_btn.disabled = false;
89                             obj.controller.view.marc_view_btn.setAttribute('retrieve_id',list[0]);
90                         } catch(E) {
91                             obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_list_init.list_construction_error'),E);
92                         }
93                     },
94                 }
95             );
96
97             JSAN.use('util.controller'); obj.controller = new util.controller();
98             obj.controller.init(
99                 {
100                     control_map : {
101                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
102                         'sel_clip' : [ ['command'], function() { obj.list.clipboard(); } ],
103                         'cmd_z3950_csv_to_clipboard' : [ ['command'], function() { obj.list.dump_csv_to_clipboard(); } ],
104                         'cmd_z3950_csv_to_printer' : [ ['command'], function() { obj.list.dump_csv_to_printer(); } ], 
105                         'cmd_z3950_csv_to_file' : [ ['command'], function() { obj.list.dump_csv_to_file( { 'defaultFileName' : 'z3950_results.txt' } ); } ],
106                         'cmd_broken' : [
107                             ['command'],
108                             function() { alert('Not Yet Implemented'); }
109                         ],
110                         'result_message' : [['render'],function(e){return function(){};}],
111                         'clear' : [
112                             ['command'],
113                             function() {
114                                 obj.clear();
115                             }
116                         ],
117                         'save_creds' : [
118                             ['command'],
119                             function() {
120                                 obj.save_creds();
121                                 setTimeout( function() { obj.focus(); }, 0 );
122                             }
123                         ],
124                         'marc_view_btn' : [
125                             ['render'],
126                             function(e) {
127                                 e.setAttribute('label', $("catStrings").getString('staff.cat.z3950.marc_view.label'));
128                                 e.setAttribute('accesskey', $("catStrings").getString('staff.cat.z3950.marc_view.accesskey'));
129                             }
130                         ],
131                         'marc_view' : [
132                             ['command'],
133                             function(ev) {
134                                 try {
135                                     var n = obj.controller.view.marc_view_btn;
136                                     if (n.getAttribute('toggle') == '1') {
137                                         document.getElementById('deck').selectedIndex = 0;
138                                         n.setAttribute('toggle','0');
139                                         n.setAttribute('label', $("catStrings").getString('staff.cat.z3950.marc_view.label'));
140                                         n.setAttribute('accesskey', $("catStrings").getString('staff.cat.z3950.marc_view.accesskey'));
141                                         document.getElementById('results').focus();
142                                     } else {
143                                         document.getElementById('deck').selectedIndex = 1;
144                                         n.setAttribute('toggle','1');
145                                         n.setAttribute('label', $("catStrings").getString('staff.cat.z3950.results_view.label'));
146                                         n.setAttribute('accesskey', $("catStrings").getString('staff.cat.z3950.results_view.accesskey'));
147                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
148                                         var f = get_contentWindow(document.getElementById('marc_frame'));
149                                         var retrieve_id = n.getAttribute('retrieve_id');
150                                         var result_idx = retrieve_id.split('-')[0];
151                                         var record_idx = retrieve_id.split('-')[1];
152                                         f.xulG = { 'marcxml' : obj.result_set[result_idx].records[ record_idx ].marcxml };
153                                         f.my_init();
154                                         f.document.body.firstChild.focus();
155                                     }
156                                 } catch(E) {
157                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_controller_init.marc_view_error'),E);
158                                 }
159                             },
160                         ],
161                         'marc_import' : [
162                             ['command'],
163                             function() {
164                                 try {
165                                     var retrieve_id = obj.controller.view.marc_import.getAttribute('retrieve_id');
166                                     var result_idx = retrieve_id.split('-')[0];
167                                     var record_idx = retrieve_id.split('-')[1];
168                                     obj.spawn_marc_editor( 
169                                         obj.result_set[ result_idx ].records[ record_idx ].marcxml,
170                                         obj.result_set[ result_idx ].records[ record_idx ].service /* FIXME: we want biblio_source here */
171                                     );
172                                 } catch(E) {
173                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_controller_init.marc_import_error'),E);
174                                 }
175                             },
176                         ],
177                         'marc_import_overlay' : [ 
178                             ['command'],
179                             function() {
180                                 try {
181                                     var retrieve_id = obj.controller.view.marc_import_overlay.getAttribute('retrieve_id');
182                                     var result_idx = retrieve_id.split('-')[0];
183                                     var record_idx = retrieve_id.split('-')[1];
184                                     obj.spawn_marc_editor_for_overlay( 
185                                         obj.result_set[ result_idx ].records[ record_idx ].marcxml,
186                                         obj.result_set[ result_idx ].records[ record_idx ].service /* FIXME: we want biblio_source here */
187                                     );
188                                 } catch(E) {
189                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_controller_init.marc_import_overlay_error'),E);
190                                 }
191                             },
192                         ],
193                         'search' : [
194                             ['command'],
195                             function() {
196                                 obj.initial_search();
197                             },
198                         ],
199                         'raw_search' : [ 
200                             ['command'], 
201                             function() { 
202                                 var raw = window.prompt(
203                                     $("catStrings").getString('staff.cat.z3950.initial_search.raw_prompt.msg'),
204                                     $("catStrings").getString('staff.cat.z3950.initial_search.raw_prompt.default_value'),
205                                     $("catStrings").getString('staff.cat.z3950.initial_search.raw_prompt.title')
206                                 ); 
207                                 if (raw) obj.initial_raw_search(raw); 
208                             } 
209                         ], 
210                         'page_next' : [
211                             ['command'],
212                             function() {
213                                 obj.page_next();
214                             },
215                         ],
216                         'toggle_form_btn' : [
217                             ['render'],
218                             function(e) {
219                                 e.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
220                                 e.setAttribute('label',$("catStrings").getString('staff.cat.z3950.hide_top_pane.label'));
221                                 e.setAttribute('accesskey',$("catStrings").getString('staff.cat.z3950.hide_top_pane.accesskey'));
222                             }
223                         ],
224                         'toggle_form' : [
225                             ['command'],
226                             function() {
227                                 var x = document.getElementById('top_pane');
228                                 document.getElementById('splitter_grippy2').doCommand();
229                                 var n = obj.controller.view.toggle_form_btn;
230                                 if (x.collapsed) {
231                                     n.setAttribute('image',"/xul/server/skin/media/images/down_arrow.gif");
232                                     n.setAttribute('label',$("catStrings").getString('staff.cat.z3950.unhide_top_pane.label'));
233                                     n.setAttribute('accesskey',$("catStrings").getString('staff.cat.z3950.unhide_top_pane.accesskey'));
234                                 } else {
235                                     n.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
236                                     n.setAttribute('label',$("catStrings").getString('staff.cat.z3950.hide_top_pane.label'));
237                                     n.setAttribute('accesskey',$("catStrings").getString('staff.cat.z3950.hide_top_pane.accesskey'));
238                                 }
239                             },
240                         ],
241                         'splitter_grippy2' : [
242                             ['click'],
243                             function() {
244                                 var x = document.getElementById('top_pane');
245                                 var n = obj.controller.view.toggle_form_btn;
246                                 if (x.collapsed) {
247                                     n.setAttribute('image',"/xul/server/skin/media/images/down_arrow.gif");
248                                     n.setAttribute('label',$("catStrings").getString('staff.cat.z3950.unhide_top_pane.label'));
249                                     n.setAttribute('accesskey',$("catStrings").getString('staff.cat.z3950.unhide_top_pane.accesskey'));
250                                 } else {
251                                     n.setAttribute('image',"/xul/server/skin/media/images/up_arrow.gif");
252                                     n.setAttribute('label',$("catStrings").getString('staff.cat.z3950.hide_top_pane.label'));
253                                     n.setAttribute('accesskey',$("catStrings").getString('staff.cat.z3950.hide_top_pane.accesskey'));
254                                 }
255                             }
256                         ],
257                         'service_rows' : [
258                             ['render'],
259                             function(e) {
260                                 return function() {
261                                     try {
262
263                                         function handle_switch(node) {
264                                             try {
265                                                 $('search').setAttribute('disabled','true'); $('raw_search').setAttribute('disabled','true');
266                                                 obj.active_services = [];
267                                                 var snl = document.getElementsByAttribute('mytype','service_class');
268                                                 for (var i = 0; i < snl.length; i++) {
269                                                     var n = snl[i];
270                                                     if (n.nodeName == 'checkbox') {
271                                                         if (n.checked) obj.active_services.push( n.getAttribute('service') );
272                                                     }
273                                                 }
274                                                 if (obj.active_services.length > 0) {
275                                                     $('search').setAttribute('disabled','false'); 
276                                                 }
277                                                 if (obj.active_services.length == 1) {
278                                                     if (obj.active_services[0] != 'native-evergreen-catalog') { 
279                                                         $('raw_search').setAttribute('disabled','false');
280                                                     }
281                                                 }
282                                                 var nl = document.getElementsByAttribute('mytype','search_class');
283                                                 for (var i = 0; i < nl.length; i++) { nl[i].disabled = true; }
284                                                 var attrs = {};
285                                                 for (var j = 0; j < obj.active_services.length; j++) {
286                                                     if (obj.services[obj.active_services[j]]) for (var i in obj.services[obj.active_services[j]].attrs) {
287                                                         var attr = obj.services[obj.active_services[j]].attrs[i];
288                                                         if (! attrs[i]) {
289                                                             attrs[i] = { 'labels' : {} };
290                                                         }
291                                                         if (attr.label) {
292                                                             attrs[i].labels[ attr.label ] = true;
293                                                         } else if (document.getElementById('commonStrings').testString('staff.z39_50.search_class.' + i)) {
294                                                             attrs[i].labels[ document.getElementById('commonStrings').getString('staff.z39_50.search_class.' + i) ] = true;
295                                                         } else if (attr.name) {
296                                                             attrs[i].labels[ attr.name ] = true;
297                                                         } else {
298                                                             attrs[i].labels[ i ] = true;
299                                                         }
300
301                                                     }
302                                                     
303                                                 }
304
305                                                 function set_label(x,attr) {
306                                                     var labels = [];
307                                                     for (var j in attrs[attr].labels) {
308                                                         labels.push(j);
309                                                     }
310                                                     if (labels.length > 0) {
311                                                         x.setAttribute('value',labels[0]);
312                                                         x.setAttribute('tooltiptext',labels.join(','));
313                                                         if (labels.length > 1) x.setAttribute('class','multiple_labels');
314                                                     }
315                                                 }
316
317                                                 for (var i in attrs) {
318                                                     var x = document.getElementById(i + '_input');
319                                                     if (x) {
320                                                         x.disabled = false;
321                                                         var y = document.getElementById(i + '_label',i);
322                                                         if (y) set_label(y,i);
323                                                     } else {
324                                                         var rows = document.getElementById('query_inputs');
325                                                         var row = document.createElement('row'); rows.appendChild(row);
326                                                         var label = document.createElement('label');
327                                                         label.setAttribute('id',i+'_label');
328                                                         label.setAttribute('control',i+'_input');
329                                                         label.setAttribute('search_class',i);
330                                                         label.setAttribute('style','-moz-user-focus: ignore');
331                                                         row.appendChild(label);
332                                                         set_label(label,i);
333                                                         label.addEventListener('click',function(ev){
334                                                                 var a = ev.target.getAttribute('search_class');
335                                                                 if (a) obj.default_attr = a;
336                                                             },false
337                                                         );
338                                                         var tb = document.createElement('textbox');
339                                                         tb.setAttribute('id',i+'_input');
340                                                         tb.setAttribute('mytype','search_class');
341                                                         tb.setAttribute('search_class',i);
342                                                         row.appendChild(tb);
343                                                         tb.addEventListener('keypress',function(ev) { return obj.handle_enter(ev); },false);
344                                                     }
345                                                 }
346                                             } catch(E) {
347                                                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_controller_init.search_fields_error'),E);
348                                             }
349                                         }
350
351                                         document.getElementById('native-evergreen-catalog_service').addEventListener('command',handle_switch,false);
352
353                                         var robj = obj.network.simple_request(
354                                             'RETRIEVE_Z3950_SERVICES',
355                                             [ ses() ]
356                                         );
357                                         if (typeof robj.ilsevent != 'undefined') throw(robj);
358                                         obj.services = robj;
359                                         var x = document.getElementById('service_rows');
360                                         var services = new Array();
361                                         for (var i in obj.services) {
362                                             var label;
363                                             if (obj.services[i].label) {
364                                                 label = obj.services[i].label;
365                                             } else if (obj.services[i].name) {
366                                                 label = obj.services[i].name;
367                                             } else {
368                                                 label = i;
369                                             }
370                                             var j = [label, i];
371                                             services.push(j);
372                                         }
373                                         services.sort();
374                                         for (var j=0; j < services.length; j++) {
375                                             var i = services[j][1];
376                                             try {
377                                                 if (i == 'native-evergreen-catalog') continue;
378                                                 var r = document.createElement('row'); x.appendChild(r);
379                                                 var cb = document.createElement('checkbox'); 
380                                                     cb.setAttribute('label',services[j][0]);
381                                                     cb.setAttribute('tooltiptext',i + ' : ' + obj.services[i].db + '@' + obj.services[i].host + ':' + obj.services[i].port); 
382                                                     cb.setAttribute('mytype','service_class'); cb.setAttribute('service',i);
383                                                     cb.setAttribute('id',i+'_service'); r.appendChild(cb);
384                                                     cb.addEventListener('command',handle_switch,false);
385                                                 var username = document.createElement('textbox'); username.setAttribute('id',i+'_username'); 
386                                                 if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[i]) username.setAttribute('value',obj.creds.hosts[ obj.data.server_unadorned ].services[i].username);
387                                                 r.appendChild(username);
388                                                 if (typeof obj.services[i].auth != 'undefined') username.hidden = ! get_bool( obj.services[i].auth );
389                                                 var password = document.createElement('textbox'); password.setAttribute('id',i+'_password'); 
390                                                 if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[i]) password.setAttribute('value',obj.creds.hosts[ obj.data.server_unadorned ].services[i].password);
391                                                 password.setAttribute('type','password'); r.appendChild(password);
392                                                 if (typeof obj.services[i].auth != 'undefined') password.hidden = ! get_bool( obj.services[i].auth );
393                                             } catch(E) {
394                                                 alert(E);
395                                             }
396                                         }
397                                         //obj.services[ 'native-evergreen-catalog' ] = { 'attrs' : { 'author' : {}, 'title' : {} } };
398                                         setTimeout(
399                                             function() { 
400                                                 if (obj.creds.hosts[ obj.data.server_unadorned ]) {
401                                                     for (var i = 0; i < obj.creds.hosts[ obj.data.server_unadorned ].default_services.length; i++) {
402                                                         var x = document.getElementById(obj.creds.hosts[ obj.data.server_unadorned ].default_services[i]+'_service');
403                                                         if (x) x.checked = true;
404                                                     }
405                                                 } else if (obj.creds.default_service) {
406                                                     var x = document.getElementById(obj.creds.default_service+'_service');
407                                                     if (x) x.checked = true;
408                                                 }
409                                                 handle_switch();
410                                             },0
411                                         );
412                                     } catch(E) {
413                                         obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.obj_controller_init.z39_service_error'),E);
414                                     }
415                                 }
416                             }
417                         ],
418                     }
419                 }
420             );
421
422             obj.controller.render();
423
424             setTimeout( function() { obj.focus(); }, 0 );
425
426             setInterval( 
427                 function() {
428                     obj.data.init({'via':'stash'});
429                     if (obj.data.marked_record) {
430                         var sel = obj.list.retrieve_selection();
431                         if (sel.length > 0) { obj.controller.view.marc_import_overlay.disabled = false; }
432                         if ($("overlay_tcn_indicator")) {
433                             if (obj.data.marked_record_mvr) {
434                                 $("overlay_tcn_indicator").setAttribute('value',$("catStrings").getFormattedString('staff.cat.z3950.marked_record_for_overlay_indicator.tcn.label',[obj.data.marked_record_mvr.tcn()]));
435                             } else {
436                                 $("overlay_tcn_indicator").setAttribute('value',$("catStrings").getFormattedString('staff.cat.z3950.marked_record_for_overlay_indicator.record_id.label',[obj.data.marked_record]));
437                             }
438                         }
439                     } else {
440                         obj.controller.view.marc_import_overlay.disabled = true;
441                         if ($("overlay_tcn_indicator")) {
442                             $("overlay_tcn_indicator").setAttribute('value',$("catStrings").getString('staff.cat.z3950.marked_record_for_overlay_indicator.no_record.label'));
443                         }
444                     }
445                 }, 2000
446             );
447
448         } catch(E) {
449             this.error.sdump('D_ERROR','cat.z3950.init: ' + E + '\n');
450         }
451     },
452
453     'focus' : function() {
454         var obj = this;
455         var focus_me; var or_focus_me;
456         for (var i = 0; i < obj.active_services.length; i++) {
457             if (obj.creds.hosts[ obj.data.server_unadorned ] && obj.creds.hosts[ obj.data.server_unadorned ].services[ obj.active_services[i] ]) {
458                 var x = obj.creds.hosts[ obj.data.server_unadorned ].services[ obj.active_services[i] ].default_attr;
459                 if (x) { focus_me = x; break; }
460             }
461             if (obj.services[ obj.active_services[i] ]) for (var i in obj.services[ obj.active_services[i] ].attr) { or_focus_me = i; }
462         }
463         if (! focus_me) focus_me = or_focus_me;
464         var xx = document.getElementById(focus_me+'_input'); if (xx) xx.focus();
465     },
466
467     'clear' : function() {
468         var obj = this;
469         var nl = document.getElementsByAttribute('mytype','search_class');
470         for (var i = 0; i < nl.length; i++) { nl[i].value = ''; nl[i].setAttribute('value',''); }
471         obj.focus();
472     },
473
474     'search_params' : {},
475
476     'initial_search' : function() {
477         try {
478             var obj = this;
479             obj.result_set = []; obj.number_of_result_sets = 0;
480             JSAN.use('util.widgets');
481             util.widgets.remove_children( obj.controller.view.result_message );
482             var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
483             if (obj.active_services.length < 1) {
484                 x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.no_search_selection')));
485                 return;
486             }
487             x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.searching')));
488             obj.search_params = {}; obj.list.clear();
489             obj.controller.view.page_next.disabled = true;
490             obj.controller.view.cmd_z3950_csv_to_file.setAttribute('disabled','true');
491             obj.controller.view.cmd_z3950_csv_to_clipboard.setAttribute('disabled','true');
492             obj.controller.view.cmd_z3950_csv_to_printer.setAttribute('disabled','true');
493
494             obj.search_params.service_array = []; 
495             obj.search_params.username_array = [];
496             obj.search_params.password_array = [];
497             for (var i = 0; i < obj.active_services.length; i++) {
498                 obj.search_params.service_array.push( obj.active_services[i] );
499                 obj.search_params.username_array.push( document.getElementById( obj.active_services[i]+'_username' ).value );
500                 obj.search_params.password_array.push( document.getElementById( obj.active_services[i]+'_password' ).value );
501             }
502             obj.search_params.limit = Math.ceil( obj.limit / obj.active_services.length );
503             obj.search_params.offset = 0;
504
505             obj.search_params.search = {};
506             var nl = document.getElementsByAttribute('mytype','search_class');
507             var count = 0;
508             for (var i = 0; i < nl.length; i++) {
509                 if (nl[i].disabled) continue;
510                 if (nl[i].value == '') continue;
511                 count++;
512                 obj.search_params.search[ nl[i].getAttribute('search_class') ] = nl[i].value;
513             }
514             if (count>0) {
515                 obj.search();
516             } else {
517                 util.widgets.remove_children( obj.controller.view.result_message );
518             }
519         } catch(E) {
520             this.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.initial_search.failed_search'),E);
521         }
522     },
523
524     'initial_raw_search' : function(raw) {
525         try {
526             var obj = this;
527             obj.result_set = []; obj.number_of_result_sets = 0;
528             JSAN.use('util.widgets');
529             util.widgets.remove_children( obj.controller.view.result_message );
530             var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
531             if (obj.active_services.length < 1) {
532                 x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.no_search_selection')));
533                 return;
534             }
535             if (obj.active_services.length > 1) {
536                 x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.too_many_selections')));
537                 return;
538             }
539             if (obj.active_services[0] == 'native-evergreen-catalog') {
540                 x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.raw_search_unsupported_for_native_catalog')));
541                 return;
542             }
543             x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.initial_search.searching')));
544             obj.search_params = {}; obj.list.clear();
545             obj.controller.view.page_next.disabled = true;
546             obj.controller.view.cmd_z3950_csv_to_file.setAttribute('disabled','true');
547             obj.controller.view.cmd_z3950_csv_to_clipboard.setAttribute('disabled','true');
548             obj.controller.view.cmd_z3950_csv_to_printer.setAttribute('disabled','true');
549
550             obj.search_params.service_array = []; 
551             obj.search_params.username_array = [];
552             obj.search_params.password_array = [];
553             for (var i = 0; i < obj.active_services.length; i++) {
554                 obj.search_params.service_array.push( obj.active_services[i] );
555                 obj.search_params.username_array.push( document.getElementById( obj.active_services[i]+'_username' ).value );
556                 obj.search_params.password_array.push( document.getElementById( obj.active_services[i]+'_password' ).value );
557             }
558             obj.search_params.limit = Math.ceil( obj.limit / obj.active_services.length );
559             obj.search_params.offset = 0;
560
561             obj.search_params.query = raw;
562
563             obj.search();
564         } catch(E) {
565             this.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.initial_search.failed_search'),E);
566         }
567     },
568
569     'page_next' : function() {
570         try {
571             var obj = this;
572             JSAN.use('util.widgets');
573             util.widgets.remove_children( obj.controller.view.result_message );
574             var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
575             x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.page_next.more_results')));
576             obj.search_params.offset += obj.search_params.limit;
577             obj.search();
578         } catch(E) {
579             this.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.page_next.subsequent_search_error'),E);
580         }
581     },
582
583     'search' : function() {
584         try {
585             var obj = this;
586             var method;
587             if (typeof obj.search_params.query == 'undefined') {
588                 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_SEARCH';
589                 obj.search_params.service = obj.search_params.service_array;
590                 obj.search_params.username = obj.search_params.username_array;
591                 obj.search_params.password = obj.search_params.password_array;
592             } else {
593                 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_RAW_SEARCH';
594                 obj.search_params.service = obj.search_params.service_array[0];
595                 obj.search_params.username = obj.search_params.username_array[0];
596                 obj.search_params.password = obj.search_params.password_array[0];
597             }
598             obj.network.simple_request(
599                 method,
600                 [ ses(), obj.search_params ],
601                 function(req) {
602                     obj.handle_results(req.getResultObject())
603                 }
604             );
605             document.getElementById('deck').selectedIndex = 0;
606         } catch(E) {
607             this.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.search.search_error'),E);
608         }
609     },
610
611     'handle_results' : function(results) {
612         var obj = this;
613         try {
614             JSAN.use('util.widgets');
615             util.widgets.remove_children( obj.controller.view.result_message ); var x;
616             if (results == null) {
617                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
618                 x.appendChild( document.createTextNode($("catStrings").getString('staff.cat.z3950.handle_results.null_server_error')));
619                 return;
620             }
621             if (typeof results.ilsevent != 'undefined') {
622                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
623                 x.appendChild( document.createTextNode($("catStrings").getFormattedString('staff.cat.z3950.handle_results.server_error', [results.textcode, results.desc])));
624                 return;
625             }
626             obj.controller.view.cmd_z3950_csv_to_file.setAttribute('disabled','false');
627             obj.controller.view.cmd_z3950_csv_to_clipboard.setAttribute('disabled','false');
628             obj.controller.view.cmd_z3950_csv_to_printer.setAttribute('disabled','false');
629             if (typeof results.length == 'undefined') results = [ results ];
630
631             var total_showing = 0;
632             var total_count = 0;
633             var tooltip_msg = '';
634
635             for (var i = 0; i < results.length; i++) {
636                 if (results[i].query) {
637                     tooltip_msg += $("catStrings").getFormattedString('staff.cat.z3950.handle_results.raw_query', [results[i].query]) + '\n';
638                 }
639                 if (results[i].count) {
640                     if (results[i].records) {
641                         var showing = obj.search_params.offset + results[i].records.length; 
642                         total_showing += obj.search_params.offset + results[i].records.length; 
643                         total_count += results[i].count;
644                         tooltip_msg += $("catStrings").getFormattedString('staff.cat.z3950.handle_results.showing_results', [(showing > results[i].count ? results[i].count : showing), results[i].count, results[i].service]) + '\n';
645                     }
646                     if (obj.search_params.offset + obj.search_params.limit <= results[i].count) {
647                         obj.controller.view.page_next.disabled = false;
648                     }
649                 } else {
650                     tooltip_msg += $("catStrings").getFormattedString('staff.cat.z3950.handle_results.num_of_results', [(results[i].count ? results[i].count : 0)]) + '\n';
651                 }
652                 if (results[i].records) {
653                     obj.result_set[ ++obj.number_of_result_sets ] = results[i];
654                     obj.controller.view.marc_import.disabled = true;
655                     obj.controller.view.marc_import_overlay.disabled = true;
656                     var x = obj.controller.view.marc_view_btn;
657                     if (x.getAttribute('toggle') == '0') x.disabled = true;
658                     for (var j = 0; j < obj.result_set[ obj.number_of_result_sets ].records.length; j++) {
659                         var f;
660                         var n = obj.list.append(
661                             {
662                                 'retrieve_id' : String( obj.number_of_result_sets ) + '-' + String( j ),
663                                 'row' : {
664                                     'my' : {
665                                         'mvr' : function(a){return a;}(obj.result_set[ obj.number_of_result_sets ].records[j].mvr),
666                                         'service' : results[i].service
667                                     }
668                                 }
669                             }
670                         );
671                         n.my_node.setAttribute('isbn', function(a){return a;}(obj.result_set[ obj.number_of_result_sets ].records[j].mvr).isbn());
672                         if (!f) { n.my_node.parentNode.focus(); f = n; } 
673                     }
674                 } else {
675                     x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
676                     x.appendChild(
677                         document.createTextNode($("catStrings").getString('staff.cat.z3950.handle_results.result_error'))
678                     );
679                 }
680             }
681             if (total_showing) {
682                 x = document.createElement('description'); 
683                 x.setAttribute('crop','end');
684                 x.setAttribute('tooltiptext',tooltip_msg);
685                 obj.controller.view.result_message.appendChild(x);
686                 x.appendChild(
687                     document.createTextNode($("catStrings").getFormattedString('staff.cat.z3950.handle_results.showing_total_results',
688                         [(total_showing > total_count ? total_count : total_showing), total_count]))
689                 );
690             } else {
691                 x = document.createElement('description'); 
692                 x.setAttribute('crop','end');
693                 x.setAttribute('tooltiptext',tooltip_msg);
694                 obj.controller.view.result_message.appendChild(x);
695                 x.appendChild(
696                     document.createTextNode($("catStrings").getFormattedString('staff.cat.z3950.handle_results.num_of_results', [(total_count ? total_count : 0)]))
697                 );
698             }            
699
700         } catch(E) {
701             this.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.handle_results.search_result_error'),E);
702         }
703     },
704
705     'replace_tab_with_opac' : function(doc_id) {
706         var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
707         var content_params = { 
708             'session' : ses(),
709             'authtime' : ses('authtime'),
710             'opac_url' : opac_url,
711         };
712         xulG.set_tab(
713             xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
714             {'tab_name': $("catStrings").getString('staff.cat.z3950.replace_tab_with_opac.tab_name')}, 
715             content_params
716         );
717     },
718
719     'spawn_marc_editor' : function(my_marcxml,biblio_source) {
720         var obj = this;
721
722         function save_marc (new_marcxml) {
723             try {
724                 var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml, biblio_source ]);
725                 if (typeof r.ilsevent != 'undefined') {
726                     switch(Number(r.ilsevent)) {
727                         case 1704 /* TCN_EXISTS */ :
728                             var msg = $("catStrings").getFormattedString('staff.cat.z3950.spawn_marc_editor.same_tcn', [r.payload.tcn]);
729                             var title = $("catStrings").getString('staff.cat.z3950.spawn_marc_editor.title');
730                             var btn1 = $("catStrings").getString('staff.cat.z3950.spawn_marc_editor.btn1_overlay');
731                             var btn2 = typeof r.payload.new_tcn == 'undefined' ? null : $("catStrings").getFormattedString('staff.cat.z3950.spawn_marc_editor.btn2_import', [r.payload.new_tcn]);
732                             if (btn2) {
733                                 obj.data.init({'via':'stash'});
734                                 var robj = obj.network.simple_request(
735                                     'PERM_CHECK',[
736                                         ses(),
737                                         obj.data.list.au[0].id(),
738                                         obj.data.list.au[0].ws_ou(),
739                                         [ 'ALLOW_ALT_TCN' ]
740                                     ]
741                                 );
742                                 if (typeof robj.ilsevent != 'undefined') {
743                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.permission_error'),E);
744                                 }
745                                 if (robj.length != 0) btn2 = null;
746                             }
747                             var btn3 = $("catStrings").getString('staff.cat.z3950.spawn_marc_editor.btn3_cancel_import');
748                             var p = obj.error.yns_alert(msg,title,btn1,btn2,btn3,$("catStrings").getString('staff.cat.z3950.spawn_marc_editor.confirm_action'));
749                             obj.error.sdump('D_ERROR','option ' + p + 'chosen');
750                             switch(p) {
751                                 case 0:
752                                     var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml, biblio_source ]);
753                                     if (typeof r3.ilsevent != 'undefined') {
754                                         throw(r3);
755                                     } else {
756                                         alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.successful_overlay'));
757                                         return {
758                                             'id' : r3.id(),
759                                             'on_complete' : function() {
760                                                 try {
761                                                     obj.replace_tab_with_opac(r3.id());
762                                                 } catch(E) {
763                                                     alert(E);
764                                                 }
765                                             }
766                                         };
767                                     }
768                                 break;
769                                 case 1:
770                                     var r2 = obj.network.request(
771                                         api.MARC_XML_RECORD_IMPORT.app,
772                                         api.MARC_XML_RECORD_IMPORT.method + '.override',
773                                         [ ses(), new_marcxml, biblio_source ]
774                                     );
775                                     if (typeof r2.ilsevent != 'undefined') {
776                                         throw(r2);
777                                     } else {
778                                         alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.successful_import_with_new_tcn'));
779                                         return {
780                                             'id' : r2.id(),
781                                             'on_complete' : function() {
782                                                 try {
783                                                     obj.replace_tab_with_opac(r2.id());
784                                                 } catch(E) {
785                                                     alert(E);
786                                                 }
787                                             }
788                                         };
789                                     }
790                                 break;
791                                 case 2:
792                                 default:
793                                     alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.import_cancelled'));
794                                 break;
795                             }
796                         break;
797                         default:
798                             throw(r);
799                         break;
800                     }
801                 } else {
802                     alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.successful_import'));
803                     return {
804                         'id' : r.id(),
805                         'on_complete' : function() {
806                             try {
807                                 obj.replace_tab_with_opac(r.id());
808                             } catch(E) {
809                                 alert(E);
810                             }
811                         }
812                     };
813                 }
814             } catch(E) {
815                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor.import_error'),E);
816             }
817         };
818
819         if ( $('marc_editor').checked ) {
820             xulG.new_tab(
821                 xulG.url_prefix(urls.XUL_MARC_EDIT), 
822                 { 'tab_name' : 'MARC Editor' }, 
823                 { 
824                     'record' : { 'marc' : my_marcxml, "rtype": "bre" },
825                     'fast_add_item' : function(doc_id,cn_label,cp_barcode) {
826                         try {
827                             JSAN.use('cat.util'); return cat.util.fast_item_add(doc_id,cn_label,cp_barcode);
828                         } catch(E) {
829                             alert(E);
830                         }
831                     },
832                     'save' : {
833                         'label' : $("catStrings").getString('staff.cat.z3950.spawn_marc_editor.save_button_label'),
834                         'func' : save_marc
835                     }
836                 } 
837             );
838         } else {
839             save_marc(my_marcxml);
840         }
841     },
842
843     'confirm_overlay' : function(record_ids) {
844         var obj = this; // JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
845         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
846         var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
847         top_xml += '<description>'+$("catStrings").getString('staff.cat.z3950.confirm_overlay.description')+'</description>';
848         top_xml += '<hbox><button id="lead" disabled="false" label="'+$("catStrings").getString('staff.cat.z3950.confirm_overlay.lead.label')+'" name="fancy_submit"';
849         top_xml += ' accesskey="'+$("catStrings").getString('staff.cat.z3950.confirm_overlay.lead.accesskey')+'"/>';
850         top_xml += ' <button label="'+$("catStrings").getString('staff.cat.z3950.confirm_overlay.cancel.label')+'" accesskey="'+
851                         $("catStrings").getString('staff.cat.z3950.confirm_overlay.cancel.accesskey')+'" name="fancy_cancel"/></hbox></vbox>';
852
853         var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
854         xml += '<table width="100%"><tr valign="top">';
855         for (var i = 0; i < record_ids.length; i++) {
856             xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
857             xml += '?docid=' + record_ids[i] + '"/></td>';
858         }
859         xml += '</tr><tr valign="top">';
860         for (var i = 0; i < record_ids.length; i++) {
861             xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="' + urls.XUL_MARC_VIEW + '?docid=' + record_ids[i] + ' "/></td>';
862         }
863         xml += '</tr></table></form>';
864         // data.temp_merge_top = top_xml; data.stash('temp_merge_top');
865         // data.temp_merge_mid = xml; data.stash('temp_merge_mid');
866         JSAN.use('util.window'); var win = new util.window();
867         var fancy_prompt_data = win.open(
868             urls.XUL_FANCY_PROMPT,
869             // + '?xml_in_stash=temp_merge_mid'
870             // + '&top_xml_in_stash=temp_merge_top'
871             // + '&title=' + window.escape('Record Overlay'),
872             'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
873             { 'top_xml' : top_xml, 'xml' : xml, 'title' : $("catStrings").getString('staff.cat.z3950.confirm_overlay.title') }
874         );
875         //data.stash_retrieve();
876         if (fancy_prompt_data.fancy_status == 'incomplete') { alert($("catStrings").getString('staff.cat.z3950.confirm_overlay.aborted')); return false; }
877         return true;
878     },
879
880     'spawn_marc_editor_for_overlay' : function(my_marcxml,biblio_source) {
881         var obj = this;
882         obj.data.init({'via':'stash'});
883         if (!obj.data.marked_record) {
884             alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.try_again'));
885             return;
886         }
887
888         function overlay_marc (new_marcxml) {
889             try {
890                 if (! obj.confirm_overlay( [ obj.data.marked_record ] ) ) { return; }
891                 var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]);
892                 if (typeof r.ilsevent != 'undefined') {
893                     switch(Number(r.ilsevent)) {
894                         case 1704 /* TCN_EXISTS */ :
895                             var msg = $("catStrings").getFormattedString('staff.cat.z3950.spawn_marc_editor_for_overlay.same_tcn', [r.payload.tcn]);
896                             var title = $("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.import_collision');
897                             var btn1 = typeof r.payload.new_tcn == 'undefined' ? null : $("catStrings").getFormattedString('staff.cat.z3950.spawn_marc_editor_for_overlay.btn1_overlay', [r.payload.new_tcn]);
898                             if (btn1) {
899                                 var robj = obj.network.simple_request(
900                                     'PERM_CHECK',[
901                                         ses(),
902                                         obj.data.list.au[0].id(),
903                                         obj.data.list.au[0].ws_ou(),
904                                         [ 'ALLOW_ALT_TCN' ]
905                                     ]
906                                 );
907                                 if (typeof robj.ilsevent != 'undefined') {
908                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.permission_error'),E);
909                                 }
910                                 if (robj.length != 0) btn1 = null;
911                             }
912                             var btn2 = $("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.btn2_cancel');
913                             var p = obj.error.yns_alert(msg,title,btn1,btn2,null, $("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.confirm_action'));
914                             obj.error.sdump('D_ERROR','option ' + p + 'chosen');
915                             switch(p) {
916                                 case 0:
917                                     var r2 = obj.network.request(
918                                         api.MARC_XML_RECORD_REPLACE.app,
919                                         api.MARC_XML_RECORD_REPLACE.method + '.override',
920                                         [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]
921                                     );
922                                     if (typeof r2.ilsevent != 'undefined') {
923                                         throw(r2);
924                                     } else {
925                                         alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.successful_overlay_with_new_TCN'));
926                                         return {
927                                             'id' : r2.id(),
928                                             'on_complete' : function() {
929                                                 try {
930                                                     obj.replace_tab_with_opac(r2.id());
931                                                 } catch(E) {
932                                                     alert(E);
933                                                 }
934                                             }
935                                         };
936                                     }
937                                 break;
938                                 case 1:
939                                 default:
940                                     alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.cancelled_overlay'));
941                                 break;
942                             }
943                         break;
944                         default:
945                             throw(r);
946                         break;
947                     }
948                 } else {
949                     alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.success_overlay'));
950                     return {
951                         'id' : r.id(),
952                         'on_complete' : function() {
953                             try {
954                                 obj.replace_tab_with_opac(r.id());
955                             } catch(E) {
956                                 alert(E);
957                             }
958                         }
959                     };
960                 }
961             } catch(E) {
962                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.overlay_error'),E);
963             }
964         }
965
966         if ( $('marc_editor').checked ) {
967             xulG.new_tab(
968                 xulG.url_prefix(urls.XUL_MARC_EDIT), 
969                 { 'tab_name' : $("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.tab_name') },
970                 { 
971                     'record' : { 'marc' : my_marcxml },
972                     'fast_add_item' : function(doc_id,cn_label,cp_barcode) {
973                         try {
974                             JSAN.use('cat.util'); cat.util.fast_item_add(doc_id,cn_label,cp_barcode);
975                         } catch(E) {
976                             alert(E);
977                         }
978                     },
979                     'save' : {
980                         'label' : $("catStrings").getString('staff.cat.z3950.spawn_marc_editor_for_overlay.overlay_record_label'),
981                         'func' : overlay_marc
982                     }
983                 } 
984             );
985         } else {
986             overlay_marc(my_marcxml);
987         }
988     },
989
990
991     'load_creds' : function() {
992         var obj = this;
993         try {
994             obj.creds = { 'version' : g.save_version, 'services' : {}, 'hosts' : {} };
995             /*
996                 {
997                     'version' : xx,
998                     'default_service' : xx,
999                     'services' : {
1000
1001                         'xx' : {
1002                             'username' : xx,
1003                             'password' : xx,
1004                             'default_attr' : xx,
1005                         },
1006
1007                         'xx' : {
1008                             'username' : xx,
1009                             'password' : xx,
1010                             'default_attr' : xx,
1011                         },
1012                     },
1013                     // new in version 2
1014                     'hosts' : {
1015                         'xxxx' : {
1016                             'default_services' : [ xx, ... ],
1017                             'services' : {
1018
1019                                 'xx' : {
1020                                     'username' : xx,
1021                                     'password' : xx,
1022                                     'default_attr' : xx,
1023                                 },
1024
1025                                 'xx' : {
1026                                     'username' : xx,
1027                                     'password' : xx,
1028                                     'default_attr' : xx,
1029                                 },
1030                             },
1031                         }
1032                     }
1033                 }
1034             */
1035             netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
1036             JSAN.use('util.file'); var file = new util.file('z3950_store');
1037             if (file._file.exists()) {
1038                 var creds = file.get_object(); file.close();
1039                 if (typeof creds.version != 'undefined') {
1040                     if (creds.version >= obj.creds_version) {  /* so apparently, this guy is assuming that future versions will be backwards compatible */
1041                         if (typeof creds.hosts == 'undefined') creds.hosts = {};
1042                         obj.creds = creds;
1043                     }
1044                 }
1045             }
1046         } catch(E) {
1047             obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.load_creds.z3950_cred_error'),E);
1048         }
1049     },
1050
1051     'save_creds' : function () {
1052         try {
1053             var obj = this;
1054             if (typeof obj.creds.hosts == 'undefined') obj.creds.hosts = {};
1055             if (typeof obj.creds.hosts[ obj.data.server_unadorned ] == 'undefined') obj.creds.hosts[ obj.data.server_unadorned ] = { 'services' : {} };
1056             obj.creds.hosts[ obj.data.server_unadorned ].default_services = obj.active_services;
1057             for (var i = 0; i < obj.creds.hosts[ obj.data.server_unadorned ].default_services.length; i++) {
1058                 var service = obj.creds.hosts[ obj.data.server_unadorned ].default_services[i];
1059                 if (typeof obj.creds.hosts[ obj.data.server_unadorned ].services[ service ] == 'undefined') {
1060                     obj.creds.hosts[ obj.data.server_unadorned ].services[ service ] = {}
1061                 }
1062                 obj.creds.hosts[ obj.data.server_unadorned ].services[service].username = document.getElementById(service + '_username').value;
1063                 obj.creds.hosts[ obj.data.server_unadorned ].services[service].password = document.getElementById(service + '_password').value;
1064                 if (obj.default_attr) {
1065                     obj.creds.hosts[ obj.data.server_unadorned ].services[service].default_attr = obj.default_attr;
1066                 }
1067             }
1068             obj.creds.version = obj.creds_version;
1069             netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
1070             JSAN.use('util.file'); var file = new util.file('z3950_store');
1071             file.set_object(obj.creds);
1072             file.close();
1073         } catch(E) {
1074             obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.z3950.save_creds.z3950_cred_error'),E);
1075         }
1076     },
1077
1078     'handle_enter' : function(ev) {
1079         var obj = this;
1080         if (ev.target.tagName != 'textbox') return;
1081         if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.initial_search(); }, 0);
1082     },
1083 }
1084
1085 dump('exiting cat.z3950.js\n');