]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/record_buckets.js
c187212708273d8559b69abb15dc2352d8f54413
[Evergreen.git] / Open-ILS / xul / staff_client / server / cat / record_buckets.js
1 dump('entering cat.record_buckets.js\n');
2
3 if (typeof cat == 'undefined') cat = {};
4 cat.record_buckets = function (params) {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.network'); this.network = new util.network();
8         JSAN.use('util.date');
9         JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
10         this.first_pause = true;
11     var x = document.getElementById("record_buckets_tabbox");
12     if (x) x.selectedIndex = 2;
13 };
14
15 cat.record_buckets.pick_file = function (defaultFileName) {
16         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
17
18         var nsIFilePicker = Components.interfaces.nsIFilePicker;
19         var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
20
21         fp.init( window, "Save File As", nsIFilePicker.modeSave );
22         if (defaultFileName)
23                 fp.defaultString = defaultFileName;
24
25         fp.appendFilters( nsIFilePicker.filterAll );
26
27         var result = fp.show(); 
28         if ( (result == nsIFilePicker.returnOK || result == nsIFilePicker.returnReplace) && fp.file ) {
29                 return fp.file;
30         } else {
31                 return null;
32         }
33 };
34
35 cat.record_buckets.export_records = function(obj, output_type) {
36         try {
37                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
38                 obj.list2.select_all();
39                 obj.data.stash_retrieve();
40                 JSAN.use('util.functional');
41
42                 var record_ids = util.functional.map_list(
43                         obj.list2.dump_retrieve_ids(),
44                         function (o) { return JSON2js(o).docid }
45                 );
46
47                 var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
48                         .createInstance(Components.interfaces.nsIWebBrowserPersist);
49
50                 var proto_uri = 'http://' + window.location.hostname + '/exporter?format=' + output_type;
51
52                 dump('Record Export URI is ' + proto_uri + '&id=' + record_ids.join('&id=') + '\n');
53
54                 var uri = Components.classes["@mozilla.org/network/io-service;1"]
55                         .getService(Components.interfaces.nsIIOService)
56                         .newURI( proto_uri + '&id=' + record_ids.join('&id='), null, null );
57
58                 var file = cat.record_buckets.pick_file('bucket.' + output_type);
59                                                                 
60                 if (file) {
61                         persist.saveURI(uri,null,null,null,null,file);
62                 } else {
63                         alert("File not downloaded.");
64                 }
65
66         } catch(E) {
67                 obj.error.standard_unexpected_error_alert('Records could not be exported.',E);
68         }
69 };
70
71
72 cat.record_buckets.prototype = {
73         'selection_list1' : [],
74         'selection_list2' : [],
75         'bucket_id_name_map' : {},
76
77         'render_pending_records' : function() {
78                 if (this.first_pause) {
79                         this.first_pause = false;
80                 } else {
81                         alert("Action completed.");
82                 }
83                 var obj = this;
84                 obj.list1.clear();
85                 for (var i = 0; i < obj.record_ids.length; i++) {
86                         var item = obj.prep_record_for_list( obj.record_ids[i] );
87                         if (item) obj.list1.append( item );
88                 }
89         },
90
91         'init' : function( params ) {
92
93                 var obj = this;
94
95                 obj.record_ids = params['record_ids'] || [];
96
97                 JSAN.use('circ.util');
98                 var columns = circ.util.columns( 
99                         { 
100                                 'title' : { 'hidden' : false },
101                                 'author' : { 'hidden' : false },
102                                 'edition' : { 'hidden' : false },
103                                 'publisher' : { 'hidden' : false },
104                                 'pubdate' : { 'hidden' : false },
105                                 'isbn' : { 'hidden' : false },
106                                 'tcn' : { 'hidden' : false },
107                         } 
108                 );
109
110                 JSAN.use('util.list'); 
111
112         function retrieve_row(params) {
113             var row = params.row;
114             try {
115                             obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE.authoritative', [ row.my.docid ],
116                     function(req) {
117                         try {
118                             var record = req.getResultObject();
119                             if (typeof req.ilsevent != 'undefined') throw(req);
120                             row.my.mvr = record;
121                             if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
122
123                         } catch(E) {
124                             obj.error.standard_unexpected_error_alert('Error retrieving mvr for record with id =' + row.my.docid, E);
125                         }
126                     }
127                 );
128             } catch(E) {
129                 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
130             }
131             return row;
132         }
133
134                 obj.list1 = new util.list('pending_records_list');
135                 obj.list1.init(
136                         {
137                                 'columns' : columns,
138                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
139                 'retrieve_row' : retrieve_row,
140                                 'on_select' : function(ev) {
141                                         try {
142                                                 JSAN.use('util.functional');
143                                                 var sel = obj.list1.retrieve_selection();
144                                                 obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
145                                                 obj.selection_list1 = util.functional.map_list(
146                                                         sel,
147                                                         function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
148                                                 );
149                                                 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
150                                                 if (obj.selection_list1.length == 0) {
151                                                         obj.controller.view.cmd_record_buckets_sel_add.setAttribute('disabled','true');
152                                                 } else {
153                                                         obj.controller.view.cmd_record_buckets_sel_add.setAttribute('disabled','false');
154                                                 }
155                                         } catch(E) {
156                                                 alert('FIXME: ' + E);
157                                         }
158                                 },
159
160                         }
161                 );
162
163                 obj.render_pending_records();
164         
165                 obj.list2 = new util.list('records_in_bucket_list');
166                 obj.list2.init(
167                         {
168                                 'columns' : columns,
169                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
170                 'retrieve_row' : retrieve_row,
171                                 'on_select' : function(ev) {
172                                         try {
173                                                 JSAN.use('util.functional');
174                                                 var sel = obj.list2.retrieve_selection();
175                                                 obj.controller.view.sel_clip2.setAttribute('disabled', sel.length < 1 ? "true" : "false");
176                                                 obj.selection_list2 = util.functional.map_list(
177                                                         sel,
178                                                         function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
179                                                 );
180                                                 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
181                                                 if (obj.selection_list2.length == 0) {
182                                                         obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','true');
183                                                         obj.controller.view.cmd_pending_buckets_to_record_buckets.setAttribute('disabled','true');
184                                                 } else {
185                                                         obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','false');
186                                                         obj.controller.view.cmd_pending_buckets_to_record_buckets.setAttribute('disabled','false');
187                                                 }
188                                         } catch(E) {
189                                                 alert('FIXME: ' + E);
190                                         }
191                                 },
192                         }
193                 );
194                 
195                 JSAN.use('util.controller'); obj.controller = new util.controller();
196                 obj.controller.init(
197                         {
198                                 'control_map' : {
199                                         'save_columns2' : [
200                                                 ['command'],
201                                                 function() { obj.list2.save_columns(); }
202                                         ],
203                                         'save_columns1' : [
204                                                 ['command'],
205                                                 function() { obj.list1.save_columns(); }
206                                         ],
207                                         'sel_clip2' : [
208                                                 ['command'],
209                                                 function() { obj.list2.clipboard(); }
210                                         ],
211                                         'sel_clip1' : [
212                                                 ['command'],
213                                                 function() { obj.list1.clipboard(); }
214                                         ],
215                                         'record_buckets_menulist_placeholder' : [
216                                                 ['render'],
217                                                 function(e) {
218                                                         return function() {
219                                                                 JSAN.use('util.widgets'); JSAN.use('util.functional');
220                                                                 var buckets = obj.network.simple_request(
221                                                                         'BUCKET_RETRIEVE_VIA_USER',
222                                                                         [ ses(), obj.data.list.au[0].id() ]
223                                                                 );
224                                                                 if (typeof buckets.ilsevent != 'undefined') {
225                                                                         obj.error.standard_unexpected_error_alert('Could not retrieve your buckets.',buckets);
226                                                                         return;
227                                                                 }
228                                                                 var items = [ ['Choose a bucket...',''], ['Retrieve shared bucket...',-1] ].concat(
229                                                                         util.functional.map_list(
230                                                                                 util.functional.filter_list(
231                                                                                         buckets.biblio,
232                                                                                         function(o) {
233                                                                                                 return o.btype() == 'staff_client';
234                                                                                         }
235                                                                                 ),
236                                                                                 function(o) {
237                                                                                         obj.bucket_id_name_map[ o.id() ] = o.name();
238                                                                                         return [ o.name(), o.id() ];
239                                                                                 }
240                                                                         ).sort( 
241                                                         function( a, b ) {
242                                                             if (a[0] < b[0]) return -1;
243                                                             if (a[0] > b[0]) return 1;
244                                                             return 0;
245                                                         }
246                                                                         )
247                                                                 );
248                                                                 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
249                                                                 util.widgets.remove_children( e );
250                                                                 var ml = util.widgets.make_menulist(
251                                                                         items
252                                                                 );
253                                                                 e.appendChild( ml );
254                                                                 ml.setAttribute('id','bucket_menulist');
255                                                                 ml.setAttribute('accesskey','');
256
257                                                                 function change_bucket(ev) {
258                                                                         var bucket_id = ev.target.value;
259                                                                         if (bucket_id < 0 ) {
260                                                                                 bucket_id = window.prompt('Enter bucket number:');
261                                                                                 ev.target.value = bucket_id;
262                                                                                 ev.target.setAttribute('value',bucket_id);
263                                                                         }
264                                                                         if (!bucket_id) return;
265                                                                         var x = document.getElementById('info_box');
266                                                                         x.setAttribute('hidden','true');
267                                     obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
268                                     obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
269                                     obj.controller.view.record_buckets_export_records.disabled = true;
270                                     obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
271                                     obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
272                                     obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
273                                     obj.controller.view.record_buckets_list_actions.disabled = true;
274                                                                         var bucket = obj.network.simple_request(
275                                                                                 'BUCKET_FLESH',
276                                                                                 [ ses(), 'biblio', bucket_id ]
277                                                                         );
278                                                                         if (typeof bucket.ilsevent != 'undefined') {
279                                                                                 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
280                                                                                         alert('Could not find a bucket with ID = ' + bucket_id);
281                                                                                 } else {
282                                                                                         obj.error.standard_unexpected_error_alert('Error retrieving bucket.  Did you use a valid bucket id?',bucket);
283                                                                                 }
284                                                                                 return;
285                                                                         }
286                                                                         try {
287                                         obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
288                                         obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
289                                         obj.controller.view.record_buckets_export_records.disabled = false;
290                                         obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
291                                         obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
292                                         obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
293                                         obj.controller.view.record_buckets_list_actions.disabled = false;
294
295                                                                                 var x = document.getElementById('info_box');
296                                                                                 x.setAttribute('hidden','false');
297                                                                                 x = document.getElementById('bucket_number');
298                                                                                 x.setAttribute('value',bucket.id());
299                                                                                 x = document.getElementById('bucket_name');
300                                                                                 x.setAttribute('value',bucket.name());
301                                                                                 x = document.getElementById('bucket_owner');
302                                                                                 var s = bucket.owner(); JSAN.use('patron.util');
303                                                                                 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); 
304                                                                                 x.setAttribute('value',s.family_name() + ' (' + s.card().barcode() + ") @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
305                                                                         } catch(E) {
306                                                                                 alert(E);
307                                                                         }
308                                                                         var items = bucket.items() || [];
309                                                                         obj.list2.clear();
310                                                                         for (var i = 0; i < items.length; i++) {
311                                                                                 var item = obj.prep_record_for_list( 
312                                                                                         items[i].target_biblio_record_entry(),
313                                                                                         items[i].id()
314                                                                                 );
315                                                                                 if (item) obj.list2.append( item );
316                                                                         }
317                                                                 }
318
319                                                                 ml.addEventListener( 'change_bucket', change_bucket , false);
320                                                                 ml.addEventListener( 'command', function() {
321                                                                         JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
322                                                                 }, false);
323                                                                 obj.controller.view.bucket_menulist = ml;
324                                                                 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
325                                                         };
326                                                 },
327                                         ],
328
329                     'cmd_record_buckets_refresh' : [
330                         ['command'],
331                         function() {
332                             JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
333                         }
334                     ],
335
336                                         'cmd_record_buckets_add' : [
337                                                 ['command'],
338                                                 function() {
339                                                         var bucket_id = obj.controller.view.bucket_menulist.value;
340                                                         if (!bucket_id) return;
341                                                         for (var i = 0; i < obj.record_ids.length; i++) {
342                                                                 var bucket_item = new cbrebi();
343                                                                 bucket_item.isnew('1');
344                                                                 bucket_item.bucket(bucket_id);
345                                                                 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
346                                                                 try {
347                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
348                                                                                 [ ses(), 'biblio', bucket_item ]);
349
350                                                                         if (typeof robj == 'object') throw robj;
351
352                                                                         var item = obj.prep_record_for_list( obj.record_ids[i], robj );
353                                                                         if (!item) continue;
354
355                                                                         obj.list2.append( item );
356                                                                 } catch(E) {
357                                                                         alert( js2JSON(E) );
358                                                                 }
359                                                         }
360                                                 }
361                                         ],
362                                         'cmd_record_buckets_sel_add' : [
363                                                 ['command'],
364                                                 function() {                                                        
365                                                         var bucket_id = obj.controller.view.bucket_menulist.value;
366                                                         if (!bucket_id) return;
367                                                         for (var i = 0; i < obj.selection_list1.length; i++) {
368                                                                 var docid = obj.selection_list1[i].docid;
369                                                                 var bucket_item = new cbrebi();
370                                                                 bucket_item.isnew('1');
371                                                                 bucket_item.bucket(bucket_id);
372                                                                 bucket_item.target_biblio_record_entry( docid );
373                                                                 try {
374                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
375                                                                                 [ ses(), 'biblio', bucket_item ]);
376
377                                                                         if (typeof robj == 'object') throw robj;
378
379                                                                         var item = obj.prep_record_for_list( docid, robj );
380                                                                         if (!item) continue;
381
382                                                                         obj.list2.append( item );
383                                                                 } catch(E) {
384                                                                         alert( js2JSON(E) );
385                                                                 }
386                                                         }
387
388                                                 }
389                                         ],
390                                         'cmd_pending_buckets_to_record_buckets' : [
391                                                 ['command'],
392                                                 function() {                                                        
393                                                         for (var i = 0; i < obj.selection_list2.length; i++) {
394                                                                 var docid = obj.selection_list2[i].docid;
395                                                                 var item = obj.prep_record_for_list( docid );
396                                                                 if (item) {
397                                                                         obj.list1.append( item );
398                                                                         obj.record_ids.push( docid );
399                                                                 }
400                                                         }
401                                                 }
402                                         ],
403
404                                         'cmd_record_buckets_delete_item' : [
405                                                 ['command'],
406                                                 function() {
407                                                         for (var i = 0; i < obj.selection_list2.length; i++) {
408                                                                 try {
409                                                                         var bucket_item_id = obj.selection_list2[i].bucket_item_id;
410                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
411                                                                                 [ ses(), 'biblio', bucket_item_id ]);
412                                                                         if (typeof robj == 'object') throw robj;
413                                                                 } catch(E) {
414                                                                         alert(js2JSON(E));
415                                                                 }
416                                                         }
417                                                         alert("Action completed.");
418                                                         setTimeout(
419                                                                 function() {
420                                                                         JSAN.use('util.widgets'); 
421                                                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
422                                                                 }, 0
423                                                         );
424                                                 }
425                                         ],
426                                         'cmd_record_buckets_delete_bucket' : [
427                                                 ['command'],
428                                                 function() {
429                                                         try {
430                                                                 var bucket = obj.controller.view.bucket_menulist.value;
431                                                                 var name = obj.bucket_id_name_map[ bucket ];
432                                                                 var conf = window.confirm('Delete the bucket named ' + name + '?');
433                                                                 if (!conf) return;
434                                                                 obj.list2.clear();
435                                                                 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
436                                                                 if (typeof robj == 'object') throw robj;
437                                                                 alert("Action completed.");
438                                                                 var x = document.getElementById('info_box');
439                                 x.setAttribute('hidden','true');
440                                 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
441                                 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
442                                 obj.controller.view.record_buckets_export_records.disabled = true;
443                                 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
444                                 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
445                                 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
446                                 obj.controller.view.record_buckets_list_actions.disabled = true;
447                                                                 obj.controller.render('record_buckets_menulist_placeholder');
448                                                                 setTimeout(
449                                                                         function() {
450                                                                                 JSAN.use('util.widgets'); 
451                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
452                                                                         }, 0
453                                                                 );
454
455                                                         } catch(E) {
456                                                                 alert('FIXME -- ' + E);
457                                                         }
458                                                 }
459                                         ],
460                                         'cmd_record_buckets_new_bucket' : [
461                                                 ['command'],
462                                                 function() {
463                                                         try {
464                                                                 var name = prompt('What would you like to name the bucket?','','Bucket Creation');
465
466                                                                 if (name) {
467                                                                         var bucket = new cbreb();
468                                                                         bucket.btype('staff_client');
469                                                                         bucket.owner( obj.data.list.au[0].id() );
470                                                                         bucket.name( name );
471
472                                                                         var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
473
474                                                                         if (typeof robj == 'object') {
475                                                                                 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
476                                                                                         alert('You already have a bucket with that name.');
477                                                                                         return;
478                                                                                 }
479                                                                                 throw robj;
480                                                                         }
481
482
483                                                                         alert('Bucket "' + name + '" created.');
484
485                                                                         obj.controller.render('record_buckets_menulist_placeholder');
486                                                                         obj.controller.view.bucket_menulist.value = robj;
487                                                                         setTimeout(
488                                                                                 function() {
489                                                                                         JSAN.use('util.widgets'); 
490                                                                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
491                                                                                 }, 0
492                                                                         );
493                                                                 }
494                                                         } catch(E) {
495                                                                 alert( js2JSON(E) );
496                                                         }
497                                                 }
498                                         ],
499                                         
500                                         'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ], 
501                                         'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
502                     'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
503                     'cmd_record_buckets_csv_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ], 
504                     'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
505                     'cmd_record_buckets_csv_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ], 
506
507                                         'cmd_export_records_usmarc' : [
508                                                 ['command'],
509                                                 function () { return cat.record_buckets.export_records(obj, 'usmarc') }
510                                         ],
511
512                                         'cmd_export_records_unimarc' : [
513                                                 ['command'],
514                                                 function () { return cat.record_buckets.export_records(obj, 'unimarc') }
515                                         ],
516
517                                         'cmd_export_records_xml' : [
518                                                 ['command'],
519                                                 function () { return cat.record_buckets.export_records(obj, 'xml') }
520                                         ],
521
522                                         'cmd_export_records_bre' : [
523                                                 ['command'],
524                                                 function () { return cat.record_buckets.export_records(obj, 'bre') }
525                                         ],
526
527                                         'cmd_merge_records' : [
528                                                 ['command'],
529                                                 function() {
530                                                         try {
531                                                                 obj.list2.select_all();
532                                                                 obj.data.stash_retrieve();
533                                                                 JSAN.use('util.functional');
534
535                                                                 var record_ids = util.functional.map_list(
536                                                                         obj.list2.dump_retrieve_ids(),
537                                                                         function (o) {
538                                                                                 return JSON2js(o).docid; // docid
539                                                                         }
540                                                                 );
541
542                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
543                                                                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
544                                                                 top_xml += '<description>Merge these records? (Select the "lead" record first)</description>';
545                                                                 top_xml += '<hbox><button id="lead" disabled="true" label="Merge" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
546
547                                                                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
548                                                                 xml += '<table><tr valign="top">';
549                                                                 for (var i = 0; i < record_ids.length; i++) {
550                                                                         xml += '<td><input value="Lead" id="record_' + record_ids[i] + '" type="radio" name="lead"';
551                                                                         xml += ' onclick="' + "try { var x = document.getElementById('lead'); x.setAttribute('value',";
552                                                                         xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
553                                                                         xml += '</input>Lead Record? #' + record_ids[i] + '</td>';
554                                                                 }
555                                                                 xml += '</tr><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                                                                 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
567                                                                 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
568                                                                 JSAN.use('util.window'); var win = new util.window();
569                                                                 var fancy_prompt_data = win.open(
570                                                                         urls.XUL_FANCY_PROMPT,
571                                                                         //+ '?xml_in_stash=temp_merge_mid'
572                                                                         //+ '&top_xml_in_stash=temp_merge_top'
573                                                                         //+ '&title=' + window.escape('Record Merging'),
574                                                                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
575                                                                         {
576                                                                                 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Merging'
577                                                                         }
578                                                                 );
579                                                                 //obj.data.stash_retrieve();
580
581                                                                 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') { alert('Merge Aborted'); return; }
582                                                                 var robj = obj.network.simple_request('MERGE_RECORDS', 
583                                                                         [ 
584                                                                                 ses(), 
585                                                                                 fancy_prompt_data.lead, 
586                                                                                 util.functional.filter_list( record_ids,
587                                                                                         function(o) {
588                                                                                                 return o != fancy_prompt_data.lead;
589                                                                                         }
590                                                                                 )
591                                                                         ]
592                                                                 );
593                                                                 if (typeof robj.ilsevent != 'undefined') {
594                                                                         throw(robj);
595                                                                 } else {
596                                                                         alert('Records were successfully merged.');
597                                                                 }
598
599                                                                 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
600                                                                 setTimeout(
601                                                                         function() {
602                                                                                 JSAN.use('util.widgets'); 
603                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
604                                                                         }, 0
605                                                                 );
606                                                         } catch(E) {
607                                                                 obj.error.standard_unexpected_error_alert('Records were not likely merged.',E);
608                                                         }
609
610                                                 }
611                                         ],
612                                         
613                                         'cmd_delete_records' : [
614                                                 ['command'],
615                                                 function() {
616                                                         try {
617                                                                 obj.list2.select_all();
618                                                                 obj.data.stash_retrieve();
619                                                                 JSAN.use('util.functional');
620
621                                                                 var record_ids = util.functional.map_list(
622                                                                         obj.list2.dump_retrieve_ids(),
623                                                                         function (o) {
624                                                                                 return JSON2js(o).docid; // docid
625                                                                         }
626                                                                 );
627
628                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
629                                                                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
630                                                                 top_xml += '<description>Delete these records?</description>';
631                                                                 top_xml += '<hbox><button id="lead" disabled="false" label="Delete" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
632
633                                                                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
634                                                                 xml += '<table><tr valign="top">';
635                                                                 for (var i = 0; i < record_ids.length; i++) {
636                                                                         xml += '<td>Record #' + record_ids[i] + '</td>';
637                                                                 }
638                                                                 xml += '</tr><tr valign="top">';
639                                                                 for (var i = 0; i < record_ids.length; i++) {
640                                                                         xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
641                                                                         xml += '?docid=' + record_ids[i] + '"/></td>';
642                                                                 }
643                                                                 xml += '</tr><tr valign="top">';
644                                                                 for (var i = 0; i < record_ids.length; i++) {
645                                                                         html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
646                                                                         xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
647                                                                 }
648                                                                 xml += '</tr></table></form>';
649                                                                 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
650                                                                 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
651                                                                 JSAN.use('util.window'); var win = new util.window();
652                                                                 var fancy_prompt_data = win.open(
653                                                                         urls.XUL_FANCY_PROMPT,
654                                                                         //+ '?xml_in_stash=temp_merge_mid'
655                                                                         //+ '&top_xml_in_stash=temp_merge_top'
656                                                                         //+ '&title=' + window.escape('Record Purging'),
657                                                                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
658                                                                         {
659                                                                                 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Purging'
660                                                                         }
661                                                                 );
662                                                                 //obj.data.stash_retrieve();
663                                                                 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') { alert('Delete Aborted'); return; }
664                                                                 var s = '';
665                                                                 for (var i = 0; i < record_ids.length; i++) {
666                                                                         var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
667                                                                         if (typeof robj.ilsevent != 'undefined') {
668                                                                                 if (!s) s = 'Error deleting these records:\n';
669                                                                                 s += 'Record #' + record_ids[i] + ' : ' + robj.textcode + ' : ' + robj.desc + '\n';
670                                                                         }
671                                                                 }
672                                                                 if (s) { alert(s); } else { alert('Records deleted.'); }
673
674                                                                 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
675                                                                 setTimeout(
676                                                                         function() {
677                                                                                 JSAN.use('util.widgets'); 
678                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
679                                                                         }, 0
680                                                                 );
681                                                         } catch(E) {
682                                                                 obj.error.standard_unexpected_error_alert('Records were not likely deleted.',E);
683                                                         }
684
685                                                 }
686                                         ],
687
688                                         'cmd_broken' : [
689                                                 ['command'],
690                                                 function() { alert('Not Yet Implemented'); }
691                                         ],
692                                         'cmd_sel_opac' : [
693                                                 ['command'],
694                                                 function() {
695                                                         try {
696                                                                 obj.list2.select_all();
697                                                                 JSAN.use('util.functional');
698                                                                 var docids = util.functional.map_list(
699                                                                         obj.list2.dump_retrieve_ids(),
700                                                                         function (o) {
701                                                                                 return JSON2js(o).docid; // docid
702                                                                         }
703                                                                 );
704                                 var seen = {};
705                                                                 for (var i = 0; i < docids.length; i++) {
706                                                                         var doc_id = docids[i];
707                                     if (seen[doc_id]) continue; seen[doc_id] = true;
708                                                                         var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
709                                                                         var content_params = { 
710                                                                                 'session' : ses(),
711                                                                                 'authtime' : ses('authtime'),
712                                                                                 'opac_url' : opac_url,
713                                                                         };
714                                                                         xulG.new_tab(
715                                                                                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
716                                                                                 {'tab_name':'Retrieving title...'}, 
717                                                                                 content_params
718                                                                         );
719                                                                 }
720                                                         } catch(E) {
721                                                                 obj.error.standard_unexpected_error_alert('Showing in OPAC',E);
722                                                         }
723                                                 }
724                                         ],
725                     'record_buckets_export_records' : [ ['render'], function(){} ],
726                     'record_buckets_list_actions' : [ ['render'], function(){} ]
727                                 }
728                         }
729                 );
730                 this.controller.render();
731
732                 if (typeof xulG == 'undefined') {
733                         obj.controller.view.cmd_sel_opac.disabled = true;
734                         obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
735                 }
736         },
737
738         'prep_record_for_list' : function(docid,bucket_item_id) {
739                 var obj = this;
740                 try {
741             var item = {
742                 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
743                 'row' : {
744                     'my' : {
745                         'docid' : docid,
746                         'bucket_item_id' : bucket_item_id
747                     }
748                 }
749             };
750             return item;
751                 } catch(E) {
752                         obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
753                         return null;
754                 }
755         },
756         
757 };
758
759 dump('exiting cat.record_buckets.js\n');