]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/z3950.js
export csv from list to clipboard
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / z3950.js
1 dump('entering cat.z3950.js\n');
2
3 if (typeof cat == 'undefined') cat = {};
4 cat.z3950 = function (params) {
5         try {
6                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
7                 JSAN.use('util.error'); this.error = new util.error();
8                 JSAN.use('util.network'); this.network = new util.network();
9         } catch(E) {
10                 dump('cat.z3950: ' + E + '\n');
11         }
12 }
13
14 cat.z3950.prototype = {
15
16         'creds_version' : 1,
17
18         'init' : function( params ) {
19
20                 try {
21                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
22                         JSAN.use('util.widgets');
23
24                         var obj = this;
25
26                         obj.load_creds();
27
28                         JSAN.use('circ.util');
29                         var columns = circ.util.columns(
30                                 {
31                                         'tcn' : { 'hidden' : false },
32                                         'isbn' : { 'hidden' : false },
33                                         'title' : { 'hidden' : false, 'flex' : '1' },
34                                         'author' : { 'hidden' : false },
35                                         'edition' : { 'hidden' : false },
36                                         'pubdate' : { 'hidden' : false },
37                                         'publisher' : { 'hidden' : false },
38                                 }
39                         );
40
41                         JSAN.use('util.list'); obj.list = new util.list('results');
42                         obj.list.init(
43                                 {
44                                         'columns' : columns,
45                                         'map_row_to_columns' : circ.util.std_map_row_to_columns(),
46                                         'on_select' : function(ev) {
47                                                 try {
48                                                         JSAN.use('util.functional');
49                                                         var sel = obj.list.retrieve_selection();
50                                                         document.getElementById('clip_button').disabled = sel.length < 1;
51                                                         var list = util.functional.map_list(
52                                                                 sel,
53                                                                 function(o) { return o.getAttribute('retrieve_id'); }
54                                                         );
55                                                         obj.error.sdump('D_TRACE','cat/z3950: selection list = ' + js2JSON(list) );
56                                                         obj.controller.view.marc_import.disabled = false;
57                                                         obj.controller.view.marc_import.setAttribute('retrieve_id',list[0]);
58                                                         obj.controller.view.marc_import_overlay.disabled = false;
59                                                         obj.controller.view.marc_import_overlay.setAttribute('retrieve_id',list[0]);
60                                                         obj.controller.view.marc_view.disabled = false;
61                                                         obj.controller.view.marc_view.setAttribute('retrieve_id',list[0]);
62                                                 } catch(E) {
63                                                         obj.error.standard_unexpected_error_alert('Failure during list construction.',E);
64                                                 }
65                                         },
66                                 }
67                         );
68
69                         JSAN.use('util.controller'); obj.controller = new util.controller();
70                         obj.controller.init(
71                                 {
72                                         control_map : {
73                                                 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
74                                                 'sel_clip' : [
75                                                         ['command'],
76                                                         function() { obj.list.clipboard(); }
77                                                 ],
78                                                 'cmd_export' : [
79                                                         ['command'],
80                                                         function() {
81                                                                 obj.list.on_all_fleshed = function() {
82                                                                         try {
83                                                                                 dump(obj.list.dump_csv() + '\n');
84                                                                                 copy_to_clipboard(obj.list.dump_csv());
85                                                                                 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
86                                                                         } catch(E) {
87                                                                                 alert(E); 
88                                                                         }
89                                                                 }
90                                                                 obj.list.full_retrieve();
91                                                         }
92                                                 ],
93                                                 'cmd_broken' : [
94                                                         ['command'],
95                                                         function() { alert('Not Yet Implemented'); }
96                                                 ],
97                                                 'result_message' : [['render'],function(e){return function(){};}],
98                                                 'clear' : [
99                                                         ['command'],
100                                                         function() {
101                                                                 obj.clear();
102                                                         }
103                                                 ],
104                                                 'save_creds' : [
105                                                         ['command'],
106                                                         function() {
107                                                                 obj.save_creds();
108                                                         }
109                                                 ],
110                                                 'marc_view' : [
111                                                         ['command'],
112                                                         function(ev) {
113                                                                 try {
114                                                                         var n = obj.controller.view.marc_view;
115                                                                         if (n.getAttribute('toggle') == '1') {
116                                                                                 document.getElementById('deck').selectedIndex = 0;
117                                                                                 n.setAttribute('toggle','0');
118                                                                                 n.setAttribute('label','MARC View');
119                                                                                 document.getElementById('results').focus();
120                                                                         } else {
121                                                                                 document.getElementById('deck').selectedIndex = 1;
122                                                                                 n.setAttribute('toggle','1');
123                                                                                 n.setAttribute('label','Results View');
124                                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
125                                                                                 var f = document.getElementById('marc_frame').contentWindow;
126                                                                                 f.xulG = { 'marcxml' : obj.results.records[ n.getAttribute('retrieve_id') ].marcxml };
127                                                                                 f.my_init();
128                                                                                 f.document.body.firstChild.focus();
129                                                                         }
130                                                                 } catch(E) {
131                                                                         alert(E);
132                                                                 }
133                                                         },
134                                                 ],
135                                                 'marc_import' : [
136                                                         ['command'],
137                                                         function() {
138                                                                 obj.spawn_marc_editor(
139                                                                         obj.results.records[
140                                                                                 obj.controller.view.marc_import.getAttribute('retrieve_id')
141                                                                         ].marcxml
142                                                                 );
143                                                         },
144                                                 ],
145                                                 'marc_import_overlay' : [ 
146                                                         ['command'],
147                                                         function() {
148                                                                 try {
149                                                                 obj.spawn_marc_editor_for_overlay(
150                                                                         obj.results.records[
151                                                                                 obj.controller.view.marc_import_overlay.getAttribute('retrieve_id')
152                                                                         ].marcxml
153                                                                 );
154                                                                 } catch(E) {
155                                                                         alert(E);
156                                                                 }
157                                                         },
158                                                 ],
159                                                 'search' : [
160                                                         ['command'],
161                                                         function() {
162                                                                 obj.initial_search();
163                                                         },
164                                                 ],
165                                                 'page_next' : [
166                                                         ['command'],
167                                                         function() {
168                                                                 obj.page_next();
169                                                         },
170                                                 ],
171                                                 'raw_search' : [
172                                                         ['command'],
173                                                         function() {
174                                                                 var raw = window.prompt('WARNING: This is not a simple keyword search.  Enter raw z39.50 PQN search string: ','','Raw Z39.50 PQN Search');
175                                                                 if (raw) obj.initial_raw_search(raw);
176                                                         },
177                                                 ],
178                                                 'menu_placeholder' : [
179                                                         ['render'],
180                                                         function(e) {
181                                                                 return function() {
182                                                                         try {
183
184                                                                                 function handle_switch(node) {
185                                                                                         var service = obj.controller.view.service_menu.value;
186                                                                                         obj.current_service = service;
187                                                                                         var nl = document.getElementsByAttribute('mytype','search_class');
188                                                                                         for (var i = 0; i < nl.length; i++) { nl[i].disabled = true; }
189                                                                                         for (var i in obj.services[service].attrs) {
190                                                                                                 var x = document.getElementById(i + '_input');
191                                                                                                 if (x) {
192                                                                                                         x.disabled = false;
193                                                                                                 } else {
194                                                                                                         var rows = document.getElementById('query_inputs');
195                                                                                                         var row = document.createElement('row'); rows.appendChild(row);
196                                                                                                         var label = document.createElement('label');
197                                                                                                         label.setAttribute('control',i+'_input');
198                                                                                                         label.setAttribute('search_class',i);
199                                                                                                         label.setAttribute('style','-moz-user-focus: ignore');
200                                                                                                         if (entities['staff.z39_50.search_class.'+i]) {
201                                                                                                                 label.setAttribute('value',entities['staff.z39_50.search_class.'+i]);
202                                                                                                         } else {
203                                                                                                                 label.setAttribute('value',i);
204                                                                                                         }
205                                                                                                         row.appendChild(label);
206                                                                                                         label.addEventListener('click',function(ev){
207                                                                                                                         var a = ev.target.getAttribute('search_class');
208                                                                                                                         if (a) obj.default_attr = a;
209                                                                                                                 },false
210                                                                                                         );
211                                                                                                         var tb = document.createElement('textbox');
212                                                                                                         tb.setAttribute('id',i+'_input');
213                                                                                                         tb.setAttribute('mytype','search_class');
214                                                                                                         tb.setAttribute('search_class',i);
215                                                                                                         row.appendChild(tb);
216                                                                                                         tb.addEventListener('keypress',obj.handle_enter,false);
217                                                                                                 }
218                                                                                         }
219                                                                                         if (obj.creds.services[ service ]) {
220                                                                                                 document.getElementById('username').setAttribute('value',
221                                                                                                         obj.creds.services[service].username
222                                                                                                 );
223                                                                                                 document.getElementById('password').setAttribute('value',
224                                                                                                         obj.creds.services[service].password
225                                                                                                 );
226                                                                                                 try { g.service = service; } catch(E) {}
227                                                                                                 obj.focus(service);
228                                                                                         } else {
229                                                                                                 document.getElementById('username').focus();
230                                                                                         }
231                                                                                 }
232
233                                                                                 var robj = obj.network.simple_request(
234                                                                                         'RETRIEVE_Z3950_SERVICES',
235                                                                                         [ ses() ]
236                                                                                 );
237                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
238                                                                                 obj.services = robj;
239                                                                                 var list = [];
240                                                                                 for (var i in robj) {
241                                                                                         list.push(
242                                                                                                 [
243                                                                                                         i + ' : ' + robj[i].db + '@' + robj[i].host + ':' + robj[i].port,
244                                                                                                         i
245                                                                                                 ]
246                                                                                         );
247                                                                                 }
248                                                                                 util.widgets.remove_children(e);
249                                                                                 var ml = util.widgets.make_menulist( list );
250                                                                                 ml.setAttribute('flex','1');
251                                                                                 e.appendChild(ml);
252                                                                                 ml.addEventListener(
253                                                                                         'command',
254                                                                                         function(ev) { handle_switch(ev.target); },
255                                                                                         false
256                                                                                 );
257                                                                                 obj.controller.view.service_menu = ml;
258                                                                                 setTimeout(
259                                                                                         function() { 
260                                                                                                 if (obj.creds.default_service) ml.value = obj.creds.default_service;
261                                                                                                 handle_switch(ml); 
262                                                                                         },0
263                                                                                 );
264                                                                         } catch(E) {
265                                                                                 alert(E);
266                                                                                 obj.error.standard_unexpected_error_alert('Z39.50 services not likely retrieved.',E);
267                                                                         }
268                                                                 }
269                                                         }
270                                                 ],
271                                         }
272                                 }
273                         );
274
275                         obj.controller.render();
276
277                         obj.controller.view.username = document.getElementById('username');
278                         obj.controller.view.password = document.getElementById('password');
279
280                 } catch(E) {
281                         this.error.sdump('D_ERROR','cat.z3950.init: ' + E + '\n');
282                 }
283         },
284
285         'focus' : function(service) {
286                 var obj = this;
287                 var x = obj.creds.services[service].default_attr;
288                 if (x) {
289                         document.getElementById(x+'_input').focus();
290                 } else {
291                         var y;
292                         for (var i in obj.services[service].attr) { y = i; }
293                         document.getElementById(y+'_input').focus();
294                 }
295         },
296
297         'clear' : function() {
298                 var obj = this;
299                 var nl = document.getElementsByAttribute('mytype','search_class');
300                 for (var i = 0; i < nl.length; i++) { nl[i].value = ''; nl[i].setAttribute('value',''); }
301                 obj.focus(obj.controller.view.service_menu.value);
302         },
303
304         'search_params' : {},
305
306         'initial_search' : function() {
307                 try {
308                         var obj = this;
309                         JSAN.use('util.widgets');
310                         util.widgets.remove_children( obj.controller.view.result_message );
311                         var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
312                         x.appendChild( document.createTextNode( 'Searching...' ));
313                         obj.search_params = {}; obj.list.clear();
314                         obj.controller.view.page_next.disabled = true;
315
316                         obj.search_params.service = obj.controller.view.service_menu.value;
317                         obj.search_params.username = obj.controller.view.username.value;
318                         obj.search_params.password = obj.controller.view.password.value;
319                         obj.search_params.limit = 10;
320                         obj.search_params.offset = 0;
321
322                         obj.search_params.search = {};
323                         var nl = document.getElementsByAttribute('mytype','search_class');
324                         var count = 0;
325                         for (var i = 0; i < nl.length; i++) {
326                                 if (nl[i].disabled) continue;
327                                 if (nl[i].value == '') continue;
328                                 count++;
329                                 obj.search_params.search[ nl[i].getAttribute('search_class') ] = nl[i].value;
330                         }
331                         if (count>0) {
332                                 obj.search();
333                         } else {
334                                 util.widgets.remove_children( obj.controller.view.result_message );
335                         }
336                 } catch(E) {
337                         this.error.standard_unexpected_error_alert('Failure during initial search.',E);
338                 }
339         },
340
341         'initial_raw_search' : function(raw) {
342                 try {
343                         var obj = this;
344                         JSAN.use('util.widgets');
345                         util.widgets.remove_children( obj.controller.view.result_message );
346                         var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
347                         x.appendChild( document.createTextNode( 'Searching...' ) );
348                         obj.search_params = {}; obj.result_count = 0; obj.list.clear();
349                         obj.controller.view.page_next.disabled = true;
350
351                         obj.search_params.service = obj.controller.view.service_menu.value;
352                         obj.search_params.username = obj.controller.view.username.value;
353                         obj.search_params.password = obj.controller.view.password.value;
354                         obj.search_params.limit = 10;
355                         obj.search_params.offset = 0;
356
357                         obj.search_params.query = raw;
358
359                         obj.search();
360                 } catch(E) {
361                         this.error.standard_unexpected_error_alert('Failure during initial raw search.',E);
362                 }
363         },
364
365         'page_next' : function() {
366                 try {
367                         var obj = this;
368                         JSAN.use('util.widgets');
369                         util.widgets.remove_children( obj.controller.view.result_message );
370                         var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
371                         x.appendChild( document.createTextNode( 'Retrieving more results...' ));
372                         obj.search_params.offset += obj.search_params.limit;
373                         obj.search();
374                 } catch(E) {
375                         this.error.standard_unexpected_error_alert('Failure during subsequent search.',E);
376                 }
377         },
378
379         'search' : function() {
380                 try {
381                         var obj = this;
382                         var method;
383                         if (typeof obj.search_params.query == 'undefined') {
384                                 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_SEARCH';
385                         } else {
386                                 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_RAW_SEARCH';
387                         }
388                         obj.network.simple_request(
389                                 method,
390                                 [ ses(), obj.search_params ],
391                                 function(req) {
392                                         obj.handle_results(req.getResultObject())
393                                 }
394                         );
395                         document.getElementById('deck').selectedIndex = 0;
396                 } catch(E) {
397                         this.error.standard_unexpected_error_alert('Failure during actual search.',E);
398                 }
399         },
400
401         'handle_results' : function(results) {
402                 var obj = this;
403                 try {
404                         JSAN.use('util.widgets');
405                         util.widgets.remove_children( obj.controller.view.result_message ); var x;
406                         if (results == null) {
407                                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
408                                 x.appendChild( document.createTextNode( 'Server Error: request returned null' ));
409                                 return;
410                         }
411                         if (typeof results.ilsevent != 'undefined') {
412                                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
413                                 x.appendChild( document.createTextNode( 'Server Error: ' + results.textcode + ' : ' + results.desc ));
414                                 return;
415                         }
416                         if (results.query) {
417                                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
418                                 x.appendChild( document.createTextNode( 'Raw query: ' + results.query ));
419                         }
420                         if (results.count) {
421                                 if (results.records) {
422                                         x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
423                                         x.appendChild(
424                                                 document.createTextNode( 'Showing ' + (obj.search_params.offset + results.records.length) + ' of ' + results.count)
425                                         );
426                                 }
427                                 if (obj.search_params.offset + obj.search_params.limit <= results.count) {
428                                         obj.controller.view.page_next.disabled = false;
429                                 }
430                         } else {
431                                         x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
432                                         x.appendChild(
433                                                 document.createTextNode( results.count + ' records found')
434                                         );
435                         }
436                         if (results.records) {
437                                 obj.results = results;
438                                 obj.controller.view.marc_import.disabled = true;
439                                 obj.controller.view.marc_import_overlay.disabled = true;
440                                 var x = obj.controller.view.marc_view;
441                                 if (x.getAttribute('toggle') == '0') x.disabled = true;
442                                 for (var i = 0; i < obj.results.records.length; i++) {
443                                         obj.list.append(
444                                                 {
445                                                         'retrieve_id' : i,
446                                                         'row' : {
447                                                                 'my' : {
448                                                                         'mvr' : function(a){return a;}(obj.results.records[i].mvr),
449                                                                 }
450                                                         }
451                                                 }
452                                         );
453                                 }
454                         } else {
455                                 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
456                                 x.appendChild(
457                                         document.createTextNode( 'Error retrieving results.')
458                                 );
459                         }
460                 } catch(E) {
461                         this.error.standard_unexpected_error_alert('Failure during search result handling.',E);
462                 }
463         },
464
465         'replace_tab_with_opac' : function(doc_id) {
466                 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
467                 var content_params = { 
468                         'session' : ses(),
469                         'authtime' : ses('authtime'),
470                         'opac_url' : opac_url,
471                 };
472                 xulG.set_tab(
473                         xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
474                         {'tab_name':'Retrieving title...'}, 
475                         content_params
476                 );
477         },
478
479         'spawn_marc_editor' : function(my_marcxml) {
480                 var obj = this;
481                 xulG.new_tab(
482                         xulG.url_prefix(urls.XUL_MARC_EDIT), 
483                         { 'tab_name' : 'MARC Editor' }, 
484                         { 
485                                 'record' : { 'marc' : my_marcxml },
486                                 'save' : {
487                                         'label' : 'Import Record',
488                                         'func' : function (new_marcxml) {
489                                                 try {
490                                                         var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml, obj.current_service ]);
491                                                         if (typeof r.ilsevent != 'undefined') {
492                                                                 switch(r.ilsevent) {
493                                                                         case 1704 /* TCN_EXISTS */ :
494                                                                                 var msg = 'A record with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
495                                                                                 var title = 'Import Collision';
496                                                                                 var btn1 = 'Overlay';
497                                                                                 var btn2 = typeof r.payload.new_tcn == 'undefined' ? null : 'Import with alternate TCN ' + r.payload.new_tcn;
498                                                                                 var btn3 = 'Cancel Import';
499                                                                                 var p = obj.error.yns_alert(msg,title,btn1,btn2,btn3,'Check here to confirm this action');
500                                                                                 obj.error.sdump('D_ERROR','option ' + p + 'chosen');
501                                                                                 switch(p) {
502                                                                                         case 0:
503                                                                                                 var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml, obj.current_service ]);
504                                                                                                 if (typeof r3.ilsevent != 'undefined') {
505                                                                                                         throw(r3);
506                                                                                                 } else {
507                                                                                                         alert('Record successfully overlayed.');
508                                                                                                         obj.replace_tab_with_opac(r3.id());
509                                                                                                 }
510                                                                                         break;
511                                                                                         case 1:
512                                                                                                 var r2 = obj.network.request(
513                                                                                                         api.MARC_XML_RECORD_IMPORT.app,
514                                                                                                         api.MARC_XML_RECORD_IMPORT.method + '.override',
515                                                                                                         [ ses(), new_marcxml, obj.current_service ]
516                                                                                                 );
517                                                                                                 if (typeof r2.ilsevent != 'undefined') {
518                                                                                                         throw(r2);
519                                                                                                 } else {
520                                                                                                         alert('Record successfully imported with alternate TCN.');
521                                                                                                         obj.replace_tab_with_opac(r2.id());
522                                                                                                 }
523                                                                                         break;
524                                                                                         case 2:
525                                                                                         default:
526                                                                                                 alert('Record import cancelled');
527                                                                                         break;
528                                                                                 }
529                                                                         break;
530                                                                         default:
531                                                                                 throw(r);
532                                                                         break;
533                                                                 }
534                                                         } else {
535                                                                 alert('Record successfully imported.');
536                                                                 obj.replace_tab_with_opac(r.id());
537                                                         }
538                                                 } catch(E) {
539                                                         obj.error.standard_unexpected_error_alert('Record not likely imported.',E);
540                                                 }
541                                         }
542                                 }
543                         } 
544                 );
545         },
546
547         'confirm_overlay' : function(record_ids) {
548                 var obj = this; JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
549                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
550                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
551                 top_xml += '<description>Overlay this record?</description>';
552                 top_xml += '<hbox><button id="lead" disabled="false" label="Overlay" name="fancy_submit" accesskey="O"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
553
554                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
555                 xml += '<table width="100%"><tr valign="top">';
556                 for (var i = 0; i < record_ids.length; i++) {
557                         xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
558                         xml += '?docid=' + record_ids[i] + '"/></td>';
559                 }
560                 xml += '</tr><tr valign="top">';
561                 for (var i = 0; i < record_ids.length; i++) {
562                         html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
563                         xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
564                 }
565                 xml += '</tr></table></form>';
566                 data.temp_merge_top = top_xml; data.stash('temp_merge_top');
567                 data.temp_merge_mid = xml; data.stash('temp_merge_mid');
568                 window.open(
569                         urls.XUL_FANCY_PROMPT
570                         + '?xml_in_stash=temp_merge_mid'
571                         + '&top_xml_in_stash=temp_merge_top'
572                         + '&title=' + window.escape('Record Overlay'),
573                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
574                 );
575                 data.stash_retrieve();
576                 if (data.fancy_prompt_data == '') { alert('Overlay Aborted'); return false; }
577                 return true;
578         },
579
580         'spawn_marc_editor_for_overlay' : function(my_marcxml) {
581                 var obj = this;
582                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
583                 if (!data.marked_record) {
584                         alert('Please mark a record for overlay from within the catalog and try this again.');
585                         return;
586                 }
587
588                 xulG.new_tab(
589                         xulG.url_prefix(urls.XUL_MARC_EDIT), 
590                         { 'tab_name' : 'MARC Editor' }, 
591                         { 
592                                 'record' : { 'marc' : my_marcxml },
593                                 'save' : {
594                                         'label' : 'Overlay Record',
595                                         'func' : function (new_marcxml) {
596                                                 try {
597                                                         if (! obj.confirm_overlay( [ data.marked_record ] ) ) { return; }
598                                                         var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', [ ses(), data.marked_record, new_marcxml, obj.current_service ]);
599                                                         if (typeof r.ilsevent != 'undefined') {
600                                                                 switch(r.ilsevent) {
601                                                                         case 1704 /* TCN_EXISTS */ :
602                                                                                 var msg = 'A record with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
603                                                                                 var title = 'Import Collision';
604                                                                                 var btn1 = typeof r.payload.new_tcn == 'undefined' ? null : 'Overlay with alternate TCN ' + r.payload.new_tcn;
605                                                                                 var btn2 = 'Cancel Import';
606                                                                                 var p = obj.error.yns_alert(msg,title,btn1,btn2,null,'Check here to confirm this action');
607                                                                                 obj.error.sdump('D_ERROR','option ' + p + 'chosen');
608                                                                                 switch(p) {
609                                                                                         case 0:
610                                                                                                 var r2 = obj.network.request(
611                                                                                                         api.MARC_XML_RECORD_REPLACE.app,
612                                                                                                         api.MARC_XML_RECORD_REPLACE.method + '.override',
613                                                                                                         [ ses(), data.marked_record, new_marcxml, obj.current_service ]
614                                                                                                 );
615                                                                                                 if (typeof r2.ilsevent != 'undefined') {
616                                                                                                         throw(r2);
617                                                                                                 } else {
618                                                                                                         alert('Record successfully overlayed with alternate TCN.');
619                                                                                                         obj.replace_tab_with_opac(r2.id());
620                                                                                                 }
621                                                                                         break;
622                                                                                         case 1:
623                                                                                         default:
624                                                                                                 alert('Record overlay cancelled');
625                                                                                         break;
626                                                                                 }
627                                                                         break;
628                                                                         default:
629                                                                                 throw(r);
630                                                                         break;
631                                                                 }
632                                                         } else {
633                                                                 alert('Record successfully overlayed.');
634                                                                 obj.replace_tab_with_opac(r.id());
635                                                         }
636                                                 } catch(E) {
637                                                         obj.error.standard_unexpected_error_alert('Record not likely overlayed.',E);
638                                                 }
639                                         }
640                                 }
641                         } 
642                 );
643         },
644
645
646         'load_creds' : function() {
647                 var obj = this;
648                 try {
649                         obj.creds = { 'version' : g.save_version, 'services' : {} };
650                         /*
651                                 {
652                                         'version' : xx,
653                                         'default_service' : xx,
654                                         'services' : {
655
656                                                 'xx' : {
657                                                         'username' : xx,
658                                                         'password' : xx,
659                                                         'default_attr' : xx,
660                                                 },
661
662                                                 'xx' : {
663                                                         'username' : xx,
664                                                         'password' : xx,
665                                                         'default_attr' : xx,
666                                                 },
667                                         },
668                                 }
669                         */
670                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
671                         JSAN.use('util.file'); var file = new util.file('z3950_store');
672                         if (file._file.exists()) {
673                                 var creds = file.get_object(); file.close();
674                                 if (typeof creds.version != 'undefined') {
675                                         if (creds.version >= obj.creds_version) {
676                                                 obj.creds = creds;
677                                         }
678                                 }
679                         }
680                 } catch(E) {
681                         obj.error.standard_unexpected_error_alert('Error retrieving stored z39.50 credentials',E);
682                 }
683         },
684
685         'save_creds' : function () {
686                 try {
687                         var obj = this;
688                         obj.creds.default_service = obj.controller.view.service_menu.value;
689                         if (typeof obj.creds.services[ obj.creds.default_service ] == 'undefined') {
690                                 obj.creds.services[ obj.creds.default_service ] = {}
691                         }
692                         obj.creds.services[obj.creds.default_service].username = document.getElementById('username').value;
693                         obj.creds.services[obj.creds.default_service].password = document.getElementById('password').value;
694                         if (obj.default_attr) {
695                                 obj.creds.services[obj.creds.default_service].default_attr = obj.default_attr;
696                         }
697                         obj.creds.version = obj.creds_version;
698                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
699                         JSAN.use('util.file'); var file = new util.file('z3950_store');
700                         file.set_object(obj.creds);
701                         file.close();
702                 } catch(E) {
703                         obj.error.standard_unexpected_error_alert('Problem storing z39.50 credentials.',E);
704                 }
705         },
706
707         'handle_enter' : function(ev) {
708                 var obj = this;
709                 if (ev.target.tagName != 'textbox') return;
710                 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.initial_search(); }, 0);
711         },
712 }
713
714 dump('exiting cat.z3950.js\n');