]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/record_buckets.js
bucket item count
[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                                                                         if (x) x.setAttribute('hidden','true');
267                                     x = document.getElementById('bucket_item_count');
268                                     if (x) x.setAttribute('label','');
269                                     obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
270                                     obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
271                                     obj.controller.view.record_buckets_export_records.disabled = true;
272                                     obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
273                                     obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
274                                     obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
275                                     obj.controller.view.record_buckets_list_actions.disabled = true;
276                                                                         var bucket = obj.network.simple_request(
277                                                                                 'BUCKET_FLESH',
278                                                                                 [ ses(), 'biblio', bucket_id ]
279                                                                         );
280                                                                         if (typeof bucket.ilsevent != 'undefined') {
281                                                                                 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
282                                                                                         alert('Could not find a bucket with ID = ' + bucket_id);
283                                                                                 } else {
284                                                                                         obj.error.standard_unexpected_error_alert('Error retrieving bucket.  Did you use a valid bucket id?',bucket);
285                                                                                 }
286                                                                                 return;
287                                                                         }
288                                                                         try {
289                                         obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
290                                         obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
291                                         obj.controller.view.record_buckets_export_records.disabled = false;
292                                         obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
293                                         obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
294                                         obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
295                                         obj.controller.view.record_buckets_list_actions.disabled = false;
296
297                                                                                 var x = document.getElementById('info_box');
298                                                                                 x.setAttribute('hidden','false');
299                                                                                 x = document.getElementById('bucket_number');
300                                                                                 x.setAttribute('value',bucket.id());
301                                                                                 x = document.getElementById('bucket_name');
302                                                                                 x.setAttribute('value',bucket.name());
303                                                                                 x = document.getElementById('bucket_owner');
304                                                                                 var s = bucket.owner(); JSAN.use('patron.util');
305                                                                                 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); 
306                                                                                 x.setAttribute('value',s.family_name() + ' (' + s.card().barcode() + ") @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
307                                                                         } catch(E) {
308                                                                                 alert(E);
309                                                                         }
310                                                                         var items = bucket.items() || [];
311                                                                         obj.list2.clear();
312                                     var x = document.getElementById('bucket_item_count');
313                                     var catStrings = document.getElementById('catStrings');    
314                                     if (x && catStrings) x.setAttribute('value',catStrings.getFormattedString('cat.total_bucket_items_in_bucket',[items.length]));
315                                                                         for (var i = 0; i < items.length; i++) {
316                                                                                 var item = obj.prep_record_for_list( 
317                                                                                         items[i].target_biblio_record_entry(),
318                                                                                         items[i].id()
319                                                                                 );
320                                                                                 if (item) obj.list2.append( item );
321                                                                         }
322                                                                 }
323
324                                                                 ml.addEventListener( 'change_bucket', change_bucket , false);
325                                                                 ml.addEventListener( 'command', function() {
326                                                                         JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
327                                                                 }, false);
328                                                                 obj.controller.view.bucket_menulist = ml;
329                                                                 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
330                                                         };
331                                                 },
332                                         ],
333
334                     'cmd_record_buckets_refresh' : [
335                         ['command'],
336                         function() {
337                             JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
338                         }
339                     ],
340
341                                         'cmd_record_buckets_add' : [
342                                                 ['command'],
343                                                 function() {
344                                                         var bucket_id = obj.controller.view.bucket_menulist.value;
345                                                         if (!bucket_id) return;
346                                                         for (var i = 0; i < obj.record_ids.length; i++) {
347                                                                 var bucket_item = new cbrebi();
348                                                                 bucket_item.isnew('1');
349                                                                 bucket_item.bucket(bucket_id);
350                                                                 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
351                                                                 try {
352                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
353                                                                                 [ ses(), 'biblio', bucket_item ]);
354
355                                                                         if (typeof robj == 'object') throw robj;
356
357                                                                         var item = obj.prep_record_for_list( obj.record_ids[i], robj );
358                                                                         if (!item) continue;
359
360                                                                         obj.list2.append( item );
361                                                                 } catch(E) {
362                                                                         alert( js2JSON(E) );
363                                                                 }
364                                                         }
365                                                 }
366                                         ],
367                                         'cmd_record_buckets_sel_add' : [
368                                                 ['command'],
369                                                 function() {                                                        
370                                                         var bucket_id = obj.controller.view.bucket_menulist.value;
371                                                         if (!bucket_id) return;
372                                                         for (var i = 0; i < obj.selection_list1.length; i++) {
373                                                                 var docid = obj.selection_list1[i].docid;
374                                                                 var bucket_item = new cbrebi();
375                                                                 bucket_item.isnew('1');
376                                                                 bucket_item.bucket(bucket_id);
377                                                                 bucket_item.target_biblio_record_entry( docid );
378                                                                 try {
379                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
380                                                                                 [ ses(), 'biblio', bucket_item ]);
381
382                                                                         if (typeof robj == 'object') throw robj;
383
384                                                                         var item = obj.prep_record_for_list( docid, robj );
385                                                                         if (!item) continue;
386
387                                                                         obj.list2.append( item );
388                                                                 } catch(E) {
389                                                                         alert( js2JSON(E) );
390                                                                 }
391                                                         }
392
393                                                 }
394                                         ],
395                                         'cmd_pending_buckets_to_record_buckets' : [
396                                                 ['command'],
397                                                 function() {                                                        
398                                                         for (var i = 0; i < obj.selection_list2.length; i++) {
399                                                                 var docid = obj.selection_list2[i].docid;
400                                                                 var item = obj.prep_record_for_list( docid );
401                                                                 if (item) {
402                                                                         obj.list1.append( item );
403                                                                         obj.record_ids.push( docid );
404                                                                 }
405                                                         }
406                                                 }
407                                         ],
408
409                                         'cmd_record_buckets_delete_item' : [
410                                                 ['command'],
411                                                 function() {
412                                                         for (var i = 0; i < obj.selection_list2.length; i++) {
413                                                                 try {
414                                                                         var bucket_item_id = obj.selection_list2[i].bucket_item_id;
415                                                                         var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
416                                                                                 [ ses(), 'biblio', bucket_item_id ]);
417                                                                         if (typeof robj == 'object') throw robj;
418                                                                 } catch(E) {
419                                                                         alert(js2JSON(E));
420                                                                 }
421                                                         }
422                                                         alert("Action completed.");
423                                                         setTimeout(
424                                                                 function() {
425                                                                         JSAN.use('util.widgets'); 
426                                                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
427                                                                 }, 0
428                                                         );
429                                                 }
430                                         ],
431                                         'cmd_record_buckets_delete_bucket' : [
432                                                 ['command'],
433                                                 function() {
434                                                         try {
435                                                                 var bucket = obj.controller.view.bucket_menulist.value;
436                                                                 var name = obj.bucket_id_name_map[ bucket ];
437                                                                 var conf = window.confirm('Delete the bucket named ' + name + '?');
438                                                                 if (!conf) return;
439                                                                 obj.list2.clear();
440                                                                 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
441                                                                 if (typeof robj == 'object') throw robj;
442                                                                 alert("Action completed.");
443                                                                 var x = document.getElementById('info_box');
444                                 x.setAttribute('hidden','true');
445                                 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
446                                 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
447                                 obj.controller.view.record_buckets_export_records.disabled = true;
448                                 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
449                                 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
450                                 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
451                                 obj.controller.view.record_buckets_list_actions.disabled = true;
452                                                                 obj.controller.render('record_buckets_menulist_placeholder');
453                                                                 setTimeout(
454                                                                         function() {
455                                                                                 JSAN.use('util.widgets'); 
456                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
457                                                                         }, 0
458                                                                 );
459
460                                                         } catch(E) {
461                                                                 alert('FIXME -- ' + E);
462                                                         }
463                                                 }
464                                         ],
465                                         'cmd_record_buckets_new_bucket' : [
466                                                 ['command'],
467                                                 function() {
468                                                         try {
469                                                                 var name = prompt('What would you like to name the bucket?','','Bucket Creation');
470
471                                                                 if (name) {
472                                                                         var bucket = new cbreb();
473                                                                         bucket.btype('staff_client');
474                                                                         bucket.owner( obj.data.list.au[0].id() );
475                                                                         bucket.name( name );
476
477                                                                         var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
478
479                                                                         if (typeof robj == 'object') {
480                                                                                 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
481                                                                                         alert('You already have a bucket with that name.');
482                                                                                         return;
483                                                                                 }
484                                                                                 throw robj;
485                                                                         }
486
487
488                                                                         alert('Bucket "' + name + '" created.');
489
490                                                                         obj.controller.render('record_buckets_menulist_placeholder');
491                                                                         obj.controller.view.bucket_menulist.value = robj;
492                                                                         setTimeout(
493                                                                                 function() {
494                                                                                         JSAN.use('util.widgets'); 
495                                                                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
496                                                                                 }, 0
497                                                                         );
498                                                                 }
499                                                         } catch(E) {
500                                                                 alert( js2JSON(E) );
501                                                         }
502                                                 }
503                                         ],
504                                         
505                                         'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ], 
506                                         'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
507                     'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
508                     'cmd_record_buckets_csv_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ], 
509                     'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
510                     'cmd_record_buckets_csv_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ], 
511
512                                         'cmd_export_records_usmarc' : [
513                                                 ['command'],
514                                                 function () { return cat.record_buckets.export_records(obj, 'usmarc') }
515                                         ],
516
517                                         'cmd_export_records_unimarc' : [
518                                                 ['command'],
519                                                 function () { return cat.record_buckets.export_records(obj, 'unimarc') }
520                                         ],
521
522                                         'cmd_export_records_xml' : [
523                                                 ['command'],
524                                                 function () { return cat.record_buckets.export_records(obj, 'xml') }
525                                         ],
526
527                                         'cmd_export_records_bre' : [
528                                                 ['command'],
529                                                 function () { return cat.record_buckets.export_records(obj, 'bre') }
530                                         ],
531
532                                         'cmd_merge_records' : [
533                                                 ['command'],
534                                                 function() {
535                                                         try {
536                                                                 obj.list2.select_all();
537                                                                 obj.data.stash_retrieve();
538                                                                 JSAN.use('util.functional');
539
540                                                                 var record_ids = util.functional.map_list(
541                                                                         obj.list2.dump_retrieve_ids(),
542                                                                         function (o) {
543                                                                                 return JSON2js(o).docid; // docid
544                                                                         }
545                                                                 );
546
547                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
548                                                                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
549                                                                 top_xml += '<description>Merge these records? (Select the "lead" record first)</description>';
550                                                                 top_xml += '<hbox><button id="lead" disabled="true" label="Merge" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
551
552                                                                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
553                                                                 xml += '<table><tr valign="top">';
554                                                                 for (var i = 0; i < record_ids.length; i++) {
555                                                                         xml += '<td><input value="Lead" id="record_' + record_ids[i] + '" type="radio" name="lead"';
556                                                                         xml += ' onclick="' + "try { var x = document.getElementById('lead'); x.setAttribute('value',";
557                                                                         xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
558                                                                         xml += '</input>Lead Record? #' + record_ids[i] + '</td>';
559                                                                 }
560                                                                 xml += '</tr><tr valign="top">';
561                                                                 for (var i = 0; i < record_ids.length; i++) {
562                                                                         xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
563                                                                         xml += '?docid=' + record_ids[i] + '"/></td>';
564                                                                 }
565                                                                 xml += '</tr><tr valign="top">';
566                                                                 for (var i = 0; i < record_ids.length; i++) {
567                                                                         html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
568                                                                         xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
569                                                                 }
570                                                                 xml += '</tr></table></form>';
571                                                                 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
572                                                                 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
573                                                                 JSAN.use('util.window'); var win = new util.window();
574                                                                 var fancy_prompt_data = win.open(
575                                                                         urls.XUL_FANCY_PROMPT,
576                                                                         //+ '?xml_in_stash=temp_merge_mid'
577                                                                         //+ '&top_xml_in_stash=temp_merge_top'
578                                                                         //+ '&title=' + window.escape('Record Merging'),
579                                                                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
580                                                                         {
581                                                                                 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Merging'
582                                                                         }
583                                                                 );
584                                                                 //obj.data.stash_retrieve();
585
586                                                                 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') { alert('Merge Aborted'); return; }
587                                                                 var robj = obj.network.simple_request('MERGE_RECORDS', 
588                                                                         [ 
589                                                                                 ses(), 
590                                                                                 fancy_prompt_data.lead, 
591                                                                                 util.functional.filter_list( record_ids,
592                                                                                         function(o) {
593                                                                                                 return o != fancy_prompt_data.lead;
594                                                                                         }
595                                                                                 )
596                                                                         ]
597                                                                 );
598                                                                 if (typeof robj.ilsevent != 'undefined') {
599                                                                         throw(robj);
600                                                                 } else {
601                                                                         alert('Records were successfully merged.');
602                                                                 }
603
604                                                                 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
605                                                                 setTimeout(
606                                                                         function() {
607                                                                                 JSAN.use('util.widgets'); 
608                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
609                                                                         }, 0
610                                                                 );
611                                                         } catch(E) {
612                                                                 obj.error.standard_unexpected_error_alert('Records were not likely merged.',E);
613                                                         }
614
615                                                 }
616                                         ],
617                                         
618                                         'cmd_delete_records' : [
619                                                 ['command'],
620                                                 function() {
621                                                         try {
622                                                                 obj.list2.select_all();
623                                                                 obj.data.stash_retrieve();
624                                                                 JSAN.use('util.functional');
625
626                                                                 var record_ids = util.functional.map_list(
627                                                                         obj.list2.dump_retrieve_ids(),
628                                                                         function (o) {
629                                                                                 return JSON2js(o).docid; // docid
630                                                                         }
631                                                                 );
632
633                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
634                                                                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
635                                                                 top_xml += '<description>Delete these records?</description>';
636                                                                 top_xml += '<hbox><button id="lead" disabled="false" label="Delete" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
637
638                                                                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
639                                                                 xml += '<table><tr valign="top">';
640                                                                 for (var i = 0; i < record_ids.length; i++) {
641                                                                         xml += '<td>Record #' + record_ids[i] + '</td>';
642                                                                 }
643                                                                 xml += '</tr><tr valign="top">';
644                                                                 for (var i = 0; i < record_ids.length; i++) {
645                                                                         xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
646                                                                         xml += '?docid=' + record_ids[i] + '"/></td>';
647                                                                 }
648                                                                 xml += '</tr><tr valign="top">';
649                                                                 for (var i = 0; i < record_ids.length; i++) {
650                                                                         html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
651                                                                         xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
652                                                                 }
653                                                                 xml += '</tr></table></form>';
654                                                                 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
655                                                                 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
656                                                                 JSAN.use('util.window'); var win = new util.window();
657                                                                 var fancy_prompt_data = win.open(
658                                                                         urls.XUL_FANCY_PROMPT,
659                                                                         //+ '?xml_in_stash=temp_merge_mid'
660                                                                         //+ '&top_xml_in_stash=temp_merge_top'
661                                                                         //+ '&title=' + window.escape('Record Purging'),
662                                                                         'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
663                                                                         {
664                                                                                 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Purging'
665                                                                         }
666                                                                 );
667                                                                 //obj.data.stash_retrieve();
668                                                                 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') { alert('Delete Aborted'); return; }
669                                                                 var s = '';
670                                                                 for (var i = 0; i < record_ids.length; i++) {
671                                                                         var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
672                                                                         if (typeof robj.ilsevent != 'undefined') {
673                                                                                 if (!s) s = 'Error deleting these records:\n';
674                                                                                 s += 'Record #' + record_ids[i] + ' : ' + robj.textcode + ' : ' + robj.desc + '\n';
675                                                                         }
676                                                                 }
677                                                                 if (s) { alert(s); } else { alert('Records deleted.'); }
678
679                                                                 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
680                                                                 setTimeout(
681                                                                         function() {
682                                                                                 JSAN.use('util.widgets'); 
683                                                                                 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
684                                                                         }, 0
685                                                                 );
686                                                         } catch(E) {
687                                                                 obj.error.standard_unexpected_error_alert('Records were not likely deleted.',E);
688                                                         }
689
690                                                 }
691                                         ],
692
693                                         'cmd_broken' : [
694                                                 ['command'],
695                                                 function() { alert('Not Yet Implemented'); }
696                                         ],
697                                         'cmd_sel_opac' : [
698                                                 ['command'],
699                                                 function() {
700                                                         try {
701                                                                 obj.list2.select_all();
702                                                                 JSAN.use('util.functional');
703                                                                 var docids = util.functional.map_list(
704                                                                         obj.list2.dump_retrieve_ids(),
705                                                                         function (o) {
706                                                                                 return JSON2js(o).docid; // docid
707                                                                         }
708                                                                 );
709                                 var seen = {};
710                                                                 for (var i = 0; i < docids.length; i++) {
711                                                                         var doc_id = docids[i];
712                                     if (seen[doc_id]) continue; seen[doc_id] = true;
713                                                                         var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
714                                                                         var content_params = { 
715                                                                                 'session' : ses(),
716                                                                                 'authtime' : ses('authtime'),
717                                                                                 'opac_url' : opac_url,
718                                                                         };
719                                                                         xulG.new_tab(
720                                                                                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
721                                                                                 {'tab_name':'Retrieving title...'}, 
722                                                                                 content_params
723                                                                         );
724                                                                 }
725                                                         } catch(E) {
726                                                                 obj.error.standard_unexpected_error_alert('Showing in OPAC',E);
727                                                         }
728                                                 }
729                                         ],
730                     'record_buckets_export_records' : [ ['render'], function(){} ],
731                     'record_buckets_list_actions' : [ ['render'], function(){} ]
732                                 }
733                         }
734                 );
735                 this.controller.render();
736
737                 if (typeof xulG == 'undefined') {
738                         obj.controller.view.cmd_sel_opac.disabled = true;
739                         obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
740                 }
741         },
742
743         'prep_record_for_list' : function(docid,bucket_item_id) {
744                 var obj = this;
745                 try {
746             var item = {
747                 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
748                 'row' : {
749                     'my' : {
750                         'docid' : docid,
751                         'bucket_item_id' : bucket_item_id
752                     }
753                 }
754             };
755             return item;
756                 } catch(E) {
757                         obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
758                         return null;
759                 }
760         },
761         
762 };
763
764 dump('exiting cat.record_buckets.js\n');