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 holdArgs.recipient = user;
35 * record, volume, copy (ids)
36 * request, recipient, editHold (objects)
38 function holdsDrawEditor(args) {
40 holdArgs = (args) ? args : holdArgs;
42 if(isXUL() && holdArgs.recipient == null
43 && holdArgs.editHold == null) {
48 if(!holdArgs.recipient) holdArgs.recipient = G.user;
49 if(!holdArgs.requestor) holdArgs.requestor = G.user;
51 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
52 detachAllEvt('common','locationChanged');
53 attachEvt('common','loggedIn', holdsDrawEditor)
58 if(holdArgs.editHold) /* flesh the args with the existing hold */
59 holdArgsFromHold(holdArgs.editHold, holdArgs);
63 if(holdArgs.editHold) {
64 hideMe($('holds_submit'));
65 unHideMe($('holds_update'));
66 var req = new Request(FETCH_HOLD_STATUS,
67 G.user.session, holdArgs.editHold.id());
69 holdArgs.status = req.result();
70 _holdsUpdateEditHold();
76 /* updates the edit window with the existing hold's data */
77 function _holdsUpdateEditHold() {
79 var hold = holdArgs.editHold;
80 var status = holdArgs.status;
82 var orgsel = $('holds_org_selector');
83 setSelector(orgsel, hold.pickup_lib());
85 if( hold.capture_time() || status > 2 )
86 orgsel.disabled = true;
88 orgsel.disabled = false;
91 $('holds_submit').onclick = holdsEditHold;
92 $('holds_update').onclick = holdsEditHold;
94 if(hold.phone_notify()) {
95 $('holds_enable_phone').checked = true;
96 $('holds_phone').value = hold.phone_notify();
99 $('holds_phone').disabled = true;
100 $('holds_enable_phone').checked = false;
103 if(hold.email_notify()) {
104 $('holds_enable_email').checked = true;
107 $('holds_enable_email').checked = false;
111 function holdsEditHold() {
112 var hold = holdsBuildHoldFromWindow();
116 if(holdArgs.onComplete)
117 holdArgs.onComplete(hold);
120 function holdArgsFromHold(hold, oargs) {
121 var args = (oargs) ? oargs : {};
122 args.type = hold.hold_type();
123 var target = hold.target();
127 args.metarecord = target;
130 args.record = target;
133 args.volume = target;
142 function holdFetchObjects(hold, doneCallback) {
144 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
146 var type = args.type;
150 if( args.copyObject ) {
152 args.copy = args.copyObject.id();
153 args.volume = args.copyObject.call_number();
154 _h_set_vol(args, doneCallback);
157 var creq = new Request(FETCH_COPY, args.copy);
161 var cp = r.getResultObject();
162 args.copyObject = cp;
163 args.volume = args.copyObject.call_number();
164 _h_set_vol(args, doneCallback);
171 _h_set_vol(args, doneCallback);
175 _h_set_rec(args, doneCallback);
177 _h_set_rec_descriptors(args, doneCallback);
185 function _h_set_vol(args, doneCallback) {
187 if( args.volumeObject ) {
188 args.volume = args.volumeObject.id();
189 args.record = args.volumeObject.record();
190 _h_set_rec(args, doneCallback);
194 var vreq = new Request(FETCH_VOLUME, args.volume);
197 var vol = r.getResultObject();
198 args.volumeObject = vol;
199 args.record = vol.record();
200 _h_set_rec(args, doneCallback);
207 function _h_set_rec(args, doneCallback) {
209 if(args.recordObject)
210 args.record = args.recordObject.doc_id();
212 args.recordObject = findRecord( args.record, 'T' );
214 if( args.type == 'T' || args.type == 'M' )
215 _h_set_rec_descriptors(args, doneCallback);
217 if(doneCallback) doneCallback(args);
221 function _h_set_rec_descriptors(args, doneCallback) {
223 /* grab the list of record desciptors attached to this records metarecord */
224 if( ! args.recordDescriptors ) {
225 var params = { record: args.record };
227 if( ! args.record ) {
228 if( args.metarecord )
229 params = { metarecord : args.metarecord };
231 params = { metarecord : args.metarecordObject.doc_id() };
234 var req = new Request(FETCH_MR_DESCRIPTORS, params );
237 var data = r.getResultObject();
238 args.recordDescriptors = data.descriptors;
239 args.metarecord = data.metarecord;
240 if( args.type == 'M' && ! args.metarecordObject)
241 args.metarecordObject = findRecord(args.metarecord, 'M');
243 if(doneCallback) doneCallback(args);
249 if(doneCallback) doneCallback(args);
258 function holdsDrawWindow() {
259 swapCanvas($('holds_box'));
260 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
261 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
262 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
263 holdFetchObjects(null, function(){__holdsDrawWindow();});
266 function __holdsDrawWindow() {
268 var rec = holdArgs.recordObject;
269 var vol = holdArgs.volumeObject;
270 var copy = holdArgs.copyObject;
271 var mr = holdArgs.metarecordObject;
273 rec = (rec) ? rec : mr;
275 if(!holdsOrgSelectorBuilt) {
276 holdsBuildOrgSelector(null,0);
277 holdsOrgSelectorBuilt = true;
281 var dsel = $('holds_depth_selector');
282 unHideMe($('holds_depth_selector_row'));
283 if(dsel.getElementsByTagName('option').length == 0) {
284 var types = globalOrgTypes;
285 var depth = findOrgDepth(G.user.ws_ou());
288 if(t.depth() > depth) return;
289 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
295 appendClear($('holds_recipient'), text(
296 holdArgs.recipient.family_name() + ', ' +
297 holdArgs.recipient.first_given_name()));
298 appendClear($('holds_title'), text(rec.title()));
299 appendClear($('holds_author'), text(rec.author()));
301 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
303 unHideMe($('holds_type_row'));
304 unHideMe($('holds_cn_row'));
305 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
307 if( holdArgs.type == 'V' ) {
308 unHideMe($('holds_is_cn'));
309 hideMe($('holds_is_copy'));
312 hideMe($('holds_is_cn'));
313 unHideMe($('holds_is_copy'));
314 unHideMe($('holds_copy_row'));
315 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
319 hideMe($('holds_type_row'));
320 hideMe($('holds_copy_row'));
321 hideMe($('holds_cn_row'));
324 removeChildren($('holds_format'));
326 var mods_formats = rec.types_of_resource();
329 if(holdArgs.recordDescriptors)
330 formats = holdArgs.recordDescriptors[0].item_type();
332 if( holdArgs.type == 'T' ) {
333 var desc = grep( holdArgs.recordDescriptors,
335 return (i.record() == holdArgs.record);
338 formats = desc[0].item_type();
341 if( holdArgs.type == 'M' ) {
342 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
343 mods_formats = data.mods_formats;
344 formats = data.formats;
348 for( var i in mods_formats ) {
349 var res = mods_formats[i];
350 var img = elem("img");
351 setResourcePic(img, res);
352 $('holds_format').appendChild(img);
354 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
356 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
357 $('holds_format').appendChild(elem('br'));
361 $('holds_phone').value = holdArgs.recipient.day_phone();
362 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
364 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
367 if( ! pref.match(/email/i) )
368 $('holds_enable_email').checked = false;
370 if( ! pref.match(/phone/i) ) {
371 $('holds_phone').disabled = true;
372 $('holds_enable_phone').checked = false;
376 appendClear($('holds_physical_desc'), text(rec.physical_description()));
378 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
380 holdsSetFormatSelector();
383 function holdsParseMRFormats(str) {
384 var data = str.split(/-/);
387 var mods_formats = [];
389 for( var i = 0; i < data[0].length; i++ ) {
390 formats.push( data[0].charAt(i) );
391 mods_formats.push( MARCFormatToMods( formats[i] ) );
394 formats = uniquify(formats);
395 mods_formats = uniquify(mods_formats);
399 mods_formats : mods_formats,
401 largeprint : data[1],
406 function holdsSetFormatSelector() {
407 var type = holdArgs.type;
408 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
410 var data = holdsGetFormats();
411 var avail_formats = data.avail_formats;
412 var sel_formats = data.sel_formats;
413 holdArgs.language = data.lang;
415 unHideMe($('holds_alt_formats_row_extras'));
416 var selector = $('hold_alt_form_selector');
418 for( var i = 0; i < avail_formats.length; i++ ) {
419 var form = avail_formats[i];
420 unHideMe(findSelectorOptByValue(selector, form));
425 function holdsGetFormats() {
429 var sformats = []; /* selected formats */
431 var type = holdArgs.type;
432 var desc = holdArgs.recordDescriptors;
433 var rec = holdArgs.record;
434 var mrec = holdArgs.metarecord;
438 for( var i = 0; i < desc.length; i++ ) {
440 if( d.record() == holdArgs.record ) {
441 lang = d.item_lang();
442 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
443 sformats.push(holdArgs.myFormat);
449 for( var i = 0; i < desc.length; i++ ) {
451 if( d.item_lang() != lang ) continue;
452 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
455 formats = uniquify(formats);
459 avail_formats : formats,
460 sel_formats : sformats,
466 function _t_f_2_format(type, form) {
467 if( form == 'd' ) return 'at-d';
468 return (type == 'a' || type == 't') ? 'at' :
469 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
472 function holdsSetSelectedFormats() {
474 var cn = $('holds_alt_formats_row').className;
475 if( cn && cn.match(/hide_me/) ) return;
477 var selector = $('hold_alt_form_selector');
478 var vals = getSelectedList(selector);
480 if(vals.length == 0) return;
483 if( holdArgs.type == 'T' )
484 vals.push(holdArgs.myFormat);
489 if( contains(vals, 'at-d') ) {
490 if( contains(vals, 'at') )
495 if( contains(vals, 'at') )
499 for( var i = 0; i < vals.length; i++ ) {
501 if( !val.match(/at/) ) fstring = val + fstring;
504 if( holdArgs.language ) {
505 if( fstring.match(/-/) )
506 fstring = fstring + '-' + holdArgs.language;
508 fstring = fstring + '--' + holdArgs.language;
516 function holdsCheckPossibility(pickuplib) {
517 var rec = holdArgs.record;
518 var type = holdArgs.type;
519 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session,
520 { titleid : rec, patronid : G.user.id(), depth : 0, pickup_lib : pickuplib } );
526 function holdsBuildOrgSelector(node) {
528 if(!node) node = globalOrgTree;
530 var selector = $('holds_org_selector');
531 var index = selector.options.length;
533 var type = findOrgType(node.ou_type());
534 var indent = type.depth() - 1;
535 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
536 if(!type.can_have_vols()) opt.disabled = true;
538 if( node.id() == holdArgs.recipient.home_ou() ) {
539 selector.selectedIndex = index;
540 selector.options[index].selected = true;
543 for( var i in node.children() ) {
544 var child = node.children()[i];
545 if(child) holdsBuildOrgSelector(child);
549 function holdsBuildHoldFromWindow() {
551 var org = $('holds_org_selector').options[
552 $('holds_org_selector').selectedIndex].value;
554 var hold = new ahr();
555 if(holdArgs.editHold) {
556 hold = holdArgs.editHold;
557 holdArgs.editHold = null;
560 if( $('holds_enable_phone').checked ) {
561 var phone = $('holds_phone').value;
562 if( !phone || !phone.match(REGEX_PHONE) ) {
563 alert($('holds_bad_phone').innerHTML);
566 hold.phone_notify(phone);
569 hold.phone_notify("");
572 if( $('holds_enable_email').checked )
573 hold.email_notify(1);
575 hold.email_notify(0);
579 switch(holdArgs.type) {
581 target = holdArgs.metarecord; break;
583 target = holdArgs.record; break;
585 target = holdArgs.volume; break;
587 target = holdArgs.copy; break;
592 hold.pickup_lib(org);
593 hold.request_lib(org);
594 hold.requestor(holdArgs.requestor.id());
595 hold.usr(holdArgs.recipient.id());
597 hold.hold_type(holdArgs.type);
599 /* check for alternate hold formats */
600 var fstring = holdsSetSelectedFormats();
603 hold.holdable_formats(fstring);
604 hold.target(holdArgs.metarecord);
607 //alert(fstring); return;
610 hold.selection_depth(getSelectorVal($('holds_depth_selector')));
615 function holdsPlaceHold(hold) {
619 swapCanvas($('check_holds_box'));
621 if( holdArgs.type == 'M' || holdArgs.type == 'T' ) {
622 if( ! holdsCheckPossibility(hold.pickup_lib() ) ) {
623 alert($('hold_not_allowed').innerHTML);
624 swapCanvas($('holds_box'));
629 var req = new Request( CREATE_HOLD, holdArgs.requestor.session, hold );
631 var res = req.result();
633 if( res == '1' ) alert($('holds_success').innerHTML);
634 else alert($('holds_failure').innerHTML);
639 runEvt('common', 'holdUpdated');
642 function holdsCancel(holdid, user) {
643 if(!user) user = G.user;
644 var req = new Request(CANCEL_HOLD, user.session, holdid);
647 runEvt('common', 'holdUpdated');
650 function holdsUpdate(hold, user) {
651 if(!user) user = G.user;
652 var req = new Request(UPDATE_HOLD, user.session, hold);
654 var x = req.result(); /* cause an exception if there is one */
655 runEvt('common', 'holdUpdated');