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
12 var noEmailMessageXUL;
14 var holdTargetTypeMap = {
24 function holdsHandleStaff() {
26 // if we know the recipient's barcode, use it
27 if(xulG.patron_barcode) return _holdsHandleStaff();
29 swapCanvas($('xulholds_box'));
30 $('xul_recipient_barcode').focus();
31 $('xul_recipient_barcode').onkeypress = function(evt)
32 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
33 $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
34 $('xul_recipient_me').onclick = _holdsHandleStaffMe;
36 $('xul_recipient_barcode').onkeyup = function(evt) {
37 if($('xul_recipient_barcode').value == '')
38 $('xul_recipient_me').disabled = false;
40 $('xul_recipient_me').disabled = true;
44 $('holds_frozen_thaw_input').onchange =
45 function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
46 $('holds_frozen_thaw_input').onkeyup =
47 function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');}
49 function _holdsHandleStaffMe() {
50 holdArgs.recipient = G.user;
54 function _holdsHandleStaff() {
55 var barcode = xulG.patron_barcode || $('xul_recipient_barcode').value;
56 var user = grabUserByBarcode( G.user.session, barcode );
59 if(evt = checkILSEvent(user)) {
64 if(!barcode || !user) {
65 alertId('holds_invalid_recipient', barcode);
71 holdArgs.recipient = user;
78 * record, volume, copy (ids)
79 * request, recipient, editHold (objects)
82 function holdsDrawEditor(args) {
84 holdArgs = (args) ? args : holdArgs;
87 noEmailMessage = $('holds_email').removeChild($('holds.no_email'));
89 if(!noEmailMessageXUL)
90 noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul'));
92 if(isXUL() && holdArgs.recipient == null
93 && holdArgs.editHold == null) {
98 if(!holdArgs.recipient) holdArgs.recipient = G.user;
99 if(!holdArgs.requestor) holdArgs.requestor = G.user;
101 if(!(holdArgs.requestor && holdArgs.requestor.session)) {
102 detachAllEvt('common','locationChanged');
103 attachEvt('common','loggedIn', holdsDrawEditor)
108 if(holdArgs.editHold) // flesh the args with the existing hold
109 holdArgsFromHold(holdArgs.editHold, holdArgs);
115 // updates the edit window with the existing hold's data
116 function _holdsUpdateEditHold() {
118 var hold = holdArgs.editHold;
119 var qstats = holdArgs.status;
121 var orgsel = $('holds_org_selector');
122 var frozenbox = $('holds_frozen_chkbox');
124 setSelector(orgsel, hold.pickup_lib());
126 if( hold.capture_time() || qstats.status > 2 ) {
127 frozenbox.disabled = true;
128 $('holds_frozen_thaw_input').disabled = true;
129 if(qstats.status == 3) {
130 // no pickup lib changes while in-transit
131 orgsel.disabled = true;
133 var orgs = fetchPermOrgs('UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF');
135 orgsel.disabled = true;
138 orgsel.disabled = false;
139 frozenbox.disabled = false;
143 $('holds_submit').onclick = holdsEditHold;
144 $('holds_update').onclick = holdsEditHold;
146 if(hold.phone_notify()) {
147 $('holds_enable_phone').checked = true;
148 $('holds_phone').value = hold.phone_notify();
151 $('holds_phone').disabled = true;
152 $('holds_enable_phone').checked = false;
155 if(isTrue(hold.email_notify())) {
156 $('holds_enable_email').checked = true;
159 $('holds_enable_email').checked = false;
162 dijit.byId('holds_expire_time').setValue(dojo.date.stamp.fromISOString(hold.expire_time()));
164 /* populate the hold freezing info */
165 if(!frozenbox.disabled && isTrue(hold.frozen())) {
166 frozenbox.checked = true;
167 unHideMe($('hold_frozen_thaw_row'));
168 if(hold.thaw_date()) {
169 dijit.byId('holds_frozen_thaw_input').setValue(dojo.date.stamp.fromISOString(hold.thaw_date()));
171 dijit.byId('holds_frozen_thaw_input').setValue('');
174 frozenbox.checked = false;
175 dijit.byId('holds_frozen_thaw_input').setValue('');
176 hideMe($('hold_frozen_thaw_row'));
180 function holdsEditHold() {
181 var hold = holdsBuildHoldFromWindow();
185 if(holdArgs.onComplete)
186 holdArgs.onComplete(hold);
189 function holdArgsFromHold(hold, oargs) {
190 var args = (oargs) ? oargs : {};
191 args.type = hold.hold_type();
192 var target = hold.target();
193 args[holdTargetTypeMap[args.type]] = target;
197 function holdFetchObjects(hold, doneCallback) {
199 var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
201 var type = args.type;
205 if( args.copyObject ) {
207 args.copy = args.copyObject.id();
208 args.volume = args.copyObject.call_number();
209 _h_set_vol(args, doneCallback);
212 var creq = new Request(FETCH_COPY, args.copy);
216 var cp = r.getResultObject();
217 args.copyObject = cp;
218 args.volume = args.copyObject.call_number();
219 _h_set_vol(args, doneCallback);
226 _h_set_vol(args, doneCallback);
228 } else if( type == 'I' ) {
229 _h_set_issuance(args, doneCallback);
233 _h_set_rec(args, doneCallback);
235 _h_set_rec_descriptors(args, doneCallback);
243 function _h_set_vol(args, doneCallback) {
245 if( args.volumeObject ) {
246 args.volume = args.volumeObject.id();
247 args.record = args.volumeObject.record();
248 _h_set_rec(args, doneCallback);
252 var vreq = new Request(FETCH_VOLUME, args.volume);
255 var vol = r.getResultObject();
256 args.volumeObject = vol;
257 args.record = vol.record();
258 _h_set_rec(args, doneCallback);
265 function _h_set_issuance(args, doneCallback) {
267 if( args.issuanceObject ) {
268 args.issuance = args.issuanceObject.id();
269 args.record = args.issuanceObject.subscription().record_entry();
270 _h_set_rec(args, doneCallback);
274 var vreq = new Request(FETCH_ISSUANCE, [args.issuance]);
277 var issuance = r.getResultObject()[0];
278 args.issuanceObject = issuance;
279 args.record = issuance.subscription().record_entry();
280 _h_set_rec(args, doneCallback);
287 function _h_set_rec(args, doneCallback) {
289 if(args.recordObject)
290 args.record = args.recordObject.doc_id();
292 args.recordObject = findRecord( args.record, 'T' );
294 if( args.type == 'T' || args.type == 'M' )
295 _h_set_rec_descriptors(args, doneCallback);
297 if(doneCallback) doneCallback(args);
301 function _h_set_rec_descriptors(args, doneCallback) {
303 if( ! args.pickup_lib )
304 args.pickup_lib = getSelectorVal($('holds_org_selector'));
306 if(args.pickup_lib === null)
307 args.pickup_lib = holdArgs.recipient.home_ou();
309 // grab the list of record desciptors attached to this records metarecord
310 if( ! args.recordDescriptors ) {
311 var params = { pickup_lib: args.pickup_lib };
313 if (args.type == 'M') {
314 if( !args.metarecord && args.record) {
315 params.metarecord = args.metarecord = args.record;
318 params.metarecord = args.metarecordObject.doc_id();
321 params.record = args.record;
324 if( ! args.record ) {
325 if( args.metarecord )
326 params.metarecord = args.metarecord;
328 params.metarecord = args.metarecordObject.doc_id();
331 var req = new Request(FETCH_MR_DESCRIPTORS, params );
334 var data = r.getResultObject();
335 holdArgs.recordDescriptors = args.recordDescriptors = data.descriptors;
336 holdArgs.metarecord = args.metarecord = data.metarecord;
337 if( args.type == 'M' && ! args.metarecordObject)
338 holdArgs.metarecordObject = args.metarecordObject = findRecord(args.metarecord, 'M');
340 if(doneCallback) doneCallback(args);
346 if(doneCallback) doneCallback(args);
354 function holdsDrawWindow() {
355 swapCanvas($('holds_box'));
356 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
357 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
358 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
359 $('holds_org_selector').onchange = function(){holdsDrawWindow()};
360 holdFetchObjects(null,
364 if(holdArgs.editHold) {
365 hideMe($('holds_submit'));
366 unHideMe($('holds_update'));
367 var req = new Request(FETCH_HOLD_STATUS,
368 G.user.session, holdArgs.editHold.id());
370 holdArgs.status = req.result();
371 _holdsUpdateEditHold();
377 function __holdsDrawWindow() {
379 var rec = holdArgs.recordObject;
380 var vol = holdArgs.volumeObject;
381 var copy = holdArgs.copyObject;
382 var mr = holdArgs.metarecordObject;
384 rec = (rec) ? rec : mr;
386 if(!holdsOrgSelectorBuilt) {
387 holdsBuildOrgSelector(null,0);
388 holdsOrgSelectorBuilt = true;
389 var selector = $('holds_org_selector');
392 var o_loc = findOrgUnit(getOrigLocation());
393 var t = findOrgType(o_loc.ou_type());
394 if( t.can_have_users() )
395 setSelector(selector, o_loc.id());
399 setSelector(selector, holdArgs.recipient.home_ou());
405 var dsel = $('holds_depth_selector');
406 unHideMe($('holds_depth_selector_row'));
407 if(dsel.getElementsByTagName('option').length == 0) {
408 var types = globalOrgTypes;
409 var depth = findOrgDepth(G.user.ws_ou());
412 if(t.depth() > depth) return;
413 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
420 appendClear($('holds_recipient'), text(
421 holdArgs.recipient.family_name() + ', ' +
422 holdArgs.recipient.first_given_name()));
423 appendClear($('holds_title'), text(rec.title()));
424 appendClear($('holds_author'), text(rec.author()));
426 if( holdArgs.type == 'I' ) {
427 unHideMe($('holds_type_row'));
428 unHideMe($('holds_is_issuance'));
429 unHideMe($('holds_issuance_row'));
430 appendClear($('holds_issuance_label'), text(holdArgs.issuanceObject.label()));
432 } else if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
434 unHideMe($('holds_type_row'));
435 unHideMe($('holds_cn_row'));
436 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
438 if( holdArgs.type == 'V' ) {
439 unHideMe($('holds_is_cn'));
440 hideMe($('holds_is_copy'));
443 hideMe($('holds_is_cn'));
444 unHideMe($('holds_is_copy'));
445 unHideMe($('holds_copy_row'));
446 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
450 hideMe($('holds_type_row'));
451 hideMe($('holds_copy_row'));
452 hideMe($('holds_cn_row'));
453 hideMe($('holds_issuance_row'));
456 removeChildren($('holds_format'));
458 var mods_formats = rec.types_of_resource();
461 if(holdArgs.recordDescriptors)
462 formats = holdArgs.recordDescriptors[0].item_type();
464 if( holdArgs.type == 'T' ) {
465 var desc = grep( holdArgs.recordDescriptors,
467 return (i.record() == holdArgs.record);
470 formats = desc[0].item_type();
473 if( holdArgs.type == 'M' ) {
475 if(holdArgs.editHold){
476 mr_formats = holdArgs.editHold.holdable_formats();
478 mr_formats = ''; // collect the item_type()s from all holdArgs.recordDescriptors
479 for(var desc in holdArgs.recordDescriptors){
480 if (!holdArgs.recordDescriptors[desc].item_type()) continue;
481 mr_formats += holdArgs.recordDescriptors[desc].item_type();
485 for(var desc in holdArgs.recordDescriptors){
486 if (!holdArgs.recordDescriptors[desc].item_form()) continue;
491 mr_formats += holdArgs.recordDescriptors[desc].item_form();
497 var data = holdsParseMRFormats(mr_formats);
498 mods_formats = data.mods_formats;
499 formats = data.formats;
503 for( var i in mods_formats ) {
504 var res = mods_formats[i];
505 var img = elem("img");
506 setResourcePic(img, res);
507 $('holds_format').appendChild(img);
509 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
511 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
512 $('holds_format').appendChild(elem('br'));
516 $('holds_phone').value = holdArgs.recipient.day_phone();
517 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
519 var pref = holdArgs.recipient.prefs[PREF_HOLD_NOTIFY];
522 if( ! pref.match(/email/i) ) {
523 $('holds_enable_email').checked = false;
525 $('holds_enable_email').checked = true;
528 if( ! pref.match(/phone/i) ) {
529 $('holds_phone').disabled = true;
530 $('holds_enable_phone').checked = false;
532 $('holds_phone').disabled = false;
533 $('holds_enable_phone').checked = true;
537 if(!holdArgs.recipient.email()) {
538 $('holds_enable_email').checked = false;
539 $('holds_enable_email').disabled = true;
542 message = noEmailMessageXUL.cloneNode(true);
543 appendClear($('holds_email'), message);
545 message = noEmailMessage.cloneNode(true);
546 appendClear($('holds_email'), message);
547 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
552 if(!$('holds_phone').value)
553 $('holds_enable_phone').checked = false;
555 appendClear($('holds_physical_desc'), text(rec.physical_description()));
557 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
559 holdsSetFormatSelector();
561 $('holds_frozen_chkbox').checked = false;
562 hideMe($('hold_frozen_thaw_row'));
564 var interval = fetchOrgSettingDefault(holdArgs.recipient.home_ou(), 'circ.hold_expire_interval');
567 secs = interval_to_seconds(interval);
568 var expire = new Date();
569 expire.setTime(expire.getTime() + Number(secs + '000'));
570 dijit.byId('holds_expire_time').setValue(expire);
574 function holdsParseMRFormats(str) {
575 var data = str.split(/-/);
578 var mods_formats = [];
580 for( var i = 0; i < data[0].length; i++ ) {
581 formats.push( data[0].charAt(i) );
582 mods_formats.push( MARCFormatToMods( formats[i] ) );
585 formats = uniquify(formats);
586 mods_formats = uniquify(mods_formats);
590 mods_formats : mods_formats,
597 function holdsSetFormatSelector() {
598 var type = holdArgs.type;
599 if( type == 'C' || type == 'V' || type == "I" || holdArgs.editHold ) return;
601 var data = holdsGetFormats();
602 var avail_formats = data.avail_formats;
603 var sel_formats = data.sel_formats;
604 holdArgs.language = data.lang;
606 hideMe($('holds_alt_formats_row_extras'));
607 unHideMe($('holds_alt_formats_row'));
609 unHideMe($('holds_alt_formats_row_extras'));
612 var selector = $('hold_alt_form_selector');
614 for( var i = 0; i < selector.options.length; i++ ) {
615 if (selector.options[i].className.indexOf('hide_me') == -1)
616 hideMe(selector.options[i]);
619 for( var i = 0; i < avail_formats.length; i++ ) {
620 var form = avail_formats[i];
621 var opt = findFormatSelectorOptByParts(selector,form);
623 if(type=='M') opt.selected=true;
628 function findFormatSelectorOptByParts( sel, val ) {
629 var parts = val.split('-');
630 for( var i = 0; i < sel.options.length; i++ ) {
631 var opt = sel.options[i];
632 var oval = opt.value;
633 var oparts = oval.split('-');
634 if( oparts[0].indexOf(parts[0]) > -1 && (!parts[1] || oparts[1].indexOf(parts[1]) > -1) ) return opt;
639 function holdsGetFormats() {
643 var sformats = []; // selected formats
645 var type = holdArgs.type;
646 var desc = holdArgs.recordDescriptors;
647 var rec = holdArgs.record;
648 var mrec = holdArgs.metarecord;
653 for( var i = 0; i < desc.length; i++ ) {
655 if( d.record() == holdArgs.record ) {
656 lang = d.item_lang();
657 holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form());
658 sformats.push(holdArgs.myFormat);
663 for( var i = 0; i < desc.length; i++ ) {
665 if( type == 'T' && d.item_lang() != lang ) continue;
666 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
669 } else if( type =='M') {
671 // All available formats are selected by default in MR holds
672 for( var i = 0; i < desc.length; i++ ) {
674 var _tmp_f = _t_f_2_format(d.item_type(), d.item_form());
675 formats.push( _tmp_f );
676 sformats.push( _tmp_f );
680 formats = uniquify(formats);
681 sformats = uniquify(sformats);
685 avail_formats : formats,
686 sel_formats : sformats
692 function _t_f_2_format(type, form) {
693 if( (type == 'a' || type == 't') && form == 's' ) return 'at-s';
694 if( form == 'd' ) return 'at-d';
695 return (type == 'a' || type == 't') ? 'at' : type;
698 function holdsSetSelectedFormats() {
700 var cn = $('holds_alt_formats_row').className;
701 if( cn && cn.match(/hide_me/) ) return;
703 var selector = $('hold_alt_form_selector');
704 var vals = getSelectedList(selector);
706 if(vals.length == 0) return;
710 if( contains(vals, 'at-d') || contains(vals, 'at-s')) {
711 if( contains(vals, 'at') ) {
713 } else if (contains(vals, 'at-s') && contains(vals, 'at-d')) {
715 } else if (!contains(vals, 'at-s')) {
722 for( var i = 0; i < vals.length; i++ ) {
724 if( !val.match(/at/) ) fstring = val + fstring;
727 if( holdArgs.language ) {
728 if( fstring.match(/-/) )
729 fstring = fstring + '-' + holdArgs.language;
731 fstring = fstring + '--' + holdArgs.language;
739 function holdsCheckPossibility(pickuplib, hold, recurse) {
742 titleid : holdArgs.record,
743 mrid : holdArgs.metarecord,
744 volume_id : holdArgs.volume,
745 issuanceid : holdArgs.issuance,
746 copy_id : holdArgs.copy,
747 hold_type : holdArgs.type,
748 patronid : holdArgs.recipient.id(),
750 pickup_lib : pickuplib
754 /* if we're calling create again (recursing),
755 we know that the hold possibility check already succeeded */
756 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
759 _debug("hold possible args = "+js2JSON(args));
761 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
763 req.request.alertEvent = false;
764 req.request._hold = hold;
765 req.request._recurse = recurse;
766 req.callback(holdHandleCreateResponse);
772 function holdsBuildOrgSelector(node) {
774 if(!node) node = globalOrgTree;
775 if(!isTrue(node.opac_visible())) return;
777 var render_this_org = true;
778 var orgHiding = checkOrgHiding(); // value here is cached so not too painful with the recursion
780 if (node.id() == globalOrgTree.id()) {
781 node = orgHiding.org; // top of tree = org hiding context org
783 if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
784 render_this_org = false;
788 if (render_this_org) {
789 var selector = $('holds_org_selector');
790 var index = selector.options.length;
792 var type = findOrgType(node.ou_type());
793 var indent = type.depth() - 1;
795 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
796 if(!type.can_have_users()) {
798 addCSSClass(opt, 'disabled_option');
802 for( var i in node.children() ) {
803 var child = node.children()[i];
804 if(child) holdsBuildOrgSelector(child);
808 function holdsBuildHoldFromWindow() {
810 var org = getSelectorVal($('holds_org_selector'));
811 var node = findOrgUnit(org);
812 var ntype = findOrgType(node.ou_type());
813 if(!ntype.can_have_users()) {
814 alertId('holds_pick_good_org');
818 fieldmapper.IDL.load(['ahr']);
819 var hold = new ahr();
820 if(holdArgs.editHold) {
821 hold = holdArgs.editHold;
822 holdArgs.editHold = null;
825 if( $('holds_enable_phone').checked ) {
826 var phone = $('holds_phone').value;
827 if( !phone || !phone.match(REGEX_PHONE) ) {
828 alert($('holds_bad_phone').innerHTML);
831 hold.phone_notify(phone);
834 hold.phone_notify("");
837 if( $('holds_enable_email').checked )
838 hold.email_notify(1);
840 hold.email_notify(0);
842 var target = holdArgs[holdTargetTypeMap[holdArgs.type]];
844 hold.pickup_lib(org);
845 //hold.request_lib(org);
846 hold.requestor(holdArgs.requestor.id());
847 hold.usr(holdArgs.recipient.id());
849 hold.hold_type(holdArgs.type);
851 var expDate = dijit.byId('holds_expire_time').getValue();
853 var expireDate = dojo.date.stamp.toISOString(expDate);
854 expireDate = holdsVerifyThawDate(expireDate);
856 hold.expire_time(expireDate);
861 // see if this hold should be frozen and for how long
862 if($('holds_frozen_chkbox').checked) {
864 unHideMe($('hold_frozen_thaw_row'));
865 var thawDate = dijit.byId('holds_frozen_thaw_input').attr('value');
867 thawDate = dojo.date.stamp.toISOString(thawDate);
868 thawDate = holdsVerifyThawDate(thawDate);
870 hold.thaw_date(thawDate);
874 hold.thaw_date(null);
878 hold.thaw_date(null);
881 //check for alternate hold formats
882 var fstring = holdsSetSelectedFormats();
885 hold.holdable_formats(fstring);
886 hold.target(holdArgs.metarecord);
891 function holdsPlaceHold(hold, recurse) {
893 swapCanvas($('check_holds_box'));
894 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
898 function holdHandleCreateResponse(r, recurse) {
901 var res = r.getResultObject();
902 if(checkILSEvent(res) || res.success != 1) {
903 if(res.success != 1) {
904 alert($('hold_not_allowed').innerHTML);
906 if( res.textcode == 'PATRON_BARRED' ) {
907 alertId('hold_failed_patron_barred');
909 alert($('hold_not_allowed').innerHTML);
912 swapCanvas($('holds_box'));
915 r._hold.selection_depth(res.depth);
918 holdCreateHold(r._recurse, r._hold);
922 function holdCreateHold( recurse, hold ) {
923 var method = CREATE_HOLD;
924 if(recurse) method = CREATE_HOLD_OVERRIDE;
925 var req = new Request( method, holdArgs.requestor.session, hold );
926 req.request.alertEvent = false;
928 var res = req.result();
929 holdProcessResult(hold, res, recurse);
933 runEvt('common', 'holdUpdated');
937 function holdProcessResult( hold, res, recurse ) {
939 if( res && res > -1 ) {
940 alert($('holds_success').innerHTML);
942 if(isXUL() && typeof xulG.opac_hold_placed == 'function')
943 xulG.opac_hold_placed(res);
948 alert($('holds_failure').innerHTML);
952 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
953 if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) {
954 if( confirm($('hold_dup_exists_override').innerHTML) ) {
955 return holdsPlaceHold(hold, true);
960 return alert($('hold_dup_exists').innerHTML);
964 if( grep(res, function(e) { return (e.textcode == 'HOLD_ITEM_CHECKED_OUT'); }) ) {
965 if( fetchPermOrgs('HOLD_ITEM_CHECKED_OUT.override')[0] != -1 ) {
966 if( confirm($('hold_checked_out_override').innerHTML) ) {
967 return holdsPlaceHold(hold, true);
972 return alert($('hold_checked_out').innerHTML);
977 alert($('holds_failure').innerHTML);
982 function holdsCancel(holdid, user) {
983 if(!user) user = G.user;
984 var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6);
987 runEvt('common', 'holdUpdated');
990 function holdsUpdate(hold, user) {
991 if(!user) user = G.user;
992 var req = new Request(UPDATE_HOLD, user.session, hold);
994 var x = req.result(); // cause an exception if there is one
995 runEvt('common', 'holdUpdated');
998 /* verify that the thaw date is valid and after today */
999 function holdsVerifyThawDate(dateString, isGreater) {
1000 thawDate = dojo.date.stamp.fromISOString(dateString);
1003 if(dojo.date.compare(thawDate) > 0) {
1004 return dojo.date.stamp.toISOString(thawDate);
1007 return dojo.date.stamp.toISOString(thawDate);
1013 function holdsVerifyThawDateUI(element) {
1014 value = dojo.date.stamp.toISOString(dijit.byId(element).getValue());
1017 removeCSSClass($(element), 'invalid_field');
1021 if(!holdsVerifyThawDate(value, true)) {
1022 addCSSClass($(element), 'invalid_field');
1024 removeCSSClass($(element), 'invalid_field');