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;
23 function _holdsHandleStaffMe() {
24 holdArgs.recipient = G.user;
28 function _holdsHandleStaff() {
29 var barcode = $('xul_recipient_barcode').value;
30 var user = grabUserByBarcode( G.user.session, barcode );
33 if(evt = checkILSEvent(user)) {
38 if(!barcode || !user) {
39 alertId('holds_invalid_recipient', barcode);
43 holdArgs.recipient = user;
50 * record, volume, copy (ids)
51 * request, recipient, editHold (objects)
54 function holdsDrawEditor(args) {
56 holdArgs = (args) ? args : holdArgs;
59 noEmailMessage = $('holds_email').removeChild($('holds.no_email'));
61 if(!noEmailMessageXUL)
62 noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul'));
64 if(isXUL() && holdArgs.recipient == null
65 && holdArgs.editHold == null) {
70 if(!holdArgs.recipient) holdArgs.recipient = G.user;
71 if(!holdArgs.requestor) holdArgs.requestor = G.user;
73 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
74 detachAllEvt('common','locationChanged');
75 attachEvt('common','loggedIn', holdsDrawEditor)
80 if(holdArgs.editHold) // flesh the args with the existing hold
81 holdArgsFromHold(holdArgs.editHold, holdArgs);
87 // updates the edit window with the existing hold's data
88 function _holdsUpdateEditHold() {
90 var hold = holdArgs.editHold;
91 var status = holdArgs.status;
93 var orgsel = $('holds_org_selector');
94 setSelector(orgsel, hold.pickup_lib());
96 if( hold.capture_time() || status > 2 )
97 orgsel.disabled = true;
99 orgsel.disabled = false;
102 $('holds_submit').onclick = holdsEditHold;
103 $('holds_update').onclick = holdsEditHold;
105 if(hold.phone_notify()) {
106 $('holds_enable_phone').checked = true;
107 $('holds_phone').value = hold.phone_notify();
110 $('holds_phone').disabled = true;
111 $('holds_enable_phone').checked = false;
114 if(isTrue(hold.email_notify())) {
115 $('holds_enable_email').checked = true;
118 $('holds_enable_email').checked = false;
122 function holdsEditHold() {
123 var hold = holdsBuildHoldFromWindow();
127 if(holdArgs.onComplete)
128 holdArgs.onComplete(hold);
131 function holdArgsFromHold(hold, oargs) {
132 var args = (oargs) ? oargs : {};
133 args.type = hold.hold_type();
134 var target = hold.target();
138 args.metarecord = target;
141 args.record = target;
144 args.volume = target;
153 function holdFetchObjects(hold, doneCallback) {
155 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
157 var type = args.type;
161 if( args.copyObject ) {
163 args.copy = args.copyObject.id();
164 args.volume = args.copyObject.call_number();
165 _h_set_vol(args, doneCallback);
168 var creq = new Request(FETCH_COPY, args.copy);
172 var cp = r.getResultObject();
173 args.copyObject = cp;
174 args.volume = args.copyObject.call_number();
175 _h_set_vol(args, doneCallback);
182 _h_set_vol(args, doneCallback);
186 _h_set_rec(args, doneCallback);
188 _h_set_rec_descriptors(args, doneCallback);
196 function _h_set_vol(args, doneCallback) {
198 if( args.volumeObject ) {
199 args.volume = args.volumeObject.id();
200 args.record = args.volumeObject.record();
201 _h_set_rec(args, doneCallback);
205 var vreq = new Request(FETCH_VOLUME, args.volume);
208 var vol = r.getResultObject();
209 args.volumeObject = vol;
210 args.record = vol.record();
211 _h_set_rec(args, doneCallback);
218 function _h_set_rec(args, doneCallback) {
220 if(args.recordObject)
221 args.record = args.recordObject.doc_id();
223 args.recordObject = findRecord( args.record, 'T' );
225 if( args.type == 'T' || args.type == 'M' )
226 _h_set_rec_descriptors(args, doneCallback);
228 if(doneCallback) doneCallback(args);
232 function _h_set_rec_descriptors(args, doneCallback) {
234 // grab the list of record desciptors attached to this records metarecord
235 if( ! args.recordDescriptors ) {
236 var params = { record: args.record };
238 if( ! args.record ) {
239 if( args.metarecord )
240 params = { metarecord : args.metarecord };
242 params = { metarecord : args.metarecordObject.doc_id() };
245 var req = new Request(FETCH_MR_DESCRIPTORS, params );
248 var data = r.getResultObject();
249 args.recordDescriptors = data.descriptors;
250 args.metarecord = data.metarecord;
251 if( args.type == 'M' && ! args.metarecordObject)
252 args.metarecordObject = findRecord(args.metarecord, 'M');
254 if(doneCallback) doneCallback(args);
260 if(doneCallback) doneCallback(args);
268 function holdsDrawWindow() {
269 swapCanvas($('holds_box'));
270 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
271 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
272 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
273 holdFetchObjects(null,
277 if(holdArgs.editHold) {
278 hideMe($('holds_submit'));
279 unHideMe($('holds_update'));
280 var req = new Request(FETCH_HOLD_STATUS,
281 G.user.session, holdArgs.editHold.id());
283 holdArgs.status = req.result();
284 _holdsUpdateEditHold();
290 function __holdsDrawWindow() {
292 var rec = holdArgs.recordObject;
293 var vol = holdArgs.volumeObject;
294 var copy = holdArgs.copyObject;
295 var mr = holdArgs.metarecordObject;
297 rec = (rec) ? rec : mr;
299 if(!holdsOrgSelectorBuilt) {
300 holdsBuildOrgSelector(null,0);
301 holdsOrgSelectorBuilt = true;
302 var selector = $('holds_org_selector');
305 var o_loc = findOrgUnit(getOrigLocation());
306 var t = findOrgType(o_loc.ou_type());
307 if( t.can_have_users() )
308 setSelector(selector, o_loc.id());
312 setSelector(selector, holdArgs.recipient.home_ou());
318 var dsel = $('holds_depth_selector');
319 unHideMe($('holds_depth_selector_row'));
320 if(dsel.getElementsByTagName('option').length == 0) {
321 var types = globalOrgTypes;
322 var depth = findOrgDepth(G.user.ws_ou());
325 if(t.depth() > depth) return;
326 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
333 appendClear($('holds_recipient'), text(
334 holdArgs.recipient.family_name() + ', ' +
335 holdArgs.recipient.first_given_name()));
336 appendClear($('holds_title'), text(rec.title()));
337 appendClear($('holds_author'), text(rec.author()));
339 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
341 unHideMe($('holds_type_row'));
342 unHideMe($('holds_cn_row'));
343 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
345 if( holdArgs.type == 'V' ) {
346 unHideMe($('holds_is_cn'));
347 hideMe($('holds_is_copy'));
350 hideMe($('holds_is_cn'));
351 unHideMe($('holds_is_copy'));
352 unHideMe($('holds_copy_row'));
353 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
357 hideMe($('holds_type_row'));
358 hideMe($('holds_copy_row'));
359 hideMe($('holds_cn_row'));
362 removeChildren($('holds_format'));
364 var mods_formats = rec.types_of_resource();
367 if(holdArgs.recordDescriptors)
368 formats = holdArgs.recordDescriptors[0].item_type();
370 if( holdArgs.type == 'T' ) {
371 var desc = grep( holdArgs.recordDescriptors,
373 return (i.record() == holdArgs.record);
376 formats = desc[0].item_type();
379 if( holdArgs.type == 'M' ) {
380 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
381 mods_formats = data.mods_formats;
382 formats = data.formats;
386 for( var i in mods_formats ) {
387 var res = mods_formats[i];
388 var img = elem("img");
389 setResourcePic(img, res);
390 $('holds_format').appendChild(img);
392 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
394 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
395 $('holds_format').appendChild(elem('br'));
399 $('holds_phone').value = holdArgs.recipient.day_phone();
400 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
402 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
405 if( ! pref.match(/email/i) )
406 $('holds_enable_email').checked = false;
408 if( ! pref.match(/phone/i) ) {
409 $('holds_phone').disabled = true;
410 $('holds_enable_phone').checked = false;
414 //if(!G.user.email()) {
415 if(!holdArgs.recipient.email()) {
416 $('holds_enable_email').checked = false;
417 $('holds_enable_email').disabled = true;
420 message = noEmailMessageXUL.cloneNode(true);
421 appendClear($('holds_email'), message);
423 message = noEmailMessage.cloneNode(true);
424 appendClear($('holds_email'), message);
425 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
430 if(!$('holds_phone').value)
431 $('holds_enable_phone').checked = false;
433 appendClear($('holds_physical_desc'), text(rec.physical_description()));
435 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
437 holdsSetFormatSelector();
440 function holdsParseMRFormats(str) {
441 var data = str.split(/-/);
444 var mods_formats = [];
446 for( var i = 0; i < data[0].length; i++ ) {
447 formats.push( data[0].charAt(i) );
448 mods_formats.push( MARCFormatToMods( formats[i] ) );
451 formats = uniquify(formats);
452 mods_formats = uniquify(mods_formats);
456 mods_formats : mods_formats,
463 function holdsSetFormatSelector() {
464 var type = holdArgs.type;
465 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
467 var data = holdsGetFormats();
468 var avail_formats = data.avail_formats;
469 var sel_formats = data.sel_formats;
470 holdArgs.language = data.lang;
472 unHideMe($('holds_alt_formats_row_extras'));
473 var selector = $('hold_alt_form_selector');
475 for( var i = 0; i < avail_formats.length; i++ ) {
476 var form = avail_formats[i];
477 unHideMe(findSelectorOptByValue(selector, form));
482 function holdsGetFormats() {
486 var sformats = []; // selected formats
488 var type = holdArgs.type;
489 var desc = holdArgs.recordDescriptors;
490 var rec = holdArgs.record;
491 var mrec = holdArgs.metarecord;
495 for( var i = 0; i < desc.length; i++ ) {
497 if( d.record() == holdArgs.record ) {
498 lang = d.item_lang();
499 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
500 sformats.push(holdArgs.myFormat);
506 for( var i = 0; i < desc.length; i++ ) {
508 if( d.item_lang() != lang ) continue;
509 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
512 formats = uniquify(formats);
516 avail_formats : formats,
517 sel_formats : sformats
523 function _t_f_2_format(type, form) {
524 if( form == 'd' ) return 'at-d';
525 return (type == 'a' || type == 't') ? 'at' :
526 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
529 function holdsSetSelectedFormats() {
531 var cn = $('holds_alt_formats_row').className;
532 if( cn && cn.match(/hide_me/) ) return;
534 var selector = $('hold_alt_form_selector');
535 var vals = getSelectedList(selector);
537 if(vals.length == 0) return;
541 if( contains(vals, 'at-d') ) {
542 if( contains(vals, 'at') )
547 if( contains(vals, 'at') )
551 for( var i = 0; i < vals.length; i++ ) {
553 if( !val.match(/at/) ) fstring = val + fstring;
556 if( holdArgs.language ) {
557 if( fstring.match(/-/) )
558 fstring = fstring + '-' + holdArgs.language;
560 fstring = fstring + '--' + holdArgs.language;
568 function holdsCheckPossibility(pickuplib, hold, recurse) {
571 titleid : holdArgs.record,
572 volume_id : holdArgs.volume,
573 copy_id : holdArgs.copy,
574 hold_type : holdArgs.type,
575 patronid : holdArgs.recipient.id(),
577 pickup_lib : pickuplib
581 /* if we're calling create again (recursing),
582 we know that the hold possibility check already succeeded */
583 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
586 _debug("hold possible args = "+js2JSON(args));
588 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
590 req.request.alertEvent = false;
591 req.request._hold = hold;
592 req.request._recurse = recurse;
593 req.callback(holdHandleCreateResponse);
599 function holdsBuildOrgSelector(node) {
601 if(!node) node = globalOrgTree;
603 var selector = $('holds_org_selector');
604 var index = selector.options.length;
606 var type = findOrgType(node.ou_type());
607 var indent = type.depth() - 1;
608 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
609 if(!type.can_have_users()) {
611 addCSSClass(opt, 'disabled_option');
614 for( var i in node.children() ) {
615 var child = node.children()[i];
616 if(child) holdsBuildOrgSelector(child);
620 function holdsBuildHoldFromWindow() {
622 var org = getSelectorVal($('holds_org_selector'));
623 var node = findOrgUnit(org);
624 var ntype = findOrgType(node.ou_type());
625 if(!ntype.can_have_users()) {
626 alertId('holds_pick_good_org');
630 var hold = new ahr();
631 if(holdArgs.editHold) {
632 hold = holdArgs.editHold;
633 holdArgs.editHold = null;
636 if( $('holds_enable_phone').checked ) {
637 var phone = $('holds_phone').value;
638 if( !phone || !phone.match(REGEX_PHONE) ) {
639 alert($('holds_bad_phone').innerHTML);
642 hold.phone_notify(phone);
645 hold.phone_notify("");
648 if( $('holds_enable_email').checked )
649 hold.email_notify(1);
651 hold.email_notify(0);
655 switch(holdArgs.type) {
657 target = holdArgs.metarecord; break;
659 target = holdArgs.record; break;
661 target = holdArgs.volume; break;
663 target = holdArgs.copy; break;
668 hold.pickup_lib(org);
669 //hold.request_lib(org);
670 hold.requestor(holdArgs.requestor.id());
671 hold.usr(holdArgs.recipient.id());
673 hold.hold_type(holdArgs.type);
675 //check for alternate hold formats
676 var fstring = holdsSetSelectedFormats();
679 hold.holdable_formats(fstring);
680 hold.target(holdArgs.metarecord);
685 function holdsPlaceHold(hold, recurse) {
687 swapCanvas($('check_holds_box'));
688 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
692 function holdHandleCreateResponse(r, recurse) {
695 var res = r.getResultObject();
696 if(!res || checkILSEvent(res) ) {
698 alert($('hold_not_allowed').innerHTML);
700 if( res.textcode == 'PATRON_BARRED' ) {
701 alertId('hold_failed_patron_barred');
703 alert($('hold_not_allowed').innerHTML);
706 swapCanvas($('holds_box'));
711 holdCreateHold(r._recurse, r._hold);
715 function holdCreateHold( recurse, hold ) {
716 var method = CREATE_HOLD;
717 if(recurse) method = CREATE_HOLD_OVERRIDE;
718 var req = new Request( method, holdArgs.requestor.session, hold );
719 req.request.alertEvent = false;
721 var res = req.result();
722 holdProcessResult(hold, res, recurse);
726 runEvt('common', 'holdUpdated');
730 function holdProcessResult( hold, res, recurse ) {
733 alert($('holds_success').innerHTML);
739 alert($('holds_failure').innerHTML);
743 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
744 if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) {
745 if( confirm($('hold_dup_exists_override').innerHTML) ) {
746 return holdsPlaceHold(hold, true);
750 return alert($('hold_dup_exists').innerHTML);
754 alert($('holds_failure').innerHTML);
759 function holdsCancel(holdid, user) {
760 if(!user) user = G.user;
761 var req = new Request(CANCEL_HOLD, user.session, holdid);
764 runEvt('common', 'holdUpdated');
767 function holdsUpdate(hold, user) {
768 if(!user) user = G.user;
769 var req = new Request(UPDATE_HOLD, user.session, hold);
771 var x = req.result(); // cause an exception if there is one
772 runEvt('common', 'holdUpdated');