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