]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/record_buckets.js
Merge branch 'template-toolkit-opac' of git.evergreen-ils.org:evergreen/equinox into...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / record_buckets.js
1 dump('entering cat.record_buckets.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof cat == 'undefined') cat = {};
6 cat.record_buckets = function (params) {
7
8     JSAN.use('util.error'); this.error = new util.error();
9     JSAN.use('util.network'); this.network = new util.network();
10     JSAN.use('util.date');
11     JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
12     var x = document.getElementById("record_buckets_tabbox");
13     if (x) {
14         x.addEventListener(
15             'select',
16             function(ev) {
17                 if (ev.target.tagName == 'tabpanels') {
18                     for (var i = 0; i < ev.target.childNodes.length; i++) {
19                         var p = ev.target.childNodes[i].firstChild;
20                         p.hidden = x.selectedIndex != i;
21                     }
22                 }
23             },
24             false
25         );
26         x.selectedIndex = 2;
27         for (var i = 0; i < x.lastChild.childNodes.length; i++) {
28             var p = x.lastChild.childNodes[i].firstChild;
29             p.hidden = x.selectedIndex != i;
30         }
31     }
32 };
33
34 cat.record_buckets.pick_file = function (defaultFileName) {
35     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
36
37     var nsIFilePicker = Components.interfaces.nsIFilePicker;
38     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
39
40     fp.init( window, $("catStrings").getString('staff.cat.record_buckets.save_file_as'), nsIFilePicker.modeSave );
41     if (defaultFileName)
42         fp.defaultString = defaultFileName;
43
44     fp.appendFilters( nsIFilePicker.filterAll );
45
46     var result = fp.show(); 
47     if ( (result == nsIFilePicker.returnOK || result == nsIFilePicker.returnReplace) && fp.file ) {
48         return fp.file;
49     } else {
50         return null;
51     }
52 };
53
54 cat.record_buckets.export_records = function(obj, output_type) {
55     try {
56         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
57         obj.list2.select_all();
58         obj.data.stash_retrieve();
59         JSAN.use('util.functional');
60
61         var record_ids = util.functional.map_list(
62             obj.list2.dump_retrieve_ids(),
63             function (o) { return JSON2js(o).docid }
64         );
65
66         var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
67             .createInstance(Components.interfaces.nsIWebBrowserPersist);
68
69         var proto_uri = 'https://' + window.location.hostname + '/exporter?format=' + output_type + '&ses=' + ses();
70
71         dump('Record Export URI is ' + proto_uri + '&id=' + record_ids.join('&id=') + '\n');
72
73         var uri = Components.classes["@mozilla.org/network/io-service;1"]
74             .getService(Components.interfaces.nsIIOService)
75             .newURI( proto_uri + '&id=' + record_ids.join('&id='), null, null );
76
77         var file = cat.record_buckets.pick_file('bucket.' + output_type);
78                                 
79         if (file) {
80             persist.saveURI(uri,null,null,null,null,file);
81         } else {
82             alert( $("catStrings").getString('staff.cat.record_buckets.export_records.alert') );
83         }
84
85     } catch(E) {
86         obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.export_records.std_unexpected_error'), E);
87     }
88 };
89
90
91 cat.record_buckets.prototype = {
92     'selection_list0' : [],
93     'selection_list1' : [],
94     'selection_list2' : [],
95     'bucket_id_name_map' : {},
96
97     'render_pending_records' : function() {
98         var obj = this;
99         obj.list1.clear();
100         for (var i = 0; i < obj.record_ids.length; i++) {
101             var item = obj.prep_record_for_list( obj.record_ids[i] );
102             if (item) obj.list1.append( item );
103         }
104     },
105
106     'init' : function( params ) {
107
108         var obj = this;
109
110         obj.record_ids = params['record_ids'] || [];
111
112         JSAN.use('circ.util');
113         var columns = circ.util.columns( 
114             { 
115                 'title' : { 'hidden' : false },
116                 'author' : { 'hidden' : false },
117                 'edition' : { 'hidden' : false },
118                 'publisher' : { 'hidden' : false },
119                 'pubdate' : { 'hidden' : false },
120                 'isbn' : { 'hidden' : false },
121                 'tcn' : { 'hidden' : false }
122             } 
123         );
124
125         JSAN.use('util.list'); 
126
127         function retrieve_row(params) {
128             var row = params.row;
129             try {
130                 obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE.authoritative', [ row.my.docid ],
131                     function(req) {
132                         try {
133                             var record = req.getResultObject();
134                             if (typeof req.ilsevent != 'undefined') throw(req);
135                             row.my.mvr = record;
136                             if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
137
138                         } catch(E) {
139                             obj.error.standard_unexpected_error_alert(
140                               $("catStrings").getFormattedString('staff.cat.record_buckets.retrieve_row.std_unexpected_error', [row.my.docid]), E);
141                         }
142                     }
143                 );
144             } catch(E) {
145                 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
146             }
147             return row;
148         }
149
150         obj.list0 = new util.list('record_query_list');
151         obj.list0.init(
152             {
153                 'columns' : columns,
154                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
155                 'retrieve_row' : retrieve_row,
156                 'on_select' : function(ev) {
157                     try {
158                         JSAN.use('util.functional');
159                         var sel = obj.list0.retrieve_selection();
160                         obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
161                         obj.selection_list0 = util.functional.map_list(
162                             sel,
163                             function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
164                         );
165                         obj.error.sdump('D_TRACE','circ/record_buckets: selection list 0 = ' + js2JSON(obj.selection_list1) );
166                         if (obj.selection_list0.length == 0) {
167                             obj.controller.view.cmd_add_sel_query_to_pending.setAttribute('disabled','true');
168                         } else {
169                             obj.controller.view.cmd_add_sel_query_to_pending.setAttribute('disabled','false');
170                         }
171                     } catch(E) {
172                         alert('FIXME: ' + E);
173                     }
174                 }
175
176             }
177         );
178
179         obj.list1 = new util.list('pending_records_list');
180         obj.list1.init(
181             {
182                 'columns' : columns,
183                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
184                 'retrieve_row' : retrieve_row,
185                 'on_select' : function(ev) {
186                     try {
187                         JSAN.use('util.functional');
188                         var sel = obj.list1.retrieve_selection();
189                         obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
190                         obj.selection_list1 = util.functional.map_list(
191                             sel,
192                             function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
193                         );
194                         obj.error.sdump('D_TRACE','circ/record_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
195                         if (obj.selection_list1.length == 0) {
196                             obj.controller.view.cmd_add_sel_pending_to_record_bucket.setAttribute('disabled','true');
197                         } else {
198                             obj.controller.view.cmd_add_sel_pending_to_record_bucket.setAttribute('disabled','false');
199                         }
200                     } catch(E) {
201                         alert('FIXME: ' + E);
202                     }
203                 }
204
205             }
206         );
207
208         obj.render_pending_records();
209     
210         obj.list2 = new util.list('records_in_bucket_list');
211         obj.list2.init(
212             {
213                 'columns' : columns,
214                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
215                 'retrieve_row' : retrieve_row,
216                 'on_select' : function(ev) {
217                     try {
218                         JSAN.use('util.functional');
219                         var sel = obj.list2.retrieve_selection();
220                         obj.controller.view.sel_clip2.setAttribute('disabled', sel.length < 1 ? "true" : "false");
221                         obj.selection_list2 = util.functional.map_list(
222                             sel,
223                             function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
224                         );
225                         obj.error.sdump('D_TRACE','circ/record_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
226                         if (obj.selection_list2.length == 0) {
227                             obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','true');
228                             obj.controller.view.cmd_record_buckets_to_pending_buckets.setAttribute('disabled','true');
229                         } else {
230                             obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','false');
231                             obj.controller.view.cmd_record_buckets_to_pending_buckets.setAttribute('disabled','false');
232                         }
233                     } catch(E) {
234                         alert('FIXME: ' + E);
235                     }
236                 }
237             }
238         );
239         
240         JSAN.use('util.controller'); obj.controller = new util.controller();
241         obj.controller.init(
242             {
243                 'control_map' : {
244                     'save_columns2' : [
245                         ['command'],
246                         function() { obj.list2.save_columns(); }
247                     ],
248                     'save_columns1' : [
249                         ['command'],
250                         function() { obj.list1.save_columns(); }
251                     ],
252                     'save_columns0' : [
253                         ['command'],
254                         function() { obj.list0.save_columns(); }
255                     ],
256                     'sel_clip2' : [
257                         ['command'],
258                         function() { obj.list2.clipboard(); }
259                     ],
260                     'sel_clip1' : [
261                         ['command'],
262                         function() { obj.list1.clipboard(); }
263                     ],
264                     'sel_clip0' : [
265                         ['command'],
266                         function() { obj.list0.clipboard(); }
267                     ],
268                     'record_query_input' : [
269                         ['render'],
270                         function(ev) {
271                             ev.addEventListener('keypress',function(ev){
272                                 if (ev.target.tagName != 'textbox') return;
273                                 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* enter on a mac */) setTimeout( function() { obj.submit(); }, 0);
274                             },false);
275                         }
276                     ],
277                     'cmd_submit_query' : [
278                         ['command'],
279                         function() { obj.submit(); }
280                     ],
281                     'record_buckets_menulist_placeholder' : [
282                         ['render'],
283                         function(e) {
284                             return function() {
285                                 JSAN.use('util.widgets'); JSAN.use('util.functional');
286                                 var buckets = obj.network.simple_request(
287                                     'BUCKET_RETRIEVE_VIA_USER',
288                                     [ ses(), obj.data.list.au[0].id() ]
289                                 );
290                                 if (typeof buckets.ilsevent != 'undefined') {
291                                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.buckets.std_unexpected_error'), buckets);
292                                     return;
293                                 }
294                                 var items = [
295                                     [$("catStrings").getString('staff.cat.record_buckets.menulist_placeholder.item1'),''],
296                                     [$("catStrings").getString('staff.cat.record_buckets.menulist_placeholder.item2'),-1]
297                                 ].concat(
298                                     util.functional.map_list(
299                                         util.functional.filter_list(
300                                             buckets.biblio,
301                                             function(o) {
302                                                 return o.btype() == 'staff_client';
303                                             }
304                                         ),
305                                         function(o) {
306                                             obj.bucket_id_name_map[ o.id() ] = o.name();
307                                             return [ o.name(), o.id() ];
308                                         }
309                                     ).sort( 
310                                         function( a, b ) {
311                                             if (a[0] < b[0]) return -1;
312                                             if (a[0] > b[0]) return 1;
313                                             return 0;
314                                         }
315                                     )
316                                 );
317                                 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
318                                 util.widgets.remove_children( e );
319                                 var ml = util.widgets.make_menulist(
320                                     items
321                                 );
322                                 e.appendChild( ml );
323                                 ml.setAttribute('id','bucket_menulist');
324                                 ml.setAttribute('accesskey','');
325
326                                 function change_bucket(ev) {
327                                     var bucket_id = ev.target.value;
328                                     if (bucket_id < 0 ) {
329                                         bucket_id = window.prompt($("catStrings").getString('staff.cat.record_buckets.change_bucket.bucket_id'));
330                                         ev.target.value = bucket_id;
331                                         ev.target.setAttribute('value',bucket_id);
332                                     }
333                                     if (!bucket_id) return;
334                                     var x = document.getElementById('info_box');
335                                     if (x) x.setAttribute('hidden','true');
336                                     x = document.getElementById('bucket_item_count');
337                                     if (x) x.setAttribute('label','');
338                                     obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
339                                     obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
340                                     obj.controller.view.record_buckets_export_records.disabled = true;
341                                     obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
342                                     obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
343                                     obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
344                                     obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','true');
345                                     obj.controller.view.cmd_marc_batch_edit.setAttribute('disabled','true');
346                                     obj.controller.view.record_buckets_list_actions.disabled = true;
347                                     var bucket = obj.network.simple_request(
348                                         'BUCKET_FLESH',
349                                         [ ses(), 'biblio', bucket_id ]
350                                     );
351                                     if (typeof bucket.ilsevent != 'undefined') {
352                                         if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
353                                             alert(catStrings.getFormattedString('staff.cat.record_buckets.menulist.change_bucket.undefined',[bucket_id]));
354                                         } else {
355                                             obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.change_bucket.error'),bucket);
356                                         }
357                                         return;
358                                     }
359                                     try {
360                                         obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
361                                         obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
362                                         obj.controller.view.record_buckets_export_records.disabled = false;
363                                         obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
364                                         obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
365                                         obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
366                                         obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','false');
367                                         obj.controller.view.cmd_marc_batch_edit.setAttribute('disabled','false');
368                                         obj.controller.view.record_buckets_list_actions.disabled = false;
369
370                                         var x = document.getElementById('info_box');
371                                         x.setAttribute('hidden','false');
372                                         x = document.getElementById('bucket_number');
373                                         x.setAttribute('value',bucket.id());
374                                         x = document.getElementById('bucket_name');
375                                         x.setAttribute('value',bucket.name());
376                                         x = document.getElementById('bucket_owner');
377                                         var s = bucket.owner(); JSAN.use('patron.util');
378                                         if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); 
379                                         x.setAttribute('value',s.family_name() + ' (' + s.card().barcode() + ") @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
380                                     } catch(E) {
381                                         alert(E);
382                                     }
383                                     var items = bucket.items() || [];
384                                     obj.list2.clear();
385                                     var x = document.getElementById('bucket_item_count');
386                                     if (x && catStrings) x.setAttribute('value',catStrings.getFormattedString('cat.total_bucket_items_in_bucket',[items.length]));
387                                     for (var i = 0; i < items.length; i++) {
388                                         var item = obj.prep_record_for_list( 
389                                             items[i].target_biblio_record_entry(),
390                                             items[i].id()
391                                         );
392                                         if (item) obj.list2.append( item );
393                                     }
394                                 }
395
396                                 ml.addEventListener( 'change_bucket', change_bucket , false);
397                                 ml.addEventListener( 'command', function() {
398                                     JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
399                                 }, false);
400                                 obj.controller.view.bucket_menulist = ml;
401                                 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
402                             };
403                         },
404                     ],
405
406                     'cmd_record_buckets_refresh' : [
407                         ['command'],
408                         function() {
409                             JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
410                         }
411                     ],
412
413                     'cmd_add_all_query_to_pending' : [
414                         ['command'],
415                         function() {
416                             obj.list0.select_all();
417                             for (var i = 0; i < obj.selection_list0.length; i++) {
418                                 var docid = obj.selection_list0[i].docid;
419                                 try {
420                                     var item = obj.prep_record_for_list( docid );
421                                     if (!item) continue;
422                                     obj.list1.append( item );
423                                     obj.record_ids.push( docid );
424                                 } catch(E) {
425                                     alert( js2JSON(E) );
426                                 }
427                             }
428                         }
429                     ],
430
431                     'cmd_add_sel_query_to_pending' : [
432                         ['command'],
433                         function() {
434                             for (var i = 0; i < obj.selection_list0.length; i++) {
435                                 var docid = obj.selection_list0[i].docid;
436                                 try {
437                                     var item = obj.prep_record_for_list( docid );
438                                     if (!item) continue;
439                                     obj.list1.append( item );
440                                     obj.record_ids.push( docid );
441                                 } catch(E) {
442                                     alert( js2JSON(E) );
443                                 }
444                             }
445                         }
446                     ],
447
448
449                     'cmd_add_all_pending_to_record_bucket' : [
450                         ['command'],
451                         function() {
452                             var bucket_id = obj.controller.view.bucket_menulist.value;
453                             if (!bucket_id) return;
454                             for (var i = 0; i < obj.record_ids.length; i++) {
455                                 var bucket_item = new cbrebi();
456                                 bucket_item.isnew('1');
457                                 bucket_item.bucket(bucket_id);
458                                 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
459                                 try {
460                                     var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
461                                         [ ses(), 'biblio', bucket_item ]);
462
463                                     if (typeof robj == 'object') throw robj;
464
465                                     var item = obj.prep_record_for_list( obj.record_ids[i], robj );
466                                     if (!item) continue;
467
468                                     obj.list2.append( item );
469                                 } catch(E) {
470                                     alert( js2JSON(E) );
471                                 }
472                             }
473                         }
474                     ],
475                     'cmd_add_sel_pending_to_record_bucket' : [
476                         ['command'],
477                         function() {                                                        
478                             var bucket_id = obj.controller.view.bucket_menulist.value;
479                             if (!bucket_id) return;
480                             for (var i = 0; i < obj.selection_list1.length; i++) {
481                                 var docid = obj.selection_list1[i].docid;
482                                 var bucket_item = new cbrebi();
483                                 bucket_item.isnew('1');
484                                 bucket_item.bucket(bucket_id);
485                                 bucket_item.target_biblio_record_entry( docid );
486                                 try {
487                                     var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
488                                         [ ses(), 'biblio', bucket_item ]);
489
490                                     if (typeof robj == 'object') throw robj;
491
492                                     var item = obj.prep_record_for_list( docid, robj );
493                                     if (!item) continue;
494
495                                     obj.list2.append( item );
496                                 } catch(E) {
497                                     alert( js2JSON(E) );
498                                 }
499                             }
500
501                         }
502                     ],
503                     'cmd_record_buckets_to_pending_buckets' : [
504                         ['command'],
505                         function() {                                                        
506                             for (var i = 0; i < obj.selection_list2.length; i++) {
507                                 var docid = obj.selection_list2[i].docid;
508                                 var item = obj.prep_record_for_list( docid );
509                                 if (item) {
510                                     obj.list1.append( item );
511                                     obj.record_ids.push( docid );
512                                 }
513                             }
514                         }
515                     ],
516
517                     'cmd_record_buckets_delete_item' : [
518                         ['command'],
519                         function() {
520                             for (var i = 0; i < obj.selection_list2.length; i++) {
521                                 try {
522                                     var bucket_item_id = obj.selection_list2[i].bucket_item_id;
523                                     var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
524                                         [ ses(), 'biblio', bucket_item_id ]);
525                                     if (typeof robj == 'object') throw robj;
526                                 } catch(E) {
527                                     alert(js2JSON(E));
528                                 }
529                                                         }
530                             setTimeout(
531                                 function() {
532                                     JSAN.use('util.widgets'); 
533                                     util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
534                                 }, 0
535                             );
536                         }
537                     ],
538                     'cmd_record_buckets_delete_bucket' : [
539                         ['command'],
540                         function() {
541                             try {
542                                 var bucket = obj.controller.view.bucket_menulist.value;
543                                 var name = obj.bucket_id_name_map[ bucket ];
544                                 var conf = window.confirm($("catStrings").getFormattedString('staff.cat.record_buckets.delete_bucket_named', [name]));
545                                 if (!conf) return;
546                                 obj.list2.clear();
547                                 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
548                                 if (typeof robj == 'object') throw robj;
549                                 var x = document.getElementById('info_box');
550                                 x.setAttribute('hidden','true');
551                                 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
552                                 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
553                                 obj.controller.view.record_buckets_export_records.disabled = true;
554                                 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
555                                 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
556                                 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
557                                 obj.controller.view.cmd_transfer_title_holds.setAttribute('disabled','true');
558                                 obj.controller.view.cmd_marc_batch_edit.setAttribute('disabled','true');
559                                 obj.controller.view.record_buckets_list_actions.disabled = true;
560                                 obj.controller.render('record_buckets_menulist_placeholder');
561                                 setTimeout(
562                                     function() {
563                                         JSAN.use('util.widgets'); 
564                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
565                                     }, 0
566                                 );
567
568                             } catch(E) {
569                                 alert('FIXME: ' + E);
570                             }
571                         }
572                     ],
573                     'cmd_record_buckets_new_bucket' : [
574                         ['command'],
575                         function() {
576                             try {
577                                 var name = prompt(
578                                     $("catStrings").getString('staff.cat.record_buckets.new_bucket.bucket_prompt'),
579                                     '',
580                                     $("catStrings").getString('staff.cat.record_buckets.new_bucket.bucket_prompt_title')
581                                 );
582
583                                 if (name) {
584                                     var bucket = new cbreb();
585                                     bucket.btype('staff_client');
586                                     bucket.owner( obj.data.list.au[0].id() );
587                                     bucket.name( name );
588
589                                     var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
590
591                                     if (typeof robj == 'object') {
592                                         if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
593                                             alert($("catStrings").getString('staff.cat.record_buckets.new_bucket.same_name_alert'));
594                                             return;
595                                         }
596                                         throw robj;
597                                     }
598
599                                     obj.controller.render('record_buckets_menulist_placeholder');
600                                     obj.controller.view.bucket_menulist.value = robj;
601                                     setTimeout(
602                                         function() {
603                                             JSAN.use('util.widgets'); 
604                                             util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
605                                         }, 0
606                                     );
607                                 }
608                             } catch(E) {
609                                 alert( js2JSON(E) );
610                             }
611                         }
612                     ],
613                     
614                     'cmd_record_query_csv_to_clipboard' : [ ['command'], function() { obj.list0.dump_csv_to_clipboard(); } ], 
615                     'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ], 
616                     'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
617                     'cmd_record_query_csv_to_printer' : [ ['command'], function() { obj.list0.dump_csv_to_printer(); } ],
618                     'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
619                     'cmd_record_buckets_csv_to_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ], 
620                     'cmd_record_query_csv_to_file' : [ ['command'], function() { obj.list0.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
621                     'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
622                     'cmd_record_buckets_csv_to_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ], 
623
624                     'cmd_export_records_usmarc' : [
625                         ['command'],
626                         function () { return cat.record_buckets.export_records(obj, 'usmarc') }
627                     ],
628
629                     'cmd_export_records_unimarc' : [
630                         ['command'],
631                         function () { return cat.record_buckets.export_records(obj, 'unimarc') }
632                     ],
633
634                     'cmd_export_records_xml' : [
635                         ['command'],
636                         function () { return cat.record_buckets.export_records(obj, 'xml') }
637                     ],
638
639                     'cmd_export_records_bre' : [
640                         ['command'],
641                         function () { return cat.record_buckets.export_records(obj, 'bre') }
642                     ],
643
644                     'cmd_merge_records' : [
645                         ['command'],
646                         function() {
647                             try {
648                                 obj.list2.select_all();
649                                 obj.data.stash_retrieve();
650                                 JSAN.use('util.functional');
651
652                                 var record_ids = util.functional.map_list(
653                                     obj.list2.dump_retrieve_ids(),
654                                     function (o) {
655                                         return JSON2js(o).docid; // docid
656                                     }
657                                 );
658
659                                 xulG.new_tab(
660                                     '/xul/server/cat/bibs_abreast.xul',{
661                                         'tab_name' : $("catStrings").getString('staff.cat.record_buckets.merge_records.fancy_prompt_title')
662                                     },{
663                                         'merge' : true,
664                                         'on_merge' : function() {
665                                             obj.render_pending_records(); // FIXME -- need a generic refresh for lists
666                                             setTimeout(
667                                                 function() {
668                                                     JSAN.use('util.widgets'); 
669                                                     util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
670                                                 }, 0
671                                             );
672                                         },
673                                         'record_ids':record_ids
674                                     }
675                                 );
676
677                             } catch(E) {
678                                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.merge_records.catch.std_unex_error'),E);
679                             }
680
681                         }
682                     ],
683                     
684                     'cmd_delete_records' : [
685                         ['command'],
686                         function() {
687                             try {
688                                 obj.list2.select_all();
689                                 obj.data.stash_retrieve();
690                                 JSAN.use('util.functional');
691
692                                 var record_ids = util.functional.map_list(
693                                     obj.list2.dump_retrieve_ids(),
694                                     function (o) {
695                                         return JSON2js(o).docid; // docid
696                                     }
697                                 );
698
699                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
700                                 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
701                                 top_xml += '<description>' + $("catStrings").getString('staff.cat.record_buckets.delete_records.xml1') + '</description>';
702                                 top_xml += '<hbox>';
703                                 top_xml += '<button id="lead" disabled="false" label="'
704                                         + $("catStrings").getString('staff.cat.record_buckets.delete_records.button.label')
705                                         + '" name="fancy_submit"/>';
706                                 top_xml += '<button label="'
707                                         + $("catStrings").getString('staff.cat.record_buckets.delete_records.cancel_button.label') +'" accesskey="'
708                                         + $("catStrings").getString('staff.cat.record_buckets.delete_records.cancel_button.accesskey') +'" name="fancy_cancel"/></hbox></vbox>';
709
710                                 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
711                                 xml += '<table><tr valign="top">';
712                                 for (var i = 0; i < record_ids.length; i++) {
713                                     xml += '<td>' + $("catStrings").getFormattedString('staff.cat.record_buckets.delete_records.xml2', [record_ids[i]]) + '</td>';
714                                 }
715                                 xml += '</tr><tr valign="top">';
716                                 for (var i = 0; i < record_ids.length; i++) {
717                                     xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF; 
718                                     xml += '?docid=' + record_ids[i] + '"/></td>';
719                                 }
720                                 xml += '</tr><tr valign="top">';
721                                 for (var i = 0; i < record_ids.length; i++) {
722                                     xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="' + urls.XUL_MARC_VIEW + '?docid=' + record_ids[i] + ' "/></td>';
723                                 }
724                                 xml += '</tr></table></form>';
725                                 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
726                                 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
727                                 JSAN.use('util.window'); var win = new util.window();
728                                 var fancy_prompt_data = win.open(
729                                     urls.XUL_FANCY_PROMPT,
730                                     //+ '?xml_in_stash=temp_merge_mid'
731                                     //+ '&top_xml_in_stash=temp_merge_top'
732                                     //+ '&title=' + window.escape('Record Purging'),
733                                     'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
734                                     {
735                                         'top_xml' : top_xml, 'xml' : xml, 'title' : $("catStrings").getString('staff.cat.record_buckets.delete_records.fancy_prompt_title')
736                                     }
737                                 );
738                                 //obj.data.stash_retrieve();
739                                 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') {
740                                     alert($("catStrings").getString('staff.cat.record_buckets.delete_records.fancy_prompt.alert'));
741                                     return;
742                                 }
743                                 var s = '';
744                                 for (var i = 0; i < record_ids.length; i++) {
745                                     var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
746                                     if (typeof robj.ilsevent != 'undefined') {
747                                         if (!s) s = $("catStrings").getString('staff.cat.record_buckets.delete_records.s1');
748                                         s += $("catStrings").getFormattedString('staff.cat.record_buckets.delete_records.s2', [record_ids[i], robj.textcode, robj.desc]);
749                                     }
750                                 }
751                                 if (s) { alert(s); }
752
753                                 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
754                                 setTimeout(
755                                     function() {
756                                         JSAN.use('util.widgets'); 
757                                         util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
758                                     }, 0
759                                 );
760                             } catch(E) {
761                                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.delete_records.catch.std_unex_err',E));
762                             }
763
764                         }
765                     ],
766
767                     'cmd_broken' : [
768                         ['command'],
769                         function() { alert($("catStrings").getString('staff.cat.record_buckets.cmd_broken.alert')); }
770                     ],
771                     'cmd_sel_opac' : [
772                         ['command'],
773                         function() {
774                             try {
775                                 obj.list2.select_all();
776                                 JSAN.use('util.functional');
777                                 var docids = util.functional.map_list(
778                                     obj.list2.dump_retrieve_ids(),
779                                     function (o) {
780                                         return JSON2js(o).docid; // docid
781                                     }
782                                 );
783                                 var seen = {};
784                                 for (var i = 0; i < docids.length; i++) {
785                                     var doc_id = docids[i];
786                                     if (seen[doc_id]) continue; seen[doc_id] = true;
787                                     var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
788                                     var content_params = { 
789                                         'session' : ses(),
790                                         'authtime' : ses('authtime'),
791                                         'opac_url' : opac_url
792                                     };
793                                     xulG.new_tab(
794                                         xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
795                                         {'tab_name':$("catStrings").getString('staff.cat.record_buckets.cmd_sel_opac.tab_name')}, 
796                                         content_params
797                                     );
798                                 }
799                             } catch(E) {
800                                 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.record_buckets.cmd_sel_opac.catch.std_unex_err'),E);
801                             }
802                         }
803                     ],
804                     'cmd_marc_batch_edit' : [
805                         ['command'],
806                         function() {
807                             try {
808                                 var bucket_id = obj.controller.view.bucket_menulist.value;
809                                 if (!bucket_id) return;
810                                 obj.list2.select_all();
811                                 xulG.new_tab(
812                                     urls.MARC_BATCH_EDIT + '?containerid='+bucket_id+'&recordSource=b', 
813                                     {
814                                         'tab_name' : $('offlineStrings').getString('menu.cmd_marc_batch_edit.tab')
815                                     },
816                                     {}
817                                 );
818                             } catch(E) {
819                                 alert('Error in record_buckets.js, cmd_marc_batch_edit: ' + E);
820                             }
821                         }
822                     ],
823                     'cmd_transfer_title_holds' : [
824                         ['command'],
825                         function() {
826                             try {
827                                 obj.list2.select_all();
828                                 JSAN.use('util.functional');
829                                 var docids = util.functional.map_list(
830                                     obj.list2.dump_retrieve_ids(),
831                                     function (o) {
832                                         return JSON2js(o).docid; // docid
833                                     }
834                                 );
835                                 JSAN.use('cat.util');
836                                 cat.util.transfer_title_holds(docids);
837                             } catch(E) {
838                                 alert('Error in record_buckets.js, cmd_transfer_title_holds: ' + E);
839                             }
840                         }
841                     ],
842
843                     'record_buckets_export_records' : [ ['render'], function(){} ],
844                     'record_buckets_list_actions' : [ ['render'], function(){} ]
845                 }
846             }
847         );
848         this.controller.render();
849
850         if (typeof xulG == 'undefined') {
851             obj.controller.view.cmd_sel_opac.disabled = true;
852             obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
853         }
854     },
855
856     'submit' : function() {
857         try {
858             var obj = this;
859             var x = document.getElementById('record_query_input'); 
860             if (x.value == '') {
861                 setTimeout( function() { obj.controller.view.record_query_input.focus(); obj.controller.view.record_query_input.select(); }, 0 );
862                 return;
863             }
864             obj.list0.clear();
865             var y = document.getElementById('query_status');
866             x.disabled = true;
867             if (y) y.value = $("catStrings").getString('staff.cat.record_buckets.submit.query_status');
868             obj.network.simple_request(
869                 'FM_BRE_ID_SEARCH_VIA_MULTICLASS_QUERY',
870                 [ { 'limit' : 100 }, x.value, 1 ],
871                 function(req) {
872                     try {
873                         var resp = req.getResultObject();
874                         if (y) y.value = catStrings.getFormattedString('cat.results_returned',[resp.count]);
875                         x.disabled = false;
876                         if (resp.count > 0) {
877                             JSAN.use('util.exec'); var exec = new util.exec();
878                             var funcs = [];
879                             for (var i = 0; i < resp.ids.length; i++) {
880                                 funcs.push(
881                                     function(b){
882                                         return function() {
883                                             obj.list0.append(obj.prep_record_for_list(b));
884                                         };
885                                     }(resp.ids[i][0])
886                                 );
887                             }
888                             funcs.push(
889                                 function() {
890                                     obj.controller.view.record_query_input.focus();
891                                     obj.controller.view.record_query_input.select();
892                                 }
893                             );
894                             exec.chain( funcs ); 
895                         } else {
896                             setTimeout( function() { obj.controller.view.record_query_input.focus(); obj.controller.view.record_query_input.select(); }, 0 );
897                         }
898                     } catch(E) {
899                         obj.error.standard_unexpected_error_alert('submit_query_callback',E);
900                     }
901                 }
902             );
903         } catch(E) {
904             this.error.standard_unexpected_error_alert('submit_query',E);
905         }
906     },
907
908     'prep_record_for_list' : function(docid,bucket_item_id) {
909         var obj = this;
910         try {
911             var item = {
912                 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
913                 'row' : {
914                     'my' : {
915                         'docid' : docid,
916                         'bucket_item_id' : bucket_item_id
917                     }
918                 }
919             };
920             return item;
921         } catch(E) {
922             obj.error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.record_buckets.prep_record_for_list.std_unex_err', [docid]),E);
923             return null;
924         }
925     }
926     
927 };
928
929 dump('exiting cat.record_buckets.js\n');