1 var holdsOrgSelectorBuilt = false;
\r
5 note: metarecord holds have a holdable_formats field that contains
\r
6 item_type(s)-item_forms(s)-language
\r
7 item_form and language are optional - if language exist and no
\r
8 item_form is specified, use item_type(s)--language
\r
12 var noEmailMessageXUL;
\r
14 function hideResultsPage(bool) {
\r
16 unHideMe($('result_header'));
\r
17 unHideMe($('tehSideBar'));
\r
18 //unHideMe($('facetSidebarContainer'));
\r
19 unHideMe($('sidebar_div'));
\r
20 unHideMe($('statusbar'));
\r
21 unHideMe($('tips'));
\r
22 unHideMe($('result_table_div'));
\r
23 if($('rresults_page')) $('rresults_page').style.width="500px";
\r
25 hideMe($('result_header'));
\r
26 hideMe($('tehSideBar'));
\r
27 hideMe($('facetSidebarContainer'));
\r
28 hideMe($('sidebar_div'));
\r
29 hideMe($('statusbar'));
\r
31 hideMe($('result_table_div'));
\r
32 hideMe($('anonListTable'));
\r
33 if($('rresults_page')) $('rresults_page').style.width="690px";
\r
37 function holdsHandleStaff() {
\r
39 // if we know the recipient's barcode, use it
\r
40 if(xulG.patron_barcode) return _holdsHandleStaff();
\r
42 swapCanvas($('xulholds_box'));
\r
43 $('xul_recipient_barcode').focus();
\r
44 $('xul_recipient_barcode').onkeypress = function(evt)
\r
45 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
\r
46 $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
\r
47 $('xul_recipient_me').onclick = _holdsHandleStaffMe;
\r
49 $('xul_recipient_barcode').onkeyup = function(evt) {
\r
50 if($('xul_recipient_barcode').value == '')
\r
51 $('xul_recipient_me').disabled = false;
\r
53 $('xul_recipient_me').disabled = true;
\r
59 $('holds_frozen_thaw_input').onchange = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
\r
60 $('holds_frozen_thaw_input').onkeyup = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
\r
64 function _holdsHandleStaffMe() {
\r
65 holdArgs.recipient = G.user;
\r
69 function _holdsHandleStaff() {
\r
70 var barcode = xulG.patron_barcode || $('xul_recipient_barcode').value;
\r
71 var user = grabUserByBarcode( G.user.session, barcode );
\r
74 if(evt = checkILSEvent(user)) {
\r
75 alertILSEvent(user);
\r
79 if(!barcode || !user) {
\r
80 alertId('holds_invalid_recipient', barcode);
\r
84 grabUserPrefs(user);
\r
86 holdArgs.recipient = user;
\r
93 * record, volume, copy (ids)
\r
94 * request, recipient, editHold (objects)
\r
97 function holdsDrawEditor(args) {
\r
98 holdArgs = (args) ? args : holdArgs;
\r
100 if(!noEmailMessage) noEmailMessage = $('holds_email').removeChild($('holds.no_email'));
\r
101 if(!noEmailMessageXUL) noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul'));
\r
103 if(isXUL() && holdArgs.recipient == null && holdArgs.editHold == null) {
\r
104 holdsHandleStaff();
\r
108 if(!holdArgs.recipient) holdArgs.recipient = G.user;
\r
109 if(!holdArgs.requestor) holdArgs.requestor = G.user;
\r
111 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
\r
113 alert("Please login first before placing a hold");
\r
114 setCacheValue('returnURL',{href:window.location.href, record:holdArgs.record, type:holdArgs.type});
\r
115 goTo(buildOPACLink({page:MYOPAC}, false, true));
\r
118 detachAllEvt('common','locationChanged');
\r
119 attachEvt('common','loggedIn', holdsDrawEditor);
\r
123 // flesh the args with the existing hold
\r
124 if(holdArgs.editHold) holdArgsFromHold(holdArgs.editHold, holdArgs);
\r
126 hideResultsPage(true);
\r
131 // updates the edit window with the existing hold's data
\r
132 function _holdsUpdateEditHold() {
\r
134 var hold = holdArgs.editHold;
\r
135 var qstats = holdArgs.status;
\r
137 var orgsel = $('holds_org_selector');
\r
138 var frozenbox = $('holds_frozen_chkbox');
\r
140 setSelector(orgsel, hold.pickup_lib());
\r
142 if( hold.capture_time() || qstats.status > 2 ) {
\r
143 frozenbox.disabled = true;
\r
144 $('holds_frozen_thaw_input').disabled = true;
\r
145 if(qstats.status == 3) {
\r
146 // no pickup lib changes while in-transit
\r
147 orgsel.disabled = true;
\r
149 var orgs = fetchPermOrgs('UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF');
\r
151 orgsel.disabled = true;
\r
154 orgsel.disabled = false;
\r
155 frozenbox.disabled = false;
\r
159 $('holds_submit').onclick = holdsEditHold;
\r
160 $('holds_update').onclick = holdsEditHold;
\r
162 if(hold.phone_notify()) {
\r
163 $('holds_enable_phone').checked = true;
\r
164 $('holds_phone').value = hold.phone_notify();
\r
167 $('holds_phone').disabled = true;
\r
168 $('holds_enable_phone').checked = false;
\r
171 if(isTrue(hold.email_notify())) {
\r
172 $('holds_enable_email').checked = true;
\r
175 $('holds_enable_email').checked = false;
\r
178 //$('holds_expire_time').setValue(dojo.date.stamp.fromISOString(hold.expire_time()));
\r
180 /* populate the hold freezing info */
\r
181 if(!frozenbox.disabled && isTrue(hold.frozen())) {
\r
182 frozenbox.checked = true;
\r
183 unHideMe($('hold_frozen_thaw_row'));
\r
184 if(hold.thaw_date()) {
\r
185 $('holds_frozen_thaw_input').value=dojo.date.stamp.fromISOString(hold.thaw_date());
\r
187 $('holds_frozen_thaw_input').value='';
\r
190 frozenbox.checked = false;
\r
191 $('holds_frozen_thaw_input').value='';
\r
192 hideMe($('hold_frozen_thaw_row'));
\r
196 function holdsEditHold() {
\r
197 var hold = holdsBuildHoldFromWindow();
\r
201 if(holdArgs.onComplete)
\r
202 holdArgs.onComplete(hold);
\r
205 function holdArgsFromHold(hold, oargs) {
\r
206 var args = (oargs) ? oargs : {};
\r
207 args.type = hold.hold_type();
\r
208 var target = hold.target();
\r
210 switch(args.type) {
\r
212 args.metarecord = target;
\r
215 args.record = target;
\r
218 args.volume = target;
\r
221 args.copy = target;
\r
227 function holdFetchObjects(hold, doneCallback) {
\r
228 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
\r
229 var type = args.type;
\r
231 if( type == 'C' ) {
\r
232 if( args.copyObject ) {
\r
234 args.copy = args.copyObject.id();
\r
235 args.volume = args.copyObject.call_number();
\r
236 _h_set_vol(args, doneCallback);
\r
239 var creq = new Request(FETCH_COPY, args.copy);
\r
243 var cp = r.getResultObject();
\r
244 args.copyObject = cp;
\r
245 args.volume = args.copyObject.call_number();
\r
246 _h_set_vol(args, doneCallback);
\r
252 if( type == 'V' ) {
\r
253 _h_set_vol(args, doneCallback);
\r
256 if( type == 'T' ) {
\r
257 _h_set_rec(args, doneCallback);
\r
259 _h_set_rec_descriptors(args, doneCallback);
\r
267 function _h_set_vol(args, doneCallback) {
\r
269 if( args.volumeObject ) {
\r
270 args.volume = args.volumeObject.id();
\r
271 args.record = args.volumeObject.record();
\r
272 _h_set_rec(args, doneCallback);
\r
276 var vreq = new Request(FETCH_VOLUME, args.volume);
\r
279 var vol = r.getResultObject();
\r
280 args.volumeObject = vol;
\r
281 args.record = vol.record();
\r
282 _h_set_rec(args, doneCallback);
\r
289 function _h_set_rec(args, doneCallback) {
\r
291 if(args.recordObject)
\r
292 args.record = args.recordObject.doc_id();
\r
294 args.recordObject = findRecord( args.record, 'T' );
\r
296 if( args.type == 'T' || args.type == 'M' )
\r
297 _h_set_rec_descriptors(args, doneCallback);
\r
299 if(doneCallback) doneCallback(args);
\r
303 function _h_set_rec_descriptors(args, doneCallback) {
\r
305 // grab the list of record desciptors attached to this records metarecord
\r
306 if( ! args.recordDescriptors ) {
\r
307 var params = { record: args.record };
\r
309 if( ! args.record ) {
\r
310 if( args.metarecord )
\r
311 params = { metarecord : args.metarecord };
\r
313 params = { metarecord : args.metarecordObject.doc_id() };
\r
316 var req = new Request(FETCH_MR_DESCRIPTORS, params );
\r
319 var data = r.getResultObject();
\r
320 args.recordDescriptors = data.descriptors;
\r
321 args.metarecord = data.metarecord;
\r
322 if( args.type == 'M' && ! args.metarecordObject)
\r
323 args.metarecordObject = findRecord(args.metarecord, 'M');
\r
325 if(doneCallback) doneCallback(args);
\r
331 if(doneCallback) doneCallback(args);
\r
339 function holdsDrawWindow(bool) {
\r
340 swapCanvas($('holds_box'));
\r
341 $('holds_cancel').onclick = function(){
\r
342 hideResultsPage(false);
\r
343 hideMe($('holds_box'));
\r
344 unHideMe($('canvas_main'));
\r
345 //runEvt('common', 'holdUpdateCanceled'), showCanvas()
\r
347 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
\r
348 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
\r
349 holdFetchObjects(null,
\r
351 __holdsDrawWindow();
\r
353 if(holdArgs.editHold) {
\r
354 //hideMe($('holds_submit'));
\r
355 unHideMe($('holds_update'));
\r
356 var req = new Request(FETCH_HOLD_STATUS,
\r
357 G.user.session, holdArgs.editHold.id());
\r
359 holdArgs.status = req.result();
\r
360 _holdsUpdateEditHold();
\r
366 function selOrgChange(e) {
\r
368 $('holds_pickup_lib').innerHTML = this.options[this.selectedIndex].text;
\r
371 function __holdsDrawWindow() {
\r
373 var rec = holdArgs.recordObject;
\r
374 var vol = holdArgs.volumeObject;
\r
375 var copy = holdArgs.copyObject;
\r
376 var mr = holdArgs.metarecordObject;
\r
378 rec = (rec) ? rec : mr;
\r
380 if(!holdsOrgSelectorBuilt) {
\r
381 holdsBuildOrgSelector(null,0);
\r
382 holdsOrgSelectorBuilt = true;
\r
383 var selector = $('holds_org_selector');
\r
386 var o_loc = findOrgUnit(getOrigLocation());
\r
387 var t = findOrgType(o_loc.ou_type());
\r
388 if( t.can_have_users() )
\r
389 setSelector(selector, o_loc.id());
\r
392 selector.onchange = selOrgChange;
\r
393 setSelector(selector, holdArgs.recipient.home_ou());
\r
396 var obj = findOrgUnit(holdArgs.recipient.home_ou());
\r
397 $('holds_pickup_lib').innerHTML = obj.name();
\r
401 var dsel = $('holds_depth_selector');
\r
402 unHideMe($('holds_depth_selector_row'));
\r
403 if(dsel.getElementsByTagName('option').length == 0) {
\r
404 var types = globalOrgTypes;
\r
405 var depth = findOrgDepth(G.user.ws_ou());
\r
408 if(t.depth() > depth) return;
\r
409 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
\r
416 appendClear($('holds_recipient'), text(
\r
417 holdArgs.recipient.family_name() + ', ' +
\r
418 holdArgs.recipient.first_given_name()));
\r
419 appendClear($('holds_title'), text(rec.title()));
\r
420 appendClear($('holds_author'), text(rec.author()));
\r
422 if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
\r
424 unHideMe($('holds_type_row'));
\r
425 unHideMe($('holds_cn_row'));
\r
426 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
\r
428 if( holdArgs.type == 'V' ) {
\r
429 unHideMe($('holds_is_cn'));
\r
430 hideMe($('holds_is_copy'));
\r
433 hideMe($('holds_is_cn'));
\r
434 unHideMe($('holds_is_copy'));
\r
435 unHideMe($('holds_copy_row'));
\r
436 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
\r
440 hideMe($('holds_type_row'));
\r
441 hideMe($('holds_copy_row'));
\r
442 hideMe($('holds_cn_row'));
\r
445 removeChildren($('holds_format'));
\r
447 var mods_formats = rec.types_of_resource();
\r
450 if(holdArgs.recordDescriptors)
\r
451 formats = holdArgs.recordDescriptors[0].item_type();
\r
453 if( holdArgs.type == 'T' ) {
\r
454 var desc = grep( holdArgs.recordDescriptors,
\r
456 return (i.record() == holdArgs.record);
\r
459 formats = desc[0].item_type();
\r
462 if( holdArgs.type == 'M' ) {
\r
463 var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats());
\r
464 mods_formats = data.mods_formats;
\r
465 formats = data.formats;
\r
469 for( var i in mods_formats ) {
\r
470 var res = mods_formats[i];
\r
471 var img = elem("img");
\r
472 setResourcePic(img, res);
\r
473 $('holds_format').appendChild(img);
\r
475 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
\r
477 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
\r
478 $('holds_format').appendChild(elem('br'));
\r
482 $('holds_phone').value = (holdArgs.recipient.day_phone())?holdArgs.recipient.day_phone():"";
\r
483 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
\r
485 var pref = holdArgs.recipient.prefs[PREF_HOLD_NOTIFY];
\r
488 if( ! pref.match(/email/i) ) {
\r
489 $('holds_enable_email').checked = false;
\r
491 $('holds_enable_email').checked = true;
\r
494 if( ! pref.match(/phone/i) ) {
\r
495 $('holds_phone').disabled = true;
\r
496 $('holds_enable_phone').checked = false;
\r
498 $('holds_phone').disabled = false;
\r
499 $('holds_enable_phone').checked = true;
\r
503 if(!holdArgs.recipient.email()) {
\r
504 $('holds_enable_email').checked = false;
\r
505 $('holds_enable_email').disabled = true;
\r
508 message = noEmailMessageXUL.cloneNode(true);
\r
509 appendClear($('holds_email'), message);
\r
511 message = noEmailMessage.cloneNode(true);
\r
512 appendClear($('holds_email'), message);
\r
513 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
\r
518 if(!$('holds_phone').value)
\r
519 $('holds_enable_phone').checked = false;
\r
521 appendClear($('holds_physical_desc'), text(rec.physical_description()));
\r
523 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
\r
525 holdsSetFormatSelector();
\r
527 $('holds_frozen_chkbox').checked = false;
\r
528 hideMe($('hold_frozen_thaw_row'));
\r
530 var interval = fetchOrgSettingDefault(holdArgs.recipient.home_ou(), 'circ.hold_expire_interval');
\r
533 secs = interval_to_seconds(interval);
\r
534 var expire = new Date();
\r
535 expire.setTime(expire.getTime() + Number(secs + '000'));
\r
536 if(dijit.byId('holds_expire_time')) dijit.byId('holds_expire_time').setValue(expire);
\r
540 function holdsParseMRFormats(str) {
\r
541 var data = str.split(/-/);
\r
544 var mods_formats = [];
\r
546 for( var i = 0; i < data[0].length; i++ ) {
\r
547 formats.push( data[0].charAt(i) );
\r
548 mods_formats.push( MARCFormatToMods( formats[i] ) );
\r
551 formats = uniquify(formats);
\r
552 mods_formats = uniquify(mods_formats);
\r
556 mods_formats : mods_formats,
\r
558 largeprint : data[1]
\r
563 function holdsSetFormatSelector() {
\r
564 var type = holdArgs.type;
\r
565 if( type == 'C' || type == 'V' || holdArgs.editHold ) return;
\r
567 var data = holdsGetFormats();
\r
568 var avail_formats = data.avail_formats;
\r
569 var sel_formats = data.sel_formats;
\r
570 holdArgs.language = data.lang;
\r
572 unHideMe($('holds_alt_formats_row_extras'));
\r
573 var selector = $('hold_alt_form_selector');
\r
575 for( var i = 0; i < avail_formats.length; i++ ) {
\r
576 var form = avail_formats[i];
\r
577 unHideMe(findSelectorOptByValue(selector, form));
\r
582 function holdsGetFormats() {
\r
586 var sformats = []; // selected formats
\r
588 var type = holdArgs.type;
\r
589 var desc = holdArgs.recordDescriptors;
\r
590 var rec = holdArgs.record;
\r
591 var mrec = holdArgs.metarecord;
\r
593 if( type == 'T' ) {
\r
595 for( var i = 0; i < desc.length; i++ ) {
\r
597 if( d.record() == holdArgs.record ) {
\r
598 lang = d.item_lang();
\r
599 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
\r
600 sformats.push(holdArgs.myFormat);
\r
606 for( var i = 0; i < desc.length; i++ ) {
\r
608 if( d.item_lang() != lang ) continue;
\r
609 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
\r
612 formats = uniquify(formats);
\r
616 avail_formats : formats,
\r
617 sel_formats : sformats
\r
623 function _t_f_2_format(type, form) {
\r
624 if( form == 'd' ) return 'at-d';
\r
625 return (type == 'a' || type == 't') ? 'at' :
\r
626 ( type == 'i' || type == 'g' || type == 'j' ) ? type : null;
\r
629 function holdsSetSelectedFormats() {
\r
631 var cn = $('holds_alt_formats_row').className;
\r
632 if( cn && cn.match(/hide_me/) ) return;
\r
634 var selector = $('hold_alt_form_selector');
\r
635 var vals = getSelectedList(selector);
\r
637 if(vals.length == 0) return;
\r
641 if( contains(vals, 'at-d') ) {
\r
642 if( contains(vals, 'at') )
\r
647 if( contains(vals, 'at') )
\r
651 for( var i = 0; i < vals.length; i++ ) {
\r
653 if( !val.match(/at/) ) fstring = val + fstring;
\r
656 if( holdArgs.language ) {
\r
657 if( fstring.match(/-/) )
\r
658 fstring = fstring + '-' + holdArgs.language;
\r
660 fstring = fstring + '--' + holdArgs.language;
\r
666 function holdsCheckPossibility(pickuplib, hold, recurse) {
\r
669 titleid : holdArgs.record,
\r
670 volume_id : holdArgs.volume,
\r
671 copy_id : holdArgs.copy,
\r
672 hold_type : holdArgs.type,
\r
673 patronid : holdArgs.recipient.id(),
\r
675 pickup_lib : pickuplib
\r
679 /* if we're calling create again (recursing),
\r
680 we know that the hold possibility check already succeeded */
\r
681 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
\r
684 _debug("hold possible args = "+js2JSON(args));
\r
686 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
\r
688 req.request.alertEvent = false;
\r
689 req.request._hold = hold;
\r
690 req.request._recurse = recurse;
\r
691 req.callback(holdHandleCreateResponse);
\r
697 function holdsBuildOrgSelector(node, sel) {
\r
699 if(!node) node = globalOrgTree;
\r
700 if(!isTrue(node.opac_visible())) return;
\r
702 var selector = sel?sel:$('holds_org_selector');
\r
703 var index = selector.options.length;
\r
705 var type = findOrgType(node.ou_type());
\r
706 var indent = type.depth() - 1;
\r
707 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
\r
708 if(!type.can_have_users()) {
\r
709 opt.disabled = true;
\r
710 addCSSClass(opt, 'disabled_option');
\r
713 for( var i in node.children() ) {
\r
714 var child = node.children()[i];
\r
715 if(child) holdsBuildOrgSelector(child);
\r
719 function holdsBuildHoldFromWindow() {
\r
721 var org = getSelectorVal($('holds_org_selector'));
\r
722 var node = findOrgUnit(org);
\r
723 var ntype = findOrgType(node.ou_type());
\r
724 if(!ntype.can_have_users()) {
\r
725 alertId('holds_pick_good_org');
\r
729 var hold = new ahr();
\r
730 if(holdArgs.editHold) {
\r
731 hold = holdArgs.editHold;
\r
732 holdArgs.editHold = null;
\r
735 if( $('holds_enable_phone').checked ) {
\r
736 var phone = $('holds_phone').value;
\r
737 if( !phone || !phone.match(REGEX_PHONE) ) {
\r
738 alert($('holds_bad_phone').innerHTML);
\r
741 hold.phone_notify(phone);
\r
744 hold.phone_notify("");
\r
747 if( $('holds_enable_email').checked )
\r
748 hold.email_notify(1);
\r
750 hold.email_notify(0);
\r
754 switch(holdArgs.type) {
\r
756 target = holdArgs.metarecord; break;
\r
758 target = holdArgs.record; break;
\r
760 target = holdArgs.volume; break;
\r
762 target = holdArgs.copy; break;
\r
767 hold.pickup_lib(org);
\r
768 //hold.request_lib(org);
\r
769 hold.requestor(holdArgs.requestor.id());
\r
770 hold.usr(holdArgs.recipient.id());
\r
771 hold.target(target);
\r
772 hold.hold_type(holdArgs.type);
\r
774 try{var expDate = dijit.byId('holds_expire_time').getValue();} catch(e){}
\r
776 var expireDate = dojo.date.stamp.toISOString(expDate);
\r
777 expireDate = holdsVerifyThawDate(expireDate);
\r
779 hold.expire_time(expireDate);
\r
784 // see if this hold should be frozen and for how long
\r
785 if($('holds_frozen_chkbox').checked) {
\r
787 unHideMe($('hold_frozen_thaw_row'));
\r
788 thawDate = dojo.date.stamp.toISOString(dijit.byId('holds_frozen_thaw_input').getValue());
\r
790 thawDate = holdsVerifyThawDate(thawDate);
\r
792 hold.thaw_date(thawDate);
\r
796 hold.thaw_date(null);
\r
800 hold.thaw_date(null);
\r
803 //check for alternate hold formats
\r
804 var fstring = holdsSetSelectedFormats();
\r
806 hold.hold_type('M');
\r
807 hold.holdable_formats(fstring);
\r
808 hold.target(holdArgs.metarecord);
\r
813 function holdsPlaceHold(hold, recurse) {
\r
815 swapCanvas($('check_holds_box'));
\r
816 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
\r
820 function holdHandleCreateResponse(r, recurse) {
\r
823 var res = r.getResultObject();
\r
824 if(checkILSEvent(res) || res.success != 1) {
\r
825 if(res.success != 1) {
\r
826 alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc));
\r
828 if( res.textcode == 'PATRON_BARRED' ) {
\r
829 alertId('hold_failed_patron_barred');
\r
831 alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc));
\r
834 swapCanvas($('holds_box'));
\r
837 r._hold.selection_depth(res.depth);
\r
840 holdCreateHold(r._recurse, r._hold);
\r
841 hideResultsPage(false);
\r
845 function holdCreateHold( recurse, hold ) {
\r
846 var method = CREATE_HOLD;
\r
847 if(recurse) method = CREATE_HOLD_OVERRIDE;
\r
848 var req = new Request( method, holdArgs.requestor.session, hold );
\r
849 req.request.alertEvent = false;
\r
851 var res = req.result();
\r
852 holdProcessResult(hold, res, recurse);
\r
856 runEvt('common', 'holdUpdated');
\r
860 function holdProcessResult( hold, res, recurse ) {
\r
862 if( res && res > -1 ) {
\r
863 alert($('holds_success').innerHTML);
\r
865 if(isXUL() && typeof xulG.opac_hold_placed == 'function')
\r
866 xulG.opac_hold_placed(res);
\r
871 alert($('holds_failure').innerHTML);
\r
875 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
\r
876 if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) {
\r
877 if( confirm($('hold_dup_exists_override').innerHTML) ) {
\r
878 return holdsPlaceHold(hold, true);
\r
883 return alert($('hold_dup_exists').innerHTML);
\r
887 if( grep(res, function(e) { return (e.textcode == 'HOLD_ITEM_CHECKED_OUT'); }) ) {
\r
888 if( fetchPermOrgs('HOLD_ITEM_CHECKED_OUT.override')[0] != -1 ) {
\r
889 if( confirm($('hold_checked_out_override').innerHTML) ) {
\r
890 return holdsPlaceHold(hold, true);
\r
895 return alert($('hold_checked_out').innerHTML);
\r
900 alert($('holds_failure').innerHTML);
\r
905 function holdsCancel(holdid, user) {
\r
906 if(!user) user = G.user;
\r
907 var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6);
\r
909 return req.result();
\r
910 runEvt('common', 'holdUpdated');
\r
913 function holdsUpdate(hold, user) {
\r
914 if(!user) user = G.user;
\r
915 var req = new Request(UPDATE_HOLD, user.session, hold);
\r
917 var x = req.result(); // cause an exception if there is one
\r
918 runEvt('common', 'holdUpdated');
\r
921 /* verify that the thaw date is valid and after today */
\r
922 function holdsVerifyThawDate(dateString, isGreater) {
\r
923 thawDate = dojo.date.stamp.fromISOString(dateString);
\r
926 if(dojo.date.compare(thawDate) > 0) {
\r
927 return dojo.date.stamp.toISOString(thawDate);
\r
930 return dojo.date.stamp.toISOString(thawDate);
\r
936 function holdsVerifyThawDateUI(element) {
\r
937 value = dojo.date.stamp.toISOString(dijit.byId(element).getValue());
\r
940 removeCSSClass($(element), 'invalid_field');
\r
944 if(!holdsVerifyThawDate(value, true)) {
\r
945 addCSSClass($(element), 'invalid_field');
\r
947 removeCSSClass($(element), 'invalid_field');
\r
952 function editHold(h) {
\r
953 var row = $('myopac_holds_row_'+h);
\r
956 objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib');
\r
957 objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel');
\r
958 objs['hold_active'] = $n(row,'hold_active');
\r
959 objs['activate_label'] = $n(row,'activate_label');
\r
960 objs['activate_date'] = $n(row,'activate_date');
\r
961 objs['activate_box'] = $n(row,'activate_box');
\r
962 objs['hold_expires_label'] = $n(row,'hold_expires_label');
\r
963 objs['hold_expires'] = $n(row,'hold_expires');
\r
964 objs['hold_expires_box'] = $n(row,'hold_expires_box');
\r
965 objs['hold_active_sel'] = $n(row,'hold_active_sel');
\r
966 objs['hold_edit_link'] = $n(row,'hold_edit_link');
\r
967 objs['hold_save_link'] = $n(row,'hold_save_link');
\r
968 objs['hold_cancel_link'] = $n(row,'hold_cancel_link');
\r
970 for(var i in objs) unHideMe(objs[i]);
\r
972 hideMe(objs['activate_date']);
\r
973 hideMe(objs['hold_active']);
\r
974 hideMe(objs['hold_expires']);
\r
975 hideMe(objs['hold_pickup_lib']);
\r
976 hideMe(objs['hold_edit_link']);
\r
979 function cancelHold(h) {
\r
980 var row = $('myopac_holds_row_'+h);
\r
983 objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib');
\r
984 objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel');
\r
985 objs['hold_active'] = $n(row,'hold_active');
\r
986 objs['activate_label'] = $n(row,'activate_label');
\r
987 objs['activate_date'] = $n(row,'activate_date');
\r
988 objs['activate_box'] = $n(row,'activate_box');
\r
989 objs['hold_expires_label'] = $n(row,'hold_expires_label');
\r
990 objs['hold_expires'] = $n(row,'hold_expires');
\r
991 objs['hold_expires_box'] = $n(row,'hold_expires_box');
\r
992 objs['hold_active_sel'] = $n(row,'hold_active_sel');
\r
993 objs['hold_edit_link'] = $n(row,'hold_edit_link');
\r
994 objs['hold_save_link'] = $n(row,'hold_save_link');
\r
995 objs['hold_cancel_link'] = $n(row,'hold_cancel_link');
\r
997 for(var i in objs) hideMe(objs[i]);
\r
999 unHideMe(objs['hold_edit_link']);
\r
1000 unHideMe(objs['hold_pickup_lib']);
\r
1001 unHideMe(objs['holds_active']);
\r
1002 unHideMe(objs['hold_active']);
\r
1003 unHideMe(objs['activate_date']);
\r
1004 unHideMe(objs['hold_expires']);
\r
1005 if(objs['hold_expires'].innerHTML) unHideMe(objs['hold_expires_label']);
\r
1006 if(objs['activate_date'].innerHTML) unHideMe(objs['activate_label']);
\r
1009 function saveHold(h) {
\r
1010 var row = $('myopac_holds_row_'+h);
\r
1011 var hold = holdsCache[holdsCacheMap[h]].hold;
\r
1013 var activateDataBox = $n(row,'activate_box');
\r
1014 var expireDateBox = $n(row,'hold_expires_box');
\r
1015 var pickupLibSel = $n(row,'hold_pickup_lib_sel');
\r
1016 var activateSel = $n(row,'hold_active_sel');
\r
1017 var expireTime = dojo.date.stamp.toISOString(new Date(Date.parse(expireDateBox.value)),null);
\r
1018 var activateTime = dojo.date.stamp.toISOString(new Date(Date.parse(activateDataBox.value)),null);
\r
1019 if(parseInt(expireTime)) hold.expire_time(expireTime);
\r
1020 if(parseInt(activateTime)) hold.thaw_date(activateTime);
\r
1021 hold.frozen(activateSel.options[activateSel.selectedIndex].value);
\r
1022 hold.pickup_lib(pickupLibSel.options[pickupLibSel.selectedIndex].value);
\r
1023 row.style.background= isTrue(hold.frozen())?"#ebf9ff":"";
\r
1025 fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.hold.update'],{params:[G.user.session,hold],oncomplete:refreshHold});
\r
1028 function updateHoldInfo(holdid,holdrow) {
\r
1029 var h = holdsCache[holdsCacheMap[holdid]].hold;
\r
1031 var row = holdrow?holdrow:$('myopac_holds_row_'+holdid);
\r
1034 $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.pickup_lib()).name();
\r
1035 $n(row,'hold_active').innerHTML = isTrue(h.frozen())?"Suspended":"Active";
\r
1037 if(h.thaw_date()) {
\r
1038 var d = dojo.date.stamp.fromISOString(h.thaw_date());
\r
1039 $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true});
\r
1040 unHideMe($n(row,'activate_label'));
\r
1041 $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true});
\r
1044 if(h.expire_time()) {
\r
1045 var exp_date = dojo.date.stamp.fromISOString(h.expire_time());
\r
1046 $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true});
\r
1047 unHideMe($n(row,'hold_expires_label'));
\r
1048 $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true});
\r
1052 function refreshHold(r) {
\r
1053 var hold = r.recv().content();
\r
1054 if(!parseInt(hold)) return;
\r
1055 updateHoldInfo(hold);
\r