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();
75 /* updates the edit window with the existing hold's data */
76 function _holdsUpdateEditHold() {
78 var hold = holdArgs.editHold;
79 var status = holdArgs.status;
81 var orgsel = $('holds_org_selector');
82 setSelector(orgsel, hold.pickup_lib());
84 if( hold.capture_time() || status > 2 )
85 orgsel.disabled = true;
87 orgsel.disabled = false;
90 $('holds_submit').onclick = holdsEditHold;
91 $('holds_update').onclick = holdsEditHold;
93 if(hold.phone_notify()) {
94 $('holds_enable_phone').checked = true;
95 $('holds_phone').value = hold.phone_notify();
98 $('holds_phone').disabled = true;
99 $('holds_enable_phone').checked = false;
102 if(hold.email_notify()) {
103 $('holds_enable_email').checked = true;
106 $('holds_enable_email').checked = false;
110 function holdsEditHold() {
111 var hold = holdsBuildHoldFromWindow();
115 if(holdArgs.onComplete)
116 holdArgs.onComplete(hold);
119 function holdArgsFromHold(hold, oargs) {
120 var args = (oargs) ? oargs : {};
121 args.type = hold.hold_type();
122 var target = hold.target();
126 args.metarecord = target;
129 args.record = target;
132 args.volume = target;
141 function holdFetchObjects(hold, doneCallback) {
143 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
145 var type = args.type;
149 if( args.copyObject ) {
151 args.copy = args.copyObject.id();
152 args.volume = args.copyObject.call_number();
153 _h_set_vol(args, doneCallback);
156 var creq = new Request(FETCH_COPY, args.copy);
160 var cp = r.getResultObject();
161 args.copyObject = cp;
162 args.volume = args.copyObject.call_number();
163 _h_set_vol(args, doneCallback);
170 _h_set_vol(args, doneCallback);
174 _h_set_rec(args, doneCallback);
182 function _h_set_vol(args, doneCallback) {
184 if( args.volumeObject ) {
185 args.volume = args.volumeObject.id();
186 args.record = args.volumeObject.record();
187 _h_set_rec(args, doneCallback);
191 var vreq = new Request(FETCH_VOLUME, args.volume);
194 var vol = r.getResultObject();
195 args.volumeObject = vol;
196 args.record = vol.record();
197 _h_set_rec(args, doneCallback);
204 function _h_set_rec(args, doneCallback) {
205 if(args.recordObject) {
206 args.record = args.recordObject.doc_id();
208 args.recordObject = findRecord( args.record, 'T' );
211 if( args.type == 'T' || args.type == 'M' ) {
212 _h_set_rec_descriptors(args, doneCallback);
214 if(doneCallback) doneCallback(args);
218 function _h_set_rec_descriptors(args, doneCallback) {
220 /* grab the list of record desciptors attached to this records metarecord */
221 if( ! args.recordDescriptors ) {
222 var params = { record: args.record };
224 if( ! args.record ) {
225 if( args.metarecord )
226 params = { metarecord : args.metarecord };
228 params = { metarecord : args.metarecordObject.id() };
231 var req = new Request(FETCH_MR_DESCRIPTORS, params );
234 args.recordDescriptors = r.getResultObject();
235 if(doneCallback) doneCallback(args);
241 if(doneCallback) doneCallback(args);
247 function holdsDrawWindow() {
248 swapCanvas($('holds_box'));
249 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
250 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
251 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
252 holdFetchObjects(null, function(){__holdsDrawWindow();});
255 function __holdsDrawWindow() {
257 var rec = holdArgs.recordObject;
258 var vol = holdArgs.volumeObject;
259 var copy = holdArgs.copyObject;
261 if(!holdsOrgSelectorBuilt) {
262 holdsBuildOrgSelector(null,0);
263 holdsOrgSelectorBuilt = true;
267 var dsel = $('holds_depth_selector');
268 unHideMe($('holds_depth_selector_row'));
269 if(dsel.getElementsByTagName('option').length == 0) {
270 var types = globalOrgTypes;
271 var depth = findOrgDepth(G.user.ws_ou());
274 if(t.depth() > depth) return;
275 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
281 appendClear($('holds_recipient'), text(
282 holdArgs.recipient.family_name() + ', ' +
283 holdArgs.recipient.first_given_name()));
284 appendClear($('holds_title'), text(rec.title()));
285 appendClear($('holds_author'), text(rec.author()));
287 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
289 unHideMe($('holds_type_row'));
290 unHideMe($('holds_cn_row'));
291 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
293 if( holdArgs.type == 'V' ) {
294 unHideMe($('holds_is_cn'));
295 hideMe($('holds_is_copy'));
298 hideMe($('holds_is_cn'));
299 unHideMe($('holds_is_copy'));
300 unHideMe($('holds_copy_row'));
301 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
305 hideMe($('holds_type_row'));
306 hideMe($('holds_copy_row'));
307 hideMe($('holds_cn_row'));
310 removeChildren($('holds_format'));
311 for( var i in rec.types_of_resource() ) {
312 var res = rec.types_of_resource()[i];
313 var img = elem("img");
314 setResourcePic(img, res);
315 $('holds_format').appendChild(text(' '+res+' '));
316 $('holds_format').appendChild(img);
317 $('holds_format').appendChild(text(' '));
321 $('holds_phone').value = holdArgs.recipient.day_phone();
322 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
324 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
327 if( ! pref.match(/email/i) )
328 $('holds_enable_email').checked = false;
330 if( ! pref.match(/phone/i) ) {
331 $('holds_phone').disabled = true;
332 $('holds_enable_phone').checked = false;
336 appendClear($('holds_physical_desc'), text(rec.physical_description()));
338 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
340 holdsSetFormatSelector();
343 function holdsSetFormatSelector() {
344 var type = holdArgs.type;
345 if( type == 'C' || type == 'V' ) return;
347 var data = holdGetTypesAndForms();
348 var item_lang = data.item_lang;
349 var avail_types = data.avail_types;
350 var avail_forms = data.avail_forms;
351 var selected_forms = data.selected_forms;
352 var selected_types = data.selected_types;
355 if( avail_types.length > 1 ) {
357 unHideMe($('holds_alt_formats_row'));
359 var selector = $('hold_alt_form_selector');
361 if( avail_forms.length > 0 )
362 unHideMe(findSelectorOptByValue(selector, 'at-d'));
364 if( selected_forms.length > 0 )
365 setSelector(selector, 'at-d');
367 for( var i = 0; i < avail_types.length; i++ ) {
368 var t = avail_types[i];
369 if( t == 'a' || t == 't' ) t = 'at'
370 unHideMe(findSelectorOptByValue(selector, t));
373 for( var i = 0; i < selected_types.length; i++ ) {
374 var t = selected_types[i];
375 if( t == 'a' || t == 't' ) t = 'at'
376 setSelector(selector, t);
382 function holdGetTypesAndForms() {
387 var selected_forms = [];
388 var selected_types = [];
390 var type = holdArgs.type;
391 var desc = holdArgs.recordDescriptors;
392 var rec = holdArgs.record;
393 var mrec = holdArgs.metarecord;
397 /* find our language */
398 for( var i = 0; i < desc.length; i++ ) {
400 if( d.record() == holdArgs.record ) {
401 item_lang = d.item_lang();
402 selected_forms.push(d.item_form());
403 selected_types.push(d.item_type());
409 for( var i = 0; i < desc.length; i++ ) {
411 if( d.item_lang() != item_lang ) continue;
412 item_types.push(d.item_type());
413 item_forms.push(d.item_form());
416 item_types = uniquify(item_types);
417 item_forms = uniquify(item_forms);
420 avail_types : item_types,
421 avail_forms : item_forms,
422 item_lang : item_lang,
423 selected_forms : selected_forms,
424 selected_types : selected_types,
429 function holdsCheckPossibility(pickuplib) {
430 var rec = holdArgs.record;
431 var type = holdArgs.type;
432 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session,
433 { titleid : rec, patronid : G.user.id(), depth : 0, pickup_lib : pickuplib } );
439 function holdsBuildOrgSelector(node) {
441 if(!node) node = globalOrgTree;
443 var selector = $('holds_org_selector');
444 var index = selector.options.length;
446 var type = findOrgType(node.ou_type());
447 var indent = type.depth() - 1;
448 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
449 if(!type.can_have_vols()) opt.disabled = true;
451 if( node.id() == holdArgs.recipient.home_ou() ) {
452 selector.selectedIndex = index;
453 selector.options[index].selected = true;
456 for( var i in node.children() ) {
457 var child = node.children()[i];
458 if(child) holdsBuildOrgSelector(child);
462 function holdsBuildHoldFromWindow() {
464 var org = $('holds_org_selector').options[
465 $('holds_org_selector').selectedIndex].value;
467 var hold = new ahr();
468 if(holdArgs.editHold) {
469 hold = holdArgs.editHold;
470 holdArgs.editHold = null;
473 if( $('holds_enable_phone').checked ) {
474 var phone = $('holds_phone').value;
475 if( !phone || !phone.match(REGEX_PHONE) ) {
476 alert($('holds_bad_phone').innerHTML);
479 hold.phone_notify(phone);
482 hold.phone_notify("");
485 if( $('holds_enable_email').checked )
486 hold.email_notify(1);
488 hold.email_notify(0);
492 switch(holdArgs.type) {
494 target = holdArgs.metarecord;
497 target = holdArgs.record;
500 target = holdArgs.volume;
503 target = holdArgs.copy;
508 hold.pickup_lib(org);
509 hold.request_lib(org);
510 hold.requestor(holdArgs.requestor.id());
511 hold.usr(holdArgs.recipient.id());
512 hold.hold_type(holdArgs.type);
516 hold.selection_depth(getSelectorVal($('holds_depth_selector')));
520 function holdsPlaceHold(hold) {
524 swapCanvas($('check_holds_box'));
526 if( holdArgs.type == 'M' || holdArgs.type == 'T' ) {
527 if( ! holdsCheckPossibility(hold.pickup_lib() ) ) {
528 alert($('hold_not_allowed').innerHTML);
529 swapCanvas($('holds_box'));
534 var req = new Request( CREATE_HOLD, holdArgs.requestor.session, hold );
536 var res = req.result();
538 if( res == '1' ) alert($('holds_success').innerHTML);
539 else alert($('holds_failure').innerHTML);
544 runEvt('common', 'holdUpdated');
547 function holdsCancel(holdid, user) {
548 if(!user) user = G.user;
549 var req = new Request(CANCEL_HOLD, user.session, holdid);
552 runEvt('common', 'holdUpdated');
555 function holdsUpdate(hold, user) {
556 if(!user) user = G.user;
557 var req = new Request(UPDATE_HOLD, user.session, hold);
559 var x = req.result(); /* cause an exception if there is one */
560 runEvt('common', 'holdUpdated');