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 );
29 alert('fixme: invalid user barcode: ['+barcode+']');
32 holdArgs.recipient = user;
39 * record, volume, copy (ids)
40 * request, recipient, editHold (objects)
43 function holdsDrawEditor(args) {
45 holdArgs = (args) ? args : holdArgs;
47 if(isXUL() && holdArgs.recipient == null
48 && holdArgs.editHold == null) {
53 if(!holdArgs.recipient) holdArgs.recipient = G.user;
54 if(!holdArgs.requestor) holdArgs.requestor = G.user;
56 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
57 detachAllEvt('common','locationChanged');
58 attachEvt('common','loggedIn', holdsDrawEditor)
63 if(holdArgs.editHold) // flesh the args with the existing hold
64 holdArgsFromHold(holdArgs.editHold, holdArgs);
70 // updates the edit window with the existing hold's data
71 function _holdsUpdateEditHold() {
73 var hold = holdArgs.editHold;
74 var status = holdArgs.status;
76 var orgsel = $('holds_org_selector');
77 setSelector(orgsel, hold.pickup_lib());
79 if( hold.capture_time() || status > 2 )
80 orgsel.disabled = true;
82 orgsel.disabled = false;
85 $('holds_submit').onclick = holdsEditHold;
86 $('holds_update').onclick = holdsEditHold;
88 if(hold.phone_notify()) {
89 $('holds_enable_phone').checked = true;
90 $('holds_phone').value = hold.phone_notify();
93 $('holds_phone').disabled = true;
94 $('holds_enable_phone').checked = false;
97 if(isTrue(hold.email_notify())) {
98 $('holds_enable_email').checked = true;
101 $('holds_enable_email').checked = false;
105 function holdsEditHold() {
106 var hold = holdsBuildHoldFromWindow();
110 if(holdArgs.onComplete)
111 holdArgs.onComplete(hold);
114 function holdArgsFromHold(hold, oargs) {
115 var args = (oargs) ? oargs : {};
116 args.type = hold.hold_type();
117 var target = hold.target();
121 args.metarecord = target;
124 args.record = target;
127 args.volume = target;
136 function holdFetchObjects(hold, doneCallback) {
138 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
140 var type = args.type;
144 if( args.copyObject ) {
146 args.copy = args.copyObject.id();
147 args.volume = args.copyObject.call_number();
148 _h_set_vol(args, doneCallback);
151 var creq = new Request(FETCH_COPY, args.copy);
155 var cp = r.getResultObject();
156 args.copyObject = cp;
157 args.volume = args.copyObject.call_number();
158 _h_set_vol(args, doneCallback);
165 _h_set_vol(args, doneCallback);
169 _h_set_rec(args, doneCallback);
171 _h_set_rec_descriptors(args, doneCallback);
179 function _h_set_vol(args, doneCallback) {
181 if( args.volumeObject ) {
182 args.volume = args.volumeObject.id();
183 args.record = args.volumeObject.record();
184 _h_set_rec(args, doneCallback);
188 var vreq = new Request(FETCH_VOLUME, args.volume);
191 var vol = r.getResultObject();
192 args.volumeObject = vol;
193 args.record = vol.record();
194 _h_set_rec(args, doneCallback);
201 function _h_set_rec(args, doneCallback) {
203 if(args.recordObject)
204 args.record = args.recordObject.doc_id();
206 args.recordObject = findRecord( args.record, 'T' );
208 if( args.type == 'T' || args.type == 'M' )
209 _h_set_rec_descriptors(args, doneCallback);
211 if(doneCallback) doneCallback(args);
215 function _h_set_rec_descriptors(args, doneCallback) {
217 // grab the list of record desciptors attached to this records metarecord
218 if( ! args.recordDescriptors ) {
219 var params = { record: args.record };
221 if( ! args.record ) {
222 if( args.metarecord )
223 params = { metarecord : args.metarecord };
225 params = { metarecord : args.metarecordObject.doc_id() };
228 var req = new Request(FETCH_MR_DESCRIPTORS, params );
231 var data = r.getResultObject();
232 args.recordDescriptors = data.descriptors;
233 args.metarecord = data.metarecord;
234 if( args.type == 'M' && ! args.metarecordObject)
235 args.metarecordObject = findRecord(args.metarecord, 'M');
237 if(doneCallback) doneCallback(args);
243 if(doneCallback) doneCallback(args);
251 function holdsDrawWindow() {
252 swapCanvas($('holds_box'));
253 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
254 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
255 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
256 holdFetchObjects(null,
260 if(holdArgs.editHold) {
261 hideMe($('holds_submit'));
262 unHideMe($('holds_update'));
263 var req = new Request(FETCH_HOLD_STATUS,
264 G.user.session, holdArgs.editHold.id());
266 holdArgs.status = req.result();
267 _holdsUpdateEditHold();
273 function __holdsDrawWindow() {
275 var rec = holdArgs.recordObject;
276 var vol = holdArgs.volumeObject;
277 var copy = holdArgs.copyObject;
278 var mr = holdArgs.metarecordObject;
280 rec = (rec) ? rec : mr;
282 if(!holdsOrgSelectorBuilt) {
283 holdsBuildOrgSelector(null,0);
284 holdsOrgSelectorBuilt = true;
285 var selector = $('holds_org_selector');
288 var o_loc = findOrgUnit(getOrigLocation());
289 var t = findOrgType(o_loc.ou_type());
290 if( t.can_have_users() )
291 setSelector(selector, o_loc.id());
295 setSelector(selector, holdArgs.recipient.home_ou());
301 var dsel = $('holds_depth_selector');
302 unHideMe($('holds_depth_selector_row'));
303 if(dsel.getElementsByTagName('option').length == 0) {
304 var types = globalOrgTypes;
305 var depth = findOrgDepth(G.user.ws_ou());
308 if(t.depth() > depth) return;
309 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
316 appendClear($('holds_recipient'), text(
317 holdArgs.recipient.family_name() + ', ' +
318 holdArgs.recipient.first_given_name()));
319 appendClear($('holds_title'), text(rec.title()));
320 appendClear($('holds_author'), text(rec.author()));
322 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
324 unHideMe($('holds_type_row'));
325 unHideMe($('holds_cn_row'));
326 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
328 if( holdArgs.type == 'V' ) {
329 unHideMe($('holds_is_cn'));
330 hideMe($('holds_is_copy'));
333 hideMe($('holds_is_cn'));
334 unHideMe($('holds_is_copy'));
335 unHideMe($('holds_copy_row'));
336 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
340 hideMe($('holds_type_row'));
341 hideMe($('holds_copy_row'));
342 hideMe($('holds_cn_row'));
345 removeChildren($('holds_format'));
347 var mods_formats = rec.types_of_resource();
350 if(holdArgs.recordDescriptors)
351 formats = holdArgs.recordDescriptors[0].item_type();
353 if( holdArgs.type == 'T' ) {
354 var desc = grep( holdArgs.recordDescriptors,
356 return (i.record() == holdArgs.record);
359 formats = desc[0].item_type();
362 if( holdArgs.type == 'M' ) {
363 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
364 mods_formats = data.mods_formats;
365 formats = data.formats;
369 for( var i in mods_formats ) {
370 var res = mods_formats[i];
371 var img = elem("img");
372 setResourcePic(img, res);
373 $('holds_format').appendChild(img);
375 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
377 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
378 $('holds_format').appendChild(elem('br'));
382 $('holds_phone').value = holdArgs.recipient.day_phone();
383 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
385 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
388 if( ! pref.match(/email/i) )
389 $('holds_enable_email').checked = false;
391 if( ! pref.match(/phone/i) ) {
392 $('holds_phone').disabled = true;
393 $('holds_enable_phone').checked = false;
397 if(!$('holds_phone').value)
398 $('holds_enable_phone').checked = false;
400 appendClear($('holds_physical_desc'), text(rec.physical_description()));
402 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
404 holdsSetFormatSelector();
407 function holdsParseMRFormats(str) {
408 var data = str.split(/-/);
411 var mods_formats = [];
413 for( var i = 0; i < data[0].length; i++ ) {
414 formats.push( data[0].charAt(i) );
415 mods_formats.push( MARCFormatToMods( formats[i] ) );
418 formats = uniquify(formats);
419 mods_formats = uniquify(mods_formats);
423 mods_formats : mods_formats,
430 function holdsSetFormatSelector() {
431 var type = holdArgs.type;
432 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
434 var data = holdsGetFormats();
435 var avail_formats = data.avail_formats;
436 var sel_formats = data.sel_formats;
437 holdArgs.language = data.lang;
439 unHideMe($('holds_alt_formats_row_extras'));
440 var selector = $('hold_alt_form_selector');
442 for( var i = 0; i < avail_formats.length; i++ ) {
443 var form = avail_formats[i];
444 unHideMe(findSelectorOptByValue(selector, form));
449 function holdsGetFormats() {
453 var sformats = []; // selected formats
455 var type = holdArgs.type;
456 var desc = holdArgs.recordDescriptors;
457 var rec = holdArgs.record;
458 var mrec = holdArgs.metarecord;
462 for( var i = 0; i < desc.length; i++ ) {
464 if( d.record() == holdArgs.record ) {
465 lang = d.item_lang();
466 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
467 sformats.push(holdArgs.myFormat);
473 for( var i = 0; i < desc.length; i++ ) {
475 if( d.item_lang() != lang ) continue;
476 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
479 formats = uniquify(formats);
483 avail_formats : formats,
484 sel_formats : sformats
490 function _t_f_2_format(type, form) {
491 if( form == 'd' ) return 'at-d';
492 return (type == 'a' || type == 't') ? 'at' :
493 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
496 function holdsSetSelectedFormats() {
498 var cn = $('holds_alt_formats_row').className;
499 if( cn && cn.match(/hide_me/) ) return;
501 var selector = $('hold_alt_form_selector');
502 var vals = getSelectedList(selector);
504 if(vals.length == 0) return;
508 if( contains(vals, 'at-d') ) {
509 if( contains(vals, 'at') )
514 if( contains(vals, 'at') )
518 for( var i = 0; i < vals.length; i++ ) {
520 if( !val.match(/at/) ) fstring = val + fstring;
523 if( holdArgs.language ) {
524 if( fstring.match(/-/) )
525 fstring = fstring + '-' + holdArgs.language;
527 fstring = fstring + '--' + holdArgs.language;
535 function holdsCheckPossibility(pickuplib) {
536 var rec = holdArgs.record;
537 var type = holdArgs.type;
538 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session,
539 { titleid : rec, patronid : G.user.id(), depth : 0, pickup_lib : pickuplib } );
540 req.request.alertEvent = false;
546 function holdsBuildOrgSelector(node) {
548 if(!node) node = globalOrgTree;
550 var selector = $('holds_org_selector');
551 var index = selector.options.length;
553 var type = findOrgType(node.ou_type());
554 var indent = type.depth() - 1;
555 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
556 if(!type.can_have_users()) {
558 addCSSClass(opt, 'disabled_option');
561 for( var i in node.children() ) {
562 var child = node.children()[i];
563 if(child) holdsBuildOrgSelector(child);
567 function holdsBuildHoldFromWindow() {
569 var org = getSelectorVal($('holds_org_selector'));
570 var node = findOrgUnit(org);
571 var ntype = findOrgType(node.ou_type());
572 if(!ntype.can_have_users()) {
573 alertId('holds_pick_good_org');
577 var hold = new ahr();
578 if(holdArgs.editHold) {
579 hold = holdArgs.editHold;
580 holdArgs.editHold = null;
583 if( $('holds_enable_phone').checked ) {
584 var phone = $('holds_phone').value;
585 if( !phone || !phone.match(REGEX_PHONE) ) {
586 alert($('holds_bad_phone').innerHTML);
589 hold.phone_notify(phone);
592 hold.phone_notify("");
595 if( $('holds_enable_email').checked )
596 hold.email_notify(1);
598 hold.email_notify(0);
602 switch(holdArgs.type) {
604 target = holdArgs.metarecord; break;
606 target = holdArgs.record; break;
608 target = holdArgs.volume; break;
610 target = holdArgs.copy; break;
615 hold.pickup_lib(org);
616 hold.request_lib(org);
617 hold.requestor(holdArgs.requestor.id());
618 hold.usr(holdArgs.recipient.id());
620 hold.hold_type(holdArgs.type);
622 //check for alternate hold formats
623 var fstring = holdsSetSelectedFormats();
626 hold.holdable_formats(fstring);
627 hold.target(holdArgs.metarecord);
630 //alert(fstring); return;
634 hold.selection_depth(getSelectorVal($('holds_depth_selector')));
640 function holdsPlaceHold(hold, recurse) {
644 swapCanvas($('check_holds_box'));
646 if( holdArgs.type == 'M' || holdArgs.type == 'T' ) {
647 var res = holdsCheckPossibility(hold.pickup_lib());
648 if(!res || checkILSEvent(res) ) {
650 alert($('hold_not_allowed').innerHTML);
652 if( res.textcode == 'PATRON_BARRED' ) {
653 alertId('hold_failed_patron_barred');
655 alert($('hold_not_allowed').innerHTML);
658 swapCanvas($('holds_box'));
663 var method = CREATE_HOLD;
664 if(recurse) method = CREATE_HOLD_OVERRIDE;
666 var req = new Request( method, holdArgs.requestor.session, hold );
667 req.request.alertEvent = false;
669 var res = req.result();
670 holdProcessResult(hold, res, recurse);
675 runEvt('common', 'holdUpdated');
678 function holdProcessResult( hold, res, recurse ) {
681 alert($('holds_success').innerHTML);
686 alert($('holds_failure').innerHTML);
690 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
691 if( fetchPermOrgs('HOLD_EXISTS')[0] ) {
692 if( confirm($('hold_dup_exists_override').innerHTML) ) {
693 return holdsPlaceHold(hold, true);
697 return alert($('hold_dup_exists').innerHTML);
701 alert($('holds_failure').innerHTML);
706 function holdsCancel(holdid, user) {
707 if(!user) user = G.user;
708 var req = new Request(CANCEL_HOLD, user.session, holdid);
711 runEvt('common', 'holdUpdated');
714 function holdsUpdate(hold, user) {
715 if(!user) user = G.user;
716 var req = new Request(UPDATE_HOLD, user.session, hold);
718 var x = req.result(); // cause an exception if there is one
719 runEvt('common', 'holdUpdated');