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 $('save').setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.create_copies'));
120 $('save').setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.create_copies.accesskey'));
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);
134 if (g.copies.length != 1) {
135 document.getElementById('copy_notes').setAttribute('hidden','true');
138 /******************************************************************************************************/
139 /* Show the Record Details? */
141 var bdb = document.getElementById('brief_display_box'); while(bdb.firstChild) bdb.removeChild(bdb.lastChild);
143 var brief_display = document.createElement('iframe'); bdb.appendChild(brief_display);
144 brief_display.setAttribute( 'src', urls.XUL_BIB_BRIEF + '?docid=' + g.docid); // this is a modal window, so can't push in xulG
145 brief_display.setAttribute( 'flex','1' );
148 /******************************************************************************************************/
149 /* Add stat cats to the panes_and_field_names.right_pane4 */
151 g.populate_stat_cats();
153 /******************************************************************************************************/
154 /* Backup copies :) */
156 g.original_copies = js2JSON( g.copies );
158 /******************************************************************************************************/
161 g.summarize( g.copies );
165 var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/copy_editor.js', E]);
166 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); dump(js2JSON(E)); }
171 /******************************************************************************************************/
172 /* Retrieve Templates */
174 g.retrieve_templates = function() {
176 JSAN.use('util.widgets'); JSAN.use('util.functional');
178 var robj = g.network.simple_request('FM_AUS_RETRIEVE',[ses(),g.data.list.au[0].id()]);
179 if (typeof robj['staff_client.copy_editor.templates'] != 'undefined') {
180 g.templates = robj['staff_client.copy_editor.templates'];
182 util.widgets.remove_children('template_placeholder');
183 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } ).sort();
185 g.template_menu = util.widgets.make_menulist( list );
186 g.template_menu.setAttribute('id','template_menu');
187 $('template_placeholder').appendChild(g.template_menu);
188 g.template_menu.addEventListener(
190 function() { g.copy_editor_prefs[ 'template_menu' ] = { 'value' : g.template_menu.value }; g.save_attributes(); },
194 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.retrieve_templates.error'), E);
198 /******************************************************************************************************/
201 g.apply_template = function() {
203 var name = g.template_menu.value;
204 if (g.templates[ name ] != 'undefined') {
205 var template = g.templates[ name ];
206 for (var i in template) {
207 g.changed[ i ] = template[ i ];
208 switch( template[i].type ) {
210 g.apply(template[i].field,template[i].value);
213 if (g.stat_cat_seen[ template[i].field ]) g.apply_stat_cat(template[i].field,template[i].value);
216 g.apply_owning_lib(template[i].value);
220 g.summarize( g.copies );
224 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.apply_templates.error'), E);
228 /******************************************************************************************************/
229 /* Save as Template */
231 g.save_template = function() {
233 var name = window.prompt(
234 $('catStrings').getString('staff.cat.copy_editor.save_as_template.prompt'),
236 $('catStrings').getString('staff.cat.copy_editor.save_as_template.title')
239 g.templates[name] = g.changed;
240 var robj = g.network.simple_request(
241 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
243 if (typeof robj.ilsevent != 'undefined') {
246 alert($('catStrings').getFormattedString('staff.cat.copy_editor.save_as_template.success', [name]));
250 g.retrieve_templates();
252 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
258 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.save_as_template.error'), E);
262 /******************************************************************************************************/
263 /* Delete Template */
265 g.delete_template = function() {
267 var name = g.template_menu.value;
269 if (! window.confirm($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]))) return;
270 delete(g.templates[name]);
271 var robj = g.network.simple_request(
272 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
274 if (typeof robj.ilsevent != 'undefined') {
277 alert($('catStrings').getFormattedString('staff.cat.copy_editor.delete_template.confirm', [name]));
281 g.retrieve_templates();
283 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
289 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.delete_template.error'), E);
293 /******************************************************************************************************/
294 /* Export Templates */
296 g.export_templates = function() {
298 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
299 JSAN.use('util.file'); var f = new util.file('');
300 f.export_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.export_templates.title'), 'data' : g.templates } );
302 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.export_templates.error'), E);
306 /******************************************************************************************************/
307 /* Import Templates */
309 g.import_templates = function() {
311 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
312 JSAN.use('util.file'); var f = new util.file('');
313 var temp = f.import_file( { 'title' : $('catStrings').getString('staff.cat.copy_editor.import_templates.title') } );
315 for (var i in temp) {
317 if (g.templates[i]) {
319 var r = g.error.yns_alert(
320 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.prompt') + '\n' + g.error.pretty_print( js2JSON( temp[i] ) ),
321 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.replace.title', [i]),
322 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.yes'),
323 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.no'),
325 $('catStrings').getString('staff.cat.copy_editor.import_templates.replace.click_here')
328 if (r == 0 /* Yes */) g.templates[i] = temp[i];
332 g.templates[i] = temp[i];
338 var r = g.error.yns_alert(
339 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.prompt'),
340 $('catStrings').getFormattedString('staff.cat.copy_editor.import_templates.save.title'),
341 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.yes'),
342 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.no'),
344 $('catStrings').getString('staff.cat.copy_editor.import_templates.save.click_here')
347 if (r == 0 /* Yes */) {
348 var robj = g.network.simple_request(
349 'FM_AUS_UPDATE',[ses(),g.data.list.au[0].id(), { 'staff_client.copy_editor.templates' : g.templates }]
351 if (typeof robj.ilsevent != 'undefined') {
354 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.success'));
358 g.retrieve_templates();
360 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.save.error'), E);
366 util.widgets.remove_children('template_placeholder');
367 var list = util.functional.map_object_to_list( g.templates, function(obj,i) { return [i, i]; } );
368 g.template_menu = util.widgets.make_menulist( list );
369 $('template_placeholder').appendChild(g.template_menu);
370 alert($('catStrings').getString('staff.cat.copy_editor.import_templates.note'));
375 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.import_templates.error'), E);
380 /******************************************************************************************************/
381 /* Restore backup copies */
383 g.reset = function() {
385 g.copies = JSON2js( g.original_copies );
386 g.summarize( g.copies );
390 /******************************************************************************************************/
391 /* Apply a value to a specific field on all the copies being edited */
393 g.apply = function(field,value) {
394 g.error.sdump('D_TRACE','applying field = <' + field + '> value = <' + value + '>\n');
395 if (value == '<HACK:KLUDGE:NULL>') value = null;
396 if (field == 'alert_message') { value = value.replace(/^\W+$/g,''); }
397 if (field == 'price' || field == 'deposit_amount') {
398 if (value == '') { value = null; } else { JSAN.use('util.money'); value = util.money.sanitize( value ); }
400 for (var i = 0; i < g.copies.length; i++) {
401 var copy = g.copies[i];
403 copy[field]( value ); copy.ischanged('1');
410 /******************************************************************************************************/
411 /* Apply a stat cat entry to all the copies being edited. An entry_id of < 0 signifies the stat cat is being removed. */
413 g.apply_stat_cat = function(sc_id,entry_id) {
414 g.error.sdump('D_TRACE','sc_id = ' + sc_id + ' entry_id = ' + entry_id + '\n');
415 for (var i = 0; i < g.copies.length; i++) {
416 var copy = g.copies[i];
419 var temp = copy.stat_cat_entries();
420 if (!temp) temp = [];
421 temp = util.functional.filter_list(
424 return (obj.stat_cat() != sc_id);
427 if (entry_id > -1) temp.push(
428 util.functional.find_id_object_in_list(
429 g.data.hash.asc[sc_id].entries(),
433 copy.stat_cat_entries( temp );
436 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
441 /******************************************************************************************************/
442 /* Apply an "owning lib" to all the copies being edited. That is, change and auto-vivicating volumes */
444 g.apply_owning_lib = function(ou_id) {
445 g.error.sdump('D_TRACE','ou_id = ' + ou_id + '\n');
446 for (var i = 0; i < g.copies.length; i++) {
447 var copy = g.copies[i];
449 if (!g.map_acn[copy.call_number()]) {
450 var volume = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ copy.call_number() ]);
451 if (typeof volume.ilsevent != 'undefined') {
452 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.undefined_volume.error', [copy.barcode()]), volume);
455 g.map_acn[copy.call_number()] = volume;
457 var old_volume = g.map_acn[copy.call_number()];
458 var acn_id = g.network.simple_request(
459 'FM_ACN_FIND_OR_CREATE',
460 [ses(),old_volume.label(),old_volume.record(),ou_id]
462 if (typeof acn_id.ilsevent != 'undefined') {
463 g.error.standard_unexpected_error_alert($('catStrings').getFormattedString('staff.cat.copy_editor.apply_owning_lib.call_number.error', [copy.barcode()]), acn_id);
466 copy.call_number(acn_id);
469 g.error.standard_unexpected_error_alert('apply_stat_cat',E);
474 /******************************************************************************************************/
475 /* This returns true if none of the copies being edited are pre-cats */
477 g.safe_to_change_owning_lib = function() {
480 for (var i = 0; i < g.copies.length; i++) {
481 var cn = g.copies[i].call_number();
482 if (typeof cn == 'object') { cn = cn.id(); }
483 if (cn == -1) { safe = false; }
487 g.error.standard_unexpected_error_alert('safe_to_change_owning_lib?',E);
492 /******************************************************************************************************/
493 /* This returns true if none of the copies being edited have a magical status found in my_constants.magical_statuses */
495 g.safe_to_edit_copy_status = function() {
498 for (var i = 0; i < g.copies.length; i++) {
499 var status = g.copies[i].status(); if (typeof status == 'object') status = status.id();
500 if (typeof my_constants.magical_statuses[ status ] != 'undefined') safe = false;
504 g.error.standard_unexpected_error_alert('safe_to_edit_copy_status?',E);
509 /******************************************************************************************************/
510 /* This concats and uniques all the alert messages for use as the default value for a new alert message */
512 g.populate_alert_message_input = function(tb) {
514 var seen = {}; var s = '';
515 for (var i = 0; i < g.copies.length; i++) {
516 var msg = g.copies[i].alert_message();
518 if (typeof seen[msg] == 'undefined') {
524 tb.setAttribute('value',s);
526 g.error.standard_unexpected_error_alert('populate_alert_message_input',E);
530 /***************************************************************************************************************/
531 /* This returns a list of acpl's appropriate for the copies being edited (and caches them in the global stash) */
533 g.get_acpl_list_for_lib = function(lib_id,but_only_these) {
534 g.data.stash_retrieve();
535 var label = 'acpl_list_for_lib_'+lib_id;
536 if (typeof g.data[label] == 'undefined') {
537 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
538 if (typeof robj.ilsevent != 'undefined') throw(robj);
540 for (var j = 0; j < robj.length; j++) {
541 var my_acpl = robj[j];
542 if (typeof g.data.hash.acpl[ my_acpl.id() ] == 'undefined') {
543 g.data.hash.acpl[ my_acpl.id() ] = my_acpl;
544 g.data.list.acpl.push( my_acpl );
546 var only_this_lib = my_acpl.owning_lib(); if (!only_this_lib) continue;
547 if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
548 if (but_only_these.indexOf( String( only_this_lib ) ) != -1) { // This filters out some of the libraries (usually the descendants)
549 temp_list.push( my_acpl );
552 g.data[label] = temp_list; g.data.stash(label,'hash','list');
554 return g.data[label];
557 /******************************************************************************************************/
558 /* This returns a list of acpl's appropriate for the copies being edited */
560 g.get_acpl_list = function() {
563 JSAN.use('util.functional');
567 /**************************************/
568 /* get owning libs from call numbers */
570 var owning_libs = {};
571 for (var i = 0; i < g.copies.length; i++) {
572 var callnumber = g.copies[i].call_number();
573 if (!callnumber) continue;
574 var cn_id = typeof callnumber == 'object' ? callnumber.id() : callnumber;
576 if (! g.map_acn[ cn_id ]) {
577 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
578 if (typeof req.ilsevent == 'undefined') {
579 g.map_acn[ cn_id ] = req;
584 var consider_lib = g.map_acn[ cn_id ].owning_lib();
585 if (!consider_lib) continue;
586 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
590 for (var i in g.callnumbers) {
591 var consider_lib = g.callnumbers[i].owning_lib;
592 if (!consider_lib) continue;
593 owning_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
597 /***************************************************************************************************/
598 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
600 JSAN.use('util.fm_utils');
601 var libs = []; for (var i in owning_libs) libs.push(i);
602 if (libs.length > 0) {
603 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
604 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
607 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
608 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
609 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
610 if (acpl_list[i] != null) {
611 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
622 for (var i = 0; i < g.copies.length; i++) {
623 var consider_lib = g.copies[i].circ_lib();
624 if (!consider_lib) continue;
625 circ_libs[ typeof consider_lib == 'object' ? consider_lib.id() : consider_lib ] = true;
628 /***************************************************************************************************/
629 /* now find the first ancestor they all have in common, get the acpl's for it and higher ancestors */
631 libs = []; for (var i in circ_libs) libs.push(i);
632 if (libs.length > 0) {
633 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
634 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
637 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
638 var acpl_list = g.get_acpl_list_for_lib(ancestor, ancestors);
639 if (acpl_list) for (var i = 0; i < acpl_list.length; i++) {
640 if (acpl_list[i] != null) {
641 my_acpls[ typeof acpl_list[i] == 'object' ? acpl_list[i].id() : acpl_list[i] ] = true;
647 var acpl_list = []; for (var i in my_acpls) acpl_list.push( g.data.hash.acpl[ i ] );
648 return acpl_list.sort(
650 var label_a = g.data.hash.aou[ a.owning_lib() ].shortname() + ' : ' + a.name();
651 var label_b = g.data.hash.aou[ b.owning_lib() ].shortname() + ' : ' + b.name();
652 if (label_a < label_b) return -1;
653 if (label_a > label_b) return 1;
659 g.error.standard_unexpected_error_alert('get_acpl_list',E);
665 /******************************************************************************************************/
666 /* This keeps track of what fields have been edited for styling purposes */
670 /******************************************************************************************************/
671 /* These need data from the middle layer to render */
673 function init_panes0() {
674 g.special_exception = {};
675 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.owning_library.label')] = function(label,value) {
676 JSAN.use('util.widgets');
677 if (value>0) { /* an existing call number */
678 g.network.simple_request(
679 'FM_ACN_RETRIEVE.authoritative',
682 var cn = '??? id = ' + value;
684 cn = req.getResultObject();
686 g.error.sdump('D_ERROR','callnumber retrieve: ' + E);
688 util.widgets.set_text(label,g.data.hash.aou[ cn.owning_lib() ].shortname() + ' : ' + cn.label());
691 } else { /* a yet to be created call number */
693 util.widgets.set_text(label,g.data.hash.aou[ g.callnumbers[value].owning_lib ].shortname() + ' : ' + g.callnumbers[value].label);
697 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.creator.label')] = function(label,value) {
698 if (!Number(value)) return;
699 g.network.simple_request(
700 'FM_AU_RETRIEVE_VIA_ID',
703 var p = '??? id = ' + value;
705 p = req.getResultObject();
709 g.error.sdump('D_ERROR','patron retrieve: ' + E);
711 JSAN.use('util.widgets');
712 util.widgets.set_text(label,p);
716 g.special_exception[$('catStrings').getString('staff.cat.copy_editor.field.last_editor.label')] = function(label,value) {
717 if (!Number(value)) return;
718 g.network.simple_request(
719 'FM_AU_RETRIEVE_VIA_ID',
722 var p = '??? id = ' + value;
724 p = req.getResultObject();
728 g.error.sdump('D_ERROR','patron retrieve: ' + E);
730 util.widgets.set_text(label,p);
736 /******************************************************************************************************/
737 g.readonly_stat_cat_names = [];
738 g.editable_stat_cat_names = [];
740 /******************************************************************************************************/
741 /* These get show in the left panel */
743 function init_panes() {
744 g.panes_and_field_names = {
749 $('catStrings').getString('staff.cat.copy_editor.field.barcode.label'),
751 render: 'fm.barcode();',
755 $('catStrings').getString('staff.cat.copy_editor.field.creation_date.label'),
757 render: 'util.date.formatted_date( fm.create_date(), "%F");',
761 $('catStrings').getString('staff.cat.copy_editor.field.creator.label'),
763 render: 'fm.creator();',
767 $('catStrings').getString('staff.cat.copy_editor.field.last_edit_date.label'),
769 render: 'util.date.formatted_date( fm.edit_date(), "%F");',
773 $('catStrings').getString('staff.cat.copy_editor.field.last_editor.label'),
775 render: 'fm.editor();',
784 $('catStrings').getString('staff.cat.copy_editor.field.location.label'),
786 render: 'typeof fm.location() == "object" ? fm.location().name() : g.data.lookup("acpl",fm.location()).name()',
787 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);',
792 $('catStrings').getString('staff.cat.copy_editor.field.circulation_library.label'),
794 render: 'typeof fm.circ_lib() == "object" ? fm.circ_lib().shortname() : g.data.hash.aou[ fm.circ_lib() ].shortname()',
795 //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);',
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( 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);',
800 $('catStrings').getString('staff.cat.copy_editor.field.owning_library.label'),
802 render: 'fm.call_number();',
803 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,
807 $('catStrings').getString('staff.cat.copy_editor.field.copy_number.label'),
809 render: 'fm.copy_number() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.copy_number()',
810 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);',
820 $('catStrings').getString('staff.cat.copy_editor.field.circulate.label'),
822 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") )',
823 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);',
827 $('catStrings').getString('staff.cat.copy_editor.field.holdable.label'),
829 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") )',
830 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);',
834 $('catStrings').getString('staff.cat.copy_editor.field.age_based_hold_protection.label'),
836 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() )',
837 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);',
842 $('catStrings').getString('staff.cat.copy_editor.field.floating.label'),
844 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") )',
845 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);',
849 $('catStrings').getString('staff.cat.copy_editor.field.loan_duration.label'),
851 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; }',
852 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);',
857 $('catStrings').getString('staff.cat.copy_editor.field.fine_level.label'),
859 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; }',
860 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);',
865 $('catStrings').getString('staff.cat.copy_editor.field.circulate_as_type.label'),
867 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()',
868 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);',
872 $('catStrings').getString('staff.cat.copy_editor.field.circulation_modifier.label'),
874 render: 'fm.circ_modifier() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.circ_modifier()',
875 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.circ_modifier, function(obj) { return [ obj, obj ]; } ).sort() ) ); x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c), false);',
882 $('catStrings').getString('staff.cat.copy_editor.field.alert_message.label'),
884 render: 'fm.alert_message() == null ? $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null") : fm.alert_message()',
885 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);',
890 $('catStrings').getString('staff.cat.copy_editor.field.deposit.label'),
892 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") )',
893 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);',
897 $('catStrings').getString('staff.cat.copy_editor.field.deposit_amount.label'),
899 render: 'if (fm.deposit_amount() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.deposit_amount() ); }',
900 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);',
904 $('catStrings').getString('staff.cat.copy_editor.field.price.label'),
906 render: 'if (fm.price() == null) { $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null"); } else { util.money.sanitize( fm.price() ); }',
907 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);',
912 $('catStrings').getString('staff.cat.copy_editor.field.opac_visible.label'),
914 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") )',
915 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);',
919 $('catStrings').getString('staff.cat.copy_editor.field.reference.label'),
921 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") )',
922 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);',
926 $('catStrings').getString('staff.cat.copy_editor.field.mint_condition.label'),
928 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")',
929 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);',
941 /******************************************************************************************************/
942 /* This loops through all our fieldnames and all the copies, tallying up counts for the different values */
944 g.summarize = function( copies ) {
945 /******************************************************************************************************/
948 JSAN.use('util.date'); JSAN.use('util.money');
951 for (var i in g.panes_and_field_names) {
952 g.field_names = g.field_names.concat( g.panes_and_field_names[i] );
954 g.field_names = g.field_names.concat( g.editable_stat_cat_names );
955 g.field_names = g.field_names.concat( g.readonly_stat_cat_names );
957 /******************************************************************************************************/
958 /* Loop through the field names */
960 for (var i = 0; i < g.field_names.length; i++) {
962 var field_name = g.field_names[i][0];
963 var render = g.field_names[i][1].render;
964 var attr = g.field_names[i][1].attr;
965 g.summary[ field_name ] = {};
967 /******************************************************************************************************/
968 /* Loop through the copies */
970 for (var j = 0; j < copies.length; j++) {
973 var cmd = render || ('fm.' + field_name + '();');
976 /**********************************************************************************************/
977 /* Try to retrieve the value for this field for this copy */
982 g.error.sdump('D_ERROR','Attempted ' + cmd + '\n' + E + '\n');
984 if (typeof value == 'object' && value != null) {
985 alert('FIXME: field_name = <' + field_name + '> value = <' + js2JSON(value) + '>\n');
988 /**********************************************************************************************/
989 /* Tally the count */
991 if (g.summary[ field_name ][ value ]) {
992 g.summary[ field_name ][ value ]++;
994 g.summary[ field_name ][ value ] = 1;
998 g.error.sdump('D_TRACE','summary = ' + js2JSON(g.summary) + '\n');
1001 /******************************************************************************************************/
1002 /* Display the summarized data and inputs for editing */
1004 g.render = function() {
1006 /******************************************************************************************************/
1007 /* Library setup and clear any existing interface */
1009 JSAN.use('util.widgets'); JSAN.use('util.date'); JSAN.use('util.money'); JSAN.use('util.functional');
1011 for (var i in g.panes_and_field_names) {
1012 var p = document.getElementById(i);
1013 if (p) util.widgets.remove_children(p);
1016 /******************************************************************************************************/
1017 /* Populate the library filter menu for stat cats */
1020 for (var i = 0; i < g.panes_and_field_names.right_pane4.length; i++) {
1021 sc_libs[ g.panes_and_field_names.right_pane4[i][1].attr.sc_lib ] = true;
1024 for (var i in sc_libs) { sc_libs2.push( [ g.data.hash.aou[ i ].shortname(), i ] ); }
1026 var x = document.getElementById("stat_cat_lib_filter_menu").firstChild;
1027 JSAN.use('util.widgets'); util.widgets.remove_children(x);
1028 for (var i = 0; i < sc_libs2.length; i++) {
1029 var menuitem = document.createElement('menuitem');
1030 menuitem.setAttribute('id','filter_'+sc_libs2[i][1]);
1031 menuitem.setAttribute('type','checkbox');
1032 menuitem.setAttribute('checked','true');
1033 menuitem.setAttribute('label',sc_libs2[i][0]);
1034 menuitem.setAttribute('value',sc_libs2[i][1]);
1035 menuitem.setAttribute('oncommand','try{g.toggle_stat_cat_display(this);}catch(E){alert(E);}');
1036 x.appendChild(menuitem);
1039 /******************************************************************************************************/
1040 /* Prepare the panes */
1042 var groupbox; var caption; var vbox; var grid; var rows;
1044 /******************************************************************************************************/
1045 /* Loop through the field names */
1047 for (h in g.panes_and_field_names) {
1048 if (!document.getElementById(h)) continue;
1049 for (var i = 0; i < g.panes_and_field_names[h].length; i++) {
1051 var f = g.panes_and_field_names[h][i]; var fn = f[0]; var attr = f[1].attr;
1052 groupbox = document.createElement('groupbox'); document.getElementById(h).appendChild(groupbox);
1054 for (var a in attr) {
1055 groupbox.setAttribute(a,attr[a]);
1058 if (typeof g.changed[fn] != 'undefined') groupbox.setAttribute('class','copy_editor_field_changed');
1059 caption = document.createElement('caption'); groupbox.appendChild(caption);
1060 caption.setAttribute('label',fn); caption.setAttribute('id','caption_'+fn);
1061 vbox = document.createElement('vbox'); groupbox.appendChild(vbox);
1062 grid = util.widgets.make_grid( [ { 'flex' : 1 }, {}, {} ] ); vbox.appendChild(grid);
1063 grid.setAttribute('flex','1');
1064 rows = grid.lastChild;
1067 /**************************************************************************************/
1068 /* Loop through each value for the field */
1070 for (var j in g.summary[fn]) {
1071 var value = j; var count = g.summary[fn][j];
1072 row = document.createElement('row'); rows.appendChild(row);
1073 var label1 = document.createElement('description'); row.appendChild(label1);
1074 if (g.special_exception[ fn ]) {
1075 g.special_exception[ fn ]( label1, value );
1077 label1.appendChild( document.createTextNode(value) );
1079 var label2 = document.createElement('description'); row.appendChild(label2);
1082 copy_count = $('catStrings').getString('staff.cat.copy_editor.copy_count');
1084 copy_count = $('catStrings').getFormattedString('staff.cat.copy_editor.copy_count.plural', [count]);
1086 label2.appendChild( document.createTextNode(copy_count) );
1088 var hbox = document.createElement('hbox');
1089 hbox.setAttribute('id',fn);
1090 groupbox.appendChild(hbox);
1091 var hbox2 = document.createElement('hbox');
1092 groupbox.appendChild(hbox2);
1094 /**************************************************************************************/
1095 /* Render the input widget */
1097 if (f[1].input && g.edit) {
1098 g.render_input(hbox,f[1]);
1102 g.error.sdump('D_ERROR','copy editor: ' + E + '\n');
1108 /******************************************************************************************************/
1109 /* Synchronize stat cat visibility with library filter menu, and default template selection */
1110 JSAN.use('util.file');
1111 var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1112 g.copy_editor_prefs = util.widgets.load_attributes(file);
1113 for (var i in g.copy_editor_prefs) {
1114 if (i.match(/filter_/) && g.copy_editor_prefs[i].checked == '') {
1116 g.toggle_stat_cat_display( document.getElementById(i) );
1117 } catch(E) { alert(E); }
1120 if (g.template_menu) g.template_menu.value = g.template_menu.getAttribute('value');
1124 /******************************************************************************************************/
1125 /* This actually draws the change button and input widget for a given field */
1126 g.render_input = function(node,blob) {
1128 // node = hbox ; groupbox -> hbox, hbox
1130 var groupbox = node.parentNode;
1131 var caption = groupbox.firstChild;
1132 var vbox = node.previousSibling;
1134 var hbox2 = node.nextSibling;
1136 var input_cmd = blob.input;
1137 var render_cmd = blob.render;
1138 var attr = blob.attr;
1140 var block = false; var first = true;
1142 function on_mouseover(ev) {
1143 groupbox.setAttribute('style','background: white');
1146 function on_mouseout(ev) {
1147 groupbox.setAttribute('style','');
1150 vbox.addEventListener('mouseover',on_mouseover,false);
1151 vbox.addEventListener('mouseout',on_mouseout,false);
1152 groupbox.addEventListener('mouseover',on_mouseover,false);
1153 groupbox.addEventListener('mouseout',on_mouseout,false);
1154 groupbox.firstChild.addEventListener('mouseover',on_mouseover,false);
1155 groupbox.firstChild.addEventListener('mouseout',on_mouseout,false);
1157 function on_click(ev){
1159 if (block) return; block = true;
1161 function post_c(v) {
1163 /* FIXME - kludgy */
1164 var t = input_cmd.match('apply_stat_cat') ? 'stat_cat' : ( input_cmd.match('apply_owning_lib') ? 'owning_lib' : 'attribute' );
1168 f = input_cmd.match(/apply\("(.+?)",/)[1];
1171 f = input_cmd.match(/apply_stat_cat\((.+?),/)[1];
1177 g.changed[ hbox.id ] = { 'type' : t, 'field' : f, 'value' : v };
1181 g.summarize( g.copies );
1183 document.getElementById(caption.id).focus();
1187 g.error.standard_unexpected_error_alert('post_c',E);
1190 var x; var c; eval( input_cmd );
1192 util.widgets.remove_children(vbox);
1193 util.widgets.remove_children(hbox);
1194 util.widgets.remove_children(hbox2);
1195 hbox.appendChild(x);
1196 var apply = document.createElement('button');
1197 apply.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.apply.label'));
1198 apply.setAttribute('accesskey', $('catStrings').getString('staff.cat.copy_editor.apply.accesskey'));
1199 hbox2.appendChild(apply);
1200 apply.addEventListener('command',function() { c(x.value); },false);
1201 var cancel = document.createElement('button');
1202 cancel.setAttribute('label', $('catStrings').getString('staff.cat.copy_editor.cancel.label'));
1203 cancel.addEventListener('command',function() { setTimeout( function() { g.summarize( g.copies ); g.render(); document.getElementById(caption.id).focus(); }, 0); }, false);
1204 hbox2.appendChild(cancel);
1205 setTimeout( function() { x.focus(); }, 0 );
1208 g.error.standard_unexpected_error_alert('render_input',E);
1211 vbox.addEventListener('click',on_click, false);
1212 hbox.addEventListener('click',on_click, false);
1213 caption.addEventListener('click',on_click, false);
1214 caption.addEventListener('keypress',function(ev) {
1215 if (ev.keyCode == 13 /* enter */ || ev.keyCode == 77 /* mac enter */) on_click();
1217 caption.setAttribute('style','-moz-user-focus: normal');
1218 caption.setAttribute('onfocus','this.setAttribute("class","outline_me")');
1219 caption.setAttribute('onblur','this.setAttribute("class","")');
1222 g.error.sdump('D_ERROR',E + '\n');
1226 /******************************************************************************************************/
1227 /* store the copies in the global xpcom stash */
1229 g.stash_and_close = function() {
1231 if (g.handle_update) {
1233 var r = g.network.request(
1234 api.FM_ACP_FLESHED_BATCH_UPDATE.app,
1235 api.FM_ACP_FLESHED_BATCH_UPDATE.method,
1236 [ ses(), g.copies, true ]
1238 if (typeof r.ilsevent != 'undefined') {
1239 g.error.standard_unexpected_error_alert('copy update',r);
1241 /* FIXME -- revisit the return value here */
1243 alert($('catStrings').getString('staff.cat.copy_editor.handle_update.error') + ' ' + js2JSON(E));
1246 //g.data.temp_copies = js2JSON( g.copies );
1247 //g.data.stash('temp_copies');
1248 xulG.copies = g.copies;
1249 update_modal_xulG(xulG);
1252 g.error.standard_unexpected_error_alert('stash and close',E);
1256 /******************************************************************************************************/
1257 /* spawn copy notes interface */
1259 g.copy_notes = function() {
1260 JSAN.use('util.window'); var win = new util.window();
1262 urls.XUL_COPY_NOTES,
1263 //+ '?copy_id=' + window.escape(g.copies[0].id()),
1264 $("catStrings").getString("staff.cat.copy_editor.copy_notes"),'chrome,resizable,modal',
1265 { 'copy_id' : g.copies[0].id() }
1269 /******************************************************************************************************/
1270 /* hides or unhides stat cats based on library stat cat filter menu */
1271 g.toggle_stat_cat_display = function(el) {
1273 var visible = el.getAttribute('checked');
1274 var nl = document.getElementsByAttribute('sc_lib',el.getAttribute('value'));
1275 for (var n = 0; n < nl.length; n++) {
1277 nl[n].setAttribute('hidden','false');
1279 nl[n].setAttribute('hidden','true');
1282 g.copy_editor_prefs[ el.getAttribute('id') ] = { 'checked' : visible };
1283 g.save_attributes();
1286 /******************************************************************************************************/
1287 /* This adds a stat cat definition to the stat cat pane for rendering */
1288 g.save_attributes = function() {
1289 JSAN.use('util.widgets'); JSAN.use('util.file'); var file = new util.file('copy_editor_prefs.'+g.data.server_unadorned);
1290 var what_to_save = {};
1291 for (var i in g.copy_editor_prefs) {
1292 what_to_save[i] = [];
1293 for (var j in g.copy_editor_prefs[i]) what_to_save[i].push(j);
1295 util.widgets.save_attributes(file, what_to_save );
1298 /******************************************************************************************************/
1299 /* This adds a stat cat definition to the stat cat pane for rendering */
1300 g.add_stat_cat = function(sc) {
1302 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; g.data.stash('hash'); }
1306 if (typeof sc == 'object') {
1311 if (typeof g.stat_cat_seen[sc_id] != 'undefined') { return; }
1313 g.stat_cat_seen[ sc_id ] = 1;
1315 if (typeof sc != 'object') {
1317 sc = g.network.simple_request(
1318 'FM_ASC_BATCH_RETRIEVE',
1319 [ ses(), [ sc_id ] ]
1324 g.data.hash.asc[ sc.id() ] = sc; g.data.stash('hash');
1326 var label_name = g.data.hash.aou[ sc.owner() ].shortname() + " : " + sc.name();
1331 render: 'var l = util.functional.find_list( fm.stat_cat_entries(), function(e){ return e.stat_cat() == '
1332 + sc.id() + '; } ); l ? l.value() : $("catStrings").getString("staff.cat.copy_editor.field.unset_or_null");',
1333 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()
1334 + '].entries(), function(obj){ return [ obj.value(), obj.id() ]; } ) ).sort() ); '
1335 + 'x.addEventListener("apply",function(f){ return function(ev) { f(ev.target.value); } }(c),false);',
1342 g.panes_and_field_names.right_pane4.push( temp_array );
1344 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.add_stat_cat.error'), E);
1348 /******************************************************************************************************/
1349 /* Add stat cats to the panes_and_field_names.right_pane4 */
1350 g.populate_stat_cats = function() {
1352 g.data.stash_retrieve();
1353 g.stat_cat_seen = {};
1355 function get(lib_id,only_these) {
1356 g.data.stash_retrieve();
1357 var label = 'asc_list_for_lib_'+lib_id;
1358 if (typeof g.data[label] == 'undefined') {
1359 var robj = g.network.simple_request('FM_ASC_RETRIEVE_VIA_AOU', [ ses(), lib_id ]);
1360 if (typeof robj.ilsevent != 'undefined') throw(robj);
1362 for (var j = 0; j < robj.length; j++) {
1363 var my_asc = robj[j];
1364 if (typeof g.data.hash.asc == 'undefined') { g.data.hash.asc = {}; }
1365 if (typeof g.data.hash.asc[ my_asc.id() ] == 'undefined') {
1366 g.data.hash.asc[ my_asc.id() ] = my_asc;
1368 var only_this_lib = my_asc.owner(); if (typeof only_this_lib == 'object') only_this_lib = only_this_lib.id();
1369 if (only_these.indexOf( String( only_this_lib ) ) != -1) {
1370 temp_list.push( my_asc );
1373 g.data[label] = temp_list; g.data.stash(label,'hash','list');
1375 return g.data[label];
1378 /* The stat cats for the pertinent library -- this is based on workstation ou */
1379 var label = 'asc_list_for_' + typeof g.data.ws_ou == 'object' ? g.data.ws_ou.id() : g.data.ws_ou;
1380 g.data[ label ] = g.data.list.my_asc; g.data.stash('label');
1381 for (var i = 0; i < g.data.list.my_asc.length; i++) {
1382 g.add_stat_cat( g.data.list.my_asc[i] );
1385 /* For the others, we want to consider the owning libs, circ libs, and any libs that have stat cats already on the copies,
1386 however, if batch editing, we only want to show the ones they have in common. So let's compile the libs */
1388 function add_common_ancestors(sc_libs) {
1389 JSAN.use('util.fm_utils');
1390 var libs = []; for (var i in sc_libs) libs.push(i);
1391 var ancestor = util.fm_utils.find_common_aou_ancestor( libs );
1392 if (typeof ancestor == 'object' && ancestor != null) ancestor = ancestor.id();
1394 var ancestors = util.fm_utils.find_common_aou_ancestors( libs );
1395 var asc_list = get(ancestor, ancestors);
1396 for (var i = 0; i < asc_list.length; i++) {
1397 g.add_stat_cat( asc_list[i] );
1402 /* stat cats based on stat cat entries present on these copies */
1404 for (var i = 0; i < g.copies.length; i++) {
1405 var entries = g.copies[i].stat_cat_entries();
1406 if (!entries) entries = [];
1407 for (var j = 0; j < entries.length; j++) {
1408 var lib = entries[j].owner(); if (typeof lib == 'object') lib = lib.id();
1409 sc_libs[ lib ] = true;
1412 add_common_ancestors(sc_libs); // CAVEAT - if a copy has no stat_cat_entries, it basically gets no vote here
1414 /* stat cats based on Circ Lib */
1416 for (var i = 0; i < g.copies.length; i++) {
1417 var circ_lib = g.copies[i].circ_lib(); if (typeof circ_lib == 'object') circ_lib = circ_lib.id();
1418 sc_libs[ circ_lib ] = true;
1420 add_common_ancestors(sc_libs);
1422 /* stat cats based on Owning Lib */
1424 for (var i = 0; i < g.copies.length; i++) {
1425 var cn_id = g.copies[i].call_number();
1427 if (! g.map_acn[ cn_id ]) {
1428 var req = g.network.simple_request('FM_ACN_RETRIEVE.authoritative',[ cn_id ]);
1429 if (typeof req.ilsevent == 'undefined') {
1430 g.map_acn[ cn_id ] = req;
1435 var owning_lib = g.map_acn[ cn_id ].owning_lib(); if (typeof owning_lib == 'object') owning_lib = owning_lib.id();
1436 sc_libs[ owning_lib ] = true;
1439 add_common_ancestors(sc_libs); // CAVEAT - if a copy is a pre-cat, it basically gets no vote here
1441 g.panes_and_field_names.right_pane4.sort();
1445 g.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_editor.populate_stat_cat.error'),E);