]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/serial/manage_dists.js
Merge branch 'template-toolkit-opac' of git.evergreen-ils.org:evergreen/equinox into...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / serial / manage_dists.js
1 dump('entering serial/manage_dists.js\n');
2 // vim:et:sw=4:ts=4:
3
4 if (typeof serial == 'undefined') serial = {};
5 serial.manage_dists = function (params) {
6     try {
7         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
8         JSAN.use('util.error'); this.error = new util.error();
9     } catch(E) {
10         dump('serial/manage_dists: ' + E + '\n');
11     }
12 };
13
14 serial.manage_dists.prototype = {
15
16     'map_tree' : {},
17     'map_sdist' : {},
18     'map_sstr' : {},
19     'sel_list' : [],
20     'funcs' : [],
21     'editor_indexes' : { 'sdist' : 1, 'sstr' : 2, 'sbsum' : 3, 'sssum' : 4, 'sisum' : 5 },
22
23     'ids_from_sel_list' : function(type) {
24         var obj = this;
25         JSAN.use('util.functional');
26
27         var list = util.functional.map_list(
28             util.functional.filter_list(
29                 obj.sel_list,
30                 function (o) {
31                     return o.split(/_/)[0] == type;
32                 }
33             ),
34             function (o) {
35                 return o.split(/_/)[1];
36             }
37         );
38
39         return list;
40     },
41
42     'editor_init' : function(type, mode, params) {
43         var obj = this;
44         try {
45             $('serial_manage_dists_editor_deck').selectedIndex = obj.editor_indexes[type];
46             var editor_type = type + '_editor';
47             if (typeof obj[editor_type] == 'undefined') {
48                 JSAN.use('serial.' + editor_type);
49                 obj[editor_type] = new serial[editor_type](); 
50             }
51
52             params.do_edit = true;
53             params.handle_update = true;
54             if (mode == 'add') {
55                 params.trigger_refresh = true;
56                 params.refresh_command = function () {obj.refresh_list();};
57             }
58             obj[editor_type].init(params);
59         } catch(E) {
60             obj.error.standard_unexpected_error_alert('editor_init() error',E);
61         }
62     },
63
64     'do_delete' : function(type, method, overridable_events) {
65         var obj = this;
66         try {
67             JSAN.use('util.functional');
68
69             var list = util.functional.filter_list(
70                 obj.sel_list,
71                 function (o) {
72                     return o.split(/_/)[0] == type;
73                 }
74             );
75
76             list = util.functional.map_list(
77                 list,
78                 function (o) {
79                     return JSON2js( js2JSON( obj['map_' + type][ type + '_' + o.split(/_/)[1] ] ) );
80                 }
81             );
82
83             //TODO: proper messages
84             var delete_msg;
85             if (list.length != 1) {
86                 delete_msg = document.getElementById('serialStrings').getFormattedString('staff.serial.manage_dists.delete_' + type + '.confirm.plural', [list.length]);
87             } else {
88                 delete_msg = document.getElementById('serialStrings').getString('staff.serial.manage_dists.delete_' + type + '.confirm');
89             }
90             var r = obj.error.yns_alert(
91                     delete_msg,
92                     document.getElementById('serialStrings').getString('staff.serial.manage_dists.delete_' + type + '.title'),
93                     document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.delete'),
94                     document.getElementById('catStrings').getString('staff.cat.copy_browser.delete_items.cancel'),
95                     null,
96                     document.getElementById('commonStrings').getString('common.confirm')
97             );
98
99             if (r == 0) {
100                 for (var i = 0; i < list.length; i++) {
101                     list[i].isdeleted('1');
102                 }
103                 var robj = obj.network.request(
104                     'open-ils.serial', 
105                     method, 
106                     [ ses(), list, true ],
107                     null,
108                     {
109                         'title' : document.getElementById('serialStrings').getString('staff.serial.manage_dists.delete_' + type + '.override'),
110                         'overridable_events' : overridable_events
111                     }
112                 );
113                 if (robj == null) throw(robj);
114                 if (typeof robj.ilsevent != 'undefined') {
115                     if (robj.ilsevent != 0) {
116                         var overridable = false;
117                         for (i = 0; i < overridable_events.length; i++) {
118                             if (overridable_events[i] == robj.ilsevent) {
119                                 overridable = true;
120                                 break;
121                             }
122                         }
123                         if (!overridable) throw(robj);
124                     }
125                 }
126                 obj.refresh_list();
127             }
128         } catch(E) {
129             obj.error.standard_unexpected_error_alert(document.getElementById('serialStrings').getString('staff.serial.manage_dists.delete.error'),E);
130             obj.refresh_list();
131         }
132     },
133
134     'init' : function( params ) {
135
136         try {
137             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
138             var obj = this;
139
140             obj.docid = params.docid;
141
142             JSAN.use('util.network'); obj.network = new util.network();
143             JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
144             JSAN.use('util.controller'); obj.controller = new util.controller();
145             obj.controller.init(
146                 {
147                     control_map : {
148                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
149                         'sel_clip' : [
150                             ['command'],
151                             function() { obj.list.clipboard(); }
152                         ],
153                         'cmd_broken' : [
154                             ['command'],
155                             function() { 
156                                 alert(document.getElementById('commonStrings').getString('common.unimplemented'));
157                             }
158                         ],
159                         'cmd_show_my_libs' : [
160                             ['command'],
161                             function() { 
162                                 obj.show_my_libs(); 
163                             }
164                         ],
165                         'cmd_clear' : [
166                             ['command'],
167                             function() {
168                                 obj.map_tree = {};
169                                 obj.list.clear();
170                             }
171                         ],
172                         'cmd_add_sstr' : [
173                             ['command'],
174                             function() {
175                                 try {
176                                     var list = obj.ids_from_sel_list('sdist');
177                                     if (list.length == 0) list = obj.ids_from_sel_list('sstr-group');
178                                     if (list.length == 0) return;
179
180                                     /*TODO: permission check?
181                                     //populate 'list' with owning_libs of subs, TODO
182                                     var edit = 0;
183                                     try {
184                                         edit = obj.network.request(
185                                             api.PERM_MULTI_ORG_CHECK.app,
186                                             api.PERM_MULTI_ORG_CHECK.method,
187                                             [ 
188                                                 ses(), 
189                                                 obj.data.list.au[0].id(), 
190                                                 list,
191                                                 [ 'CREATE_COPY' ]
192                                             ]
193                                         ).length == 0 ? 1 : 0;
194                                     } catch(E) {
195                                         obj.error.sdump('D_ERROR','batch permission check: ' + E);
196                                     }
197
198                                     if (edit==0) return; // no read-only view for this interface */
199                                     var new_sstr = new sstr();
200                                     new_sstr.distribution(list[0]);//TODO: add multiple at once support?
201                                     new_sstr.isnew(1);
202                                     var params = {};
203                                     params.sstrs = [new_sstr];
204                                     obj.editor_init('sstr', 'add', params);
205                                 } catch(E) {
206                                     obj.error.standard_unexpected_error_alert($('serialStrings').getString('staff.serial.manage_dists.add.error'),E);
207                                 }
208                             }
209                         ],
210                         'cmd_delete_sstr' : [
211                             ['command'],
212                             function() {
213                                 var overridable_events = [ //TODO: proper overrides
214                                 ];
215                                 obj.do_delete('sstr', 'open-ils.serial.stream.batch.update', overridable_events);
216                             }
217                         ],
218                         'cmd_mark_library' : [
219                             ['command'],
220                             function() {
221                                 try {
222                                     var list = obj.ids_from_sel_list('aou');
223                                     if (list.length == 1) {
224                                         obj.data.marked_library = { 'lib' : list[0], 'docid' : obj.docid };
225                                         obj.data.stash('marked_library');
226                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.alert'));
227                                     } else {
228                                         obj.error.yns_alert(
229                                                 document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.prompt'),
230                                                 document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_library.title'),
231                                                 document.getElementById('commonStrings').getString('common.ok'),
232                                                 null,
233                                                 null,
234                                                 document.getElementById('commonStrings').getString('common.confirm')
235                                                 );
236                                     }
237                                 } catch(E) {
238                                     obj.error.standard_unexpected_error_alert('manage_dists.js -> mark library',E);
239                                 }
240                             }
241                         ],
242
243                         'cmd_mark_distribution' : [
244                             ['command'],
245                             function() {
246                                 try {
247                                     var list = obj.ids_from_sel_list('sdist');
248                                     if (list.length == 1) {
249                                         obj.data.marked_distribution = list[0];
250                                         obj.data.stash('marked_distribution');
251                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.alert'));
252                                     } else {
253                                         obj.error.yns_alert(
254                                                 document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.prompt'),
255                                                 document.getElementById('catStrings').getString('staff.cat.copy_browser.mark_volume.title'),
256                                                 document.getElementById('commonStrings').getString('common.ok'),
257                                                 null,
258                                                 null,
259                                                 document.getElementById('commonStrings').getString('common.confirm')
260                                                 );
261                                     }
262                                 } catch(E) {
263                                     obj.error.standard_unexpected_error_alert('manage_dists.js -> mark distribution',E);
264                                 }
265                             }
266                         ],
267                         'cmd_transfer_distribution' : [
268                             ['command'],
269                             function() {
270                                 try {
271                                     obj.data.stash_retrieve();
272                                     if (!obj.data.marked_library) {
273                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_volume.alert'));
274                                         return;
275                                     }
276                                     
277                                     var list = obj.ids_from_sel_list('sdist');
278
279                                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
280
281                                     JSAN.use('util.functional');
282
283                                     var sdist_list = util.functional.map_list(
284                                         list,
285                                         function (o) {
286                                             return obj.map_sdist[ 'sdist_' + o ].start_date();
287                                         }
288                                     ).join(document.getElementById('commonStrings').getString('common.grouping_string'));
289
290                                     var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
291                                     xml += '<description>';
292                                     xml += document.getElementById('catStrings').getFormattedString('staff.cat.copy_browser.transfer.prompt', [sdist_list, obj.data.hash.aou[ obj.data.marked_library.lib ].shortname()]);
293                                     xml += '</description>';
294                                     xml += '<hbox><button label="' + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.submit.label') + '" name="fancy_submit"/>';
295                                     xml += '<button label="' 
296                                         + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.cancel.label') 
297                                         + '" accesskey="' 
298                                         + document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.cancel.accesskey') 
299                                         + '" name="fancy_cancel"/></hbox>';
300                                     xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
301                                     xml += '</vbox>';
302                                     JSAN.use('OpenILS.data');
303                                     var data = new OpenILS.data(); data.init({'via':'stash'});
304                                     //data.temp_transfer = xml; data.stash('temp_transfer');
305                                     JSAN.use('util.window'); var win = new util.window();
306                                     var fancy_prompt_data = win.open(
307                                         urls.XUL_FANCY_PROMPT,
308                                         //+ '?xml_in_stash=temp_transfer'
309                                         //+ '&title=' + window.escape('Volume Transfer'),
310                                         'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
311                                         {
312                                             'xml' : xml,
313                                             'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.title')
314                                         }
315                                     );
316
317                                     if (fancy_prompt_data.fancy_status == 'incomplete') {
318                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.incomplete'));
319                                         return;
320                                     }
321
322                                     var robj = obj.network.simple_request(
323                                         'FM_ACN_TRANSFER', 
324                                         [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'distributions' : list } ],
325                                         null,
326                                         {
327                                             'title' : document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.override.failure'),
328                                             'overridable_events' : [
329                                                 1208, // TITLE_LAST_COPY
330                                                 1219, // COPY_REMOTE_CIRC_LIB
331                                             ],
332                                         }
333                                     );
334
335                                     if (typeof robj.ilsevent != 'undefined') {
336                                         if (robj.ilsevent == 1221) { // ORG_CANNOT_HAVE_VOLS
337                                             alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.ineligible_destination'));
338                                         } else {
339                                             throw(robj);
340                                         }
341                                     } else {
342                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.success'));
343                                     }
344
345                                 } catch(E) {
346                                     obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer.unexpected_error'),E);
347                                 }
348                                 obj.refresh_list();
349                             }
350                         ],
351
352                         'cmd_transfer_sstrs' : [
353                             ['command'],
354                             function() {
355                                 try {
356                                     obj.data.stash_retrieve();
357                                     if (!obj.data.marked_distribution) {
358                                         alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_items.missing_volume'));
359                                         return;
360                                     }
361                                     
362                                     JSAN.use('util.functional');
363
364                                     var list = obj.ids_from_sel_list('sstr');
365                                     var distribution = obj.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ obj.data.marked_distribution ]);
366
367                                     JSAN.use('cat.util'); cat.util.transfer_copies( { 
368                                         'distribution_ids' : list, 
369                                         'docid' : distribution.record(),
370                                         'distribution_label' : distribution.start_date(),
371                                         'owning_lib' : distribution.owning_lib(),
372                                     } );
373
374                                 } catch(E) {
375                                     obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.transfer_items.unexpected_error'),E);
376                                 }
377                                 obj.refresh_list();
378                             }
379                         ],
380                         'cmd_refresh_list' : [
381                             ['command'],
382                             function() {
383                                 obj.refresh_list();
384                             }
385                         ],
386 /*dbw2                      'sel_distribution_details' : [
387                             ['command'],
388                             function() {
389                                 JSAN.use('util.functional');
390
391                                 var list = util.functional.filter_list(
392                                     obj.sel_list,
393                                     function (o) {
394                                         return o.split(/_/)[0] == 'sstr';
395                                     }
396                                 );
397
398                                 list = util.functional.map_list(
399                                     list,
400                                     function (o) {
401                                         return o.split(/_/)[1];
402                                     }
403                                 );
404     
405                                 JSAN.use('circ.util');
406                                 for (var i = 0; i < list.length; i++) {
407                                     circ.util.show_copy_details( list[i] );
408                                 }
409                             }
410                         ],
411                         'cmd_edit_sstrs' : [
412                             ['command'],
413                             function() {
414                                 try {
415                                     JSAN.use('util.functional');
416
417                                     var list = util.functional.filter_list(
418                                         obj.sel_list,
419                                         function (o) {
420                                             return o.split(/_/)[0] == 'sstr';
421                                         }
422                                     );
423
424                                     list = util.functional.map_list(
425                                         list,
426                                         function (o) {
427                                             return o.split(/_/)[1];
428                                         }
429                                     );
430
431                                     JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
432                                     obj.refresh_list();
433
434                                 } catch(E) {
435                                     obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.edit_items.error'),E);
436                                 }
437                             }
438                         ], dbw2*/
439
440 /*dbw2                      'cmd_print_spine_labels' : [
441                             ['command'],
442                             function() {
443                                 try {
444                                     JSAN.use('util.functional');
445                                     
446                                     var list = util.functional.filter_list(
447                                         obj.sel_list,
448                                         function (o) {
449                                             return o.split(/_/)[0] == 'sstr';
450                                         }
451                                     );
452
453                                     list = util.functional.map_list(
454                                         list,
455                                         function (o) {
456                                             return obj.map_sstr[ o ];
457                                         }
458                                     );
459
460                                     obj.data.temp_barcodes_for_labels = util.functional.map_list( list, function(o){return o.barcode();}) ; 
461                                     obj.data.stash('temp_barcodes_for_labels');
462                                     xulG.new_tab(
463                                         xulG.url_prefix( urls.XUL_SPINE_LABEL ),
464                                         { 'tab_name' : document.getElementById('catStrings').getString('staff.cat.copy_browser.print_spine.tab') },
465                                         {}
466                                     );
467                                 } catch(E) {
468                                     obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.print_spine.error'),E);
469                                 }
470                             }
471                         ]
472                         dbw2*/
473                     }
474                 }
475             );
476
477             obj.list_init(params);
478
479             obj.org_ids = obj.network.simple_request('FM_SDIST_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative',[ obj.docid ]);
480             if (typeof obj.org_ids.ilsevent != 'undefined') throw(obj.org_ids);
481             JSAN.use('util.functional'); 
482             obj.org_ids = util.functional.map_list( obj.org_ids, function (o) { return Number(o); });
483
484             var org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
485             //obj.show_libs( org );
486
487             //obj.show_my_libs();
488
489             JSAN.use('util.file'); JSAN.use('util.widgets');
490
491             var file; var list_data; var ml; 
492
493             file = new util.file('offline_ou_list'); 
494             if (file._file.exists()) {
495                 list_data = file.get_object(); file.close();
496                 for (var i = 0; i < list_data[0].length; i++) { // make sure all entries are enabled
497                     list_data[0][i][2] = false;
498                 }
499                 ml = util.widgets.make_menulist( list_data[0], list_data[1] );
500                 ml.setAttribute('id','sdist_lib_menu'); document.getElementById('serial_dist_lib_menu').appendChild(ml);
501                 //TODO: class this menu properly
502                 for (var i = 0; i < obj.org_ids.length; i++) {
503                     ml.getElementsByAttribute('value',obj.org_ids[i])[0].setAttribute('class','has_distributions');
504                 }
505                 ml.firstChild.addEventListener(
506                     'popupshown',
507                     function(ev) {
508                         document.getElementById('legend').setAttribute('hidden','false');
509                     },
510                     false
511                 );
512                 ml.firstChild.addEventListener(
513                     'popuphidden',
514                     function(ev) {
515                         document.getElementById('legend').setAttribute('hidden','true');
516                     },
517                     false
518                 );
519                 ml.addEventListener(
520                     'command',
521                     function(ev) {
522                         if (document.getElementById('refresh_button')) document.getElementById('refresh_button').focus(); 
523                         JSAN.use('util.file'); var file = new util.file('manage_dists_prefs.'+obj.data.server_unadorned);
524                         util.widgets.save_attributes(file, { 'sdist_lib_menu' : [ 'value' ], 'show_sdists' : [ 'checked' ], 'show_sdist_groups' : [ 'checked' ] });
525                         obj.refresh_list();
526                     },
527                     false
528                 );
529             } else {
530                 throw(document.getElementById('catStrings').getString('staff.cat.copy_browser.missing_library') + '\n');
531             }
532
533             file = new util.file('manage_dists_prefs.'+obj.data.server_unadorned);
534             util.widgets.load_attributes(file);
535             obj.default_lib = ml.getAttribute('value');
536             ml.value = obj.default_lib;
537             if (! obj.default_lib) {
538                 obj.default_lib = org.id();
539                 ml.setAttribute('value',obj.default_lib);
540                 ml.value = obj.default_lib;
541             }
542
543             document.getElementById('show_sdists').addEventListener(
544                 'command',
545                 function(ev) {
546                     JSAN.use('util.file'); var file = new util.file('manage_dists_prefs.'+obj.data.server_unadorned);
547                     util.widgets.save_attributes(file, { 'sdist_lib_menu' : [ 'value' ], 'show_sdists' : [ 'checked' ], 'show_sdist_groups' : [ 'checked' ] });
548                 },
549                 false
550             );
551
552             document.getElementById('show_sdist_groups').addEventListener(
553                 'command',
554                 function(ev) {
555                     JSAN.use('util.file'); var file = new util.file('manage_dists_prefs.'+obj.data.server_unadorned);
556                     util.widgets.save_attributes(file, { 'sdist_lib_menu' : [ 'value' ], 'show_sdists' : [ 'checked' ], 'show_sdist_groups' : [ 'checked' ] });
557                 },
558                 false
559             );
560
561             obj.show_my_libs( obj.default_lib );
562
563             JSAN.use('util.exec'); var exec = new util.exec(20); exec.timer(obj.funcs,100);
564
565             obj.toggle_actions(); // disable menus initially
566
567         } catch(E) {
568             this.error.standard_unexpected_error_alert('serial/manage_dists.init: ',E);
569         }
570     },
571
572     'show_my_libs' : function(org) {
573         var obj = this;
574         try {
575             if (!org) {
576                 org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
577             } else {
578                 if (typeof org != 'object') org = obj.data.hash.aou[ org ];
579             }
580             obj.show_libs( org, false );
581         } catch(E) {
582             alert(E);
583         }
584     },
585
586     'show_libs' : function(start_aou,show_open) {
587         var obj = this;
588         try {
589             if (!start_aou) throw('show_libs: Need a start_aou');
590             JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
591             JSAN.use('util.functional'); 
592
593             var parents = [];
594             var temp_aou = start_aou;
595             while ( temp_aou.parent_ou() ) {
596                 temp_aou = obj.data.hash.aou[ temp_aou.parent_ou() ];
597                 parents.push( temp_aou );
598             }
599             parents.reverse();
600
601             for (var i = 0; i < parents.length; i++) {
602                 obj.funcs.push(
603                     function(o,p) {
604                         return function() { 
605                             obj.append_org(o,p,{'container':'true','open':'true'}); 
606                         };
607                     }(parents[i], obj.data.hash.aou[ parents[i].parent_ou() ])
608                 );
609             }
610
611             obj.funcs.push(
612                 function(o,p) {
613                     return function() { obj.append_org(o,p); };
614                 }(start_aou,obj.data.hash.aou[ start_aou.parent_ou() ])
615             );
616
617             obj.funcs.push(
618                 function() {
619                     if (start_aou.children()) {
620                         var x = obj.map_tree[ 'aou_' + start_aou.id() ];
621                         x.setAttribute('container','true');
622                         if (show_open) x.setAttribute('open','true');
623                         for (var i = 0; i < start_aou.children().length; i++) {
624                             obj.funcs.push(
625                                 function(o,p) {
626                                     return function() { obj.append_org(o,p); };
627                                 }( start_aou.children()[i], start_aou )
628                             );
629                         }
630                     }
631                 }
632             );
633
634         } catch(E) {
635             alert(E);
636         }
637     },
638
639     'on_select' : function(list,twisty) {
640         var obj = this;
641         var sel_lists = {};
642
643         for (var i = 0; i < list.length; i++) {
644             var row_type = list[i].split('_')[0];
645             var id = list[i].split('_')[1];
646
647             if (!sel_lists[row_type]) sel_lists[row_type] = [];
648             sel_lists[row_type].push(id);
649
650             switch(row_type) {
651                 case 'aou' : obj.on_click_aou(id,twisty); break;
652                 case 'sdist' : obj.on_select_sdist(id,twisty); break;
653                 default: break;
654             }
655         }
656
657         if (!obj.focused_node_retrieve_id) return;
658
659         var row_type = obj.focused_node_retrieve_id.split('_')[0];
660         var id = obj.focused_node_retrieve_id.split('_')[1];
661
662         if (sel_lists[row_type]) { // the type focused is in the selection (usually the case)
663             switch(row_type) {
664                 case 'aou' : obj.on_click_aou(id,twisty); break;
665                 default: if (obj['on_click_' + row_type]) obj['on_click_' + row_type](sel_lists[row_type],twisty);
666             }
667         }
668     },
669
670     'on_select_sdist' : function(sdist_id,twisty) {
671         var obj = this;
672         try {
673             var sdist_tree = obj.map_sdist[ 'sdist_' + sdist_id ];
674             obj.funcs.push( function() { 
675                 document.getElementById('cmd_refresh_list').setAttribute('disabled','true'); 
676                 document.getElementById('sdist_lib_menu').setAttribute('disabled','true'); 
677             } );
678             if (sdist_tree.basic_summary()) {
679                 obj.funcs.push(
680                     function(c,a) {
681                         return function() {
682                             obj.append_member(c,a,[],'sbsum', false);
683                         }
684                     }( sdist_tree.basic_summary(), sdist_tree )
685                 );
686             }
687             if (sdist_tree.supplement_summary()) {
688                 obj.funcs.push(
689                     function(c,a) {
690                         return function() {
691                             obj.append_member(c,a,[],'sssum', false);
692                         }
693                     }( sdist_tree.supplement_summary(), sdist_tree )
694                 );
695             }
696             if (sdist_tree.index_summary()) {
697                 obj.funcs.push(
698                     function(c,a) {
699                         return function() {
700                             obj.append_member(c,a,[],'sisum', false);
701                         }
702                     }( sdist_tree.index_summary(), sdist_tree )
703                 );
704             }
705             if (sdist_tree.streams()) {
706                 for (var i = 0; i < sdist_tree.streams().length; i++) {
707                     obj.funcs.push(
708                         function(c,a) {
709                             return function() {
710                                 obj.append_member(c,a,[],'sstr', true);
711                             }
712                         }( sdist_tree.streams()[i], sdist_tree )
713                     )
714                 }
715             }
716             /* TODO: template editing would be convenient here, but a little too confusing
717             // add template nodes
718             var same_templates;
719             var has_bind_template;
720             if (sdist_tree.receive_unit_template()) {
721                 if (sdist_tree.bind_unit_template()) {
722                     has_bind_template = true;                    
723                     if (sdist_tree.receive_unit_template().id() == sdist_tree.bind_unit_template().id()) {
724                         same_templates = true;
725                         obj.funcs.push(
726                             function(c,a) {
727                                 return function() {
728                                     obj.append_member(c,a,[],'act', false, 'Receive/Bind Unit Template');
729                                 }
730                             }( sdist_tree.receive_unit_template(), sdist_tree )
731                         )
732                     }
733                 }
734
735                 if (!same_templates) {
736                     obj.funcs.push(
737                         function(c,a) {
738                             return function() {
739                                 obj.append_member(c,a,[],'act', false, 'Receive Unit Template');
740                             }
741                         }( sdist_tree.receive_unit_template(), sdist_tree )
742                     )
743                 }
744             }
745             if (has_bind_template && !same_templates) {
746                 obj.funcs.push(
747                     function(c,a) {
748                         return function() {
749                             obj.append_member(c,a,[],'act', false, 'Bind Unit Template');
750                         }
751                     }( sdist_tree.bind_unit_template(), sdist_tree )
752                 )
753             }
754             */
755             obj.funcs.push( function() { 
756                 document.getElementById('cmd_refresh_list').setAttribute('disabled','false'); 
757                 document.getElementById('sdist_lib_menu').setAttribute('disabled','false'); 
758             } );
759         } catch(E) {
760             alert(E);
761         }
762     },
763
764     'on_click_sdist' : function(sdist_ids,twisty) {
765         var obj = this;
766         try {
767             // draw sdist editor
768             if (typeof twisty == 'undefined') {
769                 var params = {};
770                 params.sdist_ids = sdist_ids;
771                 params.xul_id_prefix = 'sdist2';
772                 obj.editor_init('sdist', 'edit', params);
773             }
774         } catch(E) {
775             alert(E);
776         }
777     },
778
779     'on_click_sstr' : function(sstr_ids,twisty) {
780         var obj = this;
781         try {
782             // draw sstr editor
783             if (typeof twisty == 'undefined') {
784                 var params = {};
785                 params.sstr_ids = sstr_ids;
786                 obj.editor_init('sstr', 'edit', params);
787             }
788         } catch(E) {
789             alert(E);
790         }
791     },
792
793     'on_click_sbsum' : function(sbsum_ids,twisty) {
794         var obj = this;
795         try {
796             // draw sbsum editor
797             if (typeof twisty == 'undefined') {
798                 var params = {};
799                 params.sbsum_ids = sbsum_ids;
800                 obj.editor_init('sbsum', 'edit', params);
801             }
802         } catch(E) {
803             alert(E);
804         }
805     },
806
807     'on_click_sssum' : function(sssum_ids,twisty) {
808         var obj = this;
809         try {
810             // draw sssum editor
811             if (typeof twisty == 'undefined') {
812                 var params = {};
813                 params.sssum_ids = sssum_ids;
814                 obj.editor_init('sssum', 'edit', params);
815             }
816         } catch(E) {
817             alert(E);
818         }
819     },
820
821     'on_click_sisum' : function(sisum_ids,twisty) {
822         var obj = this;
823         try {
824             // draw sisum editor
825             if (typeof twisty == 'undefined') {
826                 var params = {};
827                 params.sisum_ids = sisum_ids;
828                 obj.editor_init('sisum', 'edit', params);
829             }
830         } catch(E) {
831             alert(E);
832         }
833     },
834
835     'on_click_aou' : function(org_id,twisty) {
836         var obj = this;
837         var org = obj.data.hash.aou[ org_id ];
838         var default_aou = obj.data.hash.aou[obj.default_lib];
839         obj.funcs.push( function() { 
840             document.getElementById('cmd_refresh_list').setAttribute('disabled','true'); 
841             document.getElementById('sdist_lib_menu').setAttribute('disabled','true'); 
842         } );
843         if (org.children()) {
844             for (var i = 0; i < org.children().length; i++) {
845                 var child = org.children()[i];
846                 if (orgIsMine(default_aou,child)) {
847                     obj.funcs.push(
848                         function(o,p) {
849                             return function() {
850                                 obj.append_org(o,p)
851                             }
852                         }(child,org)
853                     );
854                 }
855             }
856         } 
857         if (obj.map_sdist[ 'aou_' + org_id ]) {
858             for (var i = 0; i < obj.map_sdist[ 'aou_' + org_id ].length; i++) {
859                 obj.funcs.push(
860                     function(o,a) {
861                         return function() {
862                             obj.append_sdist(o,a);
863                         }
864                     }( org, obj.map_sdist[ 'aou_' + org_id ][i] )
865                 );
866             }
867         }
868         obj.funcs.push( function() { 
869             document.getElementById('cmd_refresh_list').setAttribute('disabled','false'); 
870             document.getElementById('sdist_lib_menu').setAttribute('disabled','false'); 
871         } );
872
873         // remove current editor
874         if (typeof twisty == 'undefined') {
875             document.getElementById('serial_manage_dists_editor_deck').selectedIndex = 0;
876         }
877     },
878
879     'append_org' : function (org,parent_org,params) {
880         var obj = this;
881         try {
882             if (obj.map_tree[ 'aou_' + org.id() ]) {
883                 var x = obj.map_tree[ 'aou_' + org.id() ];
884                 if (params) {
885                     for (var i in params) {
886                         x.setAttribute(i,params[i]);
887                     }
888                 }
889                 return x;
890             }
891
892             var data = {
893                 'row' : {
894                     'my' : {
895                         'aou' : org,
896                     }
897                 },
898                 'skip_all_columns_except' : [0,1,2],
899                 'retrieve_id' : 'aou_' + org.id(),
900                 'to_bottom' : true,
901                 'no_auto_select' : true,
902             };
903         
904             var sdist_tree_list;
905             if ( obj.org_ids.indexOf( Number( org.id() ) ) == -1 ) {
906                 if ( get_bool( obj.data.hash.aout[ org.ou_type() ].can_have_vols() ) ) {
907                     data.row.my.distribution_count = '0';
908                 } else {
909                     data.row.my.distribution_count = '';
910                 }
911             } else {
912                 var d_count = 0;
913                 sdist_tree_list = obj.network.simple_request(
914                     'FM_SDIST_TREE_LIST_RETRIEVE_VIA_RECORD_ID_AND_ORG_IDS.authoritative',
915                     [ ses(), obj.docid, [ org.id() ] ]
916                 );
917                 for (var i = 0; i < sdist_tree_list.length; i++) {
918                     d_count++;
919                     obj.map_sdist[ 'sdist_' + sdist_tree_list[i].id() ] = function(r){return r;}(sdist_tree_list[i]);
920                     var streams = sdist_tree_list[i].streams();
921                     for (var j = 0; j < streams.length; j++) {
922                         obj.map_sstr[ 'sstr_' + streams[j].id() ] = function(r){return r;}(streams[j]);
923                     }
924                 }
925                 data.row.my.distribution_count = d_count;
926             }
927             if (parent_org) {
928                 data.node = obj.map_tree[ 'aou_' + parent_org.id() ];
929             }
930             var nparams = obj.list.append(data);
931             var node = nparams.my_node;
932             if (params) {
933                 for (var i in params) {
934                     node.setAttribute(i,params[i]);
935                 }
936             }
937             obj.map_tree[ 'aou_' + org.id() ] = node;
938
939             if (org.children()) {
940                 node.setAttribute('container','true');
941             }
942
943             if (parent_org) {
944                 if ( obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].parent_ou() == parent_org.id() ) {
945                     data.node.setAttribute('open','true');
946                 }
947             } else {
948                 obj.map_tree[ 'aou_' + org.id() ].setAttribute('open','true');
949             }
950
951             if (sdist_tree_list) {
952                 obj.map_sdist[ 'aou_' + org.id() ] = sdist_tree_list;
953                 node.setAttribute('container','true');
954             }
955
956             if (document.getElementById('show_sdists').checked) {
957                 obj.funcs.push( function() { obj.on_click_aou( org.id() ); } );
958                 node.setAttribute('open','true');
959             }
960
961         } catch(E) {
962             dump(E+'\n');
963             alert(E);
964         }
965     },
966
967     'append_sdist' : function( org, sdist_tree, params ) {
968         var obj = this;
969         try {
970             if (obj.map_tree[ 'sdist_' + sdist_tree.id() ]) {
971                 var x = obj.map_tree[ 'sdist_' + sdist_tree.id() ];
972                 if (params) {
973                     for (var i in params) {
974                         x.setAttribute(i,params[i]);
975                     }
976                 }
977                 return x;
978             }
979
980             var parent_node = obj.map_tree[ 'aou_' + org.id() ];
981             var data = {
982                 'row' : {
983                     'my' : {
984                         'aou' : org,
985                         'sdist' : sdist_tree,
986                         'distribution_count' : ''
987                     }
988                 },
989                 'skip_all_columns_except' : [0,1,2],
990                 'retrieve_id' : 'sdist_' + sdist_tree.id(),
991                 'node' : parent_node,
992                 'to_bottom' : true,
993                 'no_auto_select' : true,
994             };
995             var nparams = obj.list.append(data);
996             var node = nparams.my_node;
997             obj.map_tree[ 'sdist_' + sdist_tree.id() ] =  node;
998             if (params) {
999                 for (var i in params) {
1000                     node.setAttribute(i,params[i]);
1001                 }
1002             }
1003             node.setAttribute('container','true');
1004             if (document.getElementById('show_sdist_groups').checked) {
1005                 node.setAttribute('open','true');
1006                 obj.funcs.push( function() { obj.on_select_sdist( sdist_tree.id(), true ); } );
1007             }
1008             var sstr_group_node_data = {
1009                 'row' : {
1010                     'my' : {
1011                         'label' : $('serialStrings').getString('serial.manage_dists.streams'),
1012                     }
1013                 },
1014                 'retrieve_id' : 'sstr-group_' + sdist_tree.id(),
1015                 'node' : node,
1016                 'to_bottom' : true,
1017                 'no_auto_select' : true,
1018             };
1019             nparams = obj.list.append(sstr_group_node_data);
1020             obj.map_tree[ 'sdist_sstr_group_' + sdist_tree.id() ] =  nparams.my_node;
1021         } catch(E) {
1022             dump(E+'\n');
1023             alert(E);
1024         }
1025     },
1026
1027     'append_member' : function( item, sdist_tree, attributes, type, group, label ) {
1028         var obj = this;
1029         try {
1030             if (obj.map_tree[ type + '_' + sdist_tree.id() + '_' + item.id() ]) {
1031                 var x = obj.map_tree[ type + '_' + item.id() ];
1032                 if (attributes) {
1033                     for (var i in attributes) {
1034                         x.setAttribute(i,attributes[i]);
1035                     }
1036                 }
1037                 return x;
1038             }
1039
1040             var parent_node;
1041             if (group) {
1042                 parent_node = obj.map_tree[ 'sdist_' + type + '_group_' + sdist_tree.id() ];
1043             } else {
1044                 parent_node = obj.map_tree[ 'sdist_' + sdist_tree.id() ];
1045             }
1046             var data = {
1047                 'row' : {
1048                     'my' : {
1049                         'aou' : obj.data.hash.aou[ sdist_tree.holding_lib() ],
1050                         'sdist' : sdist_tree,
1051                         'distribution_count' : ''
1052                     }
1053                 },
1054                 'retrieve_id' : type + '_' + item.id(),
1055                 'node' : parent_node,
1056                 'to_bottom' : true,
1057                 'no_auto_select' : true,
1058             };
1059             data['row']['my'][type] = item; // TODO: future optimization: get only the IDs of these leaves, then fetch the full row in 'retrieve_row'
1060             var nparams = obj.list.append(data);
1061             var node = nparams.my_node;
1062             obj.map_tree[ type + '_' + sdist_tree.id() + '_' + item.id() ] =  node;
1063             if (label) {
1064                 data['row']['my']['label'] = label;
1065             }
1066             if (attributes) {
1067                 for (var i in attributes) {
1068                     node.setAttribute(i,attributes[i]);
1069                 }
1070             }
1071
1072         } catch(E) {
1073             dump(E+'\n');
1074             alert(E);
1075         }
1076     },
1077
1078     'list_init' : function( params ) {
1079
1080         try {
1081             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
1082             var obj = this;
1083             
1084             JSAN.use('circ.util');
1085             var columns = [
1086                 {
1087                     'id' : 'tree_location',
1088                     'label' : 'Location',
1089                     'flex' : 1, 'primary' : true, 'hidden' : false, 
1090                     'render' : function(my) { 
1091                         if (my.label) { return my.label; }
1092                         if (my.sstr) { return $('serialStrings').getFormattedString('serial.manage_dists.stream_num', [my.sstr.id()]); }
1093                         if (my.sbsum) { return $('serialStrings').getString('serial.manage_dists.sbsum'); }
1094                         if (my.sssum) { return $('serialStrings').getString('serial.manage_dists.sssum'); }
1095                         if (my.sisum) { return $('serialStrings').getString('serial.manage_dists.sisum'); }
1096                         if (my.sdist) { return my.sdist.label(); }
1097                         if (my.aou) { return $('serialStrings').getFormattedString('serial.manage_dists.library_label', [my.aou.shortname(), my.aou.name()]); }
1098                         return "???";
1099                     },
1100                 },
1101                 {
1102                     'id' : 'distribution_count',
1103                     'label' : $('serialStrings').getString('serial.manage_dists.distributions'),
1104                     'flex' : 0, 'primary' : false, 'hidden' : false, 
1105                     'render' : function(my) { return my.distribution_count; },
1106                 }
1107             ];
1108             JSAN.use('util.list'); obj.list = new util.list('sdists_tree');
1109             obj.list.init(
1110                 {
1111                     'no_auto_select' : true,
1112                     'columns' : columns,
1113                     'map_row_to_columns' : circ.util.std_map_row_to_columns(' '),
1114                     'retrieve_row' : function(params) {
1115
1116                         var row = params.row;
1117                         obj.funcs.push(
1118                             function() {
1119
1120                                 if (typeof params.on_retrieve == 'function') {
1121                                     params.on_retrieve(row);
1122                                 }
1123
1124                             }
1125                         );
1126
1127                         return row;
1128                     },
1129                     'on_click' : function(ev) {
1130                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserRead');
1131                         var row = {}; var col = {}; var nobj = {};
1132                         obj.list.node.treeBoxObject.getCellAt(ev.clientX,ev.clientY,row,col,nobj); 
1133                         if ((row.value == -1)||(nobj.value != 'twisty')) { return; } // on_click runs for twistys only
1134
1135                         var node = obj.list.node.contentView.getItemAtIndex(row.value);
1136                         var list = [ node.getAttribute('retrieve_id') ];
1137                         if (typeof obj.on_select == 'function') {
1138                             obj.on_select(list,true);
1139                         }
1140                         if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
1141                             window.xulG.on_select(list);
1142                         }
1143                     },
1144                     'on_select' : function(ev) {
1145                         JSAN.use('util.functional');
1146                         
1147                         // get the actual node clicked to determine which editor to use
1148                         if (obj.list.node.view.selection.currentIndex > -1) {
1149                             var node = obj.list.node.contentView.getItemAtIndex(obj.list.node.view.selection.currentIndex);
1150                             obj.focused_node_retrieve_id = node.getAttribute('retrieve_id');
1151                         }
1152
1153                         var sel = obj.list.retrieve_selection();
1154                         obj.controller.view.sel_clip.disabled = sel.length < 1;
1155                         obj.sel_list = util.functional.map_list(
1156                             sel,
1157                             function(o) { return o.getAttribute('retrieve_id'); }
1158                         );
1159                         obj.toggle_actions();
1160                         if (typeof obj.on_select == 'function') {
1161                             obj.on_select(obj.sel_list);
1162                         }
1163                         if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
1164                             window.xulG.on_select(obj.sel_list);
1165                         }
1166                     },
1167                 }
1168             );
1169
1170             obj.controller.render();
1171
1172         } catch(E) {
1173             this.error.sdump('D_ERROR','serial/manage_dists.list_init: ' + E + '\n');
1174             alert(E);
1175         }
1176     },
1177
1178     'toggle_actions' : function() {
1179         var obj = this;
1180         try {
1181             var found_aou = false; var found_sdist = false; var found_sstr = false; var found_sbsum = false; var found_sssum = false; var found_sisum = false; var found_sstr_group = false;
1182             for (var i = 0; i < obj.sel_list.length; i++) {
1183                 var type = obj.sel_list[i].split(/_/)[0];
1184                 switch(type) {
1185                     case 'aou' : 
1186                         found_aou = true; 
1187                     break;
1188                     case 'sdist' : found_sdist = true; break;
1189                     case 'sstr' : found_sstr = true; break;
1190                     case 'sbsum' : found_sbsum = true; break;
1191                     case 'sssum' : found_sssum = true; break;
1192                     case 'sisum' : found_sisum = true; break;
1193                     case 'sstr-group' : found_sstr_group = true; break;
1194                 }
1195             }
1196             obj.controller.view.cmd_add_sstr.setAttribute('disabled','true');
1197             obj.controller.view.cmd_delete_sstr.setAttribute('disabled','true');
1198             obj.controller.view.cmd_mark_library.setAttribute('disabled','true');
1199             //obj.controller.view.cmd_delete_sdist.setAttribute('disabled','true');
1200             if (found_aou) {
1201                 obj.controller.view.cmd_mark_library.setAttribute('disabled','false');
1202             }
1203             if (found_sdist) {
1204                 //obj.controller.view.cmd_delete_sdist.setAttribute('disabled','false');
1205                 obj.controller.view.cmd_add_sstr.setAttribute('disabled','false');
1206             }
1207             if (found_sstr_group) {
1208                 obj.controller.view.cmd_add_sstr.setAttribute('disabled','false');
1209             }
1210             if (found_sstr) {
1211                 obj.controller.view.cmd_delete_sstr.setAttribute('disabled','false');
1212                 obj.controller.view.cmd_transfer_sstrs.setAttribute('disabled','false');
1213             }
1214             if (found_sbsum) {
1215             }
1216             if (found_sssum) {
1217             }
1218             if (found_sisum) {
1219             }
1220         } catch(E) {
1221             obj.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.actions.error'),E);
1222         }
1223     },
1224
1225     'refresh_list' : function() { 
1226         try {
1227             var obj = this;
1228             obj.list.clear();
1229             obj.map_tree = {};
1230             obj.map_sdist = {};
1231             obj.map_sstr = {};
1232             obj.org_ids = obj.network.simple_request('FM_SDIST_AOU_IDS_RETRIEVE_VIA_RECORD_ID.authoritative',[ obj.docid ]);
1233             if (typeof obj.org_ids.ilsevent != 'undefined') throw(obj.org_ids);
1234             JSAN.use('util.functional'); 
1235             obj.org_ids = util.functional.map_list( obj.org_ids, function (o) { return Number(o); });
1236             /*
1237             var org = obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ];
1238             obj.show_libs( org );
1239             */
1240             obj.default_lib = document.getElementById('sdist_lib_menu').value;
1241             obj.show_my_libs( obj.default_lib );
1242         } catch(E) {
1243             this.error.standard_unexpected_error_alert(document.getElementById('catStrings').getString('staff.cat.copy_browser.refresh_list.error'),E);
1244         }
1245     },
1246 };
1247
1248 dump('exiting serial/manage_dists.js\n');