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
13 function holdsHandleStaff() {
14 swapCanvas($('xulholds_box'));
15 $('xul_recipient_barcode').focus();
16 $('xul_recipient_barcode').onkeypress = function(evt)
17 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
18 $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
19 $('xul_recipient_me').onclick = _holdsHandleStaffMe;
22 function _holdsHandleStaffMe() {
23 holdArgs.recipient = G.user;
27 function _holdsHandleStaff() {
28 var barcode = $('xul_recipient_barcode').value;
29 var user = grabUserByBarcode( G.user.session, barcode );
32 if(evt = checkILSEvent(user)) {
37 if(!barcode || !user) {
38 alertId('holds_invalid_recipient', barcode);
42 holdArgs.recipient = user;
49 * record, volume, copy (ids)
50 * request, recipient, editHold (objects)
53 function holdsDrawEditor(args) {
55 holdArgs = (args) ? args : holdArgs;
58 noEmailMessage = $('holds_email').removeChild($('holds.no_email'));
60 if(isXUL() && holdArgs.recipient == null
61 && holdArgs.editHold == null) {
66 if(!holdArgs.recipient) holdArgs.recipient = G.user;
67 if(!holdArgs.requestor) holdArgs.requestor = G.user;
69 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
70 detachAllEvt('common','locationChanged');
71 attachEvt('common','loggedIn', holdsDrawEditor)
76 if(holdArgs.editHold) // flesh the args with the existing hold
77 holdArgsFromHold(holdArgs.editHold, holdArgs);
83 // updates the edit window with the existing hold's data
84 function _holdsUpdateEditHold() {
86 var hold = holdArgs.editHold;
87 var status = holdArgs.status;
89 var orgsel = $('holds_org_selector');
90 setSelector(orgsel, hold.pickup_lib());
92 if( hold.capture_time() || status > 2 )
93 orgsel.disabled = true;
95 orgsel.disabled = false;
98 $('holds_submit').onclick = holdsEditHold;
99 $('holds_update').onclick = holdsEditHold;
101 if(hold.phone_notify()) {
102 $('holds_enable_phone').checked = true;
103 $('holds_phone').value = hold.phone_notify();
106 $('holds_phone').disabled = true;
107 $('holds_enable_phone').checked = false;
110 if(isTrue(hold.email_notify())) {
111 $('holds_enable_email').checked = true;
114 $('holds_enable_email').checked = false;
118 function holdsEditHold() {
119 var hold = holdsBuildHoldFromWindow();
123 if(holdArgs.onComplete)
124 holdArgs.onComplete(hold);
127 function holdArgsFromHold(hold, oargs) {
128 var args = (oargs) ? oargs : {};
129 args.type = hold.hold_type();
130 var target = hold.target();
134 args.metarecord = target;
137 args.record = target;
140 args.volume = target;
149 function holdFetchObjects(hold, doneCallback) {
151 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
153 var type = args.type;
157 if( args.copyObject ) {
159 args.copy = args.copyObject.id();
160 args.volume = args.copyObject.call_number();
161 _h_set_vol(args, doneCallback);
164 var creq = new Request(FETCH_COPY, args.copy);
168 var cp = r.getResultObject();
169 args.copyObject = cp;
170 args.volume = args.copyObject.call_number();
171 _h_set_vol(args, doneCallback);
178 _h_set_vol(args, doneCallback);
182 _h_set_rec(args, doneCallback);
184 _h_set_rec_descriptors(args, doneCallback);
192 function _h_set_vol(args, doneCallback) {
194 if( args.volumeObject ) {
195 args.volume = args.volumeObject.id();
196 args.record = args.volumeObject.record();
197 _h_set_rec(args, doneCallback);
201 var vreq = new Request(FETCH_VOLUME, args.volume);
204 var vol = r.getResultObject();
205 args.volumeObject = vol;
206 args.record = vol.record();
207 _h_set_rec(args, doneCallback);
214 function _h_set_rec(args, doneCallback) {
216 if(args.recordObject)
217 args.record = args.recordObject.doc_id();
219 args.recordObject = findRecord( args.record, 'T' );
221 if( args.type == 'T' || args.type == 'M' )
222 _h_set_rec_descriptors(args, doneCallback);
224 if(doneCallback) doneCallback(args);
228 function _h_set_rec_descriptors(args, doneCallback) {
230 // grab the list of record desciptors attached to this records metarecord
231 if( ! args.recordDescriptors ) {
232 var params = { record: args.record };
234 if( ! args.record ) {
235 if( args.metarecord )
236 params = { metarecord : args.metarecord };
238 params = { metarecord : args.metarecordObject.doc_id() };
241 var req = new Request(FETCH_MR_DESCRIPTORS, params );
244 var data = r.getResultObject();
245 args.recordDescriptors = data.descriptors;
246 args.metarecord = data.metarecord;
247 if( args.type == 'M' && ! args.metarecordObject)
248 args.metarecordObject = findRecord(args.metarecord, 'M');
250 if(doneCallback) doneCallback(args);
256 if(doneCallback) doneCallback(args);
264 function holdsDrawWindow() {
265 swapCanvas($('holds_box'));
266 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
267 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
268 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
269 holdFetchObjects(null,
273 if(holdArgs.editHold) {
274 hideMe($('holds_submit'));
275 unHideMe($('holds_update'));
276 var req = new Request(FETCH_HOLD_STATUS,
277 G.user.session, holdArgs.editHold.id());
279 holdArgs.status = req.result();
280 _holdsUpdateEditHold();
286 function __holdsDrawWindow() {
288 var rec = holdArgs.recordObject;
289 var vol = holdArgs.volumeObject;
290 var copy = holdArgs.copyObject;
291 var mr = holdArgs.metarecordObject;
293 rec = (rec) ? rec : mr;
295 if(!holdsOrgSelectorBuilt) {
296 holdsBuildOrgSelector(null,0);
297 holdsOrgSelectorBuilt = true;
298 var selector = $('holds_org_selector');
301 var o_loc = findOrgUnit(getOrigLocation());
302 var t = findOrgType(o_loc.ou_type());
303 if( t.can_have_users() )
304 setSelector(selector, o_loc.id());
308 setSelector(selector, holdArgs.recipient.home_ou());
314 var dsel = $('holds_depth_selector');
315 unHideMe($('holds_depth_selector_row'));
316 if(dsel.getElementsByTagName('option').length == 0) {
317 var types = globalOrgTypes;
318 var depth = findOrgDepth(G.user.ws_ou());
321 if(t.depth() > depth) return;
322 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
329 appendClear($('holds_recipient'), text(
330 holdArgs.recipient.family_name() + ', ' +
331 holdArgs.recipient.first_given_name()));
332 appendClear($('holds_title'), text(rec.title()));
333 appendClear($('holds_author'), text(rec.author()));
335 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
337 unHideMe($('holds_type_row'));
338 unHideMe($('holds_cn_row'));
339 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
341 if( holdArgs.type == 'V' ) {
342 unHideMe($('holds_is_cn'));
343 hideMe($('holds_is_copy'));
346 hideMe($('holds_is_cn'));
347 unHideMe($('holds_is_copy'));
348 unHideMe($('holds_copy_row'));
349 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
353 hideMe($('holds_type_row'));
354 hideMe($('holds_copy_row'));
355 hideMe($('holds_cn_row'));
358 removeChildren($('holds_format'));
360 var mods_formats = rec.types_of_resource();
363 if(holdArgs.recordDescriptors)
364 formats = holdArgs.recordDescriptors[0].item_type();
366 if( holdArgs.type == 'T' ) {
367 var desc = grep( holdArgs.recordDescriptors,
369 return (i.record() == holdArgs.record);
372 formats = desc[0].item_type();
375 if( holdArgs.type == 'M' ) {
376 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
377 mods_formats = data.mods_formats;
378 formats = data.formats;
382 for( var i in mods_formats ) {
383 var res = mods_formats[i];
384 var img = elem("img");
385 setResourcePic(img, res);
386 $('holds_format').appendChild(img);
388 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
390 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
391 $('holds_format').appendChild(elem('br'));
395 $('holds_phone').value = holdArgs.recipient.day_phone();
396 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
398 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
401 if( ! pref.match(/email/i) )
402 $('holds_enable_email').checked = false;
404 if( ! pref.match(/phone/i) ) {
405 $('holds_phone').disabled = true;
406 $('holds_enable_phone').checked = false;
410 if(!G.user.email()) {
411 $('holds_enable_email').checked = false;
412 $('holds_enable_email').disabled = true;
413 var n = noEmailMessage.cloneNode(true);
414 appendClear( $('holds_email'), n);
416 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
419 if(!$('holds_phone').value)
420 $('holds_enable_phone').checked = false;
422 appendClear($('holds_physical_desc'), text(rec.physical_description()));
424 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
426 holdsSetFormatSelector();
429 function holdsParseMRFormats(str) {
430 var data = str.split(/-/);
433 var mods_formats = [];
435 for( var i = 0; i < data[0].length; i++ ) {
436 formats.push( data[0].charAt(i) );
437 mods_formats.push( MARCFormatToMods( formats[i] ) );
440 formats = uniquify(formats);
441 mods_formats = uniquify(mods_formats);
445 mods_formats : mods_formats,
452 function holdsSetFormatSelector() {
453 var type = holdArgs.type;
454 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
456 var data = holdsGetFormats();
457 var avail_formats = data.avail_formats;
458 var sel_formats = data.sel_formats;
459 holdArgs.language = data.lang;
461 unHideMe($('holds_alt_formats_row_extras'));
462 var selector = $('hold_alt_form_selector');
464 for( var i = 0; i < avail_formats.length; i++ ) {
465 var form = avail_formats[i];
466 unHideMe(findSelectorOptByValue(selector, form));
471 function holdsGetFormats() {
475 var sformats = []; // selected formats
477 var type = holdArgs.type;
478 var desc = holdArgs.recordDescriptors;
479 var rec = holdArgs.record;
480 var mrec = holdArgs.metarecord;
484 for( var i = 0; i < desc.length; i++ ) {
486 if( d.record() == holdArgs.record ) {
487 lang = d.item_lang();
488 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
489 sformats.push(holdArgs.myFormat);
495 for( var i = 0; i < desc.length; i++ ) {
497 if( d.item_lang() != lang ) continue;
498 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
501 formats = uniquify(formats);
505 avail_formats : formats,
506 sel_formats : sformats
512 function _t_f_2_format(type, form) {
513 if( form == 'd' ) return 'at-d';
514 return (type == 'a' || type == 't') ? 'at' :
515 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
518 function holdsSetSelectedFormats() {
520 var cn = $('holds_alt_formats_row').className;
521 if( cn && cn.match(/hide_me/) ) return;
523 var selector = $('hold_alt_form_selector');
524 var vals = getSelectedList(selector);
526 if(vals.length == 0) return;
530 if( contains(vals, 'at-d') ) {
531 if( contains(vals, 'at') )
536 if( contains(vals, 'at') )
540 for( var i = 0; i < vals.length; i++ ) {
542 if( !val.match(/at/) ) fstring = val + fstring;
545 if( holdArgs.language ) {
546 if( fstring.match(/-/) )
547 fstring = fstring + '-' + holdArgs.language;
549 fstring = fstring + '--' + holdArgs.language;
557 function holdsCheckPossibility(pickuplib, hold, recurse) {
560 titleid : holdArgs.record,
561 volume_id : holdArgs.volume,
562 copy_id : holdArgs.copy,
563 hold_type : holdArgs.type,
564 patronid : holdArgs.recipient.id(),
566 pickup_lib : pickuplib
570 /* if we're calling create again (recursing),
571 we know that the hold possibility check already succeeded */
572 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
575 _debug("hold possible args = "+js2JSON(args));
577 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
579 req.request.alertEvent = false;
580 req.request._hold = hold;
581 req.request._recurse = recurse;
582 req.callback(holdHandleCreateResponse);
588 function holdsBuildOrgSelector(node) {
590 if(!node) node = globalOrgTree;
592 var selector = $('holds_org_selector');
593 var index = selector.options.length;
595 var type = findOrgType(node.ou_type());
596 var indent = type.depth() - 1;
597 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
598 if(!type.can_have_users()) {
600 addCSSClass(opt, 'disabled_option');
603 for( var i in node.children() ) {
604 var child = node.children()[i];
605 if(child) holdsBuildOrgSelector(child);
609 function holdsBuildHoldFromWindow() {
611 var org = getSelectorVal($('holds_org_selector'));
612 var node = findOrgUnit(org);
613 var ntype = findOrgType(node.ou_type());
614 if(!ntype.can_have_users()) {
615 alertId('holds_pick_good_org');
619 var hold = new ahr();
620 if(holdArgs.editHold) {
621 hold = holdArgs.editHold;
622 holdArgs.editHold = null;
625 if( $('holds_enable_phone').checked ) {
626 var phone = $('holds_phone').value;
627 if( !phone || !phone.match(REGEX_PHONE) ) {
628 alert($('holds_bad_phone').innerHTML);
631 hold.phone_notify(phone);
634 hold.phone_notify("");
637 if( $('holds_enable_email').checked )
638 hold.email_notify(1);
640 hold.email_notify(0);
644 switch(holdArgs.type) {
646 target = holdArgs.metarecord; break;
648 target = holdArgs.record; break;
650 target = holdArgs.volume; break;
652 target = holdArgs.copy; break;
657 hold.pickup_lib(org);
658 //hold.request_lib(org);
659 hold.requestor(holdArgs.requestor.id());
660 hold.usr(holdArgs.recipient.id());
662 hold.hold_type(holdArgs.type);
664 //check for alternate hold formats
665 var fstring = holdsSetSelectedFormats();
668 hold.holdable_formats(fstring);
669 hold.target(holdArgs.metarecord);
674 function holdsPlaceHold(hold, recurse) {
676 swapCanvas($('check_holds_box'));
677 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
681 function holdHandleCreateResponse(r, recurse) {
684 var res = r.getResultObject();
685 if(!res || checkILSEvent(res) ) {
687 alert($('hold_not_allowed').innerHTML);
689 if( res.textcode == 'PATRON_BARRED' ) {
690 alertId('hold_failed_patron_barred');
692 alert($('hold_not_allowed').innerHTML);
695 swapCanvas($('holds_box'));
700 holdCreateHold(r._recurse, r._hold);
704 function holdCreateHold( recurse, hold ) {
705 var method = CREATE_HOLD;
706 if(recurse) method = CREATE_HOLD_OVERRIDE;
707 var req = new Request( method, holdArgs.requestor.session, hold );
708 req.request.alertEvent = false;
710 var res = req.result();
711 holdProcessResult(hold, res, recurse);
715 runEvt('common', 'holdUpdated');
719 function holdProcessResult( hold, res, recurse ) {
722 alert($('holds_success').innerHTML);
728 alert($('holds_failure').innerHTML);
732 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
733 if( fetchPermOrgs('HOLD_EXISTS.override')[0] ) {
734 if( confirm($('hold_dup_exists_override').innerHTML) ) {
735 return holdsPlaceHold(hold, true);
739 return alert($('hold_dup_exists').innerHTML);
743 alert($('holds_failure').innerHTML);
748 function holdsCancel(holdid, user) {
749 if(!user) user = G.user;
750 var req = new Request(CANCEL_HOLD, user.session, holdid);
753 runEvt('common', 'holdUpdated');
756 function holdsUpdate(hold, user) {
757 if(!user) user = G.user;
758 var req = new Request(UPDATE_HOLD, user.session, hold);
760 var x = req.result(); // cause an exception if there is one
761 runEvt('common', 'holdUpdated');