2 attachEvt("common", "run", myOPACInit );
3 //attachEvt("common", "loggedIn", myOPACInit );
4 attachEvt('common','locationUpdated', myopacReload );
6 var fleshedUser = null;
7 var fleshedContainers = {};
9 var holdStatusCache = {};
10 var allowPendingAddr = false;
11 var myopacEnableRefWorks = false;
12 var myopacRefWorksHost = 'http://www.refworks.com';
15 function clearNodes( node, keepArray ) {
17 for( var n in keepArray ) node.removeChild(keepArray[n]);
19 for( var n in keepArray ) node.appendChild(keepArray[n]);
22 function myOPACInit() {
24 var orgHiding = checkOrgHiding();
26 hideMe($('prefs_def_location_row'));
27 hideMe($('prefs_def_range_row'));
30 if(!(G.user && G.user.session)) {
35 allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address');
37 unHideMe($('myopac_pending_addr_td'));
38 myOPACChangePage( "summary" );
41 $('myopac_holds_thaw_date_input').onkeyup =
42 function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
43 $('myopac_holds_thaw_date_input').onchange =
44 function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
48 function myopacReload() {
49 //swapCanvas($('myopac_reloading'));
51 a[PARAM_LOCATION] = getNewSearchLocation();
52 a[PARAM_DEPTH] = getNewSearchDepth();
53 hideMe($('canvas_main'));
54 goTo(buildOPACLink(a, true));
58 function myOPACChangePage( page ) {
61 var s = $("myopac_summary_td");
62 var c = $("myopac_checked_td");
63 var f = $("myopac_fines_td");
64 var h = $("myopac_holds_td");
65 var p = $("myopac_prefs_td");
66 var b = $('myopac_bookbag_td');
68 var ss = $("myopac_summary_div");
69 var cc = $("myopac_checked_div");
70 var ff = $("myopac_fines_div");
71 var hh = $("myopac_holds_div");
72 var pp = $("myopac_prefs_div");
73 var bb = $('myopac_bookbag_div');
75 var cls = "myopac_link";
76 var acls = "myopac_link_active";
79 hideMe(cc); hideMe(ff);
80 hideMe(hh); hideMe(pp);
83 removeCSSClass(s, acls );
84 removeCSSClass(c, acls );
85 removeCSSClass(f, acls );
86 removeCSSClass(h, acls );
87 removeCSSClass(p, acls );
88 removeCSSClass(b, acls );
94 addCSSClass(s, acls );
100 addCSSClass(c, acls );
106 addCSSClass(h, acls );
112 addCSSClass(f, acls );
118 addCSSClass(p, acls );
124 addCSSClass(b, acls);
125 myOPACShowBookbags();
130 function myOPACShowChecked() {
131 if(checkedDrawn) return;
132 var req = new Request(FETCH_CHECKED_OUT_SUM, G.user.session, G.user.id());
133 req.callback(myOPACDrawCheckedOutSlim);
136 var nreq = new Request(FETCH_NON_CAT_CIRCS, G.user.session);
137 nreq.callback(myOPACDrawNonCatCircs);
142 var checkedRowTemplate;
143 var circsCache = new Array();
144 var checkedDrawn = false;
146 function moClearCheckedTable() {
147 var tbody = $("myopac_checked_tbody");
148 var loading = $("myopac_checked_loading");
149 var none = $("myopac_checked_none");
150 clearNodes( tbody, [ loading, none ] );
153 var __can_renew_one = false;
155 function myOPACDrawCheckedOutSlim(r) {
157 var checked = r.getResultObject();
158 var tbody = $("myopac_checked_tbody");
159 var loading = $("myopac_checked_loading");
160 var none = $("myopac_checked_none");
162 __can_renew_one = false;
164 if(checkedDrawn) return;
166 if(!checkedRowTemplate)
167 checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));
169 moClearCheckedTable();
171 hideMe(loading); /* remove all children and start over */
172 if(!(checked && (checked.out || checked.overdue))) {
177 var totalAsync = checked.overdue.length + checked.out.length;
178 var fetchedCircs = [];
179 var collectCircs = function(r) {
180 var circ = r.getResultObject();
182 fetchedCircs.push(circ);
183 if(fetchedCircs.length < totalAsync) return;
185 // sort by due date, oldest to newest
186 fetchedCircs = fetchedCircs.sort(
188 if(a.due_date() > b.due_date()) return 1;
193 dojo.forEach(fetchedCircs,
195 myOPACDrawCheckedItem(circ, tbody);
200 for( var i = 0; i < checked.overdue.length; i++ ) {
201 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.overdue[i]);
202 //req.request.tbody = tbody;
203 req.request.od = true;
204 req.callback(collectCircs);
209 for( var i = 0; i < checked.out.length; i++ ) {
210 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.out[i]);
211 //req.request.tbody = tbody;
212 req.callback(collectCircs);
216 appendClear($('mo_items_out_count'),
217 text(new String( parseInt(checked.overdue.length) + parseInt(checked.out.length) )) );
219 if( checked.overdue.length > 0 ) {
220 addCSSClass($('mo_items_overdue_count'), 'overdue');
221 appendClear($('mo_items_overdue_count'),
222 text(new String( parseInt(checked.overdue.length) )) );
228 //function myOPACDrawCheckedItem(r) {
229 function myOPACDrawCheckedItem(circ, tbody) {
231 //var circ = r.getResultObject();
232 //var tbody = r.tbody;
233 var row = checkedRowTemplate.cloneNode(true);
234 row.id = 'myopac_checked_row_ ' + circ.id();
235 row.setAttribute('circid', circ.id());
237 var due = _trimTime(circ.due_date());
239 var dlink = $n( row, "myopac_checked_due" );
240 var rlink = $n( row, "myopac_checked_renewals" );
241 //var rnlink = $n( row, "myopac_checked_renew_link" );
243 //if( r.od ) due = elem('b', {style:'color:red;font-size:110%'},due);
245 due = elem('b', null, due);
246 addCSSClass(due, 'overdue');
251 dlink.appendChild(due);
252 rlink.appendChild(text(circ.renewal_remaining()));
254 //rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');
255 circsCache.push(circ);
257 if( circ.renewal_remaining() < 1 ) {
258 $n(row, 'selectme').disabled = true;
260 $('mo_renew_button').disabled = true;
262 __can_renew_one = true;
263 $('mo_renew_button').disabled = false;
264 $n(row, 'selectme').disabled = false;
267 tbody.appendChild(row);
269 var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );
270 req.request.alertEvent = false;
271 req.request.circ = circ.id();
272 req.request.copy = circ.target_copy();
273 req.callback(myOPACDrawCheckedTitle);
277 var __circ_titles = {};
279 function myOPACDrawCheckedTitle(r) {
280 var record = r.getResultObject();
283 if(!record || checkILSEvent(record)) {
284 var req = new Request( FETCH_COPY, r.copy );
285 req.request.circ = circid
286 req.callback(myOPACDrawNonCatalogedItem);
291 var row = $('myopac_checked_row_ ' + circid);
292 var tlink = $n( row, "myopac_checked_title_link" );
293 var alink = $n( row, "myopac_checked_author_link" );
294 buildTitleDetailLink(record, tlink);
295 buildSearchLink(STYPE_AUTHOR, record.author(), alink);
296 __circ_titles[circid] = record.title();
299 function myOPACDrawNonCatalogedItem(r) {
300 var copy = r.getResultObject();
303 var row = $('myopac_checked_row_ ' + circid);
304 var tlink = $n( row, "myopac_checked_title_link" );
305 var alink = $n( row, "myopac_checked_author_link" );
307 tlink.parentNode.appendChild(text(copy.dummy_title()));
308 alink.parentNode.appendChild(text(copy.dummy_author()));
309 __circ_titles[circid] = copy.dummy_title();
314 function myOPACRenewCirc(circid) {
317 for( var i = 0; i != circsCache.length; i++ )
318 if(circsCache[i].id() == circid)
319 circ = circsCache[i];
321 if(!confirm($('myopac_renew_confirm').innerHTML)) return;
323 var req = new Request(RENEW_CIRC, G.user.session,
324 { patron : G.user.id(), copyid : circ.target_copy(), opac_renewal : 1 } );
325 req.request.alertEvent = false;
327 var res = req.result();
329 if(checkILSEvent(res) || checkILSEvent(res[0])) {
330 alertId('myopac_renew_fail');
334 alert($('myopac_renew_success').innerHTML);
335 checkedDrawn = false;
342 function myOPACShowHolds() {
343 var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());
344 req.callback(myOPACDrawHolds);
346 $('myopac_holds_actions_none').selected = true;
349 var holdsTemplateRowOrig;
350 var holdsTemplateRow;
351 var myopacForceHoldsRedraw = false;
352 function myOPACDrawHolds(r) {
354 var tbody = $("myopac_holds_tbody");
355 if(holdsTemplateRow && !myopacForceHoldsRedraw) return;
356 myopacForceHoldsRedraw = false;
358 if(holdsTemplateRowOrig) {
359 holdsTemplateRow = holdsTemplateRowOrig;
360 removeChildren(tbody);
362 holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));
363 holdsTemplateRowOrig = holdsTemplateRow;
366 hideMe($('myopac_holds_loading'));
368 var holds = r.getResultObject();
370 if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));
371 for( var i = 0; i != holds.length; i++ ) {
374 holdCache[h.id()] = h;
376 var row = holdsTemplateRow.cloneNode(true);
377 row.id = "myopac_holds_row_" + h.id();
379 var form = $n(row, "myopac_holds_formats");
380 form.id = "myopac_holds_form_" + h.id();
382 var orglink = $n(row, "myopac_holds_location");
383 orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
385 tbody.appendChild(row);
387 $n(row,'myopac_holds_edit_link').setAttribute(
388 'href','javascript:myOPACEditHold("'+ h.id()+'");');
390 if(isTrue(h.frozen())) {
391 hideMe($n(row, 'myopac_hold_unfrozen_true'))
392 unHideMe($n(row, 'myopac_hold_unfrozen_false'))
394 var d = dojo.date.stamp.fromISOString(h.thaw_date());
395 $n(row, 'myopac_holds_frozen_until').appendChild(text(dojo.date.locale.format(d, {selector: 'date', fullYear: true})));
398 unHideMe($n(row, 'myopac_hold_unfrozen_true'))
399 hideMe($n(row, 'myopac_hold_unfrozen_false'))
402 $n(row, 'myopac_holds_selected_chkbx').checked = false;
405 if(h.expire_time()) {
406 exp_date = dojo.date.stamp.fromISOString(h.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3"));
407 $n(row, 'myopac_hold_expire_time').appendChild(
408 text(dojo.date.locale.format(exp_date, {selector:'date'})));
413 var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_alert_interval');
414 if(interval && exp_date) {
415 secs = interval_to_seconds(interval) * 1000;
416 var diff = exp_date.getTime() - new Date().getTime();
418 addCSSClass($n(row, 'myopac_hold_expire_time'), 'hold_expire_warning');
421 myOPACDrawHoldTitle(h);
422 myOPACDrawHoldStatus(h);
426 function myOPACEditHold(holdid) {
427 var hold = holdCache[holdid];
432 onComplete : function(){
433 holdsTemplateRow = null;
441 function myOPACDrawHoldStatus(hold) {
442 var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );
443 req.callback(myOShowHoldStatus);
444 req.request.hold = hold;
448 var myopacShowHoldEstimate = false;
449 function myOShowHoldStatus(r) {
452 var qstats = r.getResultObject();
453 holdStatusCache[hold.id()] = qstats;
455 var row = $("myopac_holds_row_" + r.hold.id());
457 if(qstats.estimated_wait || myopacShowHoldEstimate) {
458 myopacShowHoldEstimate = true;
459 if(qstats.estimated_wait) {
460 // wait is currently returned in seconds, but displayed in days
461 var wait = Math.ceil(qstats.estimated_wait / 86400);
462 $n(row, 'myopac_holds_estimated_wait').appendChild(text(wait));
464 unHideMe($('myopac_holds_estimated_wait_column'));
465 unHideMe($n(row, 'myopac_holds_estimated_wait'));
468 if( qstats.status == 4 ) {
469 unHideMe($n(row, 'hold_status_available'));
470 hideMe($n(row, 'myopac_holds_cancel_link'));
474 var node = $n(row, 'hold_qstats');
475 // XXX best way to display this info + dojo i18n
476 node.appendChild(text('hold #' + qstats.queue_position+' of '+qstats.queue_position+' and '+qstats.potential_copies+' item(s)'));
480 if( qstats.status < 3 )
481 unHideMe($n(row, 'hold_status_waiting'));
483 if( qstats.status == 3 )
484 unHideMe($n(row, 'hold_status_transit'));
489 function myOPACDrawHoldTitle(hold) {
492 if( hold.hold_type() == 'T' || hold.hold_type() == 'M' ) {
493 if(hold.hold_type() == "M") method = FETCH_MRMODS;
494 if(hold.hold_type() == "T") method = FETCH_RMODS;
495 var req = new Request(method, hold.target());
496 req.callback(myOPACFleshHoldTitle);
497 req.request.hold = hold;
498 req.request.alertEvent = false;
502 holdFetchObjects(hold,
503 function(a) { _myOPACFleshHoldTitle(hold, a);});
507 function myOPACFleshHoldTitle(r) {
508 var rec = r.getResultObject();
509 _myOPACFleshHoldTitle(r.hold, {recordObject: rec});
512 function _myOPACFleshHoldTitle(hold, holdObjects) {
514 var record = holdObjects.recordObject;
515 var volume = holdObjects.volumeObject;
516 var copy = holdObjects.copyObject;
518 var row = $("myopac_holds_row_" + hold.id());
519 var title_link = $n(row, "myopac_holds_title_link");
520 var author_link = $n(row, "myopac_holds_author_link");
522 if(!record || checkILSEvent(record) ) {
523 addCSSClass(row, 'invalid_hold');
524 $n(row, 'myopac_holds_edit_link').setAttribute('href', 'javascript:void(0);');
525 $n(row, 'myopac_holds_edit_link').onclick = function(){alertId('invalid_hold');};
529 buildTitleDetailLink(record, title_link);
530 buildSearchLink(STYPE_AUTHOR, record.author(), author_link);
533 $n(row, 'volume').appendChild(text(volume.label()));
534 unHideMe($n(row, 'vol_copy'));
535 if(copy) $n(row, 'copy').appendChild(text(copy.barcode()));
538 var form = $("myopac_holds_form_" + hold.id());
541 var mods_formats = record.types_of_resource();
543 if( hold.hold_type() == 'M' ) {
544 var data = holdsParseMRFormats(hold.holdable_formats());
545 mods_formats = data.mods_formats;
548 for( var i = 0; i < mods_formats.length; i++ ) {
549 var img = elem("img");
550 setResourcePic(img, mods_formats[i]);
551 form.appendChild(img);
556 var finesShown = false;
557 function myOPACShowFines() {
558 if(finesShown) return; finesShown = true;
559 var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );
560 req.callback(_myOPACShowFines);
564 function _myOPACShowFines(r) {
565 hideMe($('myopac_fines_summary_loading'));
566 unHideMe($('myopac_fines_summary_row'));
568 var summary = r.getResultObject();
569 var total = "0.00"; /* localization? */
571 var balance = "0.00";
572 if( instanceOf(summary,mous) ) {
574 total = _finesFormatNumber(summary.total_owed());
575 paid = _finesFormatNumber(summary.total_paid());
576 balance = _finesFormatNumber(summary.balance_owed());
578 var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );
579 req.callback(myOPACShowTransactions);
583 $('myopac_fines_summary_total').appendChild(text(total));
584 $('myopac_fines_summary_paid').appendChild(text(paid));
585 $('myopac_fines_summary_balance').appendChild(text(balance));
588 function _finesFormatNumber(num) {
589 if(isNull(num)) num = 0;
591 if(num.length < 2 || !num.match(/\./)) num += ".00";
592 if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0";
596 //function _trimTime(time) { if(!time) return ""; return time.replace(/\ .*/,""); }
597 function _trimTime(time) {
599 time = time.replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3");
600 var d = dojo.date.stamp.fromISOString(time);
601 if(!d) return ""; /* date parse failed */
602 return dojo.date.locale.format(d, {"formatLength": "medium"});
605 function _trimSeconds(time) {
607 var d = dojo.date.stamp.fromISOString(time.replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3"));
608 if(!d) return ""; /* date parse failed */
609 return dojo.date.locale.format(d, { "timePattern" : "h:ma", "formatLength" : "medium" });
612 function myOPACShowTransactions(r) {
614 if(myopacGenericTransTemplate || myopacCircTransTemplate) return;
616 var transactions = r.getResultObject();
618 for( var idx in transactions ) {
620 var trans = transactions[idx].transaction;
621 var record = transactions[idx].record;
622 var circ = transactions[idx].circ;
624 if(trans.xact_type() == 'circulation')
625 myOPACShowCircTransaction(trans, record, circ);
627 else if(trans.xact_type() == 'grocery' )
628 myopacShowGenericTransaction( trans );
630 /* XXX need to copy circulation output function here
631 else if(trans.xact_type() == 'reservation' )
632 myopacShowReservationTransaction( trans );
638 var myopacGenericTransTemplate;
639 function myopacShowGenericTransaction( trans ) {
640 var tbody = $('myopac_trans_tbody');
642 if(!myopacGenericTransTemplate) {
643 myopacGenericTransTemplate =
644 tbody.removeChild($('myopac_trans_row'));
645 removeChildren(tbody);
648 var row = myopacGenericTransTemplate.cloneNode(true);
650 $n(row,'myopac_trans_start').appendChild(
651 text(_trimSeconds(trans.xact_start())));
653 $n(row,'myopac_trans_last_payment').appendChild(
654 text(_trimSeconds(trans.last_payment_ts())));
656 $n(row,'myopac_trans_init_amount').appendChild(
657 text(_finesFormatNumber(trans.total_owed())));
659 $n(row,'myopac_trans_total_paid').appendChild(
660 text(_finesFormatNumber(trans.total_paid())));
662 $n(row,'myopac_trans_balance').appendChild(
663 text(_finesFormatNumber(trans.balance_owed())));
665 var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id());
667 var bills = req.result();
668 if(bills && bills[0])
669 $n(row,'myopac_trans_bill_type').appendChild(
670 text(bills[0].billing_type()));
672 tbody.appendChild(row);
673 unHideMe($('myopac_trans_div'));
678 /* draws a circulation transaction summary */
679 var myopacCircTransTemplate;
680 function myOPACShowCircTransaction(trans, record, circ) {
681 var tbody = $('myopac_circ_trans_tbody');
683 if(!myopacCircTransTemplate) {
684 myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));
685 removeChildren(tbody);
688 var row = myopacCircTransTemplate.cloneNode(true);
691 buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title'));
693 $n(row,'myopac_circ_trans_author').appendChild(text(
694 normalize(truncate(record.author(), 65))));
698 var req = new Request( FETCH_COPY, circ.target_copy() );
699 req.alertEvents = false;
701 var copy = req.result();
703 $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title()));
704 $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author()));
709 $n(row,'myopac_circ_trans_start').
710 appendChild(text(_trimTime(trans.xact_start())));
711 var due = _trimTime(circ.due_date());
712 var checkin = _trimTime(circ.stop_fines_time());
714 $n(row,'myopac_circ_trans_due').appendChild(text(due))
716 appendClear($n(row,'myopac_circ_trans_finished'), text(checkin));
717 if(circ.stop_fines() == 'LOST')
718 appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines()));
719 if(circ.stop_fines() == 'CLAIMSRETURNED')
720 appendClear($n(row,'myopac_circ_trans_finished'), text(""));
723 $n(row,'myopac_circ_trans_balance').
724 appendChild(text(_finesFormatNumber(trans.balance_owed())));
726 tbody.appendChild(row);
727 unHideMe($('myopac_circ_trans_div'));
731 function myOPACSavePrefs() {
732 G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per'));
733 G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font'));
734 G.user.prefs[PREF_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));
735 G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range'));
737 if( $('myopac_pref_home_lib').checked == true )
738 G.user.prefs[PREF_DEF_LOCATION] = null;
740 G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location'));
742 if(commitUserPrefs())
743 alert($('prefs_update_success').innerHTML);
744 else alert($('prefs_update_failure').innerHTML);
748 function myOPACShowDefFont() {
750 if(G.user.prefs[PREF_DEF_FONT])
751 font = G.user.prefs[PREF_DEF_FONT];
752 else font = "regular";
753 setSelector($('prefs_def_font'), font);
756 function myOPACShowHoldNotify() {
757 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
760 if(pref.match(/email/i) && pref.match(/phone/i)) {
761 setSelector($('prefs_hold_notify'), 'phone:email');
762 } else if( pref.match(/email/i) ) {
763 setSelector($('prefs_hold_notify'), 'email');
764 } else if( pref.match(/phone/i) ) {
765 setSelector($('prefs_hold_notify'), 'phone');
769 setSelector($('prefs_hold_notify'), 'phone:email');
773 function myOPACShowPrefs() {
777 myOPACShowHoldNotify();
778 myOPACShowDefLocation();
779 hideMe($('myopac_prefs_loading'));
782 var defSearchLocationDrawn = false;
783 var defDepthIndex = 0;
784 function myOPACShowDefLocation() {
786 var selector = $('prefs_def_location');
787 var rsel = $('prefs_def_range');
789 if(!defSearchLocationDrawn) {
791 defSearchLocationDrawn = true;
793 var org = G.user.prefs[PREF_DEF_LOCATION];
796 $('myopac_pref_home_lib').checked = true;
797 $('prefs_def_location').disabled = true;
798 org = G.user.home_ou();
801 buildOrgSel(selector, globalOrgTree, 0);
803 globalOrgTypes = globalOrgTypes.sort(
805 if( a.depth() < b.depth() ) return -1;
810 iterate(globalOrgTypes,
812 if( t.depth() <= findOrgDepth(org) ) {
813 setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth());
814 if( t.depth() == findOrgDepth(org) )
815 setSelector(rsel, t.depth());
821 setSelector(selector, org);
824 function myOPACShowHitsPer() {
826 if(G.user.prefs[PREF_HITS_PER])
827 hits = G.user.prefs[PREF_HITS_PER];
828 var hitsSel = $('prefs_hits_per');
829 setSelector(hitsSel, hits);
832 var userShown = false;
833 function myOPACShowSummary() {
834 if(userShown) return; userShown = true;
835 var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());
836 req.callback(_myOPACSummaryShowUer);
842 function _myOPACSummaryShowUer(r) {
844 var user = r.getResultObject();
848 var expireDate = dojo.date.stamp.fromISOString(user.expire_date());
849 if( expireDate < new Date() ) {
850 appendClear($('myopac.expired.date'), dojo.date.locale.format(expireDate, { "formatLength" : "medium", "selector" : "date" }));
851 unHideMe($('myopac.expired.alert'));
854 var iv1 = user.ident_value()+'';
855 if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********';
858 appendClear($('myopac_summary_prefix'),text(user.prefix()));
859 appendClear($('myopac_summary_first'),text(user.first_given_name()));
860 appendClear($('myopac_summary_middle'),text(user.second_given_name()));
861 appendClear($('myopac_summary_dayphone'),text(user.day_phone()));
862 appendClear($('myopac_summary_eveningphone'),text(user.evening_phone()));
863 appendClear($('myopac_summary_otherphone'),text(user.other_phone()));
864 appendClear($('myopac_summary_last'),text(user.family_name()));
865 appendClear($('myopac_summary_suffix'),text(user.suffix()));
866 appendClear($('myopac_summary_username'),text(user.usrname()));
867 appendClear($('myopac_summary_email'),text(user.email()));
868 appendClear($('myopac_summary_barcode'),text(user.card().barcode()));
869 appendClear($('myopac_summary_ident1'),text(iv1));
870 appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name()));
871 appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date())));
873 var req = new Request(
874 FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()});
875 req.callback(myopacDrawNotes);
879 var tbody = $('myopac_addr_tbody');
882 if(addrRowTemplate) {
883 template = addrRowTemplate;
885 template = tbody.removeChild($('myopac_addr_row'));
886 addrRowTemplate = template;
888 removeChildren(tbody);
890 var addrs = user.addresses();
891 for( var a in addrs ) {
893 if(!allowPendingAddr && isTrue(addr.pending()))
895 if(addr.replaces() != null) continue;
896 var row = template.cloneNode(true);
897 myOPACDrawAddr(row, addr, addrs);
898 tbody.appendChild(row);
903 function myopacDrawNotes(r) {
904 var notes = r.getResultObject();
905 var tbody = $('myopac.notes.tbody');
907 notesTemplate = tbody.removeChild($('myopac.notes.tr'));
908 removeChildren(tbody);
912 unHideMe($('myopac.notes.div'));
913 var row = notesTemplate.cloneNode(true);
914 $n(row, 'title').appendChild(text(note.title()));
915 $n(row, 'value').appendChild(text(note.value()));
916 tbody.appendChild(row);
923 function myOPACDrawAddr(row, addr, addrs) {
924 appendClear($n(row, 'myopac_addr_type'),text(addr.address_type()));
925 appendClear($n(row, 'myopac_addr_street'),text(addr.street1()));
926 appendClear($n(row, 'myopac_addr_street2'),text(addr.street2()));
927 appendClear($n(row, 'myopac_addr_city'),text(addr.city()));
928 appendClear($n(row, 'myopac_addr_county'),text(addr.county()));
929 appendClear($n(row, 'myopac_addr_state'),text(addr.state()));
930 appendClear($n(row, 'myopac_addr_country'),text(addr.country()));
931 appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code()));
933 if(!isTrue(addr.valid()))
934 unHideMe($n(row, 'myopac_invalid_addr_row'));
936 if(!allowPendingAddr) return;
938 $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)};
939 unHideMe($n(row, 'myopac_addr_edit_td'));
941 /* if we have a replacement address, plop it into the table next to this addr */
942 var repl = grep(addrs,
944 return a.replaces() == addr.id();
948 $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id();
951 hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link
953 myopacSetAddrInputs(row, repl);
957 function myopacEditAddress(addr) {
958 var td = $('myopac_pending_addr_td_' + addr.id());
959 var row = td.parentNode;
960 myopacSetAddrInputs(row, addr);
963 function myopacSetAddrInputs(row, addr, prefix) {
964 unHideMe($n(row, 'myopac_pending_addr_td'));
965 $n(row, 'myopac_pending_addr_type').value = addr.address_type();
966 $n(row, 'myopac_pending_addr_street').value = addr.street1();
967 $n(row, 'myopac_pending_addr_street2').value = addr.street2();
968 $n(row, 'myopac_pending_addr_city').value = addr.city();
969 $n(row, 'myopac_pending_addr_county').value = addr.county();
970 $n(row, 'myopac_pending_addr_state').value = addr.state();
971 $n(row, 'myopac_pending_addr_country').value = addr.country();
972 $n(row, 'myopac_pending_addr_zip').value = addr.post_code();
973 $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)};
974 $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)};
977 // if no pending addr exists, this is called with the original address
978 function myopacSaveAddress(row, addr, deleteMe) {
980 if(addr.replaces() == null) {
981 // we are editing a non-pending address. create a pending address to manage that
982 var repl = new aua();
983 repl.usr(addr.usr());
984 repl.address_type(addr.address_type());
985 repl.within_city_limits(addr.within_city_limits());
986 repl.replaces(addr.id());
994 if(addr.id() == null) {
995 hideMe($n(row, 'myopac_pending_addr_td'));
998 addr.isdeleted(true);
1000 addr.address_type($n(row, 'myopac_pending_addr_type').value);
1001 addr.street1($n(row, 'myopac_pending_addr_street').value);
1002 addr.street2($n(row, 'myopac_pending_addr_street2').value);
1003 addr.city($n(row, 'myopac_pending_addr_city').value);
1004 addr.county($n(row, 'myopac_pending_addr_county').value);
1005 addr.state($n(row, 'myopac_pending_addr_state').value);
1006 addr.country($n(row, 'myopac_pending_addr_country').value);
1007 addr.post_code($n(row, 'myopac_pending_addr_zip').value);
1010 var req = new Request(
1011 'open-ils.actor:open-ils.actor.user.address.pending.cud',
1012 G.user.session, addr);
1016 var resp = r.getResultObject();
1019 // new, add to list of addrs
1021 fleshedUser.addresses().push(addr);
1024 // deleted, remove from list of addrs
1025 if(addr.isdeleted()) {
1026 hideMe($n(row, 'myopac_pending_addr_td'));
1028 for(var i in fleshedUser.addresses()) {
1029 var a = fleshedUser.addresses()[i];
1030 if(a.id() != addr.id())
1033 fleshedUser.addresses(addrs);
1036 alertId('myopac_addr_changes_saved');
1043 function myOPACUpdateUsername() {
1044 var username = $('myopac_new_username').value;
1045 if(username == null || username == "") {
1046 alert($('myopac_username_error').innerHTML);
1050 if( username.match(/.*\s.*/) ) {
1051 alert($('myopac_invalid_username').innerHTML);
1055 r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex');
1056 if(r) REGEX_BARCODE = new RegExp(r);
1058 if(username.match(REGEX_BARCODE)) {
1059 alert($('myopac_invalid_username').innerHTML);
1063 /* first see if the requested username is taken */
1064 var req = new Request(CHECK_USERNAME, G.user.session, username);
1066 var res = req.result();
1067 /* If the username does not already exist, res will be null;
1068 * we can move on to updating the username.
1070 * If the username does exist, then res will be the user ID.
1071 * G.user.id() gives us the currently authenticated user ID.
1072 * If res == G.user.id(), we try to update the username anyways.
1074 if( res !== null && res != G.user.id() ) {
1075 alertId('myopac_username_dup');
1079 var req = new Request(UPDATE_USERNAME, G.user.session, username );
1084 var res = req.result();
1085 if(evt = checkILSEvent(res)) {
1090 G.user.usrname(username);
1091 hideMe($('myopac_update_username_row'));
1093 alertId('myopac_username_success');
1094 myOPACShowSummary();
1098 alert($('myopac_username_failure').innerHTML);
1101 function myOPACUpdateEmail() {
1102 var email = $('myopac_new_email').value;
1103 if(email == null || email == "") {
1104 alert($('myopac_email_error').innerHTML);
1108 var req = new Request(UPDATE_EMAIL, G.user.session, email );
1111 G.user.email(email);
1112 hideMe($('myopac_update_email_row'));
1114 alertId('myopac_email_success');
1115 myOPACShowSummary();
1119 alert($('myopac_email_failure').innerHTML);
1123 function myOPACUpdatePassword() {
1124 var curpassword = $('myopac_current_password').value;
1125 var password = $('myopac_new_password').value;
1126 var password2 = $('myopac_new_password2').value;
1128 if( curpassword == null || curpassword == "" ||
1129 password == null || password == "" ||
1130 password2 == null || password2 == "" || password != password2 ) {
1131 alert($('myopac_password_error').innerHTML);
1135 if(!strongPassword(password, true)) return;
1137 var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword );
1140 hideMe($('myopac_update_password_row'));
1142 alertId('myopac_password_success');
1143 myOPACShowSummary();
1147 alert($('myopac_password_failure').innerHTML);
1153 var containerTemplate;
1154 function myOPACShowBookbags(force) {
1156 var tbody =$('myopac_bookbag_tbody') ;
1158 if(!containerTemplate)
1159 containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));
1160 else if(!force) return;
1162 removeChildren(tbody);
1164 var containers = containerFetchAll();
1167 for( var i in containers ) {
1169 var cont = containers[i];
1170 var row = containerTemplate.cloneNode(true);
1171 row.id = 'myopac_bookbag_row_' + cont.id();
1172 var link = $n(row, 'myopac_expand_bookbag');
1173 var dlink = $n(row, 'myopac_container_delete');
1174 link.appendChild( text(cont.name()) );
1175 link.setAttribute('href',
1176 'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');
1177 myOPACFetchBBItems( cont.id(), row );
1178 dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');
1180 if( isTrue(cont.pub()) ) {
1181 unHideMe($n(row, 'myopac_bb_published_yes'));
1182 var link = $n(row, 'myopac_bb_published_view');
1183 link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html-full/'+cont.id(), false));
1184 link.setAttribute('target', '_blank' );
1187 link = $n(row, 'myopac_bb_published_atom');
1188 link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));
1189 link.setAttribute('target', '_blank' );
1192 link = $n(row, 'myopac_bb_make_unpublished');
1193 link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');
1196 var RW = $n(row, 'myopac_bb_exp_refworks');
1197 if (RW && myopacEnableRefWorks) {
1198 var here = (findOrgUnit(getLocation())).name();
1199 var org_name = here.replace(" ", "+");
1200 var cgi = new CGI();
1202 RW.setAttribute('href',
1203 myopacRefWorksHost + '/express/expressimport.asp?vendor='
1205 + '&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F'
1206 + cgi.server_name + '/opac/extras/feed/bookbag/marctxt-full/'
1209 RW.setAttribute('target', 'RefWorksMain');
1210 unHideMe($n(row, 'myopac_bb_exp_refworks'));
1213 unHideMe($n(row, 'myopac_bb_published_no'));
1214 var link = $n(row, 'myopac_bb_make_published');
1215 link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');
1219 tbody.appendChild(row);
1222 if(!found) unHideMe($('myopac_bookbags_none'));
1223 else unHideMe($('myopac_bookbag_table'));
1226 function myOPACMakeBBPublished(bbid, hideme) {
1228 var bb = fleshedContainers[bbid];
1231 if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;
1234 if(!confirm($('myopac_make_published_confirm').innerHTML)) return;
1238 var result = containerUpdate(bb);
1240 var code = checkILSEvent(result);
1241 if(code) { alertILSEvent(result); return; }
1243 alert($('myopac_bb_update_success').innerHTML);
1244 myOPACShowBookbags(true);
1249 function myOPACDeleteBookbag(id) {
1250 if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {
1251 var result = containerDelete(id);
1252 var code = checkILSEvent(result);
1253 if(code) { alertILSEvent(result); return; }
1254 alert($('myopac_bb_update_success').innerHTML);
1255 hideMe($('myopac_bookbag_items_table'));
1256 hideMe($('myopac_bookbag_items_name'));
1257 hideMe($('myopac_bookbag_no_items'));
1258 myOPACShowBookbags(true);
1262 function myOPACFetchBBItems( id, row, block ) {
1264 containerFlesh( id, _myOPACSetBBItems, { row: row } );
1266 var cont = containerFlesh(id);
1267 myOPACSetBBItems( cont, row );
1271 function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }
1273 function myOPACSetBBItems( container, row ) {
1274 fleshedContainers[container.id()] = container;
1275 var node = $n(row, 'myopac_bookbag_item_count');
1276 removeChildren(node);
1277 node.appendChild( text(container.items().length) );
1281 function myOPACExpandBookbag( id, name ) {
1283 var tbody = $('myopac_bookbag_items_tbody');
1284 if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));
1285 removeChildren(tbody);
1286 removeChildren($('myopac_bookbag_items_name'));
1288 $('myopac_bookbag_items_name').appendChild(text(name));
1290 if( fleshedContainers[id] ) {
1291 var len = fleshedContainers[id].items().length;
1294 unHideMe($('myopac_bookbag_no_items'));
1295 hideMe($('myopac_bookbag_items_table'));
1299 hideMe($('myopac_bookbag_no_items'));
1300 unHideMe($('myopac_bookbag_items_table'));
1302 for( var i = 0; i != len; i++ ) {
1303 var row = BBItemsRow.cloneNode(true);
1306 var item = fleshedContainers[id].items()[i];
1307 var tlink = $n(row,'myopac_bookbag_items_title');
1308 var alink = $n(row,'myopac_bookbag_items_author');
1310 var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );
1311 req.request.tlink = tlink;
1312 req.request.alink = alink;
1313 req.callback(myOPACShowBBItem);
1316 var clink = $n(row, 'myopac_bookbag_items_remove');
1317 clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');
1319 tbody.appendChild(row);
1324 function myOPACRemoveBBItem( id, containerid, container_name ) {
1325 if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;
1326 var stat = containerRemoveItem( id );
1327 if(stat) alert($('myopac_bb_update_success').innerHTML);
1328 myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);
1329 myOPACExpandBookbag( containerid, container_name );
1332 function myOPACShowBBItem(r) {
1333 var record = r.getResultObject();
1334 buildTitleDetailLink(record, r.tlink);
1335 buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);
1338 function myOPACCreateBookbag() {
1339 var name = $('myopac_bookbag_new_name').value;
1343 for( var c in fleshedContainers ) { exists = true; break; }
1345 /* let them know what they are getting into... */
1346 if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return;
1348 var result = containerCreate( name, $('bb_public_yes').checked );
1349 var code = checkILSEvent(result);
1350 if(code) { alertILSEvent(result); return; }
1351 if(result) alert($('myopac_bb_update_success').innerHTML);
1352 myOPACShowBookbags(true);
1356 /* ---------------------------------------------------------------------- */
1358 /* ---------------------------------------------------------------------- */
1362 /* if we have some circs, grab the non-cat types */
1363 function myOPACDrawNonCatCircs(r) {
1364 var ids = r.getResultObject();
1365 if(ids.length == 0) return;
1366 nonCatCircIds = ids;
1367 unHideMe($('non_cat_circs_div'));
1368 var req = new Request(FETCH_NON_CAT_TYPES, G.user.home_ou());
1369 req.callback(myOPACDrawNonCatCircs2);
1374 /* now we have circs and the types.. draw each one */
1377 function myOPACDrawNonCatCircs2(r) {
1378 nonCatTypes = r.getResultObject();
1379 nonCatTbody = $('non_cat_circs_tbody');
1380 if(!nonCatRow) nonCatRow =
1381 nonCatTbody.removeChild($('non_cat_circs_row'));
1382 removeChildren(nonCatTbody);
1383 for( var i in nonCatCircIds ) {
1384 var req = new Request(FETCH_NON_CAT_CIRC, G.user.session, nonCatCircIds[i]);
1385 req.callback(myOPACDrawNonCatCirc);
1391 /* draw a single circ */
1392 function myOPACDrawNonCatCirc(r) {
1393 var circ = r.getResultObject();
1396 var type = grep(nonCatTypes,
1398 return (i.id() == circ.item_type());
1403 var row = nonCatTbody.appendChild(nonCatRow.cloneNode(true));
1404 appendClear($n(row, 'circ_lib'), text(findOrgUnit(circ.circ_lib()).name()));
1405 appendClear($n(row, 'item_type'), text(type.name()));
1408 $n(row, 'circ_time'),
1409 text(dojo.date.locale.format(
1410 dojo.date.stamp.fromISOString(circ.duedate()),
1419 function myopacSelectAllChecked() {
1420 __myopacSelectChecked(true);
1423 function myopacSelectNoneChecked() {
1424 __myopacSelectChecked(false);
1427 function __myopacSelectChecked(value) {
1428 var rows = myopacGetCheckedOutRows();
1429 for( var i = 0; i < rows.length; i++ ) {
1431 var box = $n(row, 'selectme');
1432 if( box && ! box.disabled )
1433 box.checked = value;
1437 function myopacGetCheckedOutRows() {
1439 var tbody = $('myopac_checked_tbody');
1440 var children = tbody.childNodes;
1441 for( var i = 0; i < children.length; i++ ) {
1442 var child = children[i];
1443 if( child.nodeName.match(/^tr$/i) )
1444 if( $n(child, 'selectme') )
1450 var __renew_circs = [];
1452 /* true if 1 renewal succeeded */
1453 var __success_count = 0;
1455 /* renews all selected circulations */
1456 function myOPACRenewSelected() {
1457 var rows = myopacGetCheckedOutRows();
1458 if(!confirm($('myopac_renew_confirm').innerHTML)) return;
1459 __success_count = 0;
1461 for( var i = 0; i < rows.length; i++ ) {
1464 if( ! $n(row, 'selectme').checked ) continue;
1465 var circ_id = row.getAttribute('circid');
1468 for( var j = 0; j != circsCache.length; j++ )
1469 if(circsCache[j].id() == circ_id)
1470 circ = circsCache[j];
1472 __renew_circs.push(circ);
1475 if( __renew_circs.length == 0 ) return;
1477 unHideMe($('my_renewing'));
1478 moClearCheckedTable();
1480 for( var i = 0; i < __renew_circs.length; i++ ) {
1481 var circ = __renew_circs[i];
1482 moRenewCirc( circ.target_copy(), G.user.id(), circ );
1487 /* renews a single circulation */
1488 function moRenewCirc(copy_id, user_id, circ) {
1490 _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id);
1491 var req = new Request(RENEW_CIRC, G.user.session,
1498 req.request.alertEvent = false;
1499 req.callback(myHandleRenewResponse);
1500 req.request.circ = circ;
1506 /* handles the circ renew results */
1507 function myHandleRenewResponse(r) {
1508 var res = r.getResultObject();
1511 /* remove this circ from the list of circs to renew */
1512 __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); });
1514 _debug("handling renew result for " + circ.id());
1516 if(checkILSEvent(res) || checkILSEvent(res[0]))
1517 alertIdText('myopac_renew_fail', __circ_titles[circ.id()]);
1518 else __success_count++;
1520 if(__renew_circs) return; /* more to come */
1524 if( __success_count > 0 )
1525 alertIdText('myopac_renew_success', __success_count);
1527 hideMe($('my_renewing'));
1528 checkedDrawn = false;
1529 myOPACShowChecked();
1532 /** ---- batch hold processing ------------ */
1535 /* myopac_holds_checkbx */
1536 function myopacSelectAllHolds() {
1537 var rows = getTableRows($("myopac_holds_tbody"));
1538 for(var i = 0; i < rows.length; i++) {
1539 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
1540 if(cb) cb.checked = true;
1544 function myopacSelectNoneHolds() {
1545 var rows = getTableRows($("myopac_holds_tbody"));
1546 for(var i = 0; i < rows.length; i++) {
1547 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
1548 if(cb) cb.checked = false;
1552 function myopacSelectedHoldsRows() {
1554 var rows = getTableRows($("myopac_holds_tbody"));
1555 for(var i = 0; i < rows.length; i++) {
1556 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
1557 if(cb && cb.checked)
1563 var myopacProcessedHolds = 0;
1564 var myopacHoldsToProcess = 0;
1565 function myopacDoHoldAction() {
1567 var selectedRows = myopacSelectedHoldsRows();
1568 action = getSelectorVal($('myopac_holds_actions'));
1569 $('myopac_holds_actions_none').selected = true;
1570 if(selectedRows.length == 0) return;
1572 myopacProcessedHolds = 0;
1574 if(!confirmId('myopac.holds.'+action+'.confirm')) return;
1575 myopacSelectNoneHolds(); /* clear the selection */
1578 /* first, let's collect the holds that actually need processing and
1579 collect the full process count while we're at it */
1581 for(var i = 0; i < selectedRows.length; i++) {
1582 hold = holdCache[myopacHoldIDFromRow(selectedRows[i])];
1583 var qstats = holdStatusCache[hold.id()];
1590 if(isTrue(hold.frozen()))
1594 if(!isTrue(hold.frozen()) && qstats.status < 3)
1599 myopacHoldsToProcess = holds;
1600 if(myopacHoldsToProcess.length == 0) return;
1602 if(action == 'thaw_date' || action == 'freeze')
1603 myopacDrawHoldThawDateForm();
1605 myopacProcessHolds(action);
1609 function myopacProcessHolds(action, thawDate) {
1611 myopacShowHoldProcessing();
1612 /* now we process them */
1613 for(var i = 0; i < myopacHoldsToProcess.length; i++) {
1615 hold = myopacHoldsToProcess[i];
1621 req = new Request(CANCEL_HOLD, G.user.session, hold.id());
1626 hold.thaw_date(null);
1627 req = new Request(UPDATE_HOLD, G.user.session, hold);
1633 hold.thaw_date(thawDate);
1634 req = new Request(UPDATE_HOLD, G.user.session, hold);
1636 //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML);
1640 req.callback(myopacBatchHoldCallback);
1646 function myopacDrawHoldThawDateForm() {
1647 hideMe($('myopac_holds_main_table'));
1648 unHideMe($('myopac_holds_thaw_date_form'));
1649 $('myopac_holds_thaw_date_input').focus();
1652 function myopacApplyThawDate() {
1653 var dateString = dijit.byId('myopac_holds_thaw_date_input').getValue();
1655 dateString = dojo.date.stamp.toISOString(dateString);
1657 dateString = holdsVerifyThawDate(dateString);
1658 if(!dateString) return;
1663 myopacProcessHolds('freeze', dateString);
1666 function myopacHoldIDFromRow(row) {
1667 return row.id.replace(/.*_(\d+)$/, '$1');
1670 function myopacShowHoldProcessing() {
1671 unHideMe($('myopac_holds_processing'));
1672 hideMe($('myopac_holds_main_table'));
1675 function myopacHideHoldProcessing() {
1676 hideMe($('myopac_holds_processing'));
1677 unHideMe($('myopac_holds_main_table'));
1678 hideMe($('myopac_holds_thaw_date_form'));
1681 function myopacBatchHoldCallback(r) {
1682 if(r) /* force load any exceptions */
1683 r.getResultObject();
1684 if(++myopacProcessedHolds >= myopacHoldsToProcess.length) {
1685 myopacHideHoldProcessing();
1687 holdStatusCache = {};
1688 myopacForceHoldsRedraw = true;