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 // grab the list of record desciptors attached to this records metarecord
304 if( ! args.recordDescriptors ) {
307 if (args.type == 'M') {
308 if( !args.metarecord && args.record) {
309 params.metarecord = args.metarecord = args.record;
312 params = { metarecord : args.metarecordObject.doc_id() };
315 params = { record: args.record };
318 if( ! args.record ) {
319 if( args.metarecord )
320 params = { metarecord : args.metarecord };
322 params = { metarecord : args.metarecordObject.doc_id() };
325 var req = new Request(FETCH_MR_DESCRIPTORS, params );
328 var data = r.getResultObject();
329 holdArgs.recordDescriptors = args.recordDescriptors = data.descriptors;
330 holdArgs.metarecord = args.metarecord = data.metarecord;
331 if( args.type == 'M' && ! args.metarecordObject)
332 holdArgs.metarecordObject = args.metarecordObject = findRecord(args.metarecord, 'M');
334 if(doneCallback) doneCallback(args);
340 if(doneCallback) doneCallback(args);
348 function holdsDrawWindow() {
349 swapCanvas($('holds_box'));
350 $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
351 $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
352 $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
353 holdFetchObjects(null,
357 if(holdArgs.editHold) {
358 hideMe($('holds_submit'));
359 unHideMe($('holds_update'));
360 var req = new Request(FETCH_HOLD_STATUS,
361 G.user.session, holdArgs.editHold.id());
363 holdArgs.status = req.result();
364 _holdsUpdateEditHold();
370 function __holdsDrawWindow() {
372 var rec = holdArgs.recordObject;
373 var vol = holdArgs.volumeObject;
374 var copy = holdArgs.copyObject;
375 var mr = holdArgs.metarecordObject;
377 rec = (rec) ? rec : mr;
379 if(!holdsOrgSelectorBuilt) {
380 holdsBuildOrgSelector(null,0);
381 holdsOrgSelectorBuilt = true;
382 var selector = $('holds_org_selector');
385 var o_loc = findOrgUnit(getOrigLocation());
386 var t = findOrgType(o_loc.ou_type());
387 if( t.can_have_users() )
388 setSelector(selector, o_loc.id());
392 setSelector(selector, holdArgs.recipient.home_ou());
398 var dsel = $('holds_depth_selector');
399 unHideMe($('holds_depth_selector_row'));
400 if(dsel.getElementsByTagName('option').length == 0) {
401 var types = globalOrgTypes;
402 var depth = findOrgDepth(G.user.ws_ou());
405 if(t.depth() > depth) return;
406 insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
413 appendClear($('holds_recipient'), text(
414 holdArgs.recipient.family_name() + ', ' +
415 holdArgs.recipient.first_given_name()));
416 appendClear($('holds_title'), text(rec.title()));
417 appendClear($('holds_author'), text(rec.author()));
419 if( holdArgs.type == 'I' ) {
420 unHideMe($('holds_type_row'));
421 unHideMe($('holds_is_issuance'));
422 unHideMe($('holds_issuance_row'));
423 appendClear($('holds_issuance_label'), text(holdArgs.issuanceObject.label()));
425 } else if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
427 unHideMe($('holds_type_row'));
428 unHideMe($('holds_cn_row'));
429 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
431 if( holdArgs.type == 'V' ) {
432 unHideMe($('holds_is_cn'));
433 hideMe($('holds_is_copy'));
436 hideMe($('holds_is_cn'));
437 unHideMe($('holds_is_copy'));
438 unHideMe($('holds_copy_row'));
439 appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
443 hideMe($('holds_type_row'));
444 hideMe($('holds_copy_row'));
445 hideMe($('holds_cn_row'));
446 hideMe($('holds_issuance_row'));
449 removeChildren($('holds_format'));
451 var mods_formats = rec.types_of_resource();
454 if(holdArgs.recordDescriptors)
455 formats = holdArgs.recordDescriptors[0].item_type();
457 if( holdArgs.type == 'T' ) {
458 var desc = grep( holdArgs.recordDescriptors,
460 return (i.record() == holdArgs.record);
463 formats = desc[0].item_type();
466 if( holdArgs.type == 'M' ) {
468 if(holdArgs.editHold){
469 mr_formats = holdArgs.editHold.holdable_formats();
471 mr_formats = ''; // collect the item_type()s from all holdArgs.recordDescriptors
472 for(var desc in holdArgs.recordDescriptors){
473 if (!holdArgs.recordDescriptors[desc].item_type()) continue;
474 mr_formats += holdArgs.recordDescriptors[desc].item_type();
478 for(var desc in holdArgs.recordDescriptors){
479 if (!holdArgs.recordDescriptors[desc].item_form()) continue;
484 mr_formats += holdArgs.recordDescriptors[desc].item_form();
490 var data = holdsParseMRFormats(mr_formats);
491 mods_formats = data.mods_formats;
492 formats = data.formats;
496 for( var i in mods_formats ) {
497 var res = mods_formats[i];
498 var img = elem("img");
499 setResourcePic(img, res);
500 $('holds_format').appendChild(img);
502 $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' '));
504 $('holds_format').appendChild(text(' '+ mods_formats[i] +' '));
505 $('holds_format').appendChild(elem('br'));
509 $('holds_phone').value = holdArgs.recipient.day_phone();
510 appendClear( $('holds_email'), text(holdArgs.recipient.email()));
512 var pref = holdArgs.recipient.prefs[PREF_HOLD_NOTIFY];
515 if( ! pref.match(/email/i) ) {
516 $('holds_enable_email').checked = false;
518 $('holds_enable_email').checked = true;
521 if( ! pref.match(/phone/i) ) {
522 $('holds_phone').disabled = true;
523 $('holds_enable_phone').checked = false;
525 $('holds_phone').disabled = false;
526 $('holds_enable_phone').checked = true;
530 if(!holdArgs.recipient.email()) {
531 $('holds_enable_email').checked = false;
532 $('holds_enable_email').disabled = true;
535 message = noEmailMessageXUL.cloneNode(true);
536 appendClear($('holds_email'), message);
538 message = noEmailMessage.cloneNode(true);
539 appendClear($('holds_email'), message);
540 $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true));
545 if(!$('holds_phone').value)
546 $('holds_enable_phone').checked = false;
548 appendClear($('holds_physical_desc'), text(rec.physical_description()));
550 if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
552 holdsSetFormatSelector();
554 $('holds_frozen_chkbox').checked = false;
555 hideMe($('hold_frozen_thaw_row'));
557 var interval = fetchOrgSettingDefault(holdArgs.recipient.home_ou(), 'circ.hold_expire_interval');
560 secs = interval_to_seconds(interval);
561 var expire = new Date();
562 expire.setTime(expire.getTime() + Number(secs + '000'));
563 dijit.byId('holds_expire_time').setValue(expire);
567 function holdsParseMRFormats(str) {
568 var data = str.split(/-/);
571 var mods_formats = [];
573 for( var i = 0; i < data[0].length; i++ ) {
574 formats.push( data[0].charAt(i) );
575 mods_formats.push( MARCFormatToMods( formats[i] ) );
578 formats = uniquify(formats);
579 mods_formats = uniquify(mods_formats);
583 mods_formats : mods_formats,
590 function holdsSetFormatSelector() {
591 var type = holdArgs.type;
592 if( type == 'C' || type == 'V' || type == "I" || holdArgs.editHold ) return;
594 var data = holdsGetFormats();
595 var avail_formats = data.avail_formats;
596 var sel_formats = data.sel_formats;
597 holdArgs.language = data.lang;
599 hideMe($('holds_alt_formats_row_extras'));
600 unHideMe($('holds_alt_formats_row'));
602 unHideMe($('holds_alt_formats_row_extras'));
605 var selector = $('hold_alt_form_selector');
607 for( var i = 0; i < selector.options.length; i++ ) {
608 if (selector.options[i].className.indexOf('hide_me') == -1)
609 hideMe(selector.options[i]);
612 for( var i = 0; i < avail_formats.length; i++ ) {
613 var form = avail_formats[i];
614 var opt = findFormatSelectorOptByParts(selector,form);
616 if(type=='M') opt.selected=true;
621 function findFormatSelectorOptByParts( sel, val ) {
622 var parts = val.split('-');
623 for( var i = 0; i < sel.options.length; i++ ) {
624 var opt = sel.options[i];
625 var oval = opt.value;
626 var oparts = oval.split('-');
627 if( oparts[0].indexOf(parts[0]) > -1 && (!parts[1] || oparts[1].indexOf(parts[1]) > -1) ) return opt;
632 function holdsGetFormats() {
636 var sformats = []; // selected formats
638 var type = holdArgs.type;
639 var desc = holdArgs.recordDescriptors;
640 var rec = holdArgs.record;
641 var mrec = holdArgs.metarecord;
643 for( var i = 0; i < desc.length; i++ ) {
645 if( type == 'T' && d.item_lang() != lang ) continue;
646 formats.push( _t_f_2_format(d.item_type(), d.item_form()));
649 formats = uniquify(formats);
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);
662 } else if( type =='M') {
664 // All available formats are selected by default in MR holds
665 for( var i = 0; i < formats.length; i++ ) {
666 sformats.push(formats[i]);
672 avail_formats : formats,
673 sel_formats : sformats
679 function _t_f_2_format(type, form) {
680 if( (type == 'a' || type == 't') && form == 's' ) return 'at-s';
681 if( form == 'd' ) return 'at-d';
682 return (type == 'a' || type == 't') ? 'at' : type;
685 function holdsSetSelectedFormats() {
687 var cn = $('holds_alt_formats_row').className;
688 if( cn && cn.match(/hide_me/) ) return;
690 var selector = $('hold_alt_form_selector');
691 var vals = getSelectedList(selector);
693 if(vals.length == 0) return;
697 if( contains(vals, 'at-d') || contains(vals, 'at-s')) {
698 if( contains(vals, 'at') ) {
700 } else if (contains(vals, 'at-s') && contains(vals, 'at-d')) {
702 } else if (!contains(vals, 'at-s')) {
709 for( var i = 0; i < vals.length; i++ ) {
711 if( !val.match(/at/) ) fstring = val + fstring;
714 if( holdArgs.language ) {
715 if( fstring.match(/-/) )
716 fstring = fstring + '-' + holdArgs.language;
718 fstring = fstring + '--' + holdArgs.language;
726 function holdsCheckPossibility(pickuplib, hold, recurse) {
729 titleid : holdArgs.record,
730 mrid : holdArgs.metarecord,
731 volume_id : holdArgs.volume,
732 issuanceid : holdArgs.issuance,
733 copy_id : holdArgs.copy,
734 hold_type : holdArgs.type,
735 patronid : holdArgs.recipient.id(),
737 pickup_lib : pickuplib
741 /* if we're calling create again (recursing),
742 we know that the hold possibility check already succeeded */
743 holdHandleCreateResponse({_recurse:true, _hold:hold}, true );
746 _debug("hold possible args = "+js2JSON(args));
748 var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args );
750 req.request.alertEvent = false;
751 req.request._hold = hold;
752 req.request._recurse = recurse;
753 req.callback(holdHandleCreateResponse);
759 function holdsBuildOrgSelector(node) {
761 if(!node) node = globalOrgTree;
762 if(!isTrue(node.opac_visible())) return;
764 var render_this_org = true;
765 var orgHiding = checkOrgHiding(); // value here is cached so not too painful with the recursion
767 if (node.id() == globalOrgTree.id()) {
768 node = orgHiding.org; // top of tree = org hiding context org
770 if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
771 render_this_org = false;
775 if (render_this_org) {
776 var selector = $('holds_org_selector');
777 var index = selector.options.length;
779 var type = findOrgType(node.ou_type());
780 var indent = type.depth() - 1;
782 var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
783 if(!type.can_have_users()) {
785 addCSSClass(opt, 'disabled_option');
789 for( var i in node.children() ) {
790 var child = node.children()[i];
791 if(child) holdsBuildOrgSelector(child);
795 function holdsBuildHoldFromWindow() {
797 var org = getSelectorVal($('holds_org_selector'));
798 var node = findOrgUnit(org);
799 var ntype = findOrgType(node.ou_type());
800 if(!ntype.can_have_users()) {
801 alertId('holds_pick_good_org');
805 fieldmapper.IDL.load(['ahr']);
806 var hold = new ahr();
807 if(holdArgs.editHold) {
808 hold = holdArgs.editHold;
809 holdArgs.editHold = null;
812 if( $('holds_enable_phone').checked ) {
813 var phone = $('holds_phone').value;
814 if( !phone || !phone.match(REGEX_PHONE) ) {
815 alert($('holds_bad_phone').innerHTML);
818 hold.phone_notify(phone);
821 hold.phone_notify("");
824 if( $('holds_enable_email').checked )
825 hold.email_notify(1);
827 hold.email_notify(0);
829 var target = holdArgs[holdTargetTypeMap[holdArgs.type]];
831 hold.pickup_lib(org);
832 //hold.request_lib(org);
833 hold.requestor(holdArgs.requestor.id());
834 hold.usr(holdArgs.recipient.id());
836 hold.hold_type(holdArgs.type);
838 var expDate = dijit.byId('holds_expire_time').getValue();
840 var expireDate = dojo.date.stamp.toISOString(expDate);
841 expireDate = holdsVerifyThawDate(expireDate);
843 hold.expire_time(expireDate);
848 // see if this hold should be frozen and for how long
849 if($('holds_frozen_chkbox').checked) {
851 unHideMe($('hold_frozen_thaw_row'));
852 var thawDate = dijit.byId('holds_frozen_thaw_input').attr('value');
854 thawDate = dojo.date.stamp.toISOString(thawDate);
855 thawDate = holdsVerifyThawDate(thawDate);
857 hold.thaw_date(thawDate);
861 hold.thaw_date(null);
865 hold.thaw_date(null);
868 //check for alternate hold formats
869 var fstring = holdsSetSelectedFormats();
872 hold.holdable_formats(fstring);
873 hold.target(holdArgs.metarecord);
878 function holdsPlaceHold(hold, recurse) {
880 swapCanvas($('check_holds_box'));
881 holdsCheckPossibility(hold.pickup_lib(), hold, recurse);
885 function holdHandleCreateResponse(r, recurse) {
888 var res = r.getResultObject();
889 if(checkILSEvent(res) || res.success != 1) {
890 if(res.success != 1) {
891 alert($('hold_not_allowed').innerHTML);
893 if( res.textcode == 'PATRON_BARRED' ) {
894 alertId('hold_failed_patron_barred');
896 alert($('hold_not_allowed').innerHTML);
899 swapCanvas($('holds_box'));
902 r._hold.selection_depth(res.depth);
905 holdCreateHold(r._recurse, r._hold);
909 function holdCreateHold( recurse, hold ) {
910 var method = CREATE_HOLD;
911 if(recurse) method = CREATE_HOLD_OVERRIDE;
912 var req = new Request( method, holdArgs.requestor.session, hold );
913 req.request.alertEvent = false;
915 var res = req.result();
916 holdProcessResult(hold, res, recurse);
920 runEvt('common', 'holdUpdated');
924 function holdProcessResult( hold, res, recurse ) {
926 if( res && res > -1 ) {
927 alert($('holds_success').innerHTML);
929 if(isXUL() && typeof xulG.opac_hold_placed == 'function')
930 xulG.opac_hold_placed(res);
935 alert($('holds_failure').innerHTML);
939 if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) {
940 if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) {
941 if( confirm($('hold_dup_exists_override').innerHTML) ) {
942 return holdsPlaceHold(hold, true);
947 return alert($('hold_dup_exists').innerHTML);
951 if( grep(res, function(e) { return (e.textcode == 'HOLD_ITEM_CHECKED_OUT'); }) ) {
952 if( fetchPermOrgs('HOLD_ITEM_CHECKED_OUT.override')[0] != -1 ) {
953 if( confirm($('hold_checked_out_override').innerHTML) ) {
954 return holdsPlaceHold(hold, true);
959 return alert($('hold_checked_out').innerHTML);
964 alert($('holds_failure').innerHTML);
969 function holdsCancel(holdid, user) {
970 if(!user) user = G.user;
971 var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6);
974 runEvt('common', 'holdUpdated');
977 function holdsUpdate(hold, user) {
978 if(!user) user = G.user;
979 var req = new Request(UPDATE_HOLD, user.session, hold);
981 var x = req.result(); // cause an exception if there is one
982 runEvt('common', 'holdUpdated');
985 /* verify that the thaw date is valid and after today */
986 function holdsVerifyThawDate(dateString, isGreater) {
987 thawDate = dojo.date.stamp.fromISOString(dateString);
990 if(dojo.date.compare(thawDate) > 0) {
991 return dojo.date.stamp.toISOString(thawDate);
994 return dojo.date.stamp.toISOString(thawDate);
1000 function holdsVerifyThawDateUI(element) {
1001 value = dojo.date.stamp.toISOString(dijit.byId(element).getValue());
1004 removeCSSClass($(element), 'invalid_field');
1008 if(!holdsVerifyThawDate(value, true)) {
1009 addCSSClass($(element), 'invalid_field');
1011 removeCSSClass($(element), 'invalid_field');