5 function $(id) { return document.getElementById(id); }
9 /******************************************************************************************************/
10 /* setup JSAN and some initial libraries */
12 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
13 if (typeof JSAN == 'undefined') {
14 throw( $('commonStrings').getString('common.jsan.missing') );
16 JSAN.errorLevel = "die"; // none, warn, or die
17 JSAN.addRepository('/xul/server/');
18 JSAN.use('util.error'); g.error = new util.error();
19 g.error.sdump('D_TRACE','my_init() for cat/copy_editor.xul');
21 JSAN.use('util.functional');
22 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
23 JSAN.use('util.network'); g.network = new util.network();
25 if (xulG.unified_interface) {
26 $('non_unified_buttons').hidden = true;
29 g.docid = xul_param('docid',{'modal_xulG':true});
30 g.handle_update = xul_param('handle_update',{'modal_xulG':true});
32 /******************************************************************************************************/
33 /* Get the copy ids from various sources and flesh them */
35 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});
36 if (!copy_ids) copy_ids = [];
38 if (copy_ids.length > 0) g.copies = g.network.simple_request(
39 'FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative',
43 /******************************************************************************************************/
44 /* And other fleshed copies if any */
46 if (!g.copies) g.copies = [];
47 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})
48 if (c) g.copies = g.copies.concat(c);
50 /******************************************************************************************************/
51 /* We try to retrieve callnumbers for existing copies, but for new copies, we rely on this */
53 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});
56 /******************************************************************************************************/
57 /* Quick fix, this was defined inline in the global scope but now needs g.error and g.copies from my_init */
58 /* Quick fix, messagecatalog only usable during/after onload */
63 /******************************************************************************************************/
64 /* Is the interface an editor or a viewer, single or multi copy, existing copies or new copies? */
66 if (xul_param('edit',{'modal_xulG':true}) == '1') {
70 if (g.copies.length > 0) { // When loaded in the unified interface, there may be no copies yet (from the volum/item creator)
72 // Editor desired, but let's check permissions
75 var check = g.network.simple_request(
76 'PERM_MULTI_ORG_CHECK',
79 g.data.list.au[0].id(),
80 util.functional.map_list(
84 var cn_id = o.call_number();
86 lib = o.circ_lib(); // base perms on circ_lib instead of owning_lib if pre-cat
88 if (! g.map_acn[ cn_id ]) {
89 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
90 if (typeof req.ilsevent == 'undefined') {
91 g.map_acn[ cn_id ] = req;
92 lib = g.map_acn[ cn_id ].owning_lib();
97 lib = g.map_acn[ cn_id ].owning_lib();
100 return typeof lib == 'object' ? lib.id() : lib;
103 g.copies.length == 1 ? [ 'UPDATE_COPY' ] : [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
106 g.edit = check.length == 0;
108 g.error.standard_unexpected_error_alert('batch permission check',E);
114 $('caption').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.caption'));
115 $('save').setAttribute('hidden','false');
117 $('top_nav').setAttribute('hidden','true');
120 g.retrieve_templates();
123 $('top_nav').setAttribute('hidden','true');
126 g.panes_and_field_names.left_pane =
129 $('catStrings').getString('staff.cat.copy_editor.status'),
131 render: 'typeof fm.status() == "object" ? fm.status().name() : g.data.hash.ccs[ fm.status() ].name()',
132 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,
133 //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);',
136 ].concat(g.panes_and_field_names.left_pane);
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 );
164 g.check_for_unmet_required_fields();
166 if (xulG.unified_interface) {
167 xulG.refresh_copy_editor = function() {
169 g.copies = xulG.copies;
170 g.edit = g.copies.length > 0;
172 $('caption').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.caption'));
174 g.original_copies = js2JSON( g.copies );
175 g.hide_copy_notes_button();
176 for (var i = 0; i < g.applied_templates.length; i++) {
177 g._apply_template( g.applied_templates[i], false);
179 g.summarize( g.copies );
181 g.check_for_unmet_required_fields();
183 alert('Error in copy_editor.js, xulG.refresh_copy_editor(): ' + E);
186 xulG.unlock_copy_editor = function() {
189 xulG.notify_of_templatable_field_change = function(id,v) {
190 g.changed[ 'volume_copy_creator.'+id ] = { 'type' : 'volume_copy_creator', 'field' : id, 'value' : v };
193 g.hide_copy_notes_button();
197 var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/copy_editor.js', E]);
198 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); dump(js2JSON(E)); }
203 /******************************************************************************************************/
204 /* Show copy notes button */
205 g.hide_copy_notes_button = function() {
206 if (g.copies.length > 0 && g.copies[0].id() < 0) {
207 document.getElementById('copy_notes').setAttribute('hidden','true');
208 $('save').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.create_copies'));
209 $('save').setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.create_copies.accesskey'));
211 if (g.copies.length != 1) {
212 document.getElementById('copy_notes').setAttribute('hidden','true');
216 /******************************************************************************************************/
217 /* Retrieve Templates */
219 g.retrieve_templates = function() {
221 JSAN.use('util.widgets'); JSAN.use('util.functional');
223 var robj = g.network.simple_request('FM_AUS_RETRIEVE',[ses(),g.data.list.au[0].id()]);
224 if (typeof robj['staff_client.copy_editor.templates'] != 'undefined') {
225 g.templates = robj['staff_client.copy_editor.templates'];
227 util.widgets.remove_children('template_placeholder');
228 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } ).sort();
230 g.template_menu = util.widgets.make_menulist( list );
231 g.template_menu.setAttribute('id','template_menu');
232 $('template_placeholder').appendChild(g.template_menu);
233 g.template_menu.addEventListener(
235 function() { g.copy_editor_prefs[ 'template_menu' ] = { 'value' : g.template_menu.value }; g.save_attributes(); },
239 if (xulG.unified_interface) {
240 if (typeof xulG.update_unified_template_list == 'function') {
241 xulG.update_unified_template_list(list);
242 // functions the unified wrapper should use to let the item attribute editor do the heavy lifting for templates
243 xulG.update_item_editor_template_selection = function(new_value) {
244 g.template_menu.value = new_value;
245 g.copy_editor_prefs[ 'template_menu' ] = { 'value' : g.template_menu.value };
248 xulG.item_editor_apply_template = function() { g.apply_template(true); };
249 xulG.item_editor_delete_template = function() { g.delete_template(); };
250 xulG.item_editor_save_template = function() { g.save_template(); };
251 xulG.item_editor_import_templates = function() { g.import_templates(); };
252 xulG.item_editor_export_templates = function() { g.export_templates(); };
253 xulG.item_editor_reset = function() { g.reset(); };
258 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.retrieve_templates.error'), E);
262 /******************************************************************************************************/
265 g.applied_templates = [];
267 g.apply_template = function(apply_volume_editor_template_changes) {
269 var name = g.template_menu.value;
270 if (g.templates[ name ] != 'undefined') {
271 g.applied_templates.push( name );
272 g._apply_template(name,apply_volume_editor_template_changes);
273 g.summarize( g.copies );
275 g.check_for_unmet_required_fields();
278 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.apply_templates.error'), E);
282 g._apply_template = function(name,apply_volume_editor_template_changes) {
284 if (g.templates[ name ] != 'undefined') {
285 var template = g.templates[ name ];
286 for (var i in template) {
287 g.changed[ i ] = template[ i ];
288 switch( template[i].type ) {
290 g.apply(template[i].field,template[i].value);
293 if (g.stat_cat_seen[ template[i].field ]) g.apply_stat_cat(template[i].field,template[i].value);
296 g.apply_owning_lib(template[i].value);
298 case 'volume_copy_creator' :
299 if (xulG.unified_interface && apply_volume_editor_template_changes) {
300 xulG.apply_template_to_batch(template[i].field,template[i].value);
307 alert('Error in copy_editor.js, g._apply_template('+name+'): ' + E);
311 /******************************************************************************************************/
312 /* Save as Template */
314 g.save_template = function() {
316 var name = window.prompt(
317 $('catStrings').getString('staff.cat.copy_editor.save_as_template.prompt'),
319 $('catStrings').getString('staff.cat.copy_editor.save_as_template.title')
322 g.templates[name] = g.changed;
323 var robj = g.network.simple_request(
324 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
326 if (typeof robj.ilsevent != 'undefined') {
329 alert($('catStrings').getFormattedString('staff.cat.copy_editor.save_as_template.success', [name]));
333 g.retrieve_templates();
335 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
341 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
345 /******************************************************************************************************/
346 /* Delete Template */
348 g.delete_template = function() {
350 var name = g.template_menu.value;
352 if (! window.confirm($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]))) return;
353 delete(g.templates[name]);
354 var robj = g.network.simple_request(
355 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
357 if (typeof robj.ilsevent != 'undefined') {
360 alert($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]));
364 g.retrieve_templates();
366 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
372 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
376 /******************************************************************************************************/
377 /* Export Templates */
379 g.export_templates = function() {
381 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
382 JSAN.use('util.file'); var f = new util.file('');
383 f.export_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.export_templates.title'), 'data' : g.templates } );
385 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.export_templates.error'), E);
389 /******************************************************************************************************/
390 /* Import Templates */
392 g.import_templates = function() {
394 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
395 JSAN.use('util.file'); var f = new util.file('');
396 var temp = f.import_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.import_templates.title') } );
398 for (var i in temp) {
400 if (g.templates[i]) {
402 var r = g.error.yns_alert(
403 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.prompt') + '\n' + g.error.pretty_print( js2JSON( temp[i] ) ),
404 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.replace.title', [i]),
405 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.yes'),
406 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.no'),
408 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.click_here')
411 if (r == 0 /* Yes */) g.templates[i] = temp[i];
415 g.templates[i] = temp[i];
421 var r = g.error.yns_alert(
422 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.prompt'),
423 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.save.title'),
424 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.yes'),
425 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.no'),
427 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.click_here')
430 if (r == 0 /* Yes */) {
431 var robj = g.network.simple_request(
432 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
434 if (typeof robj.ilsevent != 'undefined') {
437 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.success'));
441 g.retrieve_templates();
443 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.error'), E);
449 util.widgets.remove_children('template_placeholder');
450 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } );
451 g.template_menu = util.widgets.make_menulist( list );
452 $('template_placeholder').appendChild(g.template_menu);
453 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.note'));
458 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.error'), E);
463 /******************************************************************************************************/
464 /* Restore backup copies */
466 g.reset = function() {
467 g.applied_templates = [];
469 g.copies = JSON2js( g.original_copies );
470 g.summarize( g.copies );
472 g.check_for_unmet_required_fields();
474 if (xulG.unified_interface) {
475 xulG.reset_batch_menus();
479 /******************************************************************************************************/
480 /* Apply a value to a specific field on all the copies being edited */
482 g.apply = function(field,value) {
483 g.error.sdump('D_TRACE','applying field = <' + field + '> value = <' + value + '>\n');
484 if (value == '<HACK:KLUDGE:NULL>') {
487 if (field == 'alert_message') { value = value.replace(/^\W+$/g,''); }
488 if (field == 'price' || field == 'deposit_amount') {
492 JSAN.use('util.money'); value = util.money.sanitize( value );
495 for (var i = 0; i < g.copies.length; i++) {
496 var copy = g.copies[i];
498 copy[field]( value ); copy.ischanged('1');
507 /******************************************************************************************************/
508 /* Apply a stat cat entry to all the copies being edited. An entry_id of < 0 signifies the stat cat is being removed. */
510 g.apply_stat_cat = function(sc_id,entry_id) {
511 g.error.sdump('D_TRACE','sc_id = ' + sc_id + ' entry_id = ' + entry_id + '\n');
512 for (var i = 0; i < g.copies.length; i++) {
513 var copy = g.copies[i];
516 var temp = copy.stat_cat_entries();
517 if (!temp) temp = [];
518 temp = util.functional.filter_list(
521 return (obj.stat_cat() != sc_id);
526 util.functional.find_id_object_in_list(
527 g.data.hash.asc[sc_id].entries(),
532 copy.stat_cat_entries( temp );
535 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
542 /******************************************************************************************************/
543 /* Apply an "owning lib" to all the copies being edited. That is, change and auto-vivicating volumes */
545 g.apply_owning_lib = function(ou_id) {
546 g.error.sdump('D_TRACE','ou_id = ' + ou_id + '\n');
547 // but don't allow this when bundled with the volume/copy creator UI, or if we're editing pre-cats
548 if (! g.safe_to_change_owning_lib() ) { return; }
549 for (var i = 0; i < g.copies.length; i++) {
550 var copy = g.copies[i];
552 if (!g.map_acn[copy.call_number()]) {
553 var volume = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ copy.call_number() ]);
554 if (typeof volume.ilsevent != 'undefined') {
555 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.undefined_volume.error', [copy.barcode()]), volume);
558 g.map_acn[copy.call_number()] = volume;
560 var old_volume = g.map_acn[copy.call_number()];
561 var acn_blob = g.network.simple_request(
562 'FM_ACN_FIND_OR_CREATE',
563 [ses(),old_volume.label(),old_volume.record(),ou_id,old_volume.prefix().id(),old_volume.suffix().id(),old_volume.label_class().id()]
565 if (typeof acn_blob.ilsevent != 'undefined') {
566 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.call_number.error', [copy.barcode()]), acn_blob);
569 copy.call_number(acn_blob.acn_id);
572 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
579 /******************************************************************************************************/
580 /* This returns false if any of the copies being edited are pre-cats, or if we're embedded in the unified volume/copy UI */
582 g.safe_to_change_owning_lib = function() {
584 if (xulG.unified_interface) { return false; }
586 for (var i = 0; i < g.copies.length; i++) {
587 var cn = g.copies[i].call_number();
588 if (typeof cn == 'object') { cn = cn.id(); }
589 if (cn == -1) { safe = false; }
593 g.error.standard_unexpected_error_alert('safe_to_change_owning_lib?',E);
598 /******************************************************************************************************/
599 /* This returns true if none of the copies being edited have a magical status found in my_constants.magical_statuses */
601 g.safe_to_edit_copy_status = function() {
604 for (var i = 0; i < g.copies.length; i++) {
605 var status = g.copies[i].status(); if (typeof status == 'object') status = status.id();
606 if (typeof my_constants.magical_statuses[ status ] != 'undefined') safe = false;
610 g.error.standard_unexpected_error_alert('safe_to_edit_copy_status?',E);
615 /******************************************************************************************************/
616 /* This concats and uniques all the alert messages for use as the default value for a new alert message */
618 g.populate_alert_message_input = function(tb) {
620 var seen = {}; var s = '';
621 for (var i = 0; i < g.copies.length; i++) {
622 var msg = g.copies[i].alert_message();
624 if (typeof seen[msg] == 'undefined') {
630 tb.setAttribute('value',s);
632 g.error.standard_unexpected_error_alert('populate_alert_message_input',E);
636 /***************************************************************************************************************/
637 /* This returns a list of acpl's appropriate for the copies being edited (and caches them in the global stash) */
639 g.get_acpl_list_for_lib = function(lib_id,but_only_these) {
640 g.data.stash_retrieve();
641 var label = 'acpl_list_for_lib_'+lib_id;
642 if (typeof g.data[label] == 'undefined') {
643 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
644 if (typeof robj.ilsevent != 'undefined') throw(robj);
646 for (var j = 0; j < robj.length; j++) {
647 var my_acpl = robj[j];
648 if (typeof g.data.hash.acpl[ my_acpl.id() ] == 'undefined') {
649 g.data.hash.acpl[ my_acpl.id() ] = my_acpl;
650 g.data.list.acpl.push( my_acpl );
652 var only_this_lib = my_acpl.owning_lib(); if (!only_this_lib) continue;
653 if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
654 if (but_only_these.indexOf( String( only_this_lib ) ) != -1) { // This filters out some of the libraries (usually the descendants)
655 temp_list.push( my_acpl );
658 g.data[label] = temp_list; g.data.stash(label,'hash','list');
660 return g.data[label];
663 /******************************************************************************************************/
664 /* This returns a list of acpl's appropriate for the copies being edited */
666 g.get_acpl_list = function() {
669 JSAN.use('util.functional');
673 /**************************************/
674 /* get owning libs from call numbers */
676 var owning_libs = {};
677 for (var i = 0; i < g.copies.length; i++) {
678 var callnumber = g.copies[i].call_number();
679 if (!callnumber) continue;
680 var cn_id = typeof callnumber == 'object' ? callnumber.id() : callnumber;
682 if (! g.map_acn[ cn_id ]) {
683 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
684 if (typeof req.ilsevent == 'undefined') {
685 g.map_acn[ cn_id ] = req;
690 var consider_lib = g.map_acn[ cn_id ].owning_lib();
691 if (!consider_lib) continue;
692 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
696 for (var i in g.callnumbers) {
697 var consider_lib = g.callnumbers[i].owning_lib;
698 if (!consider_lib) continue;
699 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
703 /***************************************************************************************************/
704 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
706 JSAN.use('util.fm_utils');
707 var libs = []; for (var i in owning_libs) libs.push(i);
708 if (libs.length > 0) {
709 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
710 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
713 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
714 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
715 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
716 if (acpl_list[i] != null) {
717 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
728 for (var i = 0; i < g.copies.length; i++) {
729 var consider_lib = g.copies[i].circ_lib();
730 if (!consider_lib) continue;
731 circ_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
734 /***************************************************************************************************/
735 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
737 libs = []; for (var i in circ_libs) libs.push(i);
738 if (libs.length > 0) {
739 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
740 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
743 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
744 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
745 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
746 if (acpl_list[i] != null) {
747 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
753 var acpl_list = []; for (var i in my_acpls) acpl_list.push( g.data.hash.acpl[ i ] );
754 return acpl_list.sort(
756 var label_a = g.data.hash.aou[ a.owning_lib() ].shortname() + ' : ' + a.name();
757 var label_b = g.data.hash.aou[ b.owning_lib() ].shortname() + ' : ' + b.name();
758 if (label_a < label_b) return -1;
759 if (label_a > label_b) return 1;
765 g.error.standard_unexpected_error_alert('get_acpl_list',E);
771 /******************************************************************************************************/
772 /* This keeps track of which fields have been edited for styling purposes */
776 /******************************************************************************************************/
777 /* This keeps track of which fields are required, and which fields have been populated */
782 /******************************************************************************************************/
783 /* These need data from the middle layer to render */
785 function init_panes0() {
786 g.special_exception = {};
787 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.owning_library.label')] = function(label,value) {
788 JSAN.use('util.widgets');
789 if (value>0) { /* an existing call number */
790 g.network.simple_request(
791 'FM_ACN_RETRIEVE.authoritative',
794 var cn = '??? id = ' + value;
796 cn = req.getResultObject();
798 g.error.sdump('D_ERROR','callnumber retrieve: ' + E);
800 util.widgets.set_text(label,g.data.hash.aou[ cn.owning_lib() ].shortname() + ' : ' + cn.label());
803 } else { /* a yet to be created call number */
805 util.widgets.set_text(label,g.data.hash.aou[ g.callnumbers[value].owning_lib ].shortname() + ' : ' + g.callnumbers[value].label);
809 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.creator.label')] = function(label,value) {
810 if (!Number(value)) return;
811 g.network.simple_request(
812 'FM_AU_RETRIEVE_VIA_ID',
815 var p = '??? id = ' + value;
817 p = req.getResultObject();
821 g.error.sdump('D_ERROR','patron retrieve: ' + E);
823 JSAN.use('util.widgets');
824 util.widgets.set_text(label,p);
828 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.last_editor.label')] = function(label,value) {
829 if (!Number(value)) return;
830 g.network.simple_request(
831 'FM_AU_RETRIEVE_VIA_ID',
834 var p = '??? id = ' + value;
836 p = req.getResultObject();
840 g.error.sdump('D_ERROR','patron retrieve: ' + E);
842 util.widgets.set_text(label,p);
848 /******************************************************************************************************/
849 g.readonly_stat_cat_names = [];
850 g.editable_stat_cat_names = [];
852 /******************************************************************************************************/
853 /* These get show in the left panel */
855 function init_panes() {
856 g.panes_and_field_names = {
861 $('catStrings').getString('staff.cat.copy_editor.field.barcode.label'),
863 render: 'fm.barcode();',
867 $('catStrings').getString('staff.cat.copy_editor.field.creation_date.label'),
869 render: 'util.date.formatted_date( fm.create_date(), "%F");',
873 $('catStrings').getString('staff.cat.copy_editor.field.active_date.label'),
875 render: 'util.date.formatted_date( fm.active_date(), "%F");',
879 $('catStrings').getString('staff.cat.copy_editor.field.creator.label'),
881 render: 'fm.creator();',
885 $('catStrings').getString('staff.cat.copy_editor.field.last_edit_date.label'),
887 render: 'util.date.formatted_date( fm.edit_date(), "%F");',
891 $('catStrings').getString('staff.cat.copy_editor.field.last_editor.label'),
893 render: 'fm.editor();',
902 $('catStrings').getString('staff.cat.copy_editor.field.location.label'),
904 render: 'typeof fm.location() == "object" ? fm.location().name() : g.data.lookup("acpl",fm.location()).name()',
905 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);',
910 $('catStrings').getString('staff.cat.copy_editor.field.circulation_library.label'),
912 render: 'typeof fm.circ_lib() == "object" ? fm.circ_lib().shortname() : g.data.hash.aou[ fm.circ_lib() ].shortname()',
913 //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);',
914 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);',
918 $('catStrings').getString('staff.cat.copy_editor.field.owning_library.label'),
920 render: 'fm.call_number();',
921 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,
925 $('catStrings').getString('staff.cat.copy_editor.field.copy_number.label'),
927 render: 'fm.copy_number() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.copy_number()',
928 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);',
938 $('catStrings').getString('staff.cat.copy_editor.field.circulate.label'),
940 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") )',
941 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);',
945 $('catStrings').getString('staff.cat.copy_editor.field.holdable.label'),
947 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") )',
948 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);',
952 $('catStrings').getString('staff.cat.copy_editor.field.age_based_hold_protection.label'),
954 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() )',
955 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);',
960 $('catStrings').getString('staff.cat.copy_editor.field.floating.label'),
962 render: 'fm.floating() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : ( get_bool( fm.floating() ) ? $("catStrings").getString("staff.cat.copy_editor.field.floating.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.floating.no_or_false") )',
963 input: 'c = function(v){ g.apply("floating",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.floating.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.floating.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
967 $('catStrings').getString('staff.cat.copy_editor.field.loan_duration.label'),
969 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; }',
970 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);',
975 $('catStrings').getString('staff.cat.copy_editor.field.fine_level.label'),
977 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; }',
978 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);',
983 $('catStrings').getString('staff.cat.copy_editor.field.circulate_as_type.label'),
985 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',
986 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);',
990 $('catStrings').getString('staff.cat.copy_editor.field.circulation_modifier.label'),
992 render: 'fm.circ_modifier() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : $("commonStrings").getFormattedString("staff.circ_modifier.display",[fm.circ_modifier(),g.data.hash.ccm[fm.circ_modifier()].name(),g.data.hash.ccm[fm.circ_modifier()].description()])',
993 input: 'c = function(v){ g.apply("circ_modifier",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"), "<HACK:KLUDGE:NULL>" ] ].concat( util.functional.map_list( g.data.list.ccm, function(obj) { return [ $("commonStrings").getFormattedString("staff.circ_modifier.display",[obj.code(),obj.name(),obj.description()]), obj.code() ]; } ).sort() ) ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
1000 $('catStrings').getString('staff.cat.copy_editor.field.alert_message.label'),
1002 render: 'fm.alert_message() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.alert_message()',
1003 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);',
1008 $('catStrings').getString('staff.cat.copy_editor.field.deposit.label'),
1010 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") )',
1011 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);',
1015 $('catStrings').getString('staff.cat.copy_editor.field.deposit_amount.label'),
1017 render: 'if (fm.deposit_amount() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.deposit_amount() ); }',
1018 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);',
1022 $('catStrings').getString('staff.cat.copy_editor.field.price.label'),
1024 render: 'if (fm.price() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.price() ); }',
1025 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);',
1030 $('catStrings').getString('staff.cat.copy_editor.field.opac_visible.label'),
1032 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") )',
1033 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);',
1037 $('catStrings').getString('staff.cat.copy_editor.field.reference.label'),
1039 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") )',
1040 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);',
1044 $('catStrings').getString('staff.cat.copy_editor.field.mint_condition.label'),
1046 render: 'get_bool( fm.mint_condition() ) ? $("catStrings").getString("staff.cat.copy_editor.field.mint_condition.yes_or_true") : $("catStrings").getString("staff.cat.copy_editor.field.mint_condition.no_or_false")',
1047 input: 'c = function(v){ g.apply("mint_condition",v); if (typeof post_c == "function") post_c(v); }; x = util.widgets.make_menulist( [ [ $("catStrings").getString("staff.cat.copy_editor.field.mint_condition.yes_or_true"), get_db_true() ], [ $("catStrings").getString("staff.cat.copy_editor.field.mint_condition.no_or_false"), get_db_false() ] ] ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
1059 /******************************************************************************************************/
1060 /* This loops through all our fieldnames and all the copies, tallying up counts for the different values */
1062 g.summarize = function( copies ) {
1063 /******************************************************************************************************/
1066 JSAN.use('util.date'); JSAN.use('util.money');
1069 for (var i in g.panes_and_field_names) {
1070 g.field_names = g.field_names.concat( g.panes_and_field_names[i] );
1072 g.field_names = g.field_names.concat( g.editable_stat_cat_names );
1073 g.field_names = g.field_names.concat( g.readonly_stat_cat_names );
1075 /******************************************************************************************************/
1076 /* Loop through the field names */
1078 for (var i = 0; i < g.field_names.length; i++) {
1080 var field_name = g.field_names[i][0];
1081 var render = g.field_names[i][1].render;
1082 var attr = g.field_names[i][1].attr;
1083 g.summary[ field_name ] = {};
1084 g.populated[ field_name ] = 1; // delete later if we encounter a copy with the field unset
1086 /******************************************************************************************************/
1087 /* Loop through the copies */
1089 for (var j = 0; j < copies.length; j++) {
1092 var cmd = render || ('fm.' + field_name + '();');
1093 var value = $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null");
1095 /**********************************************************************************************/
1096 /* Try to retrieve the value for this field for this copy */
1099 value = eval( cmd );
1101 g.error.sdump('D_ERROR','Attempted ' + cmd + '\n' + E + '\n');
1103 if (typeof value == 'object' && value != null) {
1104 alert('FIXME: field_name = <' + field_name + '> value = <' + js2JSON(value) + '>\n');
1106 if (value == $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null")) {
1107 delete g.populated[field_name];
1110 /**********************************************************************************************/
1111 /* Tally the count */
1113 if (g.summary[ field_name ][ value ]) {
1114 g.summary[ field_name ][ value ]++;
1116 g.summary[ field_name ][ value ] = 1;
1120 g.error.sdump('D_TRACE','summary = ' + js2JSON(g.summary) + '\n');
1123 /******************************************************************************************************/
1124 /* Display the summarized data and inputs for editing */
1126 g.render = function() {
1128 /******************************************************************************************************/
1129 /* Library setup and clear any existing interface */
1131 JSAN.use('util.widgets'); JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('util.functional');
1133 for (var i in g.panes_and_field_names) {
1134 var p = document.getElementById(i);
1135 if (p) util.widgets.remove_children(p);
1138 /******************************************************************************************************/
1139 /* Populate the library filter menu for stat cats */
1142 for (var i = 0; i < g.panes_and_field_names.right_pane4.length; i++) {
1143 sc_libs[ g.panes_and_field_names.right_pane4[i][1].attr.sc_lib ] = true;
1146 for (var i in sc_libs) { sc_libs2.push( [ g.data.hash.aou[ i ].shortname(), i ] ); }
1148 var x = document.getElementById("stat_cat_lib_filter_menu").firstChild;
1149 JSAN.use('util.widgets'); util.widgets.remove_children(x);
1150 for (var i = 0; i < sc_libs2.length; i++) {
1151 var menuitem = document.createElement('menuitem');
1152 menuitem.setAttribute('id','filter_'+sc_libs2[i][1]);
1153 menuitem.setAttribute('type','checkbox');
1154 menuitem.setAttribute('checked','true');
1155 menuitem.setAttribute('label',sc_libs2[i][0]);
1156 menuitem.setAttribute('value',sc_libs2[i][1]);
1157 menuitem.setAttribute('oncommand','try{g.toggle_stat_cat_display(this);}catch(E){alert(E);}');
1158 x.appendChild(menuitem);
1161 /******************************************************************************************************/
1162 /* Prepare the panes */
1164 var groupbox; var caption; var vbox; var grid; var rows;
1166 /******************************************************************************************************/
1167 /* Loop through the field names */
1169 for (h in g.panes_and_field_names) {
1170 if (!document.getElementById(h)) continue;
1171 for (var i = 0; i < g.panes_and_field_names[h].length; i++) {
1173 var f = g.panes_and_field_names[h][i]; var fn = f[0]; var attr = f[1].attr;
1174 groupbox = document.createElement('groupbox'); document.getElementById(h).appendChild(groupbox);
1176 for (var a in attr) {
1177 groupbox.setAttribute(a,attr[a]);
1180 caption = document.createElement('caption'); groupbox.appendChild(caption);
1181 caption.setAttribute('label',fn);
1182 caption.setAttribute('id','caption_'+fn); // used for focus/keyboard navigation
1183 vbox = document.createElement('vbox'); groupbox.appendChild(vbox); // main display widget goes here
1184 if (typeof g.changed[fn] != 'undefined') { addCSSClass(vbox,'copy_editor_field_changed'); }
1185 if (typeof g.required[fn] != 'undefined') { addCSSClass(vbox,'copy_editor_field_required'); }
1186 grid = util.widgets.make_grid( [ { 'flex' : 1 }, {}, {} ] ); vbox.appendChild(grid);
1187 grid.setAttribute('flex','1');
1188 rows = grid.lastChild;
1191 /**************************************************************************************/
1192 /* Loop through each value for the field */
1194 for (var j in g.summary[fn]) {
1195 var value = j; var count = g.summary[fn][j];
1196 row = document.createElement('row'); rows.appendChild(row);
1197 var label1 = document.createElement('description'); row.appendChild(label1);
1198 if (g.special_exception[ fn ]) {
1199 g.special_exception[ fn ]( label1, value );
1201 label1.appendChild( document.createTextNode(value) );
1203 var label2 = document.createElement('description'); row.appendChild(label2);
1206 copy_count = $('catStrings').getString('staff.cat.copy_editor.copy_count');
1208 copy_count = $('catStrings').getFormattedString('staff.cat.copy_editor.copy_count.plural', [count]);
1210 label2.appendChild( document.createTextNode(copy_count) );
1212 groupbox.setAttribute('id','groupbox_'+fn); // this id is meant to be referenced by cat_custom.css for hiding fields
1213 var hbox = document.createElement('hbox'); // main input controls go here
1214 hbox.setAttribute('id',fn); // this id gets used to color areas green, etc.
1215 groupbox.appendChild(hbox);
1216 var hbox2 = document.createElement('hbox'); // cancel/apply buttons go here
1217 groupbox.appendChild(hbox2);
1219 /**************************************************************************************/
1220 /* Render the input widget */
1222 if (f[1].input && g.edit) {
1223 g.render_input(hbox,f[1]);
1227 g.error.sdump('D_ERROR','copy editor: ' + E + '\n');
1233 /******************************************************************************************************/
1234 /* Synchronize stat cat visibility with library filter menu, and default template selection */
1235 JSAN.use('util.file');
1236 var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1237 g.copy_editor_prefs = util.widgets.load_attributes(file);
1238 for (var i in g.copy_editor_prefs) {
1239 if (i.match(/filter_/) && g.copy_editor_prefs[i].checked == '') {
1241 g.toggle_stat_cat_display( document.getElementById(i) );
1242 } catch(E) { alert(E); }
1245 if (g.template_menu) g.template_menu.value = g.template_menu.getAttribute('value');
1249 /******************************************************************************************************/
1250 /* This actually draws the change button and input widget for a given field */
1251 g.render_input = function(node,blob) {
1253 // node = hbox ; groupbox -> hbox, hbox
1255 var groupbox = node.parentNode;
1256 var caption = groupbox.firstChild;
1257 var vbox = node.previousSibling;
1259 var hbox2 = node.nextSibling;
1261 var input_cmd = blob.input;
1262 var render_cmd = blob.render;
1263 var attr = blob.attr;
1265 var block = false; var first = true;
1267 function on_mouseover(ev) {
1268 groupbox.setAttribute('style','background: white');
1271 function on_mouseout(ev) {
1272 groupbox.setAttribute('style','');
1275 vbox.addEventListener('mouseover',on_mouseover,false);
1276 vbox.addEventListener('mouseout',on_mouseout,false);
1277 groupbox.addEventListener('mouseover',on_mouseover,false);
1278 groupbox.addEventListener('mouseout',on_mouseout,false);
1279 groupbox.firstChild.addEventListener('mouseover',on_mouseover,false);
1280 groupbox.firstChild.addEventListener('mouseout',on_mouseout,false);
1282 function on_click(ev){
1284 if (block) return; block = true;
1288 function post_c(v) {
1290 /* FIXME - kludgy */
1291 var t = input_cmd.match('apply_stat_cat') ? 'stat_cat' : ( input_cmd.match('apply_owning_lib') ? 'owning_lib' : 'attribute' );
1295 f = input_cmd.match(/apply\("(.+?)",/)[1];
1298 f = input_cmd.match(/apply_stat_cat\((.+?),/)[1];
1304 g.changed[ hbox.id ] = { 'type' : t, 'field' : f, 'value' : v };
1308 g.summarize( g.copies );
1310 g.check_for_unmet_required_fields();
1311 document.getElementById(caption.id).focus();
1315 g.error.standard_unexpected_error_alert('post_c',E);
1318 var x; var c; eval( input_cmd );
1320 util.widgets.remove_children(vbox);
1321 util.widgets.remove_children(hbox);
1322 util.widgets.remove_children(hbox2);
1323 hbox.appendChild(x);
1324 var apply = document.createElement('button');
1325 apply.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.apply.label'));
1326 apply.setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.apply.accesskey'));
1327 hbox2.appendChild(apply);
1328 apply.addEventListener('command',function() { c(x.value); },false);
1329 var cancel = document.createElement('button');
1330 cancel.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.cancel.label'));
1331 cancel.addEventListener('command',function() {
1332 setTimeout( function() {
1333 g.summarize( g.copies );
1335 g.check_for_unmet_required_fields();
1336 document.getElementById(caption.id).focus();
1341 hbox2.appendChild(cancel);
1342 setTimeout( function() { x.focus(); }, 0 );
1345 g.error.standard_unexpected_error_alert('render_input',E);
1348 vbox.addEventListener('click',on_click, false);
1349 hbox.addEventListener('click',on_click, false);
1350 caption.addEventListener('click',on_click, false);
1351 caption.addEventListener('keypress',function(ev) {
1352 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* mac enter */) on_click();
1354 caption.setAttribute('style','-moz-user-focus: normal');
1355 caption.setAttribute('onfocus','this.setAttribute("class","outline_me")');
1356 caption.setAttribute('onblur','this.setAttribute("class","")');
1359 g.error.sdump('D_ERROR',E + '\n');
1363 /******************************************************************************************************/
1364 /* store the copies in the global xpcom stash */
1366 g.stash_and_close = function() {
1370 if (g.handle_update) {
1372 var r = g.network.request(
1373 api.FM_ACP_FLESHED_BATCH_UPDATE.app,
1374 api.FM_ACP_FLESHED_BATCH_UPDATE.method,
1375 [ ses(), g.copies, true ]
1377 if (typeof r.ilsevent != 'undefined') {
1378 g.error.standard_unexpected_error_alert('copy update',r);
1380 /* FIXME -- revisit the return value here */
1382 alert($('catStrings').getString('staff.cat.copy_editor.handle_update.error') + ' ' + js2JSON(E));
1385 //g.data.temp_copies = js2JSON( g.copies );
1386 //g.data.stash('temp_copies');
1387 xulG.copies = g.copies;
1388 update_modal_xulG(xulG);
1389 JSAN.use('util.widgets');
1390 util.widgets.dispatch('close',window);
1392 alert('Error in copy_editor.js, g.stash_and_close(): '+E);
1396 /******************************************************************************************************/
1397 /* spawn copy notes interface */
1399 g.copy_notes = function() {
1400 JSAN.use('util.window'); var win = new util.window();
1402 urls.XUL_COPY_NOTES,
1403 //+ '?copy_id=' + window.escape(g.copies[0].id()),
1404 $("catStrings").getString("staff.cat.copy_editor.copy_notes"),'chrome,resizable,modal',
1405 { 'copy_id' : g.copies[0].id() }
1409 /******************************************************************************************************/
1410 /* hides or unhides stat cats based on library stat cat filter menu */
1411 g.toggle_stat_cat_display = function(el) {
1413 var visible = el.getAttribute('checked');
1414 var nl = document.getElementsByAttribute('sc_lib',el.getAttribute('value'));
1415 for (var n = 0; n < nl.length; n++) {
1417 nl[n].setAttribute('hidden','false');
1419 nl[n].setAttribute('hidden','true');
1422 g.copy_editor_prefs[ el.getAttribute('id') ] = { 'checked' : visible };
1423 g.save_attributes();
1426 /******************************************************************************************************/
1427 /* This adds a stat cat definition to the stat cat pane for rendering */
1428 g.save_attributes = function() {
1429 JSAN.use('util.widgets'); JSAN.use('util.file'); var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1430 var what_to_save = {};
1431 for (var i in g.copy_editor_prefs) {
1432 what_to_save[i] = [];
1433 for (var j in g.copy_editor_prefs[i]) what_to_save[i].push(j);
1435 util.widgets.save_attributes(file, what_to_save );
1438 /******************************************************************************************************/
1439 /* This adds a stat cat definition to the stat cat pane for rendering */
1440 g.add_stat_cat = function(sc) {
1442 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; g.data.stash('hash'); }
1446 if (typeof sc == 'object') {
1451 if (typeof g.stat_cat_seen[sc_id] != 'undefined') { return; }
1453 g.stat_cat_seen[ sc_id ] = 1;
1455 if (typeof sc != 'object') {
1457 sc = g.network.simple_request(
1458 'FM_ASC_BATCH_RETRIEVE',
1459 [ ses(), [ sc_id ] ]
1464 g.data.hash.asc[ sc.id() ] = sc; g.data.stash('hash');
1466 var label_name = g.data.hash.aou[ sc.owner() ].shortname() + " : " + sc.name();
1468 if (get_bool( sc.required() )) {
1469 g.required[ label_name ] = 1;
1475 render: 'var l = util.functional.find_list( fm.stat_cat_entries(), function(e){ return e.stat_cat() == '
1476 + sc.id() + '; } ); l ? l.value() : $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null");',
1477 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()
1478 + '].entries(), function(obj){ return [ obj.value(), obj.id() ]; } ) ).sort() ); '
1479 + 'x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c),false);',
1486 g.panes_and_field_names.right_pane4.push( temp_array );
1488 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.add_stat_cat.error'), E);
1492 /******************************************************************************************************/
1493 /* Add stat cats to the panes_and_field_names.right_pane4 */
1494 g.populate_stat_cats = function() {
1496 g.data.stash_retrieve();
1497 g.stat_cat_seen = {}; // used for determining whether a stat cat is displayed (and is eligible to be manipulated via a template)
1499 function get(lib_id,only_these) {
1500 g.data.stash_retrieve();
1501 var label = 'asc_list_for_lib_'+lib_id;
1502 if (typeof g.data[label] == 'undefined') {
1503 var robj = g.network.simple_request('FM_ASC_RETRIEVE_VIA_AOU', [ ses(), lib_id ]);
1504 if (typeof robj.ilsevent != 'undefined') throw(robj);
1506 for (var j = 0; j < robj.length; j++) {
1507 var my_asc = robj[j];
1508 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; }
1509 if (typeof g.data.hash.asc[ my_asc.id() ] == 'undefined') {
1510 g.data.hash.asc[ my_asc.id() ] = my_asc;
1512 var only_this_lib = my_asc.owner(); if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
1513 if (only_these.indexOf( String( only_this_lib ) ) != -1) {
1514 temp_list.push( my_asc );
1517 g.data[label] = temp_list; g.data.stash(label,'hash','list');
1519 return g.data[label];
1522 /* The stat cats for the pertinent library -- this is based on workstation ou */
1523 var label = 'asc_list_for_' + typeof g.data.ws_ou == 'object' ? g.data.ws_ou.id() : g.data.ws_ou;
1524 g.data[ label ] = g.data.list.my_asc; g.data.stash('label');
1525 for (var i = 0; i < g.data.list.my_asc.length; i++) {
1526 g.add_stat_cat( g.data.list.my_asc[i] );
1529 /* For the others, we want to consider the owning libs, circ libs, and any libs that have stat cats already on the copies,
1530 however, if batch editing, we only want to show the ones they have in common. So let's compile the libs */
1532 function add_common_ancestors(sc_libs) {
1533 JSAN.use('util.fm_utils');
1534 var libs = []; for (var i in sc_libs) libs.push(i);
1535 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
1536 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
1538 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
1539 var asc_list = get(ancestor, ancestors);
1540 for (var i = 0; i < asc_list.length; i++) {
1541 g.add_stat_cat( asc_list[i] );
1546 /* stat cats based on stat cat entries present on these copies */
1548 for (var i = 0; i < g.copies.length; i++) {
1549 var entries = g.copies[i].stat_cat_entries();
1550 if (!entries) entries = [];
1551 for (var j = 0; j < entries.length; j++) {
1552 var lib = entries[j].owner(); if (typeof lib == 'object') lib = lib.id();
1553 sc_libs[ lib ] = true;
1556 add_common_ancestors(sc_libs); // CAVEAT - if a copy has no stat_cat_entries, it basically gets no vote here
1558 /* stat cats based on Circ Lib */
1560 for (var i = 0; i < g.copies.length; i++) {
1561 var circ_lib = g.copies[i].circ_lib(); if (typeof circ_lib == 'object') circ_lib = circ_lib.id();
1562 sc_libs[ circ_lib ] = true;
1564 add_common_ancestors(sc_libs);
1566 /* stat cats based on Owning Lib */
1568 for (var i = 0; i < g.copies.length; i++) {
1569 var cn_id = g.copies[i].call_number();
1571 if (! g.map_acn[ cn_id ]) {
1572 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
1573 if (typeof req.ilsevent == 'undefined') {
1574 g.map_acn[ cn_id ] = req;
1579 var owning_lib = g.map_acn[ cn_id ].owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
1580 sc_libs[ owning_lib ] = true;
1583 add_common_ancestors(sc_libs); // CAVEAT - if a copy is a pre-cat, it basically gets no vote here
1585 g.panes_and_field_names.right_pane4.sort();
1589 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.populate_stat_cat.error'),E);
1593 g.check_for_unmet_required_fields = function() {
1595 for (var fn in g.required) {
1596 if (typeof g.populated[fn] == 'undefined') {
1600 if (xulG.unified_interface) {
1601 if (abort.length > 0) {
1602 if (typeof xulG.lock_save_button == 'function') {
1603 xulG.lock_save_button();
1606 if (typeof xulG.unlock_save_button == 'function') {
1607 xulG.unlock_save_button();
1611 if (abort.length > 0) {
1612 $('save').setAttribute('disabled','true');
1614 $('save').setAttribute('disabled','false');