1 var holdsOrgSelectorBuilt = false;
5 note: metarecord holds have a holdable_formats field that contains
6 item_type(s)-item_forms(s)-language
7 item_form and language are optional - if language exist and no
8 item_form is specified, use item_type(s)--language
12 var noEmailMessageXUL;
14 function holdsHandleStaff() {
15 swapCanvas($('xulholds_box'));
16 $('xul_recipient_barcode').focus();
17 $('xul_recipient_barcode').onkeypress = function(evt)
18 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
19 $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
20 $('xul_recipient_me').onclick = _holdsHandleStaffMe;
22 $('xul_recipient_barcode').onkeyup = function(evt) {
23 if($('xul_recipient_barcode').value == '')
24 $('xul_recipient_me').disabled = false;
26 $('xul_recipient_me').disabled = true;
30 function _holdsHandleStaffMe() {
31 holdArgs.recipient = G.user;
35 function _holdsHandleStaff() {
36 var barcode = $('xul_recipient_barcode').value;
37 var user = grabUserByBarcode( G.user.session, barcode );
40 if(evt = checkILSEvent(user)) {
45 if(!barcode || !user) {
46 alertId('holds_invalid_recipient', barcode);
50 holdArgs.recipient = user;
57 * record, volume, copy (ids)
58 * request, recipient, editHold (objects)
61 function holdsDrawEditor(args) {
63 holdArgs = (args) ? args : holdArgs;
66 noEmailMessage = $('holds_email').removeChild($('holds.no_email'));
68 if(!noEmailMessageXUL)
69 noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul'));
71 if(isXUL() && holdArgs.recipient == null
72 && holdArgs.editHold == null) {
77 if(!holdArgs.recipient) holdArgs.recipient = G.user;
78 if(!holdArgs.requestor) holdArgs.requestor = G.user;
80 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
81 detachAllEvt('common','locationChanged');
82 attachEvt('common','loggedIn', holdsDrawEditor)
87 if(holdArgs.editHold) // flesh the args with the existing hold
88 holdArgsFromHold(holdArgs.editHold, holdArgs);
94 // updates the edit window with the existing hold's data
95 function _holdsUpdateEditHold() {
97 var hold = holdArgs.editHold;
98 var status = holdArgs.status;
100 var orgsel = $('holds_org_selector');
101 var frozenbox = $('holds_frozen_chkbox');
103 setSelector(orgsel, hold.pickup_lib());
105 if( hold.capture_time() || status > 2 ) {
106 orgsel.disabled = true;
107 frozenbox.disabled = true;
108 $('holds_frozen_thaw_input').disabled = true;
111 orgsel.disabled = false;
112 frozenbox.disabled = false;
116 $('holds_submit').onclick = holdsEditHold;
117 $('holds_update').onclick = holdsEditHold;
119 if(hold.phone_notify()) {
120 $('holds_enable_phone').checked = true;
121 $('holds_phone').value = hold.phone_notify();
124 $('holds_phone').disabled = true;
125 $('holds_enable_phone').checked = false;
128 if(isTrue(hold.email_notify())) {
129 $('holds_enable_email').checked = true;
132 $('holds_enable_email').checked = false;
135 /* populate the hold freezing info */
136 if(!frozenbox.disabled && isTrue(hold.frozen())) {
137 frozenbox.checked = true;
138 unHideMe($('hold_frozen_thaw_row'));
139 if(hold.thaw_date()) {
140 $('holds_frozen_thaw_input').value = hold.thaw_date();
142 $('holds_frozen_thaw_input').value = '';
145 frozenbox.checked = false;
146 $('holds_frozen_thaw_input').value = '';
147 hideMe($('hold_frozen_thaw_row'));
151 function holdsEditHold() {
152 var hold = holdsBuildHoldFromWindow();
156 if(holdArgs.onComplete)
157 holdArgs.onComplete(hold);
160 function holdArgsFromHold(hold, oargs) {
161 var args = (oargs) ? oargs : {};
162 args.type = hold.hold_type();
163 var target = hold.target();
167 args.metarecord = target;
170 args.record = target;
173 args.volume = target;
182 function holdFetchObjects(hold, doneCallback) {
184 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
186 var type = args.type;
190 if( args.copyObject ) {
192 args.copy = args.copyObject.id();
193 args.volume = args.copyObject.call_number();
194 _h_set_vol(args, doneCallback);
197 var creq = new Request(FETCH_COPY, args.copy);
201 var cp = r.getResultObject();
202 args.copyObject = cp;
203 args.volume = args.copyObject.call_number();
204 _h_set_vol(args, doneCallback);
211 _h_set_vol(args, doneCallback);
215 _h_set_rec(args, doneCallback);
217 _h_set_rec_descriptors(args, doneCallback);
225 function _h_set_vol(args, doneCallback) {
227 if( args.volumeObject ) {
228 args.volume = args.volumeObject.id();
229 args.record = args.volumeObject.record();
230 _h_set_rec(args, doneCallback);
234 var vreq = new Request(FETCH_VOLUME, args.volume);
237 var vol = r.getResultObject();
238 args.volumeObject = vol;
239 args.record = vol.record();
240 _h_set_rec(args, doneCallback);
247 function _h_set_rec(args, doneCallback) {
249 if(args.recordObject)
250 args.record = args.recordObject.doc_id();
252 args.recordObject = findRecord( args.record, 'T' );
254 if( args.type == 'T' || args.type == 'M' )
255 _h_set_rec_descriptors(args, doneCallback);
257 if(doneCallback) doneCallback(args);
261 function _h_set_rec_descriptors(args, doneCallback) {
263 // grab the list of record desciptors attached to this records metarecord
264 if( ! args.recordDescriptors ) {
265 var params = { record: args.record };
267 if( ! args.record ) {
268 if( args.metarecord )
269 params = { metarecord : args.metarecord };
271 params = { metarecord : args.metarecordObject.doc_id() };
274 var req = new Request(FETCH_MR_DESCRIPTORS, params );
277 var data = r.getResultObject();
278 args.recordDescriptors = data.descriptors;
279 args.metarecord = data.metarecord;
280 if( args.type == 'M' && ! args.metarecordObject)
281 args.metarecordObject = findRecord(args.metarecord, 'M');
283 if(doneCallback) doneCallback(args);
289 if(doneCallback) doneCallback(args);
297 function holdsDrawWindow() {
298 swapCanvas($('holds_box'));
299 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
300 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
301 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
302 holdFetchObjects(null,
306 if(holdArgs.editHold) {
307 hideMe($('holds_submit'));
308 unHideMe($('holds_update'));
309 var req = new Request(FETCH_HOLD_STATUS,
310 G.user.session, holdArgs.editHold.id());
312 holdArgs.status = req.result();
313 _holdsUpdateEditHold();
319 function __holdsDrawWindow() {
321 var rec = holdArgs.recordObject;
322 var vol = holdArgs.volumeObject;
323 var copy = holdArgs.copyObject;
324 var mr = holdArgs.metarecordObject;
326 rec = (rec) ? rec : mr;
328 if(!holdsOrgSelectorBuilt) {
329 holdsBuildOrgSelector(null,0);
330 holdsOrgSelectorBuilt = true;
331 var selector = $('holds_org_selector');
334 var o_loc = findOrgUnit(getOrigLocation());
335 var t = findOrgType(o_loc.ou_type());
336 if( t.can_have_users() )
337 setSelector(selector, o_loc.id());
341 setSelector(selector, holdArgs.recipient.home_ou());
347 var dsel = $('holds_depth_selector');
348 unHideMe($('holds_depth_selector_row'));
349 if(dsel.getElementsByTagName('option').length == 0) {
350 var types = globalOrgTypes;
351 var depth = findOrgDepth(G.user.ws_ou());
354 if(t.depth() > depth) return;
355 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
362 appendClear($('holds_recipient'), text(
363 holdArgs.recipient.family_name() + ', ' +
364 holdArgs.recipient.first_given_name()));
365 appendClear($('holds_title'), text(rec.title()));
366 appendClear($('holds_author'), text(rec.author()));
368 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
370 unHideMe($('holds_type_row'));
371 unHideMe($('holds_cn_row'));
372 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
374 if( holdArgs.type == 'V' ) {
375 unHideMe($('holds_is_cn'));
376 hideMe($('holds_is_copy'));
379 hideMe($('holds_is_cn'));
380 unHideMe($('holds_is_copy'));
381 unHideMe($('holds_copy_row'));
382 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
386 hideMe($('holds_type_row'));
387 hideMe($('holds_copy_row'));
388 hideMe($('holds_cn_row'));
391 removeChildren($('holds_format'));
393 var mods_formats = rec.types_of_resource();
396 if(holdArgs.recordDescriptors)
397 formats = holdArgs.recordDescriptors[0].item_type();
399 if( holdArgs.type == 'T' ) {
400 var desc = grep( holdArgs.recordDescriptors,
402 return (i.record() == holdArgs.record);
405 formats = desc[0].item_type();
408 if( holdArgs.type == 'M' ) {
409 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
410 mods_formats = data.mods_formats;
411 formats = data.formats;
415 for( var i in mods_formats ) {
416 var res = mods_formats[i];
417 var img = elem("img");
418 setResourcePic(img, res);
419 $('holds_format').appendChild(img);
421 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
423 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
424 $('holds_format').appendChild(elem('br'));
428 $('holds_phone').value = holdArgs.recipient.day_phone();
429 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
431 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
434 if( ! pref.match(/email/i) )
435 $('holds_enable_email').checked = false;
437 if( ! pref.match(/phone/i) ) {
438 $('holds_phone').disabled = true;
439 $('holds_enable_phone').checked = false;
443 //if(!G.user.email()) {
444 if(!holdArgs.recipient.email()) {
445 $('holds_enable_email').checked = false;
446 $('holds_enable_email').disabled = true;
449 message = noEmailMessageXUL.cloneNode(true);
450 appendClear($('holds_email'), message);
452 message = noEmailMessage.cloneNode(true);
453 appendClear($('holds_email'), message);
454 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
459 if(!$('holds_phone').value)
460 $('holds_enable_phone').checked = false;
462 appendClear($('holds_physical_desc'), text(rec.physical_description()));
464 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
466 holdsSetFormatSelector();
469 function holdsParseMRFormats(str) {
470 var data = str.split(/-/);
473 var mods_formats = [];
475 for( var i = 0; i < data[0].length; i++ ) {
476 formats.push( data[0].charAt(i) );
477 mods_formats.push( MARCFormatToMods( formats[i] ) );
480 formats = uniquify(formats);
481 mods_formats = uniquify(mods_formats);
485 mods_formats : mods_formats,
492 function holdsSetFormatSelector() {
493 var type = holdArgs.type;
494 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
496 var data = holdsGetFormats();
497 var avail_formats = data.avail_formats;
498 var sel_formats = data.sel_formats;
499 holdArgs.language = data.lang;
501 unHideMe($('holds_alt_formats_row_extras'));
502 var selector = $('hold_alt_form_selector');
504 for( var i = 0; i < avail_formats.length; i++ ) {
505 var form = avail_formats[i];
506 unHideMe(findSelectorOptByValue(selector, form));
511 function holdsGetFormats() {
515 var sformats = []; // selected formats
517 var type = holdArgs.type;
518 var desc = holdArgs.recordDescriptors;
519 var rec = holdArgs.record;
520 var mrec = holdArgs.metarecord;
524 for( var i = 0; i < desc.length; i++ ) {
526 if( d.record() == holdArgs.record ) {
527 lang = d.item_lang();
528 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
529 sformats.push(holdArgs.myFormat);
535 for( var i = 0; i < desc.length; i++ ) {
537 if( d.item_lang() != lang ) continue;
538 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
541 formats = uniquify(formats);
545 avail_formats : formats,
546 sel_formats : sformats
552 function _t_f_2_format(type, form) {
553 if( form == 'd' ) return 'at-d';
554 return (type == 'a' || type == 't') ? 'at' :
555 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
558 function holdsSetSelectedFormats() {
560 var cn = $('holds_alt_formats_row').className;
561 if( cn && cn.match(/hide_me/) ) return;
563 var selector = $('hold_alt_form_selector');
564 var vals = getSelectedList(selector);
566 if(vals.length == 0) return;
570 if( contains(vals, 'at-d') ) {
571 if( contains(vals, 'at') )
576 if( contains(vals, 'at') )
580 for( var i = 0; i < vals.length; i++ ) {
582 if( !val.match(/at/) ) fstring = val + fstring;
585 if( holdArgs.language ) {
586 if( fstring.match(/-/) )
587 fstring = fstring + '-' + holdArgs.language;
589 fstring = fstring + '--' + holdArgs.language;
597 function holdsCheckPossibility(pickuplib, hold, recurse) {
600 titleid : holdArgs.record,
601 volume_id : holdArgs.volume,
602 copy_id : holdArgs.copy,
603 hold_type : holdArgs.type,
604 patronid : holdArgs.recipient.id(),
606 pickup_lib : pickuplib
610 /* if we're calling create again (recursing),
611 we know that the hold possibility check already succeeded */
612 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
615 _debug("hold possible args = "+js2JSON(args));
617 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
619 req.request.alertEvent = false;
620 req.request._hold = hold;
621 req.request._recurse = recurse;
622 req.callback(holdHandleCreateResponse);
628 function holdsBuildOrgSelector(node) {
630 if(!node) node = globalOrgTree;
631 if(!isTrue(node.opac_visible())) return;
633 var selector = $('holds_org_selector');
634 var index = selector.options.length;
636 var type = findOrgType(node.ou_type());
637 var indent = type.depth() - 1;
638 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
639 if(!type.can_have_users()) {
641 addCSSClass(opt, 'disabled_option');
644 for( var i in node.children() ) {
645 var child = node.children()[i];
646 if(child) holdsBuildOrgSelector(child);
650 function holdsBuildHoldFromWindow() {
652 var org = getSelectorVal($('holds_org_selector'));
653 var node = findOrgUnit(org);
654 var ntype = findOrgType(node.ou_type());
655 if(!ntype.can_have_users()) {
656 alertId('holds_pick_good_org');
660 var hold = new ahr();
661 if(holdArgs.editHold) {
662 hold = holdArgs.editHold;
663 holdArgs.editHold = null;
666 if( $('holds_enable_phone').checked ) {
667 var phone = $('holds_phone').value;
668 if( !phone || !phone.match(REGEX_PHONE) ) {
669 alert($('holds_bad_phone').innerHTML);
672 hold.phone_notify(phone);
675 hold.phone_notify("");
678 if( $('holds_enable_email').checked )
679 hold.email_notify(1);
681 hold.email_notify(0);
685 switch(holdArgs.type) {
687 target = holdArgs.metarecord; break;
689 target = holdArgs.record; break;
691 target = holdArgs.volume; break;
693 target = holdArgs.copy; break;
698 hold.pickup_lib(org);
699 //hold.request_lib(org);
700 hold.requestor(holdArgs.requestor.id());
701 hold.usr(holdArgs.recipient.id());
703 hold.hold_type(holdArgs.type);
705 // see if this hold should be frozen and for how long
706 if($('holds_frozen_chkbox').checked) {
708 unHideMe($('hold_frozen_thaw_row'));
709 thawDate = $('holds_frozen_thaw_input').value;
711 hold.thaw_date(thawDate);
713 hold.thaw_date(null);
716 //check for alternate hold formats
717 var fstring = holdsSetSelectedFormats();
720 hold.holdable_formats(fstring);
721 hold.target(holdArgs.metarecord);
726 function holdsPlaceHold(hold, recurse) {
728 swapCanvas($('check_holds_box'));
729 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
733 function holdHandleCreateResponse(r, recurse) {
736 var res = r.getResultObject();
737 if(!res || checkILSEvent(res) ) {
739 alert($('hold_not_allowed').innerHTML);
741 if( res.textcode == 'PATRON_BARRED' ) {
742 alertId('hold_failed_patron_barred');
744 alert($('hold_not_allowed').innerHTML);
747 swapCanvas($('holds_box'));
752 holdCreateHold(r._recurse, r._hold);
756 function holdCreateHold( recurse, hold ) {
757 var method = CREATE_HOLD;
758 if(recurse) method = CREATE_HOLD_OVERRIDE;
759 var req = new Request( method, holdArgs.requestor.session, hold );
760 req.request.alertEvent = false;
762 var res = req.result();
763 holdProcessResult(hold, res, recurse);
767 runEvt('common', 'holdUpdated');
771 function holdProcessResult( hold, res, recurse ) {
774 alert($('holds_success').innerHTML);
780 alert($('holds_failure').innerHTML);
784 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
785 if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) {
786 if( confirm($('hold_dup_exists_override').innerHTML) ) {
787 return holdsPlaceHold(hold, true);
791 return alert($('hold_dup_exists').innerHTML);
795 alert($('holds_failure').innerHTML);
800 function holdsCancel(holdid, user) {
801 if(!user) user = G.user;
802 var req = new Request(CANCEL_HOLD, user.session, holdid);
805 runEvt('common', 'holdUpdated');
808 function holdsUpdate(hold, user) {
809 if(!user) user = G.user;
810 var req = new Request(UPDATE_HOLD, user.session, hold);
812 var x = req.result(); // cause an exception if there is one
813 runEvt('common', 'holdUpdated');