1 dump('entering cat.record_buckets.js\n');
3 if (typeof cat == 'undefined') cat = {};
4 cat.record_buckets = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network();
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;
15 cat.record_buckets.pick_file = function (defaultFileName) {
16 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
18 var nsIFilePicker = Components.interfaces.nsIFilePicker;
19 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
21 fp.init( window, "Save File As", nsIFilePicker.modeSave );
23 fp.defaultString = defaultFileName;
25 fp.appendFilters( nsIFilePicker.filterAll );
27 var result = fp.show();
28 if ( (result == nsIFilePicker.returnOK || result == nsIFilePicker.returnReplace) && fp.file ) {
35 cat.record_buckets.export_records = function(obj, output_type) {
37 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
38 obj.list2.select_all();
39 obj.data.stash_retrieve();
40 JSAN.use('util.functional');
42 var record_ids = util.functional.map_list(
43 obj.list2.dump_retrieve_ids(),
44 function (o) { return JSON2js(o).docid }
47 var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
48 .createInstance(Components.interfaces.nsIWebBrowserPersist);
50 var proto_uri = 'http://' + window.location.hostname + '/exporter?format=' + output_type;
52 dump('Record Export URI is ' + proto_uri + '&id=' + record_ids.join('&id=') + '\n');
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 );
58 var file = cat.record_buckets.pick_file('bucket.' + output_type);
61 persist.saveURI(uri,null,null,null,null,file);
63 alert("File not downloaded.");
67 obj.error.standard_unexpected_error_alert('Records could not be exported.',E);
72 cat.record_buckets.prototype = {
73 'selection_list1' : [],
74 'selection_list2' : [],
75 'bucket_id_name_map' : {},
77 'render_pending_records' : function() {
78 if (this.first_pause) {
79 this.first_pause = false;
81 alert("Action completed.");
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 );
91 'init' : function( params ) {
95 obj.record_ids = params['record_ids'] || [];
97 JSAN.use('circ.util');
98 var columns = circ.util.columns(
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 },
110 JSAN.use('util.list');
112 function retrieve_row(params) {
113 var row = params.row;
115 obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE.authoritative', [ row.my.docid ],
118 var record = req.getResultObject();
119 if (typeof req.ilsevent != 'undefined') throw(req);
121 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
124 obj.error.standard_unexpected_error_alert('Error retrieving mvr for record with id =' + row.my.docid, E);
129 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
134 obj.list1 = new util.list('pending_records_list');
138 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
139 'retrieve_row' : retrieve_row,
140 'on_select' : function(ev) {
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(
147 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
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');
153 obj.controller.view.cmd_record_buckets_sel_add.setAttribute('disabled','false');
156 alert('FIXME: ' + E);
163 obj.render_pending_records();
165 obj.list2 = new util.list('records_in_bucket_list');
169 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
170 'retrieve_row' : retrieve_row,
171 'on_select' : function(ev) {
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(
178 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
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');
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');
189 alert('FIXME: ' + E);
195 JSAN.use('util.controller'); obj.controller = new util.controller();
201 function() { obj.list2.save_columns(); }
205 function() { obj.list1.save_columns(); }
209 function() { obj.list2.clipboard(); }
213 function() { obj.list1.clipboard(); }
215 'record_buckets_menulist_placeholder' : [
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() ]
224 if (typeof buckets.ilsevent != 'undefined') {
225 obj.error.standard_unexpected_error_alert('Could not retrieve your buckets.',buckets);
228 var items = [ ['Choose a bucket...',''], ['Retrieve shared bucket...',-1] ].concat(
229 util.functional.map_list(
230 util.functional.filter_list(
233 return o.btype() == 'staff_client';
237 obj.bucket_id_name_map[ o.id() ] = o.name();
238 return [ o.name(), o.id() ];
242 if (a[0] < b[0]) return -1;
243 if (a[0] > b[0]) return 1;
248 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
249 util.widgets.remove_children( e );
250 var ml = util.widgets.make_menulist(
254 ml.setAttribute('id','bucket_menulist');
255 ml.setAttribute('accesskey','');
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);
264 if (!bucket_id) return;
265 var x = document.getElementById('info_box');
266 x.setAttribute('hidden','true');
267 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
268 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
269 obj.controller.view.record_buckets_export_records.disabled = true;
270 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
271 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
272 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
273 obj.controller.view.record_buckets_list_actions.disabled = true;
274 var bucket = obj.network.simple_request(
276 [ ses(), 'biblio', bucket_id ]
278 if (typeof bucket.ilsevent != 'undefined') {
279 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
280 alert('Could not find a bucket with ID = ' + bucket_id);
282 obj.error.standard_unexpected_error_alert('Error retrieving bucket. Did you use a valid bucket id?',bucket);
287 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
288 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
289 obj.controller.view.record_buckets_export_records.disabled = false;
290 obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
291 obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
292 obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
293 obj.controller.view.record_buckets_list_actions.disabled = false;
295 var x = document.getElementById('info_box');
296 x.setAttribute('hidden','false');
297 x = document.getElementById('bucket_number');
298 x.setAttribute('value',bucket.id());
299 x = document.getElementById('bucket_name');
300 x.setAttribute('value',bucket.name());
301 x = document.getElementById('bucket_owner');
302 var s = bucket.owner(); JSAN.use('patron.util');
303 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s);
304 x.setAttribute('value',s.family_name() + ' (' + s.card().barcode() + ") @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
308 var items = bucket.items() || [];
310 for (var i = 0; i < items.length; i++) {
311 var item = obj.prep_record_for_list(
312 items[i].target_biblio_record_entry(),
315 if (item) obj.list2.append( item );
319 ml.addEventListener( 'change_bucket', change_bucket , false);
320 ml.addEventListener( 'command', function() {
321 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
323 obj.controller.view.bucket_menulist = ml;
324 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
329 'cmd_record_buckets_refresh' : [
332 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
336 'cmd_record_buckets_add' : [
339 var bucket_id = obj.controller.view.bucket_menulist.value;
340 if (!bucket_id) return;
341 for (var i = 0; i < obj.record_ids.length; i++) {
342 var bucket_item = new cbrebi();
343 bucket_item.isnew('1');
344 bucket_item.bucket(bucket_id);
345 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
347 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
348 [ ses(), 'biblio', bucket_item ]);
350 if (typeof robj == 'object') throw robj;
352 var item = obj.prep_record_for_list( obj.record_ids[i], robj );
355 obj.list2.append( item );
362 'cmd_record_buckets_sel_add' : [
365 var bucket_id = obj.controller.view.bucket_menulist.value;
366 if (!bucket_id) return;
367 for (var i = 0; i < obj.selection_list1.length; i++) {
368 var docid = obj.selection_list1[i].docid;
369 var bucket_item = new cbrebi();
370 bucket_item.isnew('1');
371 bucket_item.bucket(bucket_id);
372 bucket_item.target_biblio_record_entry( docid );
374 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
375 [ ses(), 'biblio', bucket_item ]);
377 if (typeof robj == 'object') throw robj;
379 var item = obj.prep_record_for_list( docid, robj );
382 obj.list2.append( item );
390 'cmd_pending_buckets_to_record_buckets' : [
393 for (var i = 0; i < obj.selection_list2.length; i++) {
394 var docid = obj.selection_list2[i].docid;
395 var item = obj.prep_record_for_list( docid );
397 obj.list1.append( item );
398 obj.record_ids.push( docid );
404 'cmd_record_buckets_delete_item' : [
407 for (var i = 0; i < obj.selection_list2.length; i++) {
409 var bucket_item_id = obj.selection_list2[i].bucket_item_id;
410 var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
411 [ ses(), 'biblio', bucket_item_id ]);
412 if (typeof robj == 'object') throw robj;
417 alert("Action completed.");
420 JSAN.use('util.widgets');
421 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
426 'cmd_record_buckets_delete_bucket' : [
430 var bucket = obj.controller.view.bucket_menulist.value;
431 var name = obj.bucket_id_name_map[ bucket ];
432 var conf = window.confirm('Delete the bucket named ' + name + '?');
435 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
436 if (typeof robj == 'object') throw robj;
437 alert("Action completed.");
438 var x = document.getElementById('info_box');
439 x.setAttribute('hidden','true');
440 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
441 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
442 obj.controller.view.record_buckets_export_records.disabled = true;
443 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
444 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
445 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
446 obj.controller.view.record_buckets_list_actions.disabled = true;
447 obj.controller.render('record_buckets_menulist_placeholder');
450 JSAN.use('util.widgets');
451 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
456 alert('FIXME -- ' + E);
460 'cmd_record_buckets_new_bucket' : [
464 var name = prompt('What would you like to name the bucket?','','Bucket Creation');
467 var bucket = new cbreb();
468 bucket.btype('staff_client');
469 bucket.owner( obj.data.list.au[0].id() );
472 var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
474 if (typeof robj == 'object') {
475 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
476 alert('You already have a bucket with that name.');
483 alert('Bucket "' + name + '" created.');
485 obj.controller.render('record_buckets_menulist_placeholder');
486 obj.controller.view.bucket_menulist.value = robj;
489 JSAN.use('util.widgets');
490 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
500 'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ],
501 'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
502 'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
503 'cmd_record_buckets_csv_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ],
504 'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
505 'cmd_record_buckets_csv_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ],
507 'cmd_export_records_usmarc' : [
509 function () { return cat.record_buckets.export_records(obj, 'usmarc') }
512 'cmd_export_records_unimarc' : [
514 function () { return cat.record_buckets.export_records(obj, 'unimarc') }
517 'cmd_export_records_xml' : [
519 function () { return cat.record_buckets.export_records(obj, 'xml') }
522 'cmd_export_records_bre' : [
524 function () { return cat.record_buckets.export_records(obj, 'bre') }
527 'cmd_merge_records' : [
531 obj.list2.select_all();
532 obj.data.stash_retrieve();
533 JSAN.use('util.functional');
535 var record_ids = util.functional.map_list(
536 obj.list2.dump_retrieve_ids(),
538 return JSON2js(o).docid; // docid
542 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
543 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
544 top_xml += '<description>Merge these records? (Select the "lead" record first)</description>';
545 top_xml += '<hbox><button id="lead" disabled="true" label="Merge" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
547 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
548 xml += '<table><tr valign="top">';
549 for (var i = 0; i < record_ids.length; i++) {
550 xml += '<td><input value="Lead" id="record_' + record_ids[i] + '" type="radio" name="lead"';
551 xml += ' onclick="' + "try { var x = document.getElementById('lead'); x.setAttribute('value',";
552 xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
553 xml += '</input>Lead Record? #' + record_ids[i] + '</td>';
555 xml += '</tr><tr valign="top">';
556 for (var i = 0; i < record_ids.length; i++) {
557 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
558 xml += '?docid=' + record_ids[i] + '"/></td>';
560 xml += '</tr><tr valign="top">';
561 for (var i = 0; i < record_ids.length; i++) {
562 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
563 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
565 xml += '</tr></table></form>';
566 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
567 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
568 JSAN.use('util.window'); var win = new util.window();
569 var fancy_prompt_data = win.open(
570 urls.XUL_FANCY_PROMPT,
571 //+ '?xml_in_stash=temp_merge_mid'
572 //+ '&top_xml_in_stash=temp_merge_top'
573 //+ '&title=' + window.escape('Record Merging'),
574 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
576 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Merging'
579 //obj.data.stash_retrieve();
581 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') { alert('Merge Aborted'); return; }
582 var robj = obj.network.simple_request('MERGE_RECORDS',
585 fancy_prompt_data.lead,
586 util.functional.filter_list( record_ids,
588 return o != fancy_prompt_data.lead;
593 if (typeof robj.ilsevent != 'undefined') {
596 alert('Records were successfully merged.');
599 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
602 JSAN.use('util.widgets');
603 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
607 obj.error.standard_unexpected_error_alert('Records were not likely merged.',E);
613 'cmd_delete_records' : [
617 obj.list2.select_all();
618 obj.data.stash_retrieve();
619 JSAN.use('util.functional');
621 var record_ids = util.functional.map_list(
622 obj.list2.dump_retrieve_ids(),
624 return JSON2js(o).docid; // docid
628 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
629 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
630 top_xml += '<description>Delete these records?</description>';
631 top_xml += '<hbox><button id="lead" disabled="false" label="Delete" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
633 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
634 xml += '<table><tr valign="top">';
635 for (var i = 0; i < record_ids.length; i++) {
636 xml += '<td>Record #' + record_ids[i] + '</td>';
638 xml += '</tr><tr valign="top">';
639 for (var i = 0; i < record_ids.length; i++) {
640 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
641 xml += '?docid=' + record_ids[i] + '"/></td>';
643 xml += '</tr><tr valign="top">';
644 for (var i = 0; i < record_ids.length; i++) {
645 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
646 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
648 xml += '</tr></table></form>';
649 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
650 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
651 JSAN.use('util.window'); var win = new util.window();
652 var fancy_prompt_data = win.open(
653 urls.XUL_FANCY_PROMPT,
654 //+ '?xml_in_stash=temp_merge_mid'
655 //+ '&top_xml_in_stash=temp_merge_top'
656 //+ '&title=' + window.escape('Record Purging'),
657 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
659 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Purging'
662 //obj.data.stash_retrieve();
663 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') { alert('Delete Aborted'); return; }
665 for (var i = 0; i < record_ids.length; i++) {
666 var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
667 if (typeof robj.ilsevent != 'undefined') {
668 if (!s) s = 'Error deleting these records:\n';
669 s += 'Record #' + record_ids[i] + ' : ' + robj.textcode + ' : ' + robj.desc + '\n';
672 if (s) { alert(s); } else { alert('Records deleted.'); }
674 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
677 JSAN.use('util.widgets');
678 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
682 obj.error.standard_unexpected_error_alert('Records were not likely deleted.',E);
690 function() { alert('Not Yet Implemented'); }
696 obj.list2.select_all();
697 JSAN.use('util.functional');
698 var docids = util.functional.map_list(
699 obj.list2.dump_retrieve_ids(),
701 return JSON2js(o).docid; // docid
705 for (var i = 0; i < docids.length; i++) {
706 var doc_id = docids[i];
707 if (seen[doc_id]) continue; seen[doc_id] = true;
708 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
709 var content_params = {
711 'authtime' : ses('authtime'),
712 'opac_url' : opac_url,
715 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
716 {'tab_name':'Retrieving title...'},
721 obj.error.standard_unexpected_error_alert('Showing in OPAC',E);
725 'record_buckets_export_records' : [ ['render'], function(){} ],
726 'record_buckets_list_actions' : [ ['render'], function(){} ]
730 this.controller.render();
732 if (typeof xulG == 'undefined') {
733 obj.controller.view.cmd_sel_opac.disabled = true;
734 obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
738 'prep_record_for_list' : function(docid,bucket_item_id) {
742 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
746 'bucket_item_id' : bucket_item_id
752 obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
759 dump('exiting cat.record_buckets.js\n');