7 function $(id) { return document.getElementById(id); }
11 /******************************************************************************************************/
12 /* setup JSAN and some initial libraries */
14 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
15 if (typeof JSAN == 'undefined') {
16 throw( $('commonStrings').getString('common.jsan.missing') );
18 JSAN.errorLevel = "die"; // none, warn, or die
19 JSAN.addRepository('/xul/server/');
20 JSAN.use('util.error'); g.error = new util.error();
21 g.error.sdump('D_TRACE','my_init() for cat/copy_editor.xul');
23 JSAN.use('util.functional');
24 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
25 JSAN.use('util.network'); g.network = new util.network();
27 g.docid = xul_param('docid',{'modal_xulG':true});
28 g.handle_update = xul_param('handle_update',{'modal_xulG':true});
30 /******************************************************************************************************/
31 /* Get the copy ids from various sources and flesh them */
33 var copy_ids = xul_param('copy_ids',{'concat':true,'JSON2js_if_cgi':true,'JSON2js_if_xulG':true,'JSON2js_if_xpcom':true,'stash_name':'temp_copy_ids','clear_xpcom':true,'modal_xulG':true});
34 if (!copy_ids) copy_ids = [];
36 if (copy_ids.length > 0) g.copies = g.network.simple_request(
37 'FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative',
41 /******************************************************************************************************/
42 /* And other fleshed copies if any */
44 if (!g.copies) g.copies = [];
45 var c = xul_param('copies',{'concat':true,'JSON2js_if_cgi':true,'JSON2js_if_xpcom':true,'stash_name':'temp_copies','clear_xpcom':true,'modal_xulG':true})
46 if (c) g.copies = g.copies.concat(c);
48 /******************************************************************************************************/
49 /* We try to retrieve callnumbers for existing copies, but for new copies, we rely on this */
51 g.callnumbers = xul_param('callnumbers',{'concat':true,'JSON2js_if_cgi':true,'JSON2js_if_xpcom':true,'stash_name':'temp_callnumbers','clear_xpcom':true,'modal_xulG':true});
54 /******************************************************************************************************/
55 /* Quick fix, this was defined inline in the global scope but now needs g.error and g.copies from my_init */
56 /* Quick fix, messagecatalog only usable during/after onload */
61 /******************************************************************************************************/
62 /* Is the interface an editor or a viewer, single or multi copy, existing copies or new copies? */
64 if (xul_param('edit',{'modal_xulG':true}) == '1') {
66 // Editor desired, but let's check permissions
70 var check = g.network.simple_request(
71 'PERM_MULTI_ORG_CHECK',
74 g.data.list.au[0].id(),
75 util.functional.map_list(
79 var cn_id = o.call_number();
81 lib = o.circ_lib(); // base perms on circ_lib instead of owning_lib if pre-cat
83 if (! g.map_acn[ cn_id ]) {
84 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
85 if (typeof req.ilsevent == 'undefined') {
86 g.map_acn[ cn_id ] = req;
87 lib = g.map_acn[ cn_id ].owning_lib();
92 lib = g.map_acn[ cn_id ].owning_lib();
95 return typeof lib == 'object' ? lib.id() : lib;
98 g.copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
101 g.edit = check.length == 0;
103 g.error.standard_unexpected_error_alert('batch permission check',E);
107 $('caption').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.caption'));
108 $('save').setAttribute('hidden','false');
109 g.retrieve_templates();
111 $('top_nav').setAttribute('hidden','true');
114 $('top_nav').setAttribute('hidden','true');
117 if (g.copies.length > 0 && g.copies[0].id() < 0) {
118 document.getElementById('copy_notes').setAttribute('hidden','true');
119 g.apply("status",5 /* In Process */);
120 $('save').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.create_copies'));
122 g.panes_and_field_names.left_pane =
125 $('catStrings').getString('staff.cat.copy_editor.status'),
127 render: 'typeof fm.status() == "object" ? fm.status().name() : g.data.hash.ccs[ fm.status() ].name()',
128 input: g.safe_to_edit_copy_status() ? 'c = function(v){ g.apply("status",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.data.list.ccs, function(obj) { return [ obj.name(), obj.id(), typeof my_constants.magical_statuses[obj.id()] != "undefined" ? true : false ]; } ).sort() ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);' : undefined,
129 //input: 'c = function(v){ g.apply("status",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( util.functional.filter_list( g.data.list.ccs, function(obj) { return typeof my_constants.magical_statuses[obj.id()] == "undefined"; } ), function(obj) { return [ obj.name(), obj.id() ]; } ).sort() ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
132 ].concat(g.panes_and_field_names.left_pane);
135 if (g.copies.length != 1) {
136 document.getElementById('copy_notes').setAttribute('hidden','true');
139 /******************************************************************************************************/
140 /* Show the Record Details? */
142 var bdb = document.getElementById('brief_display_box'); while(bdb.firstChild) bdb.removeChild(bdb.lastChild);
144 var brief_display = document.createElement('iframe'); bdb.appendChild(brief_display);
145 brief_display.setAttribute( 'src', urls.XUL_BIB_BRIEF + '?docid=' + g.docid); // this is a modal window, so can't push in xulG
146 brief_display.setAttribute( 'flex','1' );
149 /******************************************************************************************************/
150 /* Add stat cats to the panes_and_field_names.right_pane4 */
152 g.populate_stat_cats();
154 /******************************************************************************************************/
155 /* Backup copies :) */
157 g.original_copies = js2JSON( g.copies );
159 /******************************************************************************************************/
162 g.summarize( g.copies );
166 var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/copy_editor.js', E]);
167 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); dump(js2JSON(E)); }
172 /******************************************************************************************************/
173 /* Retrieve Templates */
175 g.retrieve_templates = function() {
177 JSAN.use('util.widgets'); JSAN.use('util.functional');
179 var robj = g.network.simple_request('FM_AUS_RETRIEVE',[ses(),g.data.list.au[0].id()]);
180 if (typeof robj['staff_client.copy_editor.templates'] != 'undefined') {
181 g.templates = robj['staff_client.copy_editor.templates'];
183 util.widgets.remove_children('template_placeholder');
184 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } );
186 g.template_menu = util.widgets.make_menulist( list );
187 g.template_menu.setAttribute('id','template_menu');
188 $('template_placeholder').appendChild(g.template_menu);
189 g.template_menu.addEventListener(
191 function() { g.copy_editor_prefs[ 'template_menu' ] = { 'value' : g.template_menu.value }; g.save_attributes(); },
195 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.retrieve_templates.error'), E);
199 /******************************************************************************************************/
202 g.apply_template = function() {
204 var name = g.template_menu.value;
205 if (g.templates[ name ] != 'undefined') {
206 var template = g.templates[ name ];
207 for (var i in template) {
208 g.changed[ i ] = template[ i ];
209 switch( template[i].type ) {
211 g.apply(template[i].field,template[i].value);
214 if (g.stat_cat_seen[ template[i].field ]) g.apply_stat_cat(template[i].field,template[i].value);
217 g.apply_owning_lib(template[i].value);
221 g.summarize( g.copies );
225 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.apply_templates.error'), E);
229 /******************************************************************************************************/
230 /* Save as Template */
232 g.save_template = function() {
234 var name = window.prompt(
235 $('catStrings').getString('staff.cat.copy_editor.save_as_template.prompt'),
237 $('catStrings').getString('staff.cat.copy_editor.save_as_template.title')
240 g.templates[name] = g.changed;
241 var robj = g.network.simple_request(
242 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
244 if (typeof robj.ilsevent != 'undefined') {
247 alert($('catStrings').getFormattedString('staff.cat.copy_editor.save_as_template.success', [name]));
251 g.retrieve_templates();
253 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
259 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
263 /******************************************************************************************************/
264 /* Delete Template */
266 g.delete_template = function() {
268 var name = g.template_menu.value;
270 if (! window.confirm($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]))) return;
271 delete(g.templates[name]);
272 var robj = g.network.simple_request(
273 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
275 if (typeof robj.ilsevent != 'undefined') {
278 alert($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]));
282 g.retrieve_templates();
284 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
290 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
294 /******************************************************************************************************/
295 /* Export Templates */
297 g.export_templates = function() {
299 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
300 JSAN.use('util.file'); var f = new util.file('');
301 f.export_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.export_templates.title'), 'data' : g.templates } );
303 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.export_templates.error'), E);
307 /******************************************************************************************************/
308 /* Import Templates */
310 g.import_templates = function() {
312 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
313 JSAN.use('util.file'); var f = new util.file('');
314 var temp = f.import_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.import_templates.title') } );
316 for (var i in temp) {
318 if (g.templates[i]) {
320 var r = g.error.yns_alert(
321 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.prompt') + '\n' + g.error.pretty_print( js2JSON( temp[i] ) ),
322 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.replace.title', [i]),
323 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.yes'),
324 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.no'),
326 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.click_here')
329 if (r == 0 /* Yes */) g.templates[i] = temp[i];
333 g.templates[i] = temp[i];
339 var r = g.error.yns_alert(
340 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.prompt'),
341 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.save.title'),
342 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.yes'),
343 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.no'),
345 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.click_here')
348 if (r == 0 /* Yes */) {
349 var robj = g.network.simple_request(
350 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
352 if (typeof robj.ilsevent != 'undefined') {
355 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.success'));
359 g.retrieve_templates();
361 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.error'), E);
367 util.widgets.remove_children('template_placeholder');
368 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } );
369 g.template_menu = util.widgets.make_menulist( list );
370 $('template_placeholder').appendChild(g.template_menu);
371 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.note'));
376 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.error'), E);
381 /******************************************************************************************************/
382 /* Restore backup copies */
384 g.reset = function() {
386 g.copies = JSON2js( g.original_copies );
387 g.summarize( g.copies );
391 /******************************************************************************************************/
392 /* Apply a value to a specific field on all the copies being edited */
394 g.apply = function(field,value) {
395 g.error.sdump('D_TRACE','applying field = <' + field + '> value = <' + value + '>\n');
396 if (value == '<HACK:KLUDGE:NULL>') value = null;
397 if (field == 'alert_message') { value = value.replace(/^\W+$/g,''); }
398 if (field == 'price' || field == 'deposit_amount') {
399 if (value == '') { value = null; } else { JSAN.use('util.money'); value = util.money.sanitize( value ); }
401 for (var i = 0; i < g.copies.length; i++) {
402 var copy = g.copies[i];
404 copy[field]( value ); copy.ischanged('1');
411 /******************************************************************************************************/
412 /* Apply a stat cat entry to all the copies being edited. An entry_id of < 0 signifies the stat cat is being removed. */
414 g.apply_stat_cat = function(sc_id,entry_id) {
415 g.error.sdump('D_TRACE','sc_id = ' + sc_id + ' entry_id = ' + entry_id + '\n');
416 for (var i = 0; i < g.copies.length; i++) {
417 var copy = g.copies[i];
420 var temp = copy.stat_cat_entries();
421 if (!temp) temp = [];
422 temp = util.functional.filter_list(
425 return (obj.stat_cat() != sc_id);
428 if (entry_id > -1) temp.push(
429 util.functional.find_id_object_in_list(
430 g.data.hash.asc[sc_id].entries(),
434 copy.stat_cat_entries( temp );
437 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
442 /******************************************************************************************************/
443 /* Apply an "owning lib" to all the copies being edited. That is, change and auto-vivicating volumes */
445 g.apply_owning_lib = function(ou_id) {
446 g.error.sdump('D_TRACE','ou_id = ' + ou_id + '\n');
447 for (var i = 0; i < g.copies.length; i++) {
448 var copy = g.copies[i];
450 if (!g.map_acn[copy.call_number()]) {
451 var volume = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ copy.call_number() ]);
452 if (typeof volume.ilsevent != 'undefined') {
453 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.undefined_volume.error', [copy.barcode()]), volume);
456 g.map_acn[copy.call_number()] = volume;
458 var old_volume = g.map_acn[copy.call_number()];
459 var acn_id = g.network.simple_request(
460 'FM_ACN_FIND_OR_CREATE',
461 [ses(),old_volume.label(),old_volume.record(),ou_id]
463 if (typeof acn_id.ilsevent != 'undefined') {
464 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.call_number.error', [copy.barcode()]), acn_id);
467 copy.call_number(acn_id);
470 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
475 /******************************************************************************************************/
476 /* This returns true if none of the copies being edited are pre-cats */
478 g.safe_to_change_owning_lib = function() {
481 for (var i = 0; i < g.copies.length; i++) {
482 var cn = g.copies[i].call_number();
483 if (typeof cn == 'object') { cn = cn.id(); }
484 if (cn == -1) { safe = false; }
488 g.error.standard_unexpected_error_alert('safe_to_change_owning_lib?',E);
493 /******************************************************************************************************/
494 /* This returns true if none of the copies being edited have a magical status found in my_constants.magical_statuses */
496 g.safe_to_edit_copy_status = function() {
499 for (var i = 0; i < g.copies.length; i++) {
500 var status = g.copies[i].status(); if (typeof status == 'object') status = status.id();
501 if (typeof my_constants.magical_statuses[ status ] != 'undefined') safe = false;
505 g.error.standard_unexpected_error_alert('safe_to_edit_copy_status?',E);
510 /******************************************************************************************************/
511 /* This concats and uniques all the alert messages for use as the default value for a new alert message */
513 g.populate_alert_message_input = function(tb) {
515 var seen = {}; var s = '';
516 for (var i = 0; i < g.copies.length; i++) {
517 var msg = g.copies[i].alert_message();
519 if (typeof seen[msg] == 'undefined') {
525 tb.setAttribute('value',s);
527 g.error.standard_unexpected_error_alert('populate_alert_message_input',E);
531 /***************************************************************************************************************/
532 /* This returns a list of acpl's appropriate for the copies being edited (and caches them in the global stash) */
534 g.get_acpl_list_for_lib = function(lib_id,but_only_these) {
535 g.data.stash_retrieve();
536 var label = 'acpl_list_for_lib_'+lib_id;
537 if (typeof g.data[label] == 'undefined') {
538 var robj = g.network.simple_request('FM_ACPL_RETRIEVE', [ lib_id ]); // This returns acpl's for all ancestors and descendants as well as the lib
539 if (typeof robj.ilsevent != 'undefined') throw(robj);
541 for (var j = 0; j < robj.length; j++) {
542 var my_acpl = robj[j];
543 if (typeof g.data.hash.acpl[ my_acpl.id() ] == 'undefined') {
544 g.data.hash.acpl[ my_acpl.id() ] = my_acpl;
545 g.data.list.acpl.push( my_acpl );
547 var only_this_lib = my_acpl.owning_lib(); if (!only_this_lib) continue;
548 if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
549 if (but_only_these.indexOf( String( only_this_lib ) ) != -1) { // This filters out some of the libraries (usually the descendants)
550 temp_list.push( my_acpl );
553 g.data[label] = temp_list; g.data.stash(label,'hash','list');
555 return g.data[label];
558 /******************************************************************************************************/
559 /* This returns a list of acpl's appropriate for the copies being edited */
561 g.get_acpl_list = function() {
564 JSAN.use('util.functional');
568 /**************************************/
569 /* get owning libs from call numbers */
571 var owning_libs = {};
572 for (var i = 0; i < g.copies.length; i++) {
573 var callnumber = g.copies[i].call_number();
574 if (!callnumber) continue;
575 var cn_id = typeof callnumber == 'object' ? callnumber.id() : callnumber;
577 if (! g.map_acn[ cn_id ]) {
578 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
579 if (typeof req.ilsevent == 'undefined') {
580 g.map_acn[ cn_id ] = req;
585 var consider_lib = g.map_acn[ cn_id ].owning_lib();
586 if (!consider_lib) continue;
587 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
591 for (var i in g.callnumbers) {
592 var consider_lib = g.callnumbers[i].owning_lib;
593 if (!consider_lib) continue;
594 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
598 /***************************************************************************************************/
599 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
601 JSAN.use('util.fm_utils');
602 var libs = []; for (var i in owning_libs) libs.push(i);
603 if (libs.length > 0) {
604 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
605 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
608 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
609 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
610 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
611 if (acpl_list[i] != null) {
612 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
623 for (var i = 0; i < g.copies.length; i++) {
624 var consider_lib = g.copies[i].circ_lib();
625 if (!consider_lib) continue;
626 circ_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
629 /***************************************************************************************************/
630 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
632 libs = []; for (var i in circ_libs) libs.push(i);
633 if (libs.length > 0) {
634 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
635 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
638 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
639 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
640 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
641 if (acpl_list[i] != null) {
642 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
648 var acpl_list = []; for (var i in my_acpls) acpl_list.push( g.data.hash.acpl[ i ] );
649 return acpl_list.sort(
651 var label_a = g.data.hash.aou[ a.owning_lib() ].shortname() + ' : ' + a.name();
652 var label_b = g.data.hash.aou[ b.owning_lib() ].shortname() + ' : ' + b.name();
653 if (label_a < label_b) return -1;
654 if (label_a > label_b) return 1;
660 g.error.standard_unexpected_error_alert('get_acpl_list',E);
666 /******************************************************************************************************/
667 /* This keeps track of what fields have been edited for styling purposes */
671 /******************************************************************************************************/
672 /* These need data from the middle layer to render */
674 function init_panes0() {
675 g.special_exception = {};
676 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.owning_library.label')] = function(label,value) {
677 JSAN.use('util.widgets');
678 if (value>0) { /* an existing call number */
679 g.network.simple_request(
680 'FM_ACN_RETRIEVE.authoritative',
683 var cn = '??? id = ' + value;
685 cn = req.getResultObject();
687 g.error.sdump('D_ERROR','callnumber retrieve: ' + E);
689 util.widgets.set_text(label,g.data.hash.aou[ cn.owning_lib() ].shortname() + ' : ' + cn.label());
692 } else { /* a yet to be created call number */
694 util.widgets.set_text(label,g.data.hash.aou[ g.callnumbers[value].owning_lib ].shortname() + ' : ' + g.callnumbers[value].label);
698 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.creator.label')] = function(label,value) {
699 if (value == null || value == '' || value == 'null') return;
700 g.network.simple_request(
701 'FM_AU_RETRIEVE_VIA_ID',
704 var p = '??? id = ' + value;
706 p = req.getResultObject();
710 g.error.sdump('D_ERROR','patron retrieve: ' + E);
712 JSAN.use('util.widgets');
713 util.widgets.set_text(label,p);
717 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.last_editor.label')] = function(label,value) {
718 if (value == null || value == '' || value == 'null') return;
719 g.network.simple_request(
720 'FM_AU_RETRIEVE_VIA_ID',
723 var p = '??? id = ' + value;
725 p = req.getResultObject();
729 g.error.sdump('D_ERROR','patron retrieve: ' + E);
731 util.widgets.set_text(label,p);
737 /******************************************************************************************************/
738 g.readonly_stat_cat_names = [];
739 g.editable_stat_cat_names = [];
741 /******************************************************************************************************/
742 /* These get show in the left panel */
744 function init_panes() {
745 g.panes_and_field_names = {
750 $('catStrings').getString('staff.cat.copy_editor.field.barcode.label'),
752 render: 'fm.barcode();',
756 $('catStrings').getString('staff.cat.copy_editor.field.creation_date.label'),
758 render: 'util.date.formatted_date( fm.create_date(), "%F");',
762 $('catStrings').getString('staff.cat.copy_editor.field.creator.label'),
764 render: 'fm.creator();',
768 $('catStrings').getString('staff.cat.copy_editor.field.last_edit_date.label'),
770 render: 'util.date.formatted_date( fm.edit_date(), "%F");',
774 $('catStrings').getString('staff.cat.copy_editor.field.last_editor.label'),
776 render: 'fm.editor();',
785 $('catStrings').getString('staff.cat.copy_editor.field.location.label'),
787 render: 'typeof fm.location() == "object" ? fm.location().name() : g.data.lookup("acpl",fm.location()).name()',
788 input: 'c = function(v){ g.apply("location",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.get_acpl_list(), function(obj) { return [ g.data.hash.aou[ obj.owning_lib() ].shortname() + " : " + obj.name(), obj.id() ]; }).sort()); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
793 $('catStrings').getString('staff.cat.copy_editor.field.circulation_library.label'),
795 render: 'typeof fm.circ_lib() == "object" ? fm.circ_lib().shortname() : g.data.hash.aou[ fm.circ_lib() ].shortname()',
796 //input: 'c = function(v){ g.apply("circ_lib",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( util.functional.filter_list(g.data.list.my_aou, function(obj) { return g.data.hash.aout[ obj.ou_type() ].can_have_vols(); }), function(obj) { return [ obj.shortname(), obj.id() ]; }).sort() ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
797 input: 'c = function(v){ g.apply("circ_lib",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.data.list.aou, function(obj) { var sname = obj.shortname(); for (i = sname.length; i < 20; i++) sname += " "; return [ obj.name() ? sname + " " + obj.name() : obj.shortname(), obj.id(), ( ! get_bool( g.data.hash.aout[ obj.ou_type() ].can_have_vols() ) ), ( g.data.hash.aout[ obj.ou_type() ].depth() * 2), ]; }), g.data.list.au[0].ws_ou()); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
801 $('catStrings').getString('staff.cat.copy_editor.field.owning_library.label'),
803 render: 'fm.call_number();',
804 input: g.safe_to_change_owning_lib() ? 'c = function(v){ g.apply_owning_lib(v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.data.list.aou, function(obj) { var sname = obj.shortname(); for (i = sname.length; i < 20; i++) sname += " "; return [ obj.name() ? sname + " " + obj.name() : obj.shortname(), obj.id(), ( ! get_bool( g.data.hash.aout[ obj.ou_type() ].can_have_vols() ) ), ( g.data.hash.aout[ obj.ou_type() ].depth() * 2), ]; }), g.data.list.au[0].ws_ou()); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);' : undefined,
808 $('catStrings').getString('staff.cat.copy_editor.field.copy_number.label'),
810 render: 'fm.copy_number() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.copy_number()',
811 input: 'c = function(v){ g.apply("copy_number",v); if (typeof post_c == "function") post_c(v); }; x = document.createElement("textbox"); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
821 $('catStrings').getString('staff.cat.copy_editor.field.circulate.label'),
823 render: 'fm.circulate() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.circulate() ) ? $("catStrings").getString("staff.cat.copy_editor.field.circulate.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.circulate.no_or_false") )',
824 input: 'c = function(v){ g.apply("circulate",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.circulate.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.circulate.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
828 $('catStrings').getString('staff.cat.copy_editor.field.holdable.label'),
830 render: 'fm.holdable() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.holdable() ) ? $("catStrings").getString("staff.cat.copy_editor.field.holdable.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.holdable.no_or_false") )',
831 input: 'c = function(v){ g.apply("holdable",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.holdable.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.holdable.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
835 $('catStrings').getString('staff.cat.copy_editor.field.age_based_hold_protection.label'),
837 render: 'fm.age_protect() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( typeof fm.age_protect() == "object" ? fm.age_protect().name() : g.data.hash.crahp[ fm.age_protect() ].name() )',
838 input: 'c = function(v){ g.apply("age_protect",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.remove_age_based_hold_protection"), "<HACK:KLUDGE:NULL>" ] ].concat( util.functional.map_list( g.data.list.crahp, function(obj) { return [ obj.name(), obj.id() ]; }).sort() ) ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
843 $('catStrings').getString('staff.cat.copy_editor.field.loan_duration.label'),
845 render: 'switch(Number(fm.loan_duration())){ case 1: $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.short"); break; case 2: $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.normal"); break; case 3: $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.extended"); break; }',
846 input: 'c = function(v){ g.apply("loan_duration",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.short"), "1" ], [ $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.normal"), "2" ], [ $("catStrings").getString("staff.cat.copy_editor.field.loan_duration.extended"), "3" ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
851 $('catStrings').getString('staff.cat.copy_editor.field.fine_level.label'),
853 render: 'switch(Number(fm.fine_level())){ case 1: $("catStrings").getString("staff.cat.copy_editor.field.fine_level.low"); break; case 2: $("catStrings").getString("staff.cat.copy_editor.field.fine_level.normal"); break; case 3: $("catStrings").getString("staff.cat.copy_editor.field.fine_level.high"); break; }',
854 input: 'c = function(v){ g.apply("fine_level",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.fine_level.low"), "1" ], [ $("catStrings").getString("staff.cat.copy_editor.field.fine_level.normal"), "2" ], [ $("catStrings").getString("staff.cat.copy_editor.field.fine_level.high"), "3" ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
859 $('catStrings').getString('staff.cat.copy_editor.field.circulate_as_type.label'),
861 render: 'fm.circ_as_type() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : g.data.hash.citm[ fm.circ_as_type() ].value()',
862 input: 'c = function(v){ g.apply("circ_as_type",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.remove_circulate_as_type"), "<HACK:KLUDGE:NULL>" ] ].concat( util.functional.map_list( g.data.list.citm, function(n){return [ n.code() + " - " + n.value(), n.code()];} ).sort() ) ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
866 $('catStrings').getString('staff.cat.copy_editor.field.circulation_modifier.label'),
868 render: 'fm.circ_modifier() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.circ_modifier()',
869 /*input: 'c = function(v){ g.apply("circ_modifier",v); if (typeof post_c == "function") post_c(v); }; x = document.createElement("textbox"); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',*/
870 input: 'c = function(v){ g.apply("circ_modifier",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( util.functional.map_list( g.data.list.circ_modifier, function(obj) { return [ obj, obj ]; } ).sort() ); x.setAttribute("editable","true"); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
877 $('catStrings').getString('staff.cat.copy_editor.field.alert_message.label'),
879 render: 'fm.alert_message() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.alert_message()',
880 input: 'c = function(v){ g.apply("alert_message",v); if (typeof post_c == "function") post_c(v); }; x = document.createElement("textbox"); x.setAttribute("multiline",true); g.populate_alert_message_input(x); x.addEventListener("apply",function(f){ return function(ev) { f( ev.target.value ); } }(c), false);',
885 $('catStrings').getString('staff.cat.copy_editor.field.deposit.label'),
887 render: 'fm.deposit() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.deposit() ) ? $("catStrings").getString("staff.cat.copy_editor.field.deposit.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.deposit.no_or_false") )',
888 input: 'c = function(v){ g.apply("deposit",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.deposit.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.deposit.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
892 $('catStrings').getString('staff.cat.copy_editor.field.deposit_amount.label'),
894 render: 'if (fm.deposit_amount() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.deposit_amount() ); }',
895 input: 'c = function(v){ g.apply("deposit_amount",v); if (typeof post_c == "function") post_c(v); }; x = document.createElement("textbox"); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
899 $('catStrings').getString('staff.cat.copy_editor.field.price.label'),
901 render: 'if (fm.price() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.price() ); }',
902 input: 'c = function(v){ g.apply("price",v); if (typeof post_c == "function") post_c(v); }; x = document.createElement("textbox"); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
907 $('catStrings').getString('staff.cat.copy_editor.field.opac_visible.label'),
909 render: 'fm.opac_visible() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.opac_visible() ) ? $("catStrings").getString("staff.cat.copy_editor.field.opac_visible.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.opac_visible.no_or_false") )',
910 input: 'c = function(v){ g.apply("opac_visible",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.opac_visible.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.opac_visible.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
914 $('catStrings').getString('staff.cat.copy_editor.field.reference.label'),
916 render: 'fm.ref() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.ref() ) ? $("catStrings").getString("staff.cat.copy_editor.field.reference.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.reference.no_or_false") )',
917 input: 'c = function(v){ g.apply("ref",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.reference.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.reference.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
929 /******************************************************************************************************/
930 /* This loops through all our fieldnames and all the copies, tallying up counts for the different values */
932 g.summarize = function( copies ) {
933 /******************************************************************************************************/
936 JSAN.use('util.date'); JSAN.use('util.money');
939 for (var i in g.panes_and_field_names) {
940 g.field_names = g.field_names.concat( g.panes_and_field_names[i] );
942 g.field_names = g.field_names.concat( g.editable_stat_cat_names );
943 g.field_names = g.field_names.concat( g.readonly_stat_cat_names );
945 /******************************************************************************************************/
946 /* Loop through the field names */
948 for (var i = 0; i < g.field_names.length; i++) {
950 var field_name = g.field_names[i][0];
951 var render = g.field_names[i][1].render;
952 var attr = g.field_names[i][1].attr;
953 g.summary[ field_name ] = {};
955 /******************************************************************************************************/
956 /* Loop through the copies */
958 for (var j = 0; j < copies.length; j++) {
961 var cmd = render || ('fm.' + field_name + '();');
964 /**********************************************************************************************/
965 /* Try to retrieve the value for this field for this copy */
970 g.error.sdump('D_ERROR','Attempted ' + cmd + '\n' + E + '\n');
972 if (typeof value == 'object' && value != null) {
973 alert('FIXME: field_name = <' + field_name + '> value = <' + js2JSON(value) + '>\n');
976 /**********************************************************************************************/
977 /* Tally the count */
979 if (g.summary[ field_name ][ value ]) {
980 g.summary[ field_name ][ value ]++;
982 g.summary[ field_name ][ value ] = 1;
986 g.error.sdump('D_TRACE','summary = ' + js2JSON(g.summary) + '\n');
989 /******************************************************************************************************/
990 /* Display the summarized data and inputs for editing */
992 g.render = function() {
994 /******************************************************************************************************/
995 /* Library setup and clear any existing interface */
997 JSAN.use('util.widgets'); JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('util.functional');
999 for (var i in g.panes_and_field_names) {
1000 var p = document.getElementById(i);
1001 if (p) util.widgets.remove_children(p);
1004 /******************************************************************************************************/
1005 /* Populate the library filter menu for stat cats */
1008 for (var i = 0; i < g.panes_and_field_names.right_pane4.length; i++) {
1009 sc_libs[ g.panes_and_field_names.right_pane4[i][1].attr.sc_lib ] = true;
1012 for (var i in sc_libs) { sc_libs2.push( [ g.data.hash.aou[ i ].shortname(), i ] ); }
1014 var x = document.getElementById("stat_cat_lib_filter_menu").firstChild;
1015 JSAN.use('util.widgets'); util.widgets.remove_children(x);
1016 for (var i = 0; i < sc_libs2.length; i++) {
1017 var menuitem = document.createElement('menuitem');
1018 menuitem.setAttribute('id','filter_'+sc_libs2[i][1]);
1019 menuitem.setAttribute('type','checkbox');
1020 menuitem.setAttribute('checked','true');
1021 menuitem.setAttribute('label',sc_libs2[i][0]);
1022 menuitem.setAttribute('value',sc_libs2[i][1]);
1023 menuitem.setAttribute('oncommand','try{g.toggle_stat_cat_display(this);}catch(E){alert(E);}');
1024 x.appendChild(menuitem);
1027 /******************************************************************************************************/
1028 /* Prepare the panes */
1030 var groupbox; var caption; var vbox; var grid; var rows;
1032 /******************************************************************************************************/
1033 /* Loop through the field names */
1035 for (h in g.panes_and_field_names) {
1036 if (!document.getElementById(h)) continue;
1037 for (var i = 0; i < g.panes_and_field_names[h].length; i++) {
1039 var f = g.panes_and_field_names[h][i]; var fn = f[0]; var attr = f[1].attr;
1040 groupbox = document.createElement('groupbox'); document.getElementById(h).appendChild(groupbox);
1042 for (var a in attr) {
1043 groupbox.setAttribute(a,attr[a]);
1046 if (typeof g.changed[fn] != 'undefined') groupbox.setAttribute('class','copy_editor_field_changed');
1047 caption = document.createElement('caption'); groupbox.appendChild(caption);
1048 caption.setAttribute('label',fn); caption.setAttribute('id','caption_'+fn);
1049 vbox = document.createElement('vbox'); groupbox.appendChild(vbox);
1050 grid = util.widgets.make_grid( [ { 'flex' : 1 }, {}, {} ] ); vbox.appendChild(grid);
1051 grid.setAttribute('flex','1');
1052 rows = grid.lastChild;
1055 /**************************************************************************************/
1056 /* Loop through each value for the field */
1058 for (var j in g.summary[fn]) {
1059 var value = j; var count = g.summary[fn][j];
1060 row = document.createElement('row'); rows.appendChild(row);
1061 var label1 = document.createElement('description'); row.appendChild(label1);
1062 if (g.special_exception[ fn ]) {
1063 g.special_exception[ fn ]( label1, value );
1065 label1.appendChild( document.createTextNode(value) );
1067 var label2 = document.createElement('description'); row.appendChild(label2);
1070 copy_count = $('catStrings').getString('staff.cat.copy_editor.copy_count');
1072 copy_count = $('catStrings').getFormattedString('staff.cat.copy_editor.copy_count.plural', [count]);
1074 label2.appendChild( document.createTextNode(copy_count) );
1076 var hbox = document.createElement('hbox');
1077 hbox.setAttribute('id',fn);
1078 groupbox.appendChild(hbox);
1079 var hbox2 = document.createElement('hbox');
1080 groupbox.appendChild(hbox2);
1082 /**************************************************************************************/
1083 /* Render the input widget */
1085 if (f[1].input && g.edit) {
1086 g.render_input(hbox,f[1]);
1090 g.error.sdump('D_ERROR','copy editor: ' + E + '\n');
1096 /******************************************************************************************************/
1097 /* Synchronize stat cat visibility with library filter menu, and default template selection */
1098 JSAN.use('util.file');
1099 var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1100 g.copy_editor_prefs = util.widgets.load_attributes(file);
1101 for (var i in g.copy_editor_prefs) {
1102 if (i.match(/filter_/) && g.copy_editor_prefs[i].checked == '') {
1104 g.toggle_stat_cat_display( document.getElementById(i) );
1105 } catch(E) { alert(E); }
1108 if (g.template_menu) g.template_menu.value = g.template_menu.getAttribute('value');
1112 /******************************************************************************************************/
1113 /* This actually draws the change button and input widget for a given field */
1114 g.render_input = function(node,blob) {
1116 // node = hbox ; groupbox -> hbox, hbox
1118 var groupbox = node.parentNode;
1119 var caption = groupbox.firstChild;
1120 var vbox = node.previousSibling;
1122 var hbox2 = node.nextSibling;
1124 var input_cmd = blob.input;
1125 var render_cmd = blob.render;
1126 var attr = blob.attr;
1128 var block = false; var first = true;
1130 function on_mouseover(ev) {
1131 groupbox.setAttribute('style','background: white');
1134 function on_mouseout(ev) {
1135 groupbox.setAttribute('style','');
1138 vbox.addEventListener('mouseover',on_mouseover,false);
1139 vbox.addEventListener('mouseout',on_mouseout,false);
1140 groupbox.addEventListener('mouseover',on_mouseover,false);
1141 groupbox.addEventListener('mouseout',on_mouseout,false);
1142 groupbox.firstChild.addEventListener('mouseover',on_mouseover,false);
1143 groupbox.firstChild.addEventListener('mouseout',on_mouseout,false);
1145 function on_click(ev){
1147 if (block) return; block = true;
1149 function post_c(v) {
1151 /* FIXME - kludgy */
1152 var t = input_cmd.match('apply_stat_cat') ? 'stat_cat' : ( input_cmd.match('apply_owning_lib') ? 'owning_lib' : 'attribute' );
1156 f = input_cmd.match(/apply\("(.+?)",/)[1];
1159 f = input_cmd.match(/apply_stat_cat\((.+?),/)[1];
1165 g.changed[ hbox.id ] = { 'type' : t, 'field' : f, 'value' : v };
1169 g.summarize( g.copies );
1171 document.getElementById(caption.id).focus();
1175 g.error.standard_unexpected_error_alert('post_c',E);
1178 var x; var c; eval( input_cmd );
1180 util.widgets.remove_children(vbox);
1181 util.widgets.remove_children(hbox);
1182 util.widgets.remove_children(hbox2);
1183 hbox.appendChild(x);
1184 var apply = document.createElement('button');
1185 apply.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.apply.label'));
1186 apply.setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.apply.accesskey'));
1187 hbox2.appendChild(apply);
1188 apply.addEventListener('command',function() { c(x.value); },false);
1189 var cancel = document.createElement('button');
1190 cancel.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.cancel.label'));
1191 cancel.addEventListener('command',function() { setTimeout( function() { g.summarize( g.copies ); g.render(); document.getElementById(caption.id).focus(); }, 0); }, false);
1192 hbox2.appendChild(cancel);
1193 setTimeout( function() { x.focus(); }, 0 );
1196 g.error.standard_unexpected_error_alert('render_input',E);
1199 vbox.addEventListener('click',on_click, false);
1200 hbox.addEventListener('click',on_click, false);
1201 caption.addEventListener('click',on_click, false);
1202 caption.addEventListener('keypress',function(ev) {
1203 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* mac enter */) on_click();
1205 caption.setAttribute('style','-moz-user-focus: normal');
1206 caption.setAttribute('onfocus','this.setAttribute("class","outline_me")');
1207 caption.setAttribute('onblur','this.setAttribute("class","")');
1210 g.error.sdump('D_ERROR',E + '\n');
1214 /******************************************************************************************************/
1215 /* store the copies in the global xpcom stash */
1217 g.stash_and_close = function() {
1219 if (g.handle_update) {
1221 var r = g.network.request(
1222 api.FM_ACP_FLESHED_BATCH_UPDATE.app,
1223 api.FM_ACP_FLESHED_BATCH_UPDATE.method,
1224 [ ses(), g.copies, true ]
1226 if (typeof r.ilsevent != 'undefined') {
1227 g.error.standard_unexpected_error_alert('copy update',r);
1229 alert($('catStrings').getString('staff.cat.copy_editor.handle_update.success'));
1231 /* FIXME -- revisit the return value here */
1233 alert($('catStrings').getString('staff.cat.copy_editor.handle_update.error') + ' ' + js2JSON(E));
1236 //g.data.temp_copies = js2JSON( g.copies );
1237 //g.data.stash('temp_copies');
1238 xulG.copies = g.copies;
1239 update_modal_xulG(xulG);
1242 g.error.standard_unexpected_error_alert('stash and close',E);
1246 /******************************************************************************************************/
1247 /* spawn copy notes interface */
1249 g.copy_notes = function() {
1250 JSAN.use('util.window'); var win = new util.window();
1252 urls.XUL_COPY_NOTES,
1253 //+ '?copy_id=' + window.escape(g.copies[0].id()),
1254 $("catStrings").getString("staff.cat.copy_editor.copy_notes"),'chrome,resizable,modal',
1255 { 'copy_id' : g.copies[0].id() }
1259 /******************************************************************************************************/
1260 /* hides or unhides stat cats based on library stat cat filter menu */
1261 g.toggle_stat_cat_display = function(el) {
1263 var visible = el.getAttribute('checked');
1264 var nl = document.getElementsByAttribute('sc_lib',el.getAttribute('value'));
1265 for (var n = 0; n < nl.length; n++) {
1267 nl[n].setAttribute('hidden','false');
1269 nl[n].setAttribute('hidden','true');
1272 g.copy_editor_prefs[ el.getAttribute('id') ] = { 'checked' : visible };
1273 g.save_attributes();
1276 /******************************************************************************************************/
1277 /* This adds a stat cat definition to the stat cat pane for rendering */
1278 g.save_attributes = function() {
1279 JSAN.use('util.widgets'); JSAN.use('util.file'); var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1280 var what_to_save = {};
1281 for (var i in g.copy_editor_prefs) {
1282 what_to_save[i] = [];
1283 for (var j in g.copy_editor_prefs[i]) what_to_save[i].push(j);
1285 util.widgets.save_attributes(file, what_to_save );
1288 /******************************************************************************************************/
1289 /* This adds a stat cat definition to the stat cat pane for rendering */
1290 g.add_stat_cat = function(sc) {
1292 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; g.data.stash('hash'); }
1296 if (typeof sc == 'object') {
1301 if (typeof g.stat_cat_seen[sc_id] != 'undefined') { return; }
1303 g.stat_cat_seen[ sc_id ] = 1;
1305 if (typeof sc != 'object') {
1307 sc = g.network.simple_request(
1308 'FM_ASC_BATCH_RETRIEVE',
1309 [ ses(), [ sc_id ] ]
1314 g.data.hash.asc[ sc.id() ] = sc; g.data.stash('hash');
1316 var label_name = g.data.hash.aou[ sc.owner() ].shortname() + " : " + sc.name();
1321 render: 'var l = util.functional.find_list( fm.stat_cat_entries(), function(e){ return e.stat_cat() == '
1322 + sc.id() + '; } ); l ? l.value() : $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null");',
1323 input: 'c = function(v){ g.apply_stat_cat(' + sc.id() + ',v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.remove_stat_cat_entry"), -1 ] ].concat( util.functional.map_list( g.data.hash.asc[' + sc.id()
1324 + '].entries(), function(obj){ return [ obj.value(), obj.id() ]; } ) ).sort() ); '
1325 + 'x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c),false);',
1332 g.panes_and_field_names.right_pane4.push( temp_array );
1334 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.add_stat_cat.error'), E);
1338 /******************************************************************************************************/
1339 /* Add stat cats to the panes_and_field_names.right_pane4 */
1340 g.populate_stat_cats = function() {
1342 g.data.stash_retrieve();
1343 g.stat_cat_seen = {};
1345 function get(lib_id,only_these) {
1346 g.data.stash_retrieve();
1347 var label = 'asc_list_for_lib_'+lib_id;
1348 if (typeof g.data[label] == 'undefined') {
1349 var robj = g.network.simple_request('FM_ASC_RETRIEVE_VIA_AOU', [ ses(), lib_id ]);
1350 if (typeof robj.ilsevent != 'undefined') throw(robj);
1352 for (var j = 0; j < robj.length; j++) {
1353 var my_asc = robj[j];
1354 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; }
1355 if (typeof g.data.hash.asc[ my_asc.id() ] == 'undefined') {
1356 g.data.hash.asc[ my_asc.id() ] = my_asc;
1358 var only_this_lib = my_asc.owner(); if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
1359 if (only_these.indexOf( String( only_this_lib ) ) != -1) {
1360 temp_list.push( my_asc );
1363 g.data[label] = temp_list; g.data.stash(label,'hash','list');
1365 return g.data[label];
1368 /* The stat cats for the pertinent library -- this is based on workstation ou */
1369 var label = 'asc_list_for_' + typeof g.data.ws_ou == 'object' ? g.data.ws_ou.id() : g.data.ws_ou;
1370 g.data[ label ] = g.data.list.my_asc; g.data.stash('label');
1371 for (var i = 0; i < g.data.list.my_asc.length; i++) {
1372 g.add_stat_cat( g.data.list.my_asc[i] );
1375 /* For the others, we want to consider the owning libs, circ libs, and any libs that have stat cats already on the copies,
1376 however, if batch editing, we only want to show the ones they have in common. So let's compile the libs */
1378 function add_common_ancestors(sc_libs) {
1379 JSAN.use('util.fm_utils');
1380 var libs = []; for (var i in sc_libs) libs.push(i);
1381 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
1382 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
1384 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
1385 var asc_list = get(ancestor, ancestors);
1386 for (var i = 0; i < asc_list.length; i++) {
1387 g.add_stat_cat( asc_list[i] );
1392 /* stat cats based on stat cat entries present on these copies */
1394 for (var i = 0; i < g.copies.length; i++) {
1395 var entries = g.copies[i].stat_cat_entries();
1396 if (!entries) entries = [];
1397 for (var j = 0; j < entries.length; j++) {
1398 var lib = entries[j].owner(); if (typeof lib == 'object') lib = lib.id();
1399 sc_libs[ lib ] = true;
1402 add_common_ancestors(sc_libs); // CAVEAT - if a copy has no stat_cat_entries, it basically gets no vote here
1404 /* stat cats based on Circ Lib */
1406 for (var i = 0; i < g.copies.length; i++) {
1407 var circ_lib = g.copies[i].circ_lib(); if (typeof circ_lib == 'object') circ_lib = circ_lib.id();
1408 sc_libs[ circ_lib ] = true;
1410 add_common_ancestors(sc_libs);
1412 /* stat cats based on Owning Lib */
1414 for (var i = 0; i < g.copies.length; i++) {
1415 var cn_id = g.copies[i].call_number();
1417 if (! g.map_acn[ cn_id ]) {
1418 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
1419 if (typeof req.ilsevent == 'undefined') {
1420 g.map_acn[ cn_id ] = req;
1425 var owning_lib = g.map_acn[ cn_id ].owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
1426 sc_libs[ owning_lib ] = true;
1429 add_common_ancestors(sc_libs); // CAVEAT - if a copy is a pre-cat, it basically gets no vote here
1431 g.panes_and_field_names.right_pane4.sort();
1435 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.populate_stat_cat.error'),E);