1 dump('entering cat.z3950.js\n');
3 if (typeof cat == 'undefined') cat = {};
4 cat.z3950 = function (params) {
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();
10 dump('cat.z3950: ' + E + '\n');
14 cat.z3950.prototype = {
18 'init' : function( params ) {
21 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
22 JSAN.use('util.widgets');
28 JSAN.use('circ.util');
29 var columns = circ.util.columns(
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 },
41 JSAN.use('util.list'); obj.list = new util.list('results');
45 'map_row_to_column' : circ.util.std_map_row_to_column(),
46 'on_select' : function(ev) {
48 JSAN.use('util.functional');
49 var sel = obj.list.retrieve_selection();
50 var list = util.functional.map_list(
52 function(o) { return o.getAttribute('retrieve_id'); }
54 obj.error.sdump('D_TRACE','cat/z3950: selection list = ' + js2JSON(list) );
55 obj.controller.view.marc_import.disabled = false;
56 obj.controller.view.marc_import.setAttribute('retrieve_id',list[0]);
57 obj.controller.view.marc_view.disabled = false;
58 obj.controller.view.marc_view.setAttribute('retrieve_id',list[0]);
60 obj.error.standard_unexpected_error_alert('Failure during list construction.',E);
66 JSAN.use('util.controller'); obj.controller = new util.controller();
72 function() { alert('Not Yet Implemented'); }
74 'result_message' : [['render'],function(e){return function(){};}],
91 var n = obj.controller.view.marc_view;
92 if (n.getAttribute('toggle') == '1') {
93 document.getElementById('deck').selectedIndex = 0;
94 n.setAttribute('toggle','0');
95 n.setAttribute('label','MARC View');
97 document.getElementById('deck').selectedIndex = 1;
98 n.setAttribute('toggle','1');
99 n.setAttribute('label','Results View');
100 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
101 var f = document.getElementById('marc_frame').contentWindow;
102 f.xulG = { 'marcxml' : obj.results.records[ n.getAttribute('retrieve_id') ].marcxml };
113 obj.spawn_marc_editor(
115 obj.controller.view.marc_import.getAttribute('retrieve_id')
123 obj.initial_search();
135 var raw = window.prompt('Enter raw z39.50 search string: ','','Raw Z39.50 Search');
136 if (raw) obj.initial_raw_search(raw);
139 'menu_placeholder' : [
145 function handle_switch(node) {
146 var service = obj.controller.view.service_menu.value;
147 var nl = document.getElementsByAttribute('mytype','search_class');
148 for (var i = 0; i < nl.length; i++) { nl[i].disabled = true; }
149 for (var i in obj.services[service].attrs) {
150 var x = document.getElementById(i + '_input');
154 var rows = document.getElementById('query_inputs');
155 var row = document.createElement('row'); rows.appendChild(row);
156 var label = document.createElement('label');
157 label.setAttribute('control',i+'_input');
158 label.setAttribute('search_class',i);
159 if (entities['staff.z39_50.search_class.'+i]) {
160 label.setAttribute('value',entities['staff.z39_50.search_class.'+i]);
162 label.setAttribute('value',i);
164 row.appendChild(label);
165 label.addEventListener('click',function(ev){
166 var a = ev.target.getAttribute('search_class');
167 if (a) obj.default_attr = a;
170 var tb = document.createElement('textbox');
171 tb.setAttribute('id',i+'_input');
172 tb.setAttribute('mytype','search_class');
173 tb.setAttribute('search_class',i);
175 tb.addEventListener('keypress',obj.handle_enter,false);
178 if (obj.creds.services[ service ]) {
179 document.getElementById('username').setAttribute('value',
180 obj.creds.services[service].username
182 document.getElementById('password').setAttribute('value',
183 obj.creds.services[service].password
187 document.getElementById('username').focus();
191 var robj = obj.network.simple_request(
192 'RETRIEVE_Z3950_SERVICES',
195 if (typeof robj.ilsevent != 'undefined') throw(robj);
198 for (var i in robj) {
201 i + ' : ' + robj[i].db + '@' + robj[i].host + ':' + robj[i].port,
206 util.widgets.remove_children(e);
207 var ml = util.widgets.make_menulist( list );
208 ml.setAttribute('flex','1');
212 function(ev) { handle_switch(ev.target); },
215 obj.controller.view.service_menu = ml;
218 if (obj.creds.default_service) ml.value = obj.creds.default_service;
224 obj.error.standard_unexpected_error_alert('Z39.50 services not likely retrieved.',E);
233 obj.controller.render();
235 obj.controller.view.username = document.getElementById('username');
236 obj.controller.view.password = document.getElementById('password');
239 this.error.sdump('D_ERROR','cat.z3950.init: ' + E + '\n');
243 'focus' : function(service) {
245 var x = obj.creds.services[service].default_attr;
247 document.getElementById(x+'_input').focus();
250 for (var i in obj.services[service].attr) { y = i; }
251 document.getElementById(y+'_input').focus();
255 'clear' : function() {
257 var nl = document.getElementsByAttribute('mytype','search_class');
258 for (var i = 0; i < nl.length; i++) { nl[i].value = ''; nl[i].setAttribute('value',''); }
259 obj.focus(obj.controller.view.service_menu.value);
262 'search_params' : {},
264 'initial_search' : function() {
267 JSAN.use('util.widgets');
268 util.widgets.remove_children( obj.controller.view.result_message );
269 var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
270 x.appendChild( document.createTextNode( 'Searching...' ));
271 obj.search_params = {}; obj.list.clear();
272 obj.controller.view.page_next.disabled = true;
274 obj.search_params.service = obj.controller.view.service_menu.value;
275 obj.search_params.username = obj.controller.view.username.value;
276 obj.search_params.password = obj.controller.view.password.value;
277 obj.search_params.limit = 10;
278 obj.search_params.offset = 0;
280 obj.search_params.search = {};
281 var nl = document.getElementsByAttribute('mytype','search_class');
283 for (var i = 0; i < nl.length; i++) {
284 if (nl[i].disabled) continue;
285 if (nl[i].value == '') continue;
287 obj.search_params.search[ nl[i].getAttribute('search_class') ] = nl[i].value;
292 util.widgets.remove_children( obj.controller.view.result_message );
295 this.error.standard_unexpected_error_alert('Failure during initial search.',E);
299 'initial_raw_search' : function(raw) {
302 JSAN.use('util.widgets');
303 util.widgets.remove_children( obj.controller.view.result_message );
304 var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
305 x.appendChild( document.createTextNode( 'Searching...' ) );
306 obj.search_params = {}; obj.result_count = 0; obj.list.clear();
307 obj.controller.view.page_next.disabled = true;
309 obj.search_params.service = obj.controller.view.service_menu.value;
310 obj.search_params.username = obj.controller.view.username.value;
311 obj.search_params.password = obj.controller.view.password.value;
312 obj.search_params.limit = 10;
313 obj.search_params.offset = 0;
315 obj.search_params.query = raw;
319 this.error.standard_unexpected_error_alert('Failure during initial raw search.',E);
323 'page_next' : function() {
326 JSAN.use('util.widgets');
327 util.widgets.remove_children( obj.controller.view.result_message );
328 var x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
329 x.appendChild( document.createTextNode( 'Retrieving more results...' ));
330 obj.search_params.offset += obj.search_params.limit;
333 this.error.standard_unexpected_error_alert('Failure during subsequent search.',E);
337 'search' : function() {
341 if (typeof obj.search_params.query == 'undefined') {
342 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_SEARCH';
344 method = 'FM_BLOB_RETRIEVE_VIA_Z3950_RAW_SEARCH';
346 obj.network.simple_request(
348 [ ses(), obj.search_params ],
350 obj.handle_results(req.getResultObject())
354 this.error.standard_unexpected_error_alert('Failure during actual search.',E);
358 'handle_results' : function(results) {
361 JSAN.use('util.widgets');
362 util.widgets.remove_children( obj.controller.view.result_message ); var x;
363 if (results == null) {
364 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
365 x.appendChild( document.createTextNode( 'Server Error: request returned null' ));
368 if (typeof results.ilsevent != 'undefined') {
369 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
370 x.appendChild( document.createTextNode( 'Server Error: ' + results.textcode + ' : ' + results.desc ));
374 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
375 x.appendChild( document.createTextNode( 'Raw query: ' + results.query ));
378 if (results.records) {
379 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
381 document.createTextNode( 'Showing ' + (obj.search_params.offset + results.records.length) + ' of ' + results.count)
384 if (obj.search_params.offset + obj.search_params.limit <= results.count) {
385 obj.controller.view.page_next.disabled = false;
388 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
390 document.createTextNode( results.count + ' records found')
393 if (results.records) {
394 obj.results = results;
395 obj.controller.view.marc_import.disabled = true;
396 var x = obj.controller.view.marc_view;
397 if (x.getAttribute('toggle') == '0') x.disabled = true;
398 for (var i = 0; i < obj.results.records.length; i++) {
404 'mvr' : function(a){return a;}(obj.results.records[i].mvr),
411 x = document.createElement('description'); obj.controller.view.result_message.appendChild(x);
413 document.createTextNode( 'Error retrieving results.')
417 this.error.standard_unexpected_error_alert('Failure during search result handling.',E);
421 'replace_tab_with_opac' : function(doc_id) {
422 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
423 var content_params = {
425 'authtime' : ses('authtime'),
426 'opac_url' : opac_url,
429 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
430 {'tab_name':'Retrieving title...'},
435 'spawn_marc_editor' : function(my_marcxml) {
438 xulG.url_prefix(urls.XUL_MARC_EDIT),
439 { 'tab_name' : 'MARC Editor' },
441 'record' : { 'marc' : my_marcxml },
443 'label' : 'Import Record',
444 'func' : function (new_marcxml) {
446 var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml ]);
447 if (typeof r.ilsevent != 'undefined') {
449 case 1704 /* TCN_EXISTS */ :
450 var msg = 'A record with with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
451 var title = 'Import Collision';
452 var btn1 = 'Overlay';
453 var btn2 = typeof r.payload.new_tcn == 'undefined' ? null : 'Import with alternate TCN ' + r.payload.new_tcn;
454 var btn3 = 'Cancel Import';
455 var p = obj.error.yns_alert(msg,title,btn1,btn2,btn3,'Check here to confirm this action');
456 obj.error.sdump('D_ERROR','option ' + p + 'chosen');
459 var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml ]);
460 if (typeof r3.ilsevent != 'undefined') {
463 alert('Record successfully overlayed.');
464 obj.replace_tab_with_opac(r3.id());
468 var r2 = obj.network.request(
469 api.MARC_XML_RECORD_IMPORT.app,
470 api.MARC_XML_RECORD_IMPORT.method + '.override',
471 [ ses(), new_marcxml ]
473 if (typeof r2.ilsevent != 'undefined') {
476 alert('Record successfully imported with alternate TCN.');
477 obj.replace_tab_with_opac(r2.id());
482 alert('Record import cancelled');
491 alert('Record successfully imported.');
492 obj.replace_tab_with_opac(r.id());
495 obj.error.standard_unexpected_error_alert('Record not likely imported.',E);
503 'load_creds' : function() {
506 obj.creds = { 'version' : g.save_version, 'services' : {} };
510 'default_service' : xx,
527 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
528 JSAN.use('util.file'); var file = new util.file('z3950_store');
529 if (file._file.exists()) {
530 var creds = file.get_object(); file.close();
531 if (typeof creds.version != 'undefined') {
532 if (creds.version >= obj.creds_version) {
538 obj.error.standard_unexpected_error_dialog('Error retrieving stored z39.50 credentials',E);
542 'save_creds' : function () {
545 obj.creds.default_service = obj.controller.view.service_menu.value;
546 if (typeof obj.creds.services[ obj.creds.default_service ] == 'undefined') {
547 obj.creds.services[ obj.creds.default_service ] = {}
549 obj.creds.services[obj.creds.default_service].username = document.getElementById('username').value;
550 obj.creds.services[obj.creds.default_service].password = document.getElementById('password').value;
551 if (obj.default_attr) {
552 obj.creds.services[obj.creds.default_service].default_attr = obj.default_attr;
554 obj.creds.version = obj.creds_version;
555 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
556 JSAN.use('util.file'); var file = new util.file('z3950_store');
557 file.set_object(obj.creds);
560 obj.error.standard_unexpected_error_alert('Problem storing z39.50 credentials.',E);
564 'handle_enter' : function(ev) {
566 if (ev.target.tagName != 'textbox') return;
567 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.initial_search(); }, 0);
571 dump('exiting cat.z3950.js\n');