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
11 function holdsHandleStaff() {
12 swapCanvas($('xulholds_box'));
13 $('xul_recipient_barcode').focus();
14 $('xul_recipient_barcode').onkeypress = function(evt)
15 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
16 $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
17 $('xul_recipient_me').onclick = _holdsHandleStaffMe;
20 function _holdsHandleStaffMe() {
21 holdArgs.recipient = G.user;
25 function _holdsHandleStaff() {
26 var barcode = $('xul_recipient_barcode').value;
27 var user = grabUserByBarcode( G.user.session, barcode );
30 if(evt = checkILSEvent(user)) {
35 if(!barcode || !user) {
36 alertId('holds_invalid_recipient', barcode);
40 holdArgs.recipient = user;
47 * record, volume, copy (ids)
48 * request, recipient, editHold (objects)
51 function holdsDrawEditor(args) {
53 holdArgs = (args) ? args : holdArgs;
55 if(isXUL() && holdArgs.recipient == null
56 && holdArgs.editHold == null) {
61 if(!holdArgs.recipient) holdArgs.recipient = G.user;
62 if(!holdArgs.requestor) holdArgs.requestor = G.user;
64 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
65 detachAllEvt('common','locationChanged');
66 attachEvt('common','loggedIn', holdsDrawEditor)
71 if(holdArgs.editHold) // flesh the args with the existing hold
72 holdArgsFromHold(holdArgs.editHold, holdArgs);
78 // updates the edit window with the existing hold's data
79 function _holdsUpdateEditHold() {
81 var hold = holdArgs.editHold;
82 var status = holdArgs.status;
84 var orgsel = $('holds_org_selector');
85 setSelector(orgsel, hold.pickup_lib());
87 if( hold.capture_time() || status > 2 )
88 orgsel.disabled = true;
90 orgsel.disabled = false;
93 $('holds_submit').onclick = holdsEditHold;
94 $('holds_update').onclick = holdsEditHold;
96 if(hold.phone_notify()) {
97 $('holds_enable_phone').checked = true;
98 $('holds_phone').value = hold.phone_notify();
101 $('holds_phone').disabled = true;
102 $('holds_enable_phone').checked = false;
105 if(isTrue(hold.email_notify())) {
106 $('holds_enable_email').checked = true;
109 $('holds_enable_email').checked = false;
113 function holdsEditHold() {
114 var hold = holdsBuildHoldFromWindow();
118 if(holdArgs.onComplete)
119 holdArgs.onComplete(hold);
122 function holdArgsFromHold(hold, oargs) {
123 var args = (oargs) ? oargs : {};
124 args.type = hold.hold_type();
125 var target = hold.target();
129 args.metarecord = target;
132 args.record = target;
135 args.volume = target;
144 function holdFetchObjects(hold, doneCallback) {
146 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
148 var type = args.type;
152 if( args.copyObject ) {
154 args.copy = args.copyObject.id();
155 args.volume = args.copyObject.call_number();
156 _h_set_vol(args, doneCallback);
159 var creq = new Request(FETCH_COPY, args.copy);
163 var cp = r.getResultObject();
164 args.copyObject = cp;
165 args.volume = args.copyObject.call_number();
166 _h_set_vol(args, doneCallback);
173 _h_set_vol(args, doneCallback);
177 _h_set_rec(args, doneCallback);
179 _h_set_rec_descriptors(args, doneCallback);
187 function _h_set_vol(args, doneCallback) {
189 if( args.volumeObject ) {
190 args.volume = args.volumeObject.id();
191 args.record = args.volumeObject.record();
192 _h_set_rec(args, doneCallback);
196 var vreq = new Request(FETCH_VOLUME, args.volume);
199 var vol = r.getResultObject();
200 args.volumeObject = vol;
201 args.record = vol.record();
202 _h_set_rec(args, doneCallback);
209 function _h_set_rec(args, doneCallback) {
211 if(args.recordObject)
212 args.record = args.recordObject.doc_id();
214 args.recordObject = findRecord( args.record, 'T' );
216 if( args.type == 'T' || args.type == 'M' )
217 _h_set_rec_descriptors(args, doneCallback);
219 if(doneCallback) doneCallback(args);
223 function _h_set_rec_descriptors(args, doneCallback) {
225 // grab the list of record desciptors attached to this records metarecord
226 if( ! args.recordDescriptors ) {
227 var params = { record: args.record };
229 if( ! args.record ) {
230 if( args.metarecord )
231 params = { metarecord : args.metarecord };
233 params = { metarecord : args.metarecordObject.doc_id() };
236 var req = new Request(FETCH_MR_DESCRIPTORS, params );
239 var data = r.getResultObject();
240 args.recordDescriptors = data.descriptors;
241 args.metarecord = data.metarecord;
242 if( args.type == 'M' && ! args.metarecordObject)
243 args.metarecordObject = findRecord(args.metarecord, 'M');
245 if(doneCallback) doneCallback(args);
251 if(doneCallback) doneCallback(args);
259 function holdsDrawWindow() {
260 swapCanvas($('holds_box'));
261 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
262 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
263 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
264 holdFetchObjects(null,
268 if(holdArgs.editHold) {
269 hideMe($('holds_submit'));
270 unHideMe($('holds_update'));
271 var req = new Request(FETCH_HOLD_STATUS,
272 G.user.session, holdArgs.editHold.id());
274 holdArgs.status = req.result();
275 _holdsUpdateEditHold();
281 function __holdsDrawWindow() {
283 var rec = holdArgs.recordObject;
284 var vol = holdArgs.volumeObject;
285 var copy = holdArgs.copyObject;
286 var mr = holdArgs.metarecordObject;
288 rec = (rec) ? rec : mr;
290 if(!holdsOrgSelectorBuilt) {
291 holdsBuildOrgSelector(null,0);
292 holdsOrgSelectorBuilt = true;
293 var selector = $('holds_org_selector');
296 var o_loc = findOrgUnit(getOrigLocation());
297 var t = findOrgType(o_loc.ou_type());
298 if( t.can_have_users() )
299 setSelector(selector, o_loc.id());
303 setSelector(selector, holdArgs.recipient.home_ou());
309 var dsel = $('holds_depth_selector');
310 unHideMe($('holds_depth_selector_row'));
311 if(dsel.getElementsByTagName('option').length == 0) {
312 var types = globalOrgTypes;
313 var depth = findOrgDepth(G.user.ws_ou());
316 if(t.depth() > depth) return;
317 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
324 appendClear($('holds_recipient'), text(
325 holdArgs.recipient.family_name() + ', ' +
326 holdArgs.recipient.first_given_name()));
327 appendClear($('holds_title'), text(rec.title()));
328 appendClear($('holds_author'), text(rec.author()));
330 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
332 unHideMe($('holds_type_row'));
333 unHideMe($('holds_cn_row'));
334 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
336 if( holdArgs.type == 'V' ) {
337 unHideMe($('holds_is_cn'));
338 hideMe($('holds_is_copy'));
341 hideMe($('holds_is_cn'));
342 unHideMe($('holds_is_copy'));
343 unHideMe($('holds_copy_row'));
344 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
348 hideMe($('holds_type_row'));
349 hideMe($('holds_copy_row'));
350 hideMe($('holds_cn_row'));
353 removeChildren($('holds_format'));
355 var mods_formats = rec.types_of_resource();
358 if(holdArgs.recordDescriptors)
359 formats = holdArgs.recordDescriptors[0].item_type();
361 if( holdArgs.type == 'T' ) {
362 var desc = grep( holdArgs.recordDescriptors,
364 return (i.record() == holdArgs.record);
367 formats = desc[0].item_type();
370 if( holdArgs.type == 'M' ) {
371 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
372 mods_formats = data.mods_formats;
373 formats = data.formats;
377 for( var i in mods_formats ) {
378 var res = mods_formats[i];
379 var img = elem("img");
380 setResourcePic(img, res);
381 $('holds_format').appendChild(img);
383 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
385 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
386 $('holds_format').appendChild(elem('br'));
390 $('holds_phone').value = holdArgs.recipient.day_phone();
391 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
393 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
396 if( ! pref.match(/email/i) )
397 $('holds_enable_email').checked = false;
399 if( ! pref.match(/phone/i) ) {
400 $('holds_phone').disabled = true;
401 $('holds_enable_phone').checked = false;
406 $('holds_enable_email').checked = false;
408 if(!$('holds_phone').value)
409 $('holds_enable_phone').checked = false;
411 appendClear($('holds_physical_desc'), text(rec.physical_description()));
413 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
415 holdsSetFormatSelector();
418 function holdsParseMRFormats(str) {
419 var data = str.split(/-/);
422 var mods_formats = [];
424 for( var i = 0; i < data[0].length; i++ ) {
425 formats.push( data[0].charAt(i) );
426 mods_formats.push( MARCFormatToMods( formats[i] ) );
429 formats = uniquify(formats);
430 mods_formats = uniquify(mods_formats);
434 mods_formats : mods_formats,
441 function holdsSetFormatSelector() {
442 var type = holdArgs.type;
443 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
445 var data = holdsGetFormats();
446 var avail_formats = data.avail_formats;
447 var sel_formats = data.sel_formats;
448 holdArgs.language = data.lang;
450 unHideMe($('holds_alt_formats_row_extras'));
451 var selector = $('hold_alt_form_selector');
453 for( var i = 0; i < avail_formats.length; i++ ) {
454 var form = avail_formats[i];
455 unHideMe(findSelectorOptByValue(selector, form));
460 function holdsGetFormats() {
464 var sformats = []; // selected formats
466 var type = holdArgs.type;
467 var desc = holdArgs.recordDescriptors;
468 var rec = holdArgs.record;
469 var mrec = holdArgs.metarecord;
473 for( var i = 0; i < desc.length; i++ ) {
475 if( d.record() == holdArgs.record ) {
476 lang = d.item_lang();
477 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
478 sformats.push(holdArgs.myFormat);
484 for( var i = 0; i < desc.length; i++ ) {
486 if( d.item_lang() != lang ) continue;
487 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
490 formats = uniquify(formats);
494 avail_formats : formats,
495 sel_formats : sformats
501 function _t_f_2_format(type, form) {
502 if( form == 'd' ) return 'at-d';
503 return (type == 'a' || type == 't') ? 'at' :
504 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
507 function holdsSetSelectedFormats() {
509 var cn = $('holds_alt_formats_row').className;
510 if( cn && cn.match(/hide_me/) ) return;
512 var selector = $('hold_alt_form_selector');
513 var vals = getSelectedList(selector);
515 if(vals.length == 0) return;
519 if( contains(vals, 'at-d') ) {
520 if( contains(vals, 'at') )
525 if( contains(vals, 'at') )
529 for( var i = 0; i < vals.length; i++ ) {
531 if( !val.match(/at/) ) fstring = val + fstring;
534 if( holdArgs.language ) {
535 if( fstring.match(/-/) )
536 fstring = fstring + '-' + holdArgs.language;
538 fstring = fstring + '--' + holdArgs.language;
546 function holdsCheckPossibility(pickuplib, hold, recurse) {
549 titleid : holdArgs.record,
550 volume_id : holdArgs.volume,
551 copy_id : holdArgs.copy,
552 hold_type : holdArgs.type,
553 patronid : holdArgs.recipient.id(),
555 pickup_lib : pickuplib
559 /* if we're calling create again (recursing),
560 we know that the hold possibility check already succeeded */
561 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
564 _debug("hold possible args = "+js2JSON(args));
566 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
568 req.request.alertEvent = false;
569 req.request._hold = hold;
570 req.request._recurse = recurse;
571 req.callback(holdHandleCreateResponse);
577 function holdsBuildOrgSelector(node) {
579 if(!node) node = globalOrgTree;
581 var selector = $('holds_org_selector');
582 var index = selector.options.length;
584 var type = findOrgType(node.ou_type());
585 var indent = type.depth() - 1;
586 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
587 if(!type.can_have_users()) {
589 addCSSClass(opt, 'disabled_option');
592 for( var i in node.children() ) {
593 var child = node.children()[i];
594 if(child) holdsBuildOrgSelector(child);
598 function holdsBuildHoldFromWindow() {
600 var org = getSelectorVal($('holds_org_selector'));
601 var node = findOrgUnit(org);
602 var ntype = findOrgType(node.ou_type());
603 if(!ntype.can_have_users()) {
604 alertId('holds_pick_good_org');
608 var hold = new ahr();
609 if(holdArgs.editHold) {
610 hold = holdArgs.editHold;
611 holdArgs.editHold = null;
614 if( $('holds_enable_phone').checked ) {
615 var phone = $('holds_phone').value;
616 if( !phone || !phone.match(REGEX_PHONE) ) {
617 alert($('holds_bad_phone').innerHTML);
620 hold.phone_notify(phone);
623 hold.phone_notify("");
626 if( $('holds_enable_email').checked )
627 hold.email_notify(1);
629 hold.email_notify(0);
633 switch(holdArgs.type) {
635 target = holdArgs.metarecord; break;
637 target = holdArgs.record; break;
639 target = holdArgs.volume; break;
641 target = holdArgs.copy; break;
646 hold.pickup_lib(org);
647 //hold.request_lib(org);
648 hold.requestor(holdArgs.requestor.id());
649 hold.usr(holdArgs.recipient.id());
651 hold.hold_type(holdArgs.type);
653 //check for alternate hold formats
654 var fstring = holdsSetSelectedFormats();
657 hold.holdable_formats(fstring);
658 hold.target(holdArgs.metarecord);
663 function holdsPlaceHold(hold, recurse) {
665 swapCanvas($('check_holds_box'));
666 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
670 function holdHandleCreateResponse(r, recurse) {
673 var res = r.getResultObject();
674 if(!res || checkILSEvent(res) ) {
676 alert($('hold_not_allowed').innerHTML);
678 if( res.textcode == 'PATRON_BARRED' ) {
679 alertId('hold_failed_patron_barred');
681 alert($('hold_not_allowed').innerHTML);
684 swapCanvas($('holds_box'));
689 holdCreateHold(r._recurse, r._hold);
693 function holdCreateHold( recurse, hold ) {
694 var method = CREATE_HOLD;
695 if(recurse) method = CREATE_HOLD_OVERRIDE;
696 var req = new Request( method, holdArgs.requestor.session, hold );
697 req.request.alertEvent = false;
699 var res = req.result();
700 holdProcessResult(hold, res, recurse);
704 runEvt('common', 'holdUpdated');
708 function holdProcessResult( hold, res, recurse ) {
711 alert($('holds_success').innerHTML);
717 alert($('holds_failure').innerHTML);
721 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
722 if( fetchPermOrgs('HOLD_EXISTS.override')[0] ) {
723 if( confirm($('hold_dup_exists_override').innerHTML) ) {
724 return holdsPlaceHold(hold, true);
728 return alert($('hold_dup_exists').innerHTML);
732 alert($('holds_failure').innerHTML);
737 function holdsCancel(holdid, user) {
738 if(!user) user = G.user;
739 var req = new Request(CANCEL_HOLD, user.session, holdid);
742 runEvt('common', 'holdUpdated');
745 function holdsUpdate(hold, user) {
746 if(!user) user = G.user;
747 var req = new Request(UPDATE_HOLD, user.session, hold);
749 var x = req.result(); // cause an exception if there is one
750 runEvt('common', 'holdUpdated');