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