]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/z3950.js
handle ilsevents from z3950 search
[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         'init' : function( params ) {
17
18                 try {
19                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
20                         JSAN.use('util.widgets');
21
22                         var obj = this;
23
24                         JSAN.use('circ.util');
25                         var columns = circ.util.columns(
26                                 {
27                                         'tcn' : { 'hidden' : false },
28                                         'isbn' : { 'hidden' : false },
29                                         'title' : { 'hidden' : false, 'flex' : '1' },
30                                         'author' : { 'hidden' : false },
31                                         'edition' : { 'hidden' : false },
32                                         'pubdate' : { 'hidden' : false },
33                                         'publisher' : { 'hidden' : false },
34                                 }
35                         );
36
37                         JSAN.use('util.list'); obj.list = new util.list('results');
38                         obj.list.init(
39                                 {
40                                         'columns' : columns,
41                                         'map_row_to_column' : circ.util.std_map_row_to_column(),
42                                         'on_select' : function(ev) {
43                                                 try {
44                                                         JSAN.use('util.functional');
45                                                         var sel = obj.list.retrieve_selection();
46                                                         var list = util.functional.map_list(
47                                                                 sel,
48                                                                 function(o) { return o.getAttribute('retrieve_id'); }
49                                                         );
50                                                         obj.error.sdump('D_TRACE','cat/z3950: selection list = ' + js2JSON(list) );
51                                                         obj.controller.view.marc_import.disabled = false;
52                                                         obj.controller.view.marc_import.setAttribute('retrieve_id',list[0]);
53                                                 } catch(E) {
54                                                         obj.error.standard_unexpected_error_alert('Failure during list construction.',E);
55                                                 }
56                                         },
57                                 }
58                         );
59
60 /*
61                         document.getAnonymousNodes(document.getElementById('c1'))[0].addEventListener(
62                                 'mouseup',
63                                 function() {
64                                         util.widgets.click(
65                                                 document.getAnonymousNodes(document.getElementById('c2'))[0]
66                                         );
67                                 }, false
68                         );
69                         document.getAnonymousNodes(document.getElementById('c2'))[0].addEventListener(
70                                 'mouseup',
71                                 function() {
72                                         util.widgets.click(
73                                                 document.getAnonymousNodes(document.getElementById('c1'))[0]
74                                         );
75                                 }, false
76                         );
77 */
78                         JSAN.use('util.controller'); obj.controller = new util.controller();
79                         obj.controller.init(
80                                 {
81                                         control_map : {
82                                                 'cmd_broken' : [
83                                                         ['command'],
84                                                         function() { alert('Not Yet Implemented'); }
85                                                 ],
86                                                 'result_message' : [['render'],function(e){return function(){};}],
87                                                 'server' : [['render'],function(e){return function(){};}],
88                                                 'database' : [['render'],function(e){return function(){};}],
89                                                 'port' : [['render'],function(e){return function(){};}],
90                                                 'username' : [['render'],function(e){return function(){};}],
91                                                 'password' : [['render'],function(e){return function(){};}],
92                                                 'asc_id' : [
93                                                         ['render'],
94                                                         function(e){
95                                                                 return function(){
96                                                                         e.addEventListener(
97                                                                                 'keypress',
98                                                                                 function(ev) {
99                                                                                         if (ev.keyCode && ev.keyCode == 13) {
100                                                                                                 obj.asc_search_async();
101                                                                                         }
102                                                                                 },
103                                                                                 false
104                                                                         );
105                                                                 };
106                                                         }
107                                                 ],
108                                                 'marc_import' : [
109                                                         ['command'],
110                                                         function() {
111                                                                 obj.spawn_marc_editor(
112                                                                         obj.results.records[
113                                                                                 obj.controller.view.marc_import.getAttribute('retrieve_id')
114                                                                         ].marcxml
115                                                                 );
116                                                         },
117                                                 ],
118                                                 'asc_search' : [
119                                                         ['command'],
120                                                         function() {
121                                                                 obj.asc_search_async();
122                                                         },
123                                                 ],
124                                                 'raw_string' : [
125                                                         ['render'],
126                                                         function(e){
127                                                                 return function(){
128                                                                         e.addEventListener(
129                                                                                 'keypress',
130                                                                                 function(ev) {
131                                                                                         if (ev.keyCode && ev.keyCode == 13) {
132                                                                                                 obj.raw_search_async();
133                                                                                         }
134                                                                                 },
135                                                                                 false
136                                                                         );
137                                                                 };
138                                                         }
139                                                 ],
140                                                 'raw_search' : [
141                                                         ['command'],
142                                                         function() {
143                                                                 obj.raw_search_async();
144                                                         },
145                                                 ],
146 //                                              'menu_placeholder' : [
147 //                                                      ['render'],
148 //                                                      function(e) {
149 //                                                              return function() {
150 //                                                                      util.widgets.remove_children(e);
151 //                                                                      var ml = util.widgets.make_menulist( [
152 //                                                                              [ 'OCLC', 'oclc' ],
153 //                                                                              [ 'Custom', 1 ],
154 //                                                                      ] );
155 //                                                                      ml.setAttribute('flex','1');
156 //                                                                      e.appendChild(ml);
157 //                                                                      /* An experiment with virtual events.  I could just use a named function
158 //                                                                         instead of defining one inline, and then call that once to set things
159 //                                                                         up, and let the event handler call it the rest of the time. */
160 //                                                                      ml.addEventListener(
161 //                                                                              'set_server_details',
162 //                                                                              function(ev) { 
163 //                                                                                      /* FIXME - get these values from server */
164 //                                                                                      switch(ev.target.value) {
165 //                                                                                              case 'oclc':
166 //                                                                                                      obj.controller.view.server.value = 'zcat.oclc.org';
167 //                                                                                                      obj.controller.view.server.disabled = true;
168 //                                                                                                      obj.controller.view.database.value = 'OLUCWorldCat';
169 //                                                                                                      obj.controller.view.database.disabled = true;
170 //                                                                                                      obj.controller.view.port.value = '210';
171 //                                                                                                      obj.controller.view.port.disabled = true;
172 //                                                                                                      obj.controller.view.username.value = '****';
173 //                                                                                                      obj.controller.view.username.disabled = true;
174 //                                                                                                      obj.controller.view.password.value = '****';
175 //                                                                                                      obj.controller.view.password.disabled = true;
176 //                                                                                                      //obj.controller.view.raw_string.value = 'DISABLED';
177 //                                                                                                      //obj.controller.view.raw_string.disabled = true;
178 //                                                                                                      //obj.controller.view.raw_search.disabled = true;
179 //                                                                                                      //obj.controller.view.asc_id.value = '';
180 //                                                                                                      //obj.controller.view.asc_id.disabled = false;
181 //                                                                                                      //obj.controller.view.asc_search.disabled = false;
182 //                                                                                              break;
183 //                                                                                              default:
184 //                                                                                                      obj.controller.view.server.disabled = false;
185 //                                                                                                      obj.controller.view.database.disabled = false;
186 //                                                                                                      obj.controller.view.server.disabled = false;
187 //                                                                                                      obj.controller.view.port.disabled = false;
188 //                                                                                                      obj.controller.view.username.value = '';
189 //                                                                                                      obj.controller.view.username.disabled = false;
190 //                                                                                                      obj.controller.view.password.value = '';
191 //                                                                                                      obj.controller.view.password.disabled = false;
192 //                                                                                                      //obj.controller.view.raw_string.value = '';
193 //                                                                                                      //obj.controller.view.raw_string.disabled = false;
194 //                                                                                                      //obj.controller.view.raw_search.disabled = false;
195 //                                                                                                      //obj.controller.view.asc_id.value = 'DISABLED';
196 //                                                                                                      //obj.controller.view.asc_id.disabled = true;
197 //                                                                                                      //obj.controller.view.asc_search.disabled = true;
198 //                                                                                              break;
199 //                                                                                      }
200 //                                                                              },
201 //                                                                              false
202 //                                                                      );
203 //                                                                      ml.addEventListener(
204 //                                                                              'command',
205 //                                                                              function(ev) { util.widgets.dispatch('set_server_details', ev.target); },
206 //                                                                              false
207 //                                                                      );
208 //                                                                      setTimeout( function() { util.widgets.dispatch('set_server_details',ml); }, 0 );
209 //                                                                      obj.controller.view.server_menu = ml;
210 //                                                              }
211 //                                                      }
212 //                                              ],
213                                         }
214                                 }
215                         );
216
217                         obj.controller.render();
218                         obj.controller.view.server.value = 'zcat.oclc.org';
219                         obj.controller.view.server.disabled = true;
220                         obj.controller.view.database.value = 'OLUCWorldCat';
221                         obj.controller.view.database.disabled = true;
222                         obj.controller.view.port.value = '210';
223                         obj.controller.view.port.disabled = true;
224                         obj.controller.view.username.value = '';
225                         obj.controller.view.username.disabled = false;
226                         obj.controller.view.password.value = '';
227                         obj.controller.view.password.disabled = false;
228
229                 } catch(E) {
230                         this.error.sdump('D_ERROR','cat.z3950.init: ' + E + '\n');
231                 }
232         },
233
234         'store_disable_search_buttons' : function() {
235                 var obj = this;
236                 JSAN.use('util.widgets');
237                 util.widgets.store_disable(
238                         obj.controller.view.asc_search,
239                         obj.controller.view.raw_search
240                 );
241                 util.widgets.disable(
242                         obj.controller.view.asc_search,
243                         obj.controller.view.raw_search
244                 );
245         },
246
247         'restore_enable_search_buttons' : function() {
248                 var obj = this;
249                 JSAN.use('util.widgets');
250                 util.widgets.restore_disable(
251                         obj.controller.view.asc_search,
252                         obj.controller.view.raw_search
253                 );
254         },
255
256         'asc_search_async' : function() {
257                 try {
258                         var obj = this;
259                         var search = obj.controller.view.asc_id.value;
260                         obj.error.sdump('D_TRACE','search string: ' + search);
261                         JSAN.use('util.widgets');
262                         util.widgets.remove_children( obj.controller.view.result_message );
263                         obj.controller.view.result_message.appendChild(
264                                 document.createTextNode( 'Searching...' )
265                         );
266                         obj.store_disable_search_buttons();
267                         var params;
268                         obj.network.simple_request(
269                                 'FM_BLOB_RETRIEVE_VIA_Z3950_TCN',
270                                 [ ses(), search, 'oclc', obj.controller.view.username.value, obj.controller.view.password.value ],
271                                 function(req) {
272                                         obj.handle_results(req.getResultObject())
273                                         obj.restore_enable_search_buttons();
274                                 }
275                         );
276                 } catch(E) {
277                         this.error.standard_unexpected_error_alert('Failure during search.',E);
278                 }
279
280         },
281
282         'raw_search_async' : function() {
283                 try {
284                         var obj = this;
285                         var search = obj.controller.view.raw_string.value;
286                         obj.error.sdump('D_TRACE','search string: ' + search);
287                         JSAN.use('util.widgets');
288                         util.widgets.remove_children( obj.controller.view.result_message );
289                         obj.controller.view.result_message.appendChild(
290                                 document.createTextNode( 'Searching...' )
291                         );
292                         obj.store_disable_search_buttons();
293                         if (!Number(obj.controller.view.server_menu.value)) {
294                                 params = [ 
295                                         ses(), 
296                                         {
297                                                 'search':search,
298                                                 'service':obj.controller.view.server_menu.value,
299                                         }
300                                 ];
301                         } else {
302                                 params = [ 
303                                         ses(), 
304                                         {
305                                                 'search':search,
306                                                 'server':obj.controller.view.server.value, 
307                                                 'prt':obj.controller.view.port.value, 
308                                                 'db':obj.controller.view.database.value, 
309                                                 'username':obj.controller.view.username.value, 
310                                                 'password':obj.controller.view.password.value 
311                                         }
312
313                                 ];
314                         }
315                         obj.network.simple_request(
316                                 'FM_BLOB_RETRIEVE_VIA_Z3950_RAW',
317                                 params,
318                                 function(req) {
319                                         obj.handle_results(req.getResultObject())
320                                         obj.restore_enable_search_buttons();
321                                 }
322                         );
323                 } catch(E) {
324                         this.error.standard_unexpected_error_alert('Failure during search.',E);
325                 }
326         },
327
328         'handle_results' : function(results) {
329                 var obj = this;
330                 JSAN.use('util.widgets');
331                 util.widgets.remove_children( obj.controller.view.result_message );
332                 if (results == null) {
333                         obj.controller.view.result_message.appendChild(
334                                 document.createTextNode( 'Server Error: ' + api.FM_BLOB_RETRIEVE_VIA_Z3950_TCN.method + ' returned null' )
335                         );
336                         return;
337                 }
338                 if (typeof results.ilsevent != 'undefined') {
339                         obj.controller.view.result_message.appendChild(
340                                 document.createTextNode( 'Server Error: ' + results.textcode + ' : ' + results.desc )
341                         );
342                         return;
343                 }
344                 if (results.count) {
345                         obj.controller.view.result_message.appendChild(
346                                 document.createTextNode( results.count + (results.count == 1 ? ' result ' : ' results ') + 'found. ' )
347                         );
348                 }
349                 if (results.records) {
350                         obj.controller.view.result_message.appendChild(
351                                 document.createTextNode( results.records.length + (results.records.length == 1 ? ' result' : ' results') + ' retrieved. ')
352                         );
353                         obj.results = results;
354                         obj.list.clear(); obj.controller.view.marc_import.disabled = true;
355                         for (var i = 0; i < obj.results.records.length; i++) {
356                                 obj.list.append(
357                                         {
358                                                 'retrieve_id' : i,
359                                                 'row' : {
360                                                         'my' : {
361                                                                 'mvr' : function(a){return a;}(obj.results.records[i].mvr),
362                                                         }
363                                                 }
364                                         }
365                                 );
366                         }
367                 } else {
368                         obj.controller.view.result_message.appendChild(
369                                 document.createTextNode( 'Too many results to retrieve. ')
370                         );
371                 }
372         },
373
374         'replace_tab_with_opac' : function(doc_id) {
375                 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
376                 var content_params = { 
377                         'session' : ses(),
378                         'authtime' : ses('authtime'),
379                         'opac_url' : opac_url,
380                 };
381                 xulG.set_tab(
382                         xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
383                         {'tab_name':'Retrieving title...'}, 
384                         content_params
385                 );
386         },
387
388         'spawn_marc_editor' : function(my_marcxml) {
389                 var obj = this;
390                 xulG.new_tab(
391                         xulG.url_prefix(urls.XUL_MARC_EDIT), 
392                         { 'tab_name' : 'MARC Editor' }, 
393                         { 
394                                 'record' : { 'marc' : my_marcxml },
395                                 'save' : {
396                                         'label' : 'Import Record',
397                                         'func' : function (new_marcxml) {
398                                                 try {
399                                                         var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml ]);
400                                                         if (typeof r.ilsevent != 'undefined') {
401                                                                 switch(r.ilsevent) {
402                                                                         case 1704 /* TCN_EXISTS */ :
403                                                                                 var msg = 'A record with with TCN ' + r.payload.tcn + ' already exists.\nFIXME: add record summary here';
404                                                                                 var title = 'Import Collision';
405                                                                                 var btn1 = 'Overlay';
406                                                                                 var btn2 = typeof r.payload.new_tcn == 'undefined' ? null : 'Import with alternate TCN ' + r.payload.new_tcn;
407                                                                                 var btn3 = 'Cancel Import';
408                                                                                 var p = obj.error.yns_alert(msg,title,btn1,btn2,btn3,'Check here to confirm this action');
409                                                                                 obj.error.sdump('D_ERROR','option ' + p + 'chosen');
410                                                                                 switch(p) {
411                                                                                         case 0:
412                                                                                                 var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml ]);
413                                                                                                 if (typeof r3.ilsevent != 'undefined') {
414                                                                                                         throw(r3);
415                                                                                                 } else {
416                                                                                                         alert('Record successfully overlayed.');
417                                                                                                         obj.replace_tab_with_opac(r3.id());
418                                                                                                 }
419                                                                                         break;
420                                                                                         case 1:
421                                                                                                 var r2 = obj.network.request(
422                                                                                                         api.MARC_XML_RECORD_IMPORT.app,
423                                                                                                         api.MARC_XML_RECORD_IMPORT.method + '.override',
424                                                                                                         [ ses(), new_marcxml ]
425                                                                                                 );
426                                                                                                 if (typeof r2.ilsevent != 'undefined') {
427                                                                                                         throw(r2);
428                                                                                                 } else {
429                                                                                                         alert('Record successfully imported with alternate TCN.');
430                                                                                                         obj.replace_tab_with_opac(r2.id());
431                                                                                                 }
432                                                                                         break;
433                                                                                         case 2:
434                                                                                         default:
435                                                                                                 alert('Record import cancelled');
436                                                                                         break;
437                                                                                 }
438                                                                         break;
439                                                                         default:
440                                                                                 throw(r);
441                                                                         break;
442                                                                 }
443                                                         } else {
444                                                                 alert('Record successfully imported.');
445                                                                 obj.replace_tab_with_opac(r.id());
446                                                         }
447                                                 } catch(E) {
448                                                         obj.error.standard_unexpected_error_alert('Record not likely imported.',E);
449                                                 }
450                                         }
451                                 }
452                         } 
453                 );
454         },
455
456 }
457
458 dump('exiting cat.z3950.js\n');