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