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