2 attachEvt("common", "run", myOPACInit );
\r
3 //attachEvt("common", "loggedIn", myOPACInit );
\r
4 attachEvt('common','locationUpdated', myopacReload );
\r
6 var fleshedUser = null;
\r
7 var fleshedContainers = {};
\r
9 var holdStatusCache = {};
\r
10 var allowPendingAddr = false;
\r
12 function clearNodes( node, keepArray ) {
\r
14 for( var n in keepArray ) node.removeChild(keepArray[n]);
\r
15 removeChildren(node);
\r
16 for( var n in keepArray ) node.appendChild(keepArray[n]);
\r
19 function myOPACInit() {
\r
21 if(!(G.user && G.user.session)) {
\r
26 allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address');
\r
27 if(allowPendingAddr)
\r
28 unHideMe($('myopac_pending_addr_td'));
\r
30 var page = "summary";
\r
32 switch(new CGI().param('acctpage')) {
\r
33 case "1": page = "summary"; swapTabs($('acct_summary')); break;
\r
34 case "2": page = "checked"; swapTabs($('acct_checked_out')); break;
\r
35 case "3": page = "holds"; swapTabs($('acct_holds')); break;
\r
36 case "4": page = "fines"; swapTabs($('acct_prefs')); break;
\r
37 case "5": page = "prefs"; swapTabs($('acct_favs')); break;
\r
38 case "6": page = "bookbag"; swapTabs($('acct_lists')); break;
\r
40 myOPACChangePage(page);
\r
43 //$('myopac_holds_thaw_date_input').onkeyup =
\r
44 // function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
\r
45 //$('myopac_holds_thaw_date_input').onchange =
\r
46 // function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
\r
50 function myopacReload() {
\r
51 //swapCanvas($('myopac_reloading'));
\r
53 a[PARAM_LOCATION] = getNewSearchLocation();
\r
54 a[PARAM_DEPTH] = getNewSearchDepth();
\r
55 hideMe($('canvas_main'));
\r
56 goTo(buildOPACLink(a, true));
\r
60 function myOPACChangePage( page ) {
\r
63 var s = $("myopac_summary_td");
\r
64 var c = $("myopac_checked_td");
\r
65 var f = $("myopac_fines_td");
\r
66 var h = $("myopac_holds_td");
\r
67 var p = $("myopac_prefs_td");
\r
68 var b = $('myopac_bookbag_td');
\r
70 var ss = $("myopac_summary_div");
\r
71 var cc = $("myopac_checked_div");
\r
72 var ff = $("myopac_fines_div");
\r
73 var hh = $("myopac_holds_div");
\r
74 var pp = $("myopac_prefs_div");
\r
75 var bb = $('myopac_bookbag_div');
\r
77 var cls = "myopac_link";
\r
78 var acls = "myopac_link_active";
\r
81 hideMe(cc); hideMe(ff);
\r
82 hideMe(hh); hideMe(pp);
\r
85 removeCSSClass(s, acls );
\r
86 removeCSSClass(c, acls );
\r
87 removeCSSClass(f, acls );
\r
88 removeCSSClass(h, acls );
\r
89 removeCSSClass(p, acls );
\r
90 removeCSSClass(b, acls );
\r
96 addCSSClass(s, acls );
\r
97 myOPACShowSummary();
\r
98 if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff);
\r
99 addCSSClass(f, acls );
\r
105 addCSSClass(c, acls );
\r
106 myOPACShowChecked();
\r
111 addCSSClass(h, acls );
\r
118 addCSSClass(f, acls );
\r
124 addCSSClass(p, acls );
\r
130 addCSSClass(b, acls);
\r
131 myOPACShowBookbags();
\r
136 function myOPACShowChecked() {
\r
137 if(checkedDrawn) return;
\r
138 var req = new Request(FETCH_CHECKED_OUT_SUM, G.user.session, G.user.id());
\r
139 req.callback(myOPACDrawCheckedOutSlim);
\r
142 var nreq = new Request(FETCH_NON_CAT_CIRCS, G.user.session);
\r
143 nreq.callback(myOPACDrawNonCatCircs);
\r
148 var checkedRowTemplate;
\r
149 var circsCache = new Array();
\r
150 var checkedDrawn = false;
\r
152 function moClearCheckedTable() {
\r
153 var tbody = $("myopac_checked_tbody");
\r
154 var loading = $("myopac_checked_loading");
\r
155 var none = $("myopac_checked_none");
\r
156 clearNodes( tbody, [ loading, none ] );
\r
159 var __can_renew_one = false;
\r
161 function myOPACDrawCheckedOutSlim(r) {
\r
163 var checked = r.getResultObject();
\r
164 var tbody = $("myopac_checked_tbody");
\r
165 var loading = $("myopac_checked_loading");
\r
166 var none = $("myopac_checked_none");
\r
168 __can_renew_one = false;
\r
170 if(checkedDrawn) return;
\r
171 checkedDrawn = true;
\r
172 if(!checkedRowTemplate)
\r
173 checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));
\r
175 moClearCheckedTable();
\r
177 hideMe(loading); /* remove all children and start over */
\r
178 if(!(checked && (checked.out || checked.overdue)) || (!checked.out.length && !checked.overdue.length)) {
\r
183 var totalAsync = checked.overdue.length + checked.out.length;
\r
184 var fetchedCircs = [];
\r
185 var collectCircs = function(r) {
\r
186 var circ = r.getResultObject();
\r
188 fetchedCircs.push(circ);
\r
189 if(fetchedCircs.length < totalAsync) return;
\r
191 // sort by due date, oldest to newest
\r
192 fetchedCircs = fetchedCircs.sort(
\r
194 if(a.due_date() > b.due_date()) return 1;
\r
199 dojo.forEach(fetchedCircs,
\r
201 myOPACDrawCheckedItem(circ, tbody);
\r
206 for( var i = 0; i < checked.overdue.length; i++ ) {
\r
207 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.overdue[i]);
\r
208 //req.request.tbody = tbody;
\r
209 req.request.od = true;
\r
210 req.callback(collectCircs);
\r
215 for( var i = 0; i < checked.out.length; i++ ) {
\r
216 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.out[i]);
\r
217 //req.request.tbody = tbody;
\r
218 req.callback(collectCircs);
\r
222 appendClear($('mo_items_out_count'),
\r
223 text(new String( parseInt(checked.overdue.length) + parseInt(checked.out.length) )) );
\r
225 if( checked.overdue.length > 0 ) {
\r
226 addCSSClass($('mo_items_overdue_count'), 'overdue');
\r
227 appendClear($('mo_items_overdue_count'),
\r
228 text(new String( parseInt(checked.overdue.length) )) );
\r
234 //function myOPACDrawCheckedItem(r) {
\r
235 function myOPACDrawCheckedItem(circ, tbody) {
\r
237 //var circ = r.getResultObject();
\r
238 //var tbody = r.tbody;
\r
239 var row = checkedRowTemplate.cloneNode(true);
\r
240 row.id = 'myopac_checked_row_ ' + circ.id();
\r
241 row.setAttribute('circid', circ.id());
\r
243 var due = _trimTime(circ.due_date());
\r
245 var dlink = $n( row, "myopac_checked_due" );
\r
246 var rlink = $n( row, "myopac_checked_renewals" );
\r
247 var cnlink = $n(row, "myopac_checked_cn");
\r
248 //var rnlink = $n( row, "myopac_checked_renew_link" );
\r
250 //if( r.od ) due = elem('b', {style:'color:red;font-size:110%'},due);
\r
252 due = elem('b', {style:'color:red;'}, due);
\r
253 addCSSClass(due, 'overdue');
\r
258 dlink.appendChild(due);
\r
259 rlink.appendChild(text(circ.renewal_remaining()));
\r
261 //rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');
\r
262 circsCache.push(circ);
\r
264 if( circ.renewal_remaining() < 1 ) {
\r
265 $n(row, 'selectme').disabled = true;
\r
266 if(!__can_renew_one)
\r
267 hideMe($('mo_renew_button'));
\r
269 __can_renew_one = true;
\r
270 unHideMe($('mo_renew_button'));
\r
271 $n(row, 'selectme').disabled = false;
\r
274 tbody.appendChild(row);
\r
276 var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );
\r
277 req.request.alertEvent = false;
\r
278 req.request.circ = circ.id();
\r
279 req.request.copy = circ.target_copy();
\r
280 req.callback(myOPACDrawCheckedTitle);
\r
284 var __circ_titles = {};
\r
286 function myOPACDrawCheckedTitle(r) {
\r
287 var record = r.getResultObject();
\r
288 var circid = r.circ;
\r
290 if(!record || checkILSEvent(record)) {
\r
291 var req = new Request( FETCH_COPY, r.copy );
\r
292 req.request.circ = circid
\r
293 req.callback(myOPACDrawNonCatalogedItem);
\r
298 var row = $('myopac_checked_row_ ' + circid);
\r
299 var tlink = $n( row, "myopac_checked_title_link" );
\r
300 var alink = $n( row, "myopac_checked_author_link" );
\r
302 var cn = fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.copy_location_counts.summary.retrieve"],{params:[record.doc_id(),getLocation(),getDepth()]});
\r
303 var cnlink = $n( row, "myopac_checked_cn" );
\r
304 if(cn.length) cnlink.appendChild(text(cn[0][1]));
\r
305 buildTitleDetailLink(record, tlink);
\r
306 buildSearchLink(STYPE_AUTHOR, record.author(), alink);
\r
307 __circ_titles[circid] = record.title();
\r
310 function myOPACDrawNonCatalogedItem(r) {
\r
311 var copy = r.getResultObject();
\r
312 var circid = r.circ;
\r
314 var row = $('myopac_checked_row_ ' + circid);
\r
315 var tlink = $n( row, "myopac_checked_title_link" );
\r
316 var alink = $n( row, "myopac_checked_author_link" );
\r
318 tlink.parentNode.appendChild(text(copy.dummy_title()));
\r
319 alink.parentNode.appendChild(text(copy.dummy_author()));
\r
320 __circ_titles[circid] = copy.dummy_title();
\r
325 function myOPACRenewCirc(circid) {
\r
328 for( var i = 0; i != circsCache.length; i++ )
\r
329 if(circsCache[i].id() == circid)
\r
330 circ = circsCache[i];
\r
332 if(!confirm($('myopac_renew_confirm').innerHTML)) return;
\r
334 var req = new Request(RENEW_CIRC, G.user.session,
\r
335 { patron : G.user.id(), copyid : circ.target_copy(), opac_renewal : 1 } );
\r
336 req.request.alertEvent = false;
\r
338 var res = req.result();
\r
340 if(checkILSEvent(res) || checkILSEvent(res[0])) {
\r
341 alertId('myopac_renew_fail');
\r
345 alert($('myopac_renew_success').innerHTML);
\r
346 checkedDrawn = false;
\r
347 myOPACShowChecked();
\r
353 function myOPACShowHolds() {
\r
354 var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());
\r
355 req.callback(myOPACDrawHolds);
\r
357 //$('myopac_holds_actions_none').selected = true;
\r
360 var holdsTemplateRowOrig;
\r
361 var holdsTemplateRow;
\r
363 var myopacForceHoldsRedraw = true;
\r
364 function myOPACDrawHolds(r) {
\r
365 if(!myopacForceHoldsRedraw) return;
\r
366 var holds_main = $('holds_main'); if(!holds_main) return;
\r
367 if(!template) template = holds_main.removeChild($('acct_holds_temp'));
\r
368 //if(!template) template = $('acct_holds_temp').cloneNode(true);
\r
369 var holds = r.getResultObject();
\r
370 if(!holds || !holds.length || !template) return;
\r
371 myopacForceHoldsRedraw = false;
\r
373 if(!holds.length) { holds_main.appendChild(elem('div',{style:"font-size:16px;font-weight:bold;text-align:center;width:100%;"},text('You have no holds'))); return; }
\r
374 for(var i=0; i<holds.length; i++) {
\r
376 holdCache[h.id()] = h;
\r
377 var row = template.cloneNode(true);
\r
378 row.id = "myopac_holds_row_" + h.id();
\r
379 var form = $n(row, "myopac_holds_formats");
\r
380 form.id = "myopac_holds_form_" + h.id();
\r
382 var tree = $n(row,'hold_pickup_lib_sel');
\r
383 buildOrgSel(tree, globalOrgTree, 0);
\r
384 setSelector(tree, h.pickup_lib());
\r
385 $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+ h.id()+');');
\r
386 $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+ h.id()+');');
\r
387 $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+ h.id()+');');
\r
388 var activeSel = $n(row,'hold_active_sel');
\r
389 activeSel.selectedIndex = isTrue(h.frozen())?1:0;
\r
391 updateHoldInfo(h.id(),row);
\r
392 myOPACDrawHoldTitle(h);
\r
393 myOPACDrawHoldStatus(h);
\r
396 holds_main.appendChild(row);
\r
401 var tbody = $("myopac_holds_tbody");
\r
402 if(holdsTemplateRow && !myopacForceHoldsRedraw) return;
\r
403 myopacForceHoldsRedraw = false;
\r
405 if(holdsTemplateRowOrig) {
\r
406 holdsTemplateRow = holdsTemplateRowOrig;
\r
407 removeChildren(tbody);
\r
409 holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));
\r
410 holdsTemplateRowOrig = holdsTemplateRow;
\r
413 hideMe($('myopac_holds_loading'));
\r
414 var holds = r.getResultObject();
\r
415 if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));
\r
417 for( var i = 0; i != holds.length; i++ ) {
\r
419 holdCache[h.id()] = h;
\r
421 var row = holdsTemplateRow.cloneNode(true);
\r
422 row.id = "myopac_holds_row_" + h.id();
\r
424 var form = $n(row, "myopac_holds_formats");
\r
425 form.id = "myopac_holds_form_" + h.id();
\r
427 var orglink = $n(row, "myopac_holds_location");
\r
428 orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
\r
430 tbody.appendChild(row);
\r
432 $n(row,'myopac_holds_edit_link').setAttribute(
\r
433 'href','javascript:myOPACEditHold("'+ h.id()+'");');
\r
435 if(isTrue(h.frozen())) {
\r
436 hideMe($n(row, 'myopac_hold_unfrozen_true'))
\r
437 unHideMe($n(row, 'myopac_hold_unfrozen_false'))
\r
438 if(h.thaw_date()) {
\r
439 var d = dojo.date.stamp.fromISOString(h.thaw_date());
\r
440 $n(row, 'myopac_holds_frozen_until').appendChild(text(dojo.date.locale.format(d, {selector: 'date', fullYear: true})));
\r
443 unHideMe($n(row, 'myopac_hold_unfrozen_true'))
\r
444 hideMe($n(row, 'myopac_hold_unfrozen_false'))
\r
447 $n(row, 'myopac_holds_selected_chkbx').checked = false;
\r
450 if(h.expire_time()) {
\r
451 exp_date = dojo.date.stamp.fromISOString(h.expire_time());
\r
452 $n(row, 'myopac_hold_expire_time').appendChild(
\r
453 text(dojo.date.locale.format(exp_date, {selector:'date'})));
\r
458 var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_alert_interval');
\r
459 if(interval && exp_date) {
\r
460 secs = interval_to_seconds(interval) * 1000;
\r
461 var diff = exp_date.getTime() - new Date().getTime();
\r
463 addCSSClass($n(row, 'myopac_hold_expire_time'), 'hold_expire_warning');
\r
466 myOPACDrawHoldTitle(h);
\r
467 myOPACDrawHoldStatus(h);
\r
471 function myOPACEditHold(holdid) {
\r
472 var hold = holdCache[holdid];
\r
477 onComplete : function(){
\r
478 holdsTemplateRow = null;
\r
479 myOPACShowHolds();
\r
486 function myOPACDrawHoldStatus(hold) {
\r
487 var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );
\r
488 req.callback(myOShowHoldStatus);
\r
489 req.request.hold = hold;
\r
493 var myopacShowHoldEstimate = false;
\r
494 function myOShowHoldStatus(r) {
\r
497 var qstats = r.getResultObject();
\r
498 holdStatusCache[hold.id()] = qstats;
\r
499 var row = $("myopac_holds_row_" + r.hold.id());
\r
502 if( qstats.status == 4 ) {
\r
503 $n(row,'acct_holds_status').innerHTML = "Ready for Pickup";
\r
505 var suffix = (qstats.queue_position==1)?"st":(qstats.queue_position==2)?"nd":(qstats.queue_position==3)?"rd":"th";
\r
506 $n(row,'acct_holds_status').innerHTML = qstats.queue_position+suffix+" hold on "+qstats.potential_copies+" circulating cop"+(qstats.potential_copies==1?"y":"ies");
\r
513 if(qstats.estimated_wait || myopacShowHoldEstimate) {
\r
514 myopacShowHoldEstimate = true;
\r
515 if(qstats.estimated_wait)
\r
516 $n(row, 'myopac_holds_estimated_wait').appendChild(text(qstats.estimated_wait));
\r
517 unHideMe($('myopac_holds_estimated_wait_column'));
\r
518 unHideMe($n(row, 'myopac_holds_estimated_wait'));
\r
522 if( qstats.status == 4 ) {
\r
523 unHideMe($n(row, 'hold_status_available'));
\r
524 hideMe($n(row, 'myopac_holds_cancel_link'));
\r
528 var node = $n(row, 'hold_qstats');
\r
529 // XXX best way to display this info + dojo i18n
\r
530 node.appendChild(text('hold #' + qstats.queue_position+' of '+qstats.queue_position+' and '+qstats.potential_copies+' item(s)'));
\r
534 if( qstats.status < 3 )
\r
535 unHideMe($n(row, 'hold_status_waiting'));
\r
537 if( qstats.status == 3 )
\r
538 unHideMe($n(row, 'hold_status_transit'));
\r
543 function myOPACDrawHoldTitle(hold) {
\r
546 if( hold.hold_type() == 'T' || hold.hold_type() == 'M' ) {
\r
547 if(hold.hold_type() == "M") method = FETCH_MRMODS;
\r
548 if(hold.hold_type() == "T") method = FETCH_RMODS;
\r
549 var req = new Request(method, hold.target());
\r
550 req.callback(myOPACFleshHoldTitle);
\r
551 req.request.hold = hold;
\r
552 req.request.alertEvent = false;
\r
556 holdFetchObjects(hold,
\r
557 function(a) { _myOPACFleshHoldTitle(hold, a);});
\r
561 function myOPACFleshHoldTitle(r) {
\r
562 var rec = r.getResultObject();
\r
563 _myOPACFleshHoldTitle(r.hold, {recordObject: rec});
\r
566 function _myOPACFleshHoldTitle(hold, holdObjects) {
\r
568 var record = holdObjects.recordObject;
\r
569 var volume = holdObjects.volumeObject;
\r
570 var copy = holdObjects.copyObject;
\r
572 var row = $("myopac_holds_row_" + hold.id());
\r
573 var title_link = $n(row, "myopac_holds_title_link");
\r
574 //var author_link = $n(row, "myopac_holds_author_link");
\r
576 if(!record || checkILSEvent(record) ) {
\r
577 addCSSClass(row, 'invalid_hold');
\r
578 $n(row, 'myopac_holds_edit_link').setAttribute('href', 'javascript:void(0);');
\r
579 $n(row, 'myopac_holds_edit_link').onclick = function(){alertId('invalid_hold');};
\r
583 buildTitleDetailLink(record, title_link);
\r
584 title_link.title = record.title();
\r
585 //buildSearchLink(STYPE_AUTHOR, record.author(), author_link);
\r
588 $n(row, 'volume').appendChild(text(volume.label()));
\r
589 unHideMe($n(row, 'vol_copy'));
\r
590 if(copy) $n(row, 'copy').appendChild(text(copy.barcode()));
\r
593 var ress = getMarcData(record.doc_id(),"998","d");
\r
594 var img = elem("img");
\r
595 var form = $("myopac_holds_form_" + hold.id());
\r
597 if(setFormatIcon(img, ress) && ress && form) form.appendChild(img);
\r
603 var mods_formats = record.types_of_resource();
\r
605 if( hold.hold_type() == 'M' ) {
\r
606 var data = holdsParseMRFormats(hold.holdable_formats());
\r
607 mods_formats = data.mods_formats;
\r
610 for( var i = 0; i < mods_formats.length; i++ ) {
\r
611 var img = elem("img");
\r
612 setResourcePic(img, mods_formats[i]);
\r
613 form.appendChild(img);
\r
619 var finesShown = false;
\r
620 function myOPACShowFines() {
\r
621 if(finesShown) return; finesShown = true;
\r
622 var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );
\r
623 req.callback(_myOPACShowFines);
\r
627 function _myOPACShowFines(r) {
\r
628 hideMe($('myopac_fines_summary_loading'));
\r
629 unHideMe($('myopac_fines_summary_row'));
\r
631 var summary = r.getResultObject();
\r
632 var total = "0.00"; /* localization? */
\r
634 var balance = "0.00";
\r
635 if( instanceOf(summary,mous) ) {
\r
637 total = _finesFormatNumber(summary.total_owed());
\r
638 paid = _finesFormatNumber(summary.total_paid());
\r
639 balance = _finesFormatNumber(summary.balance_owed());
\r
641 var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );
\r
642 req.callback(myOPACShowTransactions);
\r
646 $('myopac_fines_summary_total').appendChild(text(total));
\r
647 $('myopac_fines_summary_paid').appendChild(text(paid));
\r
648 $('myopac_fines_summary_balance').appendChild(text(balance));
\r
651 function _finesFormatNumber(num) {
\r
652 if(isNull(num)) num = 0;
\r
654 if(num.length < 2 || !num.match(/\./)) num += ".00";
\r
655 if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0";
\r
659 //function _trimTime(time) { if(!time) return ""; return time.replace(/\ .*/,""); }
\r
660 function _trimTime(time) {
\r
661 if(!time) return "";
\r
662 var d = dojo.date.stamp.fromISOString(time);
\r
663 if(!d) return ""; /* date parse failed */
\r
664 return d.iso8601Format('YMD');
\r
667 function _trimSeconds(time) {
\r
668 if(!time) return "";
\r
669 var d = dojo.date.stamp.fromISOString(time);
\r
670 if(!d) return ""; /* date parse failed */
\r
671 return d.iso8601Format('YMDHM',null,true,true);
\r
674 function myOPACShowTransactions(r) {
\r
676 if(myopacGenericTransTemplate || myopacCircTransTemplate) return;
\r
678 var transactions = r.getResultObject();
\r
680 for( var idx in transactions ) {
\r
682 var trans = transactions[idx].transaction;
\r
683 var record = transactions[idx].record;
\r
684 var circ = transactions[idx].circ;
\r
686 if(trans.xact_type() == 'circulation')
\r
687 myOPACShowCircTransaction(trans, record, circ);
\r
689 else if(trans.xact_type() == 'grocery' )
\r
690 myopacShowGenericTransaction( trans );
\r
694 var myopacGenericTransTemplate;
\r
695 function myopacShowGenericTransaction( trans ) {
\r
696 var tbody = $('myopac_trans_tbody');
\r
698 if(!myopacGenericTransTemplate) {
\r
699 myopacGenericTransTemplate =
\r
700 tbody.removeChild($('myopac_trans_row'));
\r
701 removeChildren(tbody);
\r
704 var row = myopacGenericTransTemplate.cloneNode(true);
\r
706 $n(row,'myopac_trans_start').appendChild(
\r
707 text(_trimSeconds(trans.xact_start())));
\r
709 $n(row,'myopac_trans_last_payment').appendChild(
\r
710 text(_trimSeconds(trans.last_payment_ts())));
\r
712 $n(row,'myopac_trans_init_amount').appendChild(
\r
713 text(_finesFormatNumber(trans.total_owed())));
\r
715 $n(row,'myopac_trans_total_paid').appendChild(
\r
716 text(_finesFormatNumber(trans.total_paid())));
\r
718 $n(row,'myopac_trans_balance').appendChild(
\r
719 text(_finesFormatNumber(trans.balance_owed())));
\r
721 var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id());
\r
723 var bills = req.result();
\r
724 if(bills && bills[0])
\r
725 $n(row,'myopac_trans_bill_type').appendChild(
\r
726 text(bills[0].billing_type()));
\r
728 tbody.appendChild(row);
\r
729 unHideMe($('myopac_trans_div'));
\r
734 /* draws a circulation transaction summary */
\r
735 var myopacCircTransTemplate;
\r
736 function myOPACShowCircTransaction(trans, record, circ) {
\r
737 var tbody = $('myopac_circ_trans_tbody');
\r
739 if(!myopacCircTransTemplate) {
\r
740 myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));
\r
741 removeChildren(tbody);
\r
744 var row = myopacCircTransTemplate.cloneNode(true);
\r
747 buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title'));
\r
749 $n(row,'myopac_circ_trans_author').appendChild(text(
\r
750 normalize(truncate(record.author(), 65))));
\r
754 var req = new Request( FETCH_COPY, circ.target_copy() );
\r
755 req.alertEvents = false;
\r
757 var copy = req.result();
\r
759 $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title()));
\r
760 $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author()));
\r
765 $n(row,'myopac_circ_trans_start').
\r
766 appendChild(text(_trimTime(trans.xact_start())));
\r
768 var due = _trimTime(circ.due_date());
\r
769 var checkin = _trimTime(circ.stop_fines_time());
\r
771 $n(row,'myopac_circ_trans_due').appendChild(text(due))
\r
773 appendClear($n(row,'myopac_circ_trans_finished'), text(checkin));
\r
774 if(circ.stop_fines() == 'LOST')
\r
775 appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines()));
\r
776 if(circ.stop_fines() == 'CLAIMSRETURNED')
\r
777 appendClear($n(row,'myopac_circ_trans_finished'), text(""));
\r
780 $n(row,'myopac_circ_trans_balance').
\r
781 appendChild(text(_finesFormatNumber(trans.balance_owed())));
\r
783 tbody.appendChild(row);
\r
784 unHideMe($('myopac_circ_trans_div'));
\r
788 function myOPACSavePrefs() {
\r
789 G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per'));
\r
790 G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font'));
\r
791 G.user.prefs[PREF_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));
\r
792 G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range'));
\r
794 if( $('myopac_pref_home_lib').checked == true )
\r
795 G.user.prefs[PREF_DEF_LOCATION] = null;
\r
797 G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location'));
\r
799 if(commitUserPrefs())
\r
800 alert($('prefs_update_success').innerHTML);
\r
801 else alert($('prefs_update_failure').innerHTML);
\r
805 function myOPACShowDefFont() {
\r
807 if(G.user.prefs[PREF_DEF_FONT])
\r
808 font = G.user.prefs[PREF_DEF_FONT];
\r
809 else font = "regular";
\r
810 setSelector($('prefs_def_font'), font);
\r
813 function myOPACShowHoldNotify() {
\r
814 var pref = G.user.prefs[PREF_HOLD_NOTIFY];
\r
817 if(pref.match(/email/i) && pref.match(/phone/i)) {
\r
818 setSelector($('prefs_hold_notify'), 'phone:email');
\r
819 } else if( pref.match(/email/i) ) {
\r
820 setSelector($('prefs_hold_notify'), 'email');
\r
821 } else if( pref.match(/phone/i) ) {
\r
822 setSelector($('prefs_hold_notify'), 'phone');
\r
826 setSelector($('prefs_hold_notify'), 'phone:email');
\r
830 function myOPACShowPrefs() {
\r
832 myOPACShowHitsPer();
\r
833 myOPACShowDefFont();
\r
834 myOPACShowHoldNotify();
\r
835 myOPACShowDefLocation();
\r
836 hideMe($('myopac_prefs_loading'));
\r
839 var defSearchLocationDrawn = false;
\r
840 var defDepthIndex = 0;
\r
841 function myOPACShowDefLocation() {
\r
843 var selector = $('prefs_def_location');
\r
844 var rsel = $('prefs_def_range');
\r
846 if(!defSearchLocationDrawn) {
\r
848 defSearchLocationDrawn = true;
\r
850 var org = G.user.prefs[PREF_DEF_LOCATION];
\r
853 $('myopac_pref_home_lib').checked = true;
\r
854 $('prefs_def_location').disabled = true;
\r
855 org = G.user.home_ou();
\r
858 buildOrgSel(selector, globalOrgTree, 0);
\r
860 globalOrgTypes = globalOrgTypes.sort(
\r
862 if( a.depth() < b.depth() ) return -1;
\r
867 iterate(globalOrgTypes,
\r
869 if( t.depth() <= findOrgDepth(org) ) {
\r
870 setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth());
\r
871 if( t.depth() == findOrgDepth(org) )
\r
872 setSelector(rsel, t.depth());
\r
878 setSelector(selector, org);
\r
881 function myOPACShowHitsPer() {
\r
883 if(G.user.prefs[PREF_HITS_PER])
\r
884 hits = G.user.prefs[PREF_HITS_PER];
\r
885 var hitsSel = $('prefs_hits_per');
\r
886 setSelector(hitsSel, hits);
\r
889 var userShown = false;
\r
890 function myOPACShowSummary() {
\r
891 if(userShown) return; userShown = true;
\r
892 var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());
\r
893 req.callback(_myOPACSummaryShowUer);
\r
896 //would be nice to batch these requests in one shot.
\r
897 fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.user.checked_out"],{params:[G.user.session, G.user.id()],oncomplete:drawMyOPACSumPage});
\r
898 fieldmapper.standardRequest(["open-ils.circ","open-ils.circ.holds.retrieve"],{params:[G.user.session, G.user.id()], oncomplete:drawMyOPACSumPage});
\r
899 fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.user.fines.summary"],{params:[G.user.session, G.user.id()], oncomplete:drawMyOPACSumPage});
\r
904 function drawMyOPACSumPage(r) {
\r
905 var obj = r.recv().content();
\r
908 case "open-ils.actor.user.checked_out":
\r
909 appendClear($('myopac_sum_checked'),text("("+(obj.out.length+obj.overdue.length+obj.lost.length+obj.long_overdue.length)+")"));
\r
911 case "open-ils.circ.holds.retrieve":
\r
912 for(var i in obj) fieldmapper.standardRequest(["open-ils.circ","open-ils.circ.hold.queue_stats.retrieve"],{params:[G.user.session,obj[i].id()],oncomplete:drawMyOPACSumPage});
\r
914 case "open-ils.actor.user.fines.summary":
\r
915 var balance = obj.balance_owed();
\r
916 if(parseFloat(balance) > 0.00) {
\r
917 var bal = $('myopac_sum_fines_bal');
\r
918 bal.style.color = "red";
\r
919 appendClear(bal,text("$"+balance));
\r
920 unHideMe($('myopac_sum_fines'));
\r
921 unHideMe($('myopac_sum_fines_slim'));
\r
923 case "open-ils.circ.hold.queue_stats.retrieve":
\r
924 if(obj.status==4) {
\r
925 appendClear($('myopac_sum_pickup'),text("("+(++pickupCount)+")"));
\r
927 appendClear($('myopac_sum_holds'),text("("+(++holdsCount)+")"));
\r
932 var addrRowTemplate;
\r
934 function _myOPACSummaryShowUer(r) {
\r
935 var user = r.getResultObject();
\r
936 fleshedUser = user;
\r
940 var expireDate = dojo.date.stamp.fromISOString(user.expire_date());
\r
941 if( expireDate < new Date() ) {
\r
942 appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD'));
\r
943 unHideMe($('myopac.expired.alert'));
\r
946 var iv1 = user.ident_value()+'';
\r
947 if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********';
\r
949 appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name())));
\r
950 //appendClear($('myopac_summary_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name())));
\r
951 //appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name()));
\r
953 appendClear($('myopac_summary_dayphone'),text(user.day_phone()));
\r
954 appendClear($('myopac_summary_eveningphone'),text(user.evening_phone()));
\r
955 appendClear($('myopac_summary_otherphone'),text(user.other_phone()));
\r
956 appendClear($('myopac_summary_suffix'),text(user.suffix()));
\r
957 appendClear($('myopac_summary_username'),text(user.usrname()));
\r
958 appendClear($('myopac_summary_email'),text(user.email()));
\r
959 appendClear($('myopac_summary_barcode'),text(user.card().barcode()));
\r
960 appendClear($('myopac_summary_ident1'),text(iv1));
\r
961 appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date())));
\r
963 var req = new Request(
\r
964 FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()});
\r
965 req.callback(myopacDrawNotes);
\r
968 var tbody = $('myopac_addr_tbody');
\r
971 if(addrRowTemplate) {
\r
972 template = addrRowTemplate;
\r
974 template = tbody.removeChild($('myopac_addr_row'));
\r
975 addrRowTemplate = template;
\r
977 removeChildren(tbody);
\r
979 var addrs = user.addresses();
\r
980 for( var a in addrs ) {
\r
981 var addr = addrs[a];
\r
982 if(!allowPendingAddr && isTrue(addr.pending()))
\r
984 if(addr.replaces() != null) continue;
\r
985 var row = template.cloneNode(true);
\r
986 myOPACDrawAddr(row, addr, addrs);
\r
987 tbody.appendChild(row);
\r
991 function drawSumFines(r){
\r
992 var rr = r.recv().content();
\r
993 var bal1 = $('myopac_sum_fines_bal1');
\r
994 var bal2 = $('myopac_sum_fines_bal2');
\r
995 var balance = rr.balance_owed();
\r
997 if(parseFloat(balance) > 0.00) {
\r
998 bal1.style.color="red";
\r
999 bal2.style.color="red";
\r
1000 unHideMe($('acct_pay_fines1'));
\r
1001 unHideMe($('acct_pay_fines2'));
\r
1004 appendClear(bal1, text("$"+balance));
\r
1005 appendClear(bal2, text("$"+balance));
\r
1006 appendClear($('myopac_sum_fines_owed'), text(rr.total_owed()));
\r
1007 appendClear($('myopac_sum_fines_paid'), text(rr.total_paid()));
\r
1010 function myopacDrawNotes(r) {
\r
1011 var notes = r.getResultObject();
\r
1012 var tbody = $('myopac.notes.tbody');
\r
1013 if(!notesTemplate)
\r
1014 notesTemplate = tbody.removeChild($('myopac.notes.tr'));
\r
1015 removeChildren(tbody);
\r
1019 unHideMe($('myopac.notes.div'));
\r
1020 var row = notesTemplate.cloneNode(true);
\r
1021 $n(row, 'title').appendChild(text(note.title()));
\r
1022 $n(row, 'value').appendChild(text(note.value()));
\r
1023 tbody.appendChild(row);
\r
1030 function myOPACDrawAddr(row, addr, addrs) {
\r
1031 appendClear($n(row, 'myopac_addr_type'),text(addr.address_type()));
\r
1032 appendClear($n(row, 'myopac_addr_street'),text(addr.street1()));
\r
1033 appendClear($n(row, 'myopac_addr_street2'),text(addr.street2()));
\r
1034 appendClear($n(row, 'myopac_addr_city'),text(addr.city()));
\r
1035 appendClear($n(row, 'myopac_addr_county'),text(addr.county()));
\r
1036 appendClear($n(row, 'myopac_addr_state'),text(addr.state()));
\r
1037 appendClear($n(row, 'myopac_addr_country'),text(addr.country()));
\r
1038 appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code()));
\r
1040 if(!allowPendingAddr) return;
\r
1042 $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)};
\r
1043 unHideMe($n(row, 'myopac_addr_edit_td'));
\r
1045 /* if we have a replacement address, plop it into the table next to this addr */
\r
1046 var repl = grep(addrs,
\r
1048 return a.replaces() == addr.id();
\r
1052 $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id();
\r
1055 hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link
\r
1057 myopacSetAddrInputs(row, repl);
\r
1061 function myopacEditAddress(addr) {
\r
1062 var td = $('myopac_pending_addr_td_' + addr.id());
\r
1063 var row = td.parentNode;
\r
1064 myopacSetAddrInputs(row, addr);
\r
1067 function myopacSetAddrInputs(row, addr, prefix) {
\r
1068 unHideMe($n(row, 'myopac_pending_addr_td'));
\r
1069 $n(row, 'myopac_pending_addr_type').value = addr.address_type();
\r
1070 $n(row, 'myopac_pending_addr_street').value = addr.street1();
\r
1071 $n(row, 'myopac_pending_addr_street2').value = addr.street2();
\r
1072 $n(row, 'myopac_pending_addr_city').value = addr.city();
\r
1073 $n(row, 'myopac_pending_addr_county').value = addr.county();
\r
1074 $n(row, 'myopac_pending_addr_state').value = addr.state();
\r
1075 $n(row, 'myopac_pending_addr_country').value = addr.country();
\r
1076 $n(row, 'myopac_pending_addr_zip').value = addr.post_code();
\r
1077 $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)};
\r
1078 $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)};
\r
1081 // if no pending addr exists, this is called with the original address
\r
1082 function myopacSaveAddress(row, addr, deleteMe) {
\r
1084 if(addr.replaces() == null) {
\r
1085 // we are editing a non-pending address. create a pending address to manage that
\r
1086 var repl = new aua();
\r
1087 repl.usr(addr.usr());
\r
1088 repl.address_type(addr.address_type());
\r
1089 repl.within_city_limits(addr.within_city_limits());
\r
1090 repl.replaces(addr.id());
\r
1091 repl.pending('t');
\r
1098 if(addr.id() == null) {
\r
1099 hideMe($n(row, 'myopac_pending_addr_td'));
\r
1102 addr.isdeleted(true);
\r
1104 addr.address_type($n(row, 'myopac_pending_addr_type').value);
\r
1105 addr.street1($n(row, 'myopac_pending_addr_street').value);
\r
1106 addr.street2($n(row, 'myopac_pending_addr_street2').value);
\r
1107 addr.city($n(row, 'myopac_pending_addr_city').value);
\r
1108 addr.county($n(row, 'myopac_pending_addr_county').value);
\r
1109 addr.state($n(row, 'myopac_pending_addr_state').value);
\r
1110 addr.country($n(row, 'myopac_pending_addr_country').value);
\r
1111 addr.post_code($n(row, 'myopac_pending_addr_zip').value);
\r
1114 var req = new Request(
\r
1115 'open-ils.actor:open-ils.actor.user.address.pending.cud',
\r
1116 G.user.session, addr);
\r
1120 var resp = r.getResultObject();
\r
1122 if(addr.isnew()) {
\r
1123 // new, add to list of addrs
\r
1125 fleshedUser.addresses().push(addr);
\r
1128 // deleted, remove from list of addrs
\r
1129 if(addr.isdeleted()) {
\r
1130 hideMe($n(row, 'myopac_pending_addr_td'));
\r
1132 for(var i in fleshedUser.addresses()) {
\r
1133 var a = fleshedUser.addresses()[i];
\r
1134 if(a.id() != addr.id())
\r
1137 fleshedUser.addresses(addrs);
\r
1140 alertId('myopac_addr_changes_saved');
\r
1147 function myOPACUpdateUsername() {
\r
1148 var username = $('myopac_new_username').value;
\r
1149 if(username == null || username == "") {
\r
1150 alert($('myopac_username_error').innerHTML);
\r
1154 if( username.match(/.*\s.*/) ) {
\r
1155 alert($('myopac_invalid_username').innerHTML);
\r
1159 r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex');
\r
1160 if(r) REGEX_BARCODE = new RegExp(r);
\r
1162 if(username.match(REGEX_BARCODE)) {
\r
1163 alert($('myopac_invalid_username').innerHTML);
\r
1167 /* first see if the requested username is taken */
\r
1168 var req = new Request(CHECK_USERNAME, G.user.session, username);
\r
1170 var res = req.result();
\r
1171 /* If the username does not already exist, res will be null;
\r
1172 * we can move on to updating the username.
\r
1174 * If the username does exist, then res will be the user ID.
\r
1175 * G.user.id() gives us the currently authenticated user ID.
\r
1176 * If res == G.user.id(), we try to update the username anyways.
\r
1178 if( res !== null && res != G.user.id() ) {
\r
1179 alertId('myopac_username_dup');
\r
1183 var req = new Request(UPDATE_USERNAME, G.user.session, username );
\r
1185 if(req.result()) {
\r
1188 var res = req.result();
\r
1189 if(evt = checkILSEvent(res)) {
\r
1190 alertILSEvent(res);
\r
1194 G.user.usrname(username);
\r
1195 hideMe($('myopac_update_username_row'));
\r
1196 userShown = false;
\r
1197 alertId('myopac_username_success');
\r
1198 myOPACShowSummary();
\r
1202 alert($('myopac_username_failure').innerHTML);
\r
1205 function myOPACUpdateEmail() {
\r
1206 var email = $('myopac_new_email').value;
\r
1207 if(email == null || email == "") {
\r
1208 alert($('myopac_email_error').innerHTML);
\r
1212 var req = new Request(UPDATE_EMAIL, G.user.session, email );
\r
1214 if(req.result()) {
\r
1215 G.user.usrname(email);
\r
1216 hideMe($('myopac_update_email_row'));
\r
1217 userShown = false;
\r
1218 alertId('myopac_email_success');
\r
1219 myOPACShowSummary();
\r
1223 alert($('myopac_email_failure').innerHTML);
\r
1227 function myOPACUpdatePassword() {
\r
1228 var curpassword = $('myopac_current_password').value;
\r
1229 var password = $('myopac_new_password').value;
\r
1230 var password2 = $('myopac_new_password2').value;
\r
1232 if( curpassword == null || curpassword == "" ||
\r
1233 password == null || password == "" ||
\r
1234 password2 == null || password2 == "" || password != password2 ) {
\r
1235 alert($('myopac_password_error').innerHTML);
\r
1239 if(!strongPassword(password, true)) return;
\r
1241 var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword );
\r
1243 if(req.result()) {
\r
1244 hideMe($('myopac_update_password_row'));
\r
1245 userShown = false;
\r
1246 alertId('myopac_password_success');
\r
1247 myOPACShowSummary();
\r
1251 alert($('myopac_password_failure').innerHTML);
\r
1256 var containerTemplate = null;
\r
1257 function myOPACShowBookbags(force) {
\r
1258 var wrapper = $('acct_lists_prime');
\r
1259 if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return;
\r
1260 if(!wrapper) return;
\r
1262 var containers = containerFetchAll();
\r
1264 var found = false;
\r
1265 for(var i in containers) {
\r
1267 var cont = containers[i];
\r
1268 fleshedContainers[cont.id()] = cont;
\r
1269 var temp = containerTemplate.cloneNode(true);
\r
1270 var title = $n(temp, 'list_name');
\r
1271 var sel_none = $n(temp, 'select_none');
\r
1272 var sel_all = $n(temp, 'select_all');
\r
1273 var list_act = $n(temp, 'list_actions');
\r
1274 if(!title || !sel_none || !sel_all || !list_act) continue;
\r
1276 title.appendChild(text(cont.name()));
\r
1277 sel_all.onclick = function() { tickTheBoxes(true,this); };
\r
1278 sel_none.onclick = function() { tickTheBoxes(false,this); };
\r
1279 list_act.listID = cont.id();
\r
1280 list_act.onchange = myListAction;
\r
1281 temp.setAttribute("id",temp.id+cont.id());
\r
1283 if(isTrue(cont.pub())) {
\r
1284 list_act.appendChild(elem('option',{value:'hide'},'Un-share this list'));
\r
1285 var link = $n(temp,'share_list_rss');
\r
1286 link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));
\r
1289 list_act.appendChild(elem('option',{value:'share'},'Share this list'));
\r
1292 wrapper.appendChild(temp);
\r
1293 // grab container items after adding each list to the page
\r
1294 fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.container.flesh"],{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows});
\r
1296 if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists"));
\r
1299 var tbody =$('myopac_bookbag_tbody') ;
\r
1301 if(!containerTemplate)
\r
1302 containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));
\r
1303 else if(!force) return;
\r
1305 removeChildren(tbody);
\r
1307 var containers = containerFetchAll();
\r
1309 var found = false;
\r
1310 for( var i in containers ) {
\r
1312 var cont = containers[i];
\r
1313 var row = containerTemplate.cloneNode(true);
\r
1314 row.id = 'myopac_bookbag_row_' + cont.id();
\r
1315 var link = $n(row, 'myopac_expand_bookbag');
\r
1316 var dlink = $n(row, 'myopac_container_delete');
\r
1317 link.appendChild( text(cont.name()) );
\r
1318 link.setAttribute('href',
\r
1319 'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');
\r
1320 myOPACFetchBBItems( cont.id(), row );
\r
1321 dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');
\r
1323 if( isTrue(cont.pub()) ) {
\r
1324 unHideMe($n(row, 'myopac_bb_published_yes'));
\r
1325 var link = $n(row, 'myopac_bb_published_view');
\r
1326 link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html-full/'+cont.id(), false));
\r
1327 link.setAttribute('target', '_blank' );
\r
1330 link = $n(row, 'myopac_bb_published_atom');
\r
1331 link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));
\r
1332 link.setAttribute('target', '_blank' );
\r
1335 link = $n(row, 'myopac_bb_make_unpublished');
\r
1336 link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');
\r
1340 unHideMe($n(row, 'myopac_bb_published_no'));
\r
1341 var link = $n(row, 'myopac_bb_make_published');
\r
1342 link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');
\r
1346 tbody.appendChild(row);
\r
1349 if(!found) unHideMe($('myopac_bookbags_none'));
\r
1350 else unHideMe($('myopac_bookbag_table'));
\r
1354 function myListAction() {
\r
1355 if(!this.listID) return;
\r
1356 switch(this.value) {
\r
1357 case "delete": myOPACDeleteBookbag(this.listID); break;
\r
1358 case "share": myOPACMakeBBPublished(this.listID); break;
\r
1359 case "hide": myOPACMakeBBPublished(this.listID, true); break;
\r
1363 function drawListItemRows(r) {
\r
1364 var fleshed = r.recv().content();
\r
1365 if(!fleshed) return;
\r
1368 var temp = $('acct_list_template'+fleshed.id());
\r
1370 var tbody = $n(temp,'list_tbody');
\r
1371 if(!tbody) return;
\r
1372 var items = fleshed.items();
\r
1374 for(var i=0; i<items.length; i++) {
\r
1375 var it = items[i];
\r
1376 var tr = elem('tr');
\r
1377 var td1 = elem('td',{'class':'list_item_title_'+it.target_biblio_record_entry()});
\r
1378 var td2 = elem('td',{align:'right',width:'1'});
\r
1380 td2.appendChild(elem('input',{type:'checkbox', title:'Remove', name:'item_remove_chbx','class':'item_remove_chbx',itemID:+it.id(),listID:fleshed.id()}));
\r
1382 tr.appendChild(td1);
\r
1383 tr.appendChild(td2);
\r
1384 tbody.appendChild(tr);
\r
1385 modsArr[i] = it.target_biblio_record_entry();
\r
1388 // yay for batching requests
\r
1389 if(modsArr.length) {
\r
1390 fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{params:[modsArr],oncomplete:drawListItemTitles});
\r
1392 var tr = elem('');
\r
1393 var td = elem('td',{style:"font-weight:bold;font-size:14px;",align:'center'},'No items have been added to this list yet.');
\r
1394 tr.appendChild(td);
\r
1395 tbody.appendChild(tr);
\r
1399 function drawListItemTitles(r) {
\r
1400 var rec = r.recv().content();
\r
1403 for(var i in rec) {
\r
1404 var rows = dojo.query('.list_item_title_'+rec[i].doc_id());
\r
1405 rows.forEach(function(node, index, arr){
\r
1406 node.innerHTML = rec[i].title();
\r
1411 function myOPACMakeBBPublished(bbid, hideme) {
\r
1413 var bb = fleshedContainers[bbid];
\r
1416 if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;
\r
1419 if(!confirm($('myopac_make_published_confirm').innerHTML)) return;
\r
1423 var result = containerUpdate(bb);
\r
1425 var code = checkILSEvent(result);
\r
1426 if(code) { alertILSEvent(result); return; }
\r
1428 alert($('myopac_bb_update_success').innerHTML);
\r
1434 function myOPACDeleteBookbag(id) {
\r
1435 if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {
\r
1436 var result = containerDelete(id);
\r
1437 var code = checkILSEvent(result);
\r
1438 if(code) { alertILSEvent(result); return; }
\r
1439 alert($('myopac_bb_update_success').innerHTML);
\r
1440 //hideMe($('myopac_bookbag_items_table'));
\r
1441 //hideMe($('myopac_bookbag_items_name'));
\r
1442 //hideMe($('myopac_bookbag_no_items'));
\r
1447 function myOPACFetchBBItems( id, row, block ) {
\r
1449 containerFlesh( id, _myOPACSetBBItems, { row: row } );
\r
1451 var cont = containerFlesh(id);
\r
1452 myOPACSetBBItems( cont, row );
\r
1456 function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }
\r
1458 function myOPACSetBBItems( container, row ) {
\r
1459 fleshedContainers[container.id()] = container;
\r
1460 var node = $n(row, 'myopac_bookbag_item_count');
\r
1461 removeChildren(node);
\r
1462 node.appendChild( text(container.items().length) );
\r
1466 function myOPACExpandBookbag( id, name ) {
\r
1468 var tbody = $('myopac_bookbag_items_tbody');
\r
1469 if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));
\r
1470 removeChildren(tbody);
\r
1471 removeChildren($('myopac_bookbag_items_name'));
\r
1473 $('myopac_bookbag_items_name').appendChild(text(name));
\r
1475 if( fleshedContainers[id] ) {
\r
1476 var len = fleshedContainers[id].items().length;
\r
1479 unHideMe($('myopac_bookbag_no_items'));
\r
1480 hideMe($('myopac_bookbag_items_table'));
\r
1484 hideMe($('myopac_bookbag_no_items'));
\r
1485 unHideMe($('myopac_bookbag_items_table'));
\r
1487 for( var i = 0; i != len; i++ ) {
\r
1488 var row = BBItemsRow.cloneNode(true);
\r
1491 var item = fleshedContainers[id].items()[i];
\r
1492 var tlink = $n(row,'myopac_bookbag_items_title');
\r
1493 var alink = $n(row,'myopac_bookbag_items_author');
\r
1495 var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );
\r
1496 req.request.tlink = tlink;
\r
1497 req.request.alink = alink;
\r
1498 req.callback(myOPACShowBBItem);
\r
1501 var clink = $n(row, 'myopac_bookbag_items_remove');
\r
1502 clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');
\r
1504 tbody.appendChild(row);
\r
1509 function myOPACRemoveBBItem( id, containerid, container_name ) {
\r
1510 if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;
\r
1511 var stat = containerRemoveItem( id );
\r
1512 if(stat) alert($('myopac_bb_update_success').innerHTML);
\r
1513 myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);
\r
1514 myOPACExpandBookbag( containerid, container_name );
\r
1517 function myOPACShowBBItem(r) {
\r
1518 var record = r.getResultObject();
\r
1519 buildTitleDetailLink(record, r.tlink);
\r
1520 buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);
\r
1524 /* ---------------------------------------------------------------------- */
\r
1525 /* Non cat circs */
\r
1526 /* ---------------------------------------------------------------------- */
\r
1528 var nonCatCircIds;
\r
1530 /* if we have some circs, grab the non-cat types */
\r
1531 function myOPACDrawNonCatCircs(r) {
\r
1532 var ids = r.getResultObject();
\r
1533 if(ids.length == 0) return;
\r
1534 nonCatCircIds = ids;
\r
1535 unHideMe($('non_cat_circs_div'));
\r
1536 var req = new Request(FETCH_NON_CAT_TYPES, G.user.home_ou());
\r
1537 req.callback(myOPACDrawNonCatCircs2);
\r
1542 /* now we have circs and the types.. draw each one */
\r
1545 function myOPACDrawNonCatCircs2(r) {
\r
1546 nonCatTypes = r.getResultObject();
\r
1547 nonCatTbody = $('non_cat_circs_tbody');
\r
1548 if(!nonCatRow) nonCatRow =
\r
1549 nonCatTbody.removeChild($('non_cat_circs_row'));
\r
1550 removeChildren(nonCatTbody);
\r
1551 for( var i in nonCatCircIds ) {
\r
1552 var req = new Request(FETCH_NON_CAT_CIRC, G.user.session, nonCatCircIds[i]);
\r
1553 req.callback(myOPACDrawNonCatCirc);
\r
1559 /* draw a single circ */
\r
1560 function myOPACDrawNonCatCirc(r) {
\r
1561 var circ = r.getResultObject();
\r
1564 var type = grep(nonCatTypes,
\r
1566 return (i.id() == circ.item_type());
\r
1571 var row = nonCatTbody.appendChild(nonCatRow.cloneNode(true));
\r
1572 appendClear($n(row, 'circ_lib'), text(findOrgUnit(circ.circ_lib()).name()));
\r
1573 appendClear($n(row, 'item_type'), text(type.name()));
\r
1575 var duration = interval_to_seconds(type.circ_duration());
\r
1576 duration = parseInt(duration + '000');
\r
1578 var dtf = circ.circ_time();
\r
1579 var start = dojo.date.stamp.fromISOString(circ.circ_time());
\r
1580 var due = new Date( start.getTime() + duration );
\r
1581 appendClear($n(row, 'circ_time'), text(due.iso8601Format('YMDHM', null, true, true)));
\r
1587 function myopacSelectAllChecked() {
\r
1588 __myopacSelectChecked(true);
\r
1591 function myopacSelectNoneChecked() {
\r
1592 __myopacSelectChecked(false);
\r
1595 function __myopacSelectChecked(value) {
\r
1596 var rows = myopacGetCheckedOutRows();
\r
1597 for( var i = 0; i < rows.length; i++ ) {
\r
1598 var row = rows[i];
\r
1599 var box = $n(row, 'selectme');
\r
1600 if( box && ! box.disabled )
\r
1601 box.checked = value;
\r
1605 function myopacGetCheckedOutRows() {
\r
1607 var tbody = $('myopac_checked_tbody');
\r
1608 var children = tbody.childNodes;
\r
1609 for( var i = 0; i < children.length; i++ ) {
\r
1610 var child = children[i];
\r
1611 if( child.nodeName.match(/^tr$/i) )
\r
1612 if( $n(child, 'selectme') )
\r
1618 var __renew_circs = [];
\r
1620 /* true if 1 renewal succeeded */
\r
1621 var __success_count = 0;
\r
1623 /* renews all selected circulations */
\r
1624 function myOPACRenewSelected() {
\r
1625 var rows = myopacGetCheckedOutRows();
\r
1626 if(!confirm($('myopac_renew_confirm').innerHTML)) return;
\r
1627 __success_count = 0;
\r
1629 for( var i = 0; i < rows.length; i++ ) {
\r
1631 var row = rows[i];
\r
1632 if( ! $n(row, 'selectme').checked ) continue;
\r
1633 var circ_id = row.getAttribute('circid');
\r
1636 for( var j = 0; j != circsCache.length; j++ )
\r
1637 if(circsCache[j].id() == circ_id)
\r
1638 circ = circsCache[j];
\r
1640 __renew_circs.push(circ);
\r
1643 if( __renew_circs.length == 0 ) return;
\r
1645 unHideMe($('my_renewing'));
\r
1646 moClearCheckedTable();
\r
1648 for( var i = 0; i < __renew_circs.length; i++ ) {
\r
1649 var circ = __renew_circs[i];
\r
1650 moRenewCirc( circ.target_copy(), G.user.id(), circ );
\r
1655 /* renews a single circulation */
\r
1656 function moRenewCirc(copy_id, user_id, circ) {
\r
1658 _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id);
\r
1659 var req = new Request(RENEW_CIRC, G.user.session,
\r
1660 { patron : user_id,
\r
1661 copyid : copy_id,
\r
1666 req.request.alertEvent = false;
\r
1667 req.callback(myHandleRenewResponse);
\r
1668 req.request.circ = circ;
\r
1674 /* handles the circ renew results */
\r
1675 function myHandleRenewResponse(r) {
\r
1676 var res = r.getResultObject();
\r
1677 var circ = r.circ;
\r
1679 /* remove this circ from the list of circs to renew */
\r
1680 __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); });
\r
1682 _debug("handling renew result for " + circ.id());
\r
1684 if(checkILSEvent(res) || checkILSEvent(res[0]))
\r
1685 alertIdText('myopac_renew_fail', __circ_titles[circ.id()]);
\r
1686 else __success_count++;
\r
1688 if(__renew_circs) return; /* more to come */
\r
1690 __renew_circs = [];
\r
1692 if( __success_count > 0 )
\r
1693 alertIdText('myopac_renew_success', __success_count);
\r
1695 hideMe($('my_renewing'));
\r
1696 checkedDrawn = false;
\r
1697 myOPACShowChecked();
\r
1700 /** ---- batch hold processing ------------ */
\r
1703 /* myopac_holds_checkbx */
\r
1704 function myopacSelectAllHolds() {
\r
1705 var rows = getTableRows($("myopac_holds_tbody"));
\r
1706 for(var i = 0; i < rows.length; i++) {
\r
1707 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
\r
1708 if(cb) cb.checked = true;
\r
1712 function myopacSelectNoneHolds() {
\r
1713 var rows = getTableRows($("myopac_holds_tbody"));
\r
1714 for(var i = 0; i < rows.length; i++) {
\r
1715 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
\r
1716 if(cb) cb.checked = false;
\r
1720 function myopacSelectedHoldsRows() {
\r
1722 var rows = getTableRows($("myopac_holds_tbody"));
\r
1723 for(var i = 0; i < rows.length; i++) {
\r
1724 cb = $n(rows[i], 'myopac_holds_selected_chkbx');
\r
1725 if(cb && cb.checked)
\r
1731 var myopacProcessedHolds = 0;
\r
1732 var myopacHoldsToProcess = 0;
\r
1733 function myopacDoHoldAction() {
\r
1735 var selectedRows = myopacSelectedHoldsRows();
\r
1736 action = getSelectorVal($('myopac_holds_actions'));
\r
1737 $('myopac_holds_actions_none').selected = true;
\r
1738 if(selectedRows.length == 0) return;
\r
1740 myopacProcessedHolds = 0;
\r
1742 if(!confirmId('myopac.holds.'+action+'.confirm')) return;
\r
1743 myopacSelectNoneHolds(); /* clear the selection */
\r
1746 /* first, let's collect the holds that actually need processing and
\r
1747 collect the full process count while we're at it */
\r
1749 for(var i = 0; i < selectedRows.length; i++) {
\r
1750 hold = holdCache[myopacHoldIDFromRow(selectedRows[i])];
\r
1751 var qstats = holdStatusCache[hold.id()];
\r
1758 if(isTrue(hold.frozen()))
\r
1762 if(!isTrue(hold.frozen()) && qstats.status < 3)
\r
1767 myopacHoldsToProcess = holds;
\r
1768 if(myopacHoldsToProcess.length == 0) return;
\r
1770 if(action == 'thaw_date' || action == 'freeze')
\r
1771 myopacDrawHoldThawDateForm();
\r
1773 myopacProcessHolds(action);
\r
1777 function myopacProcessHolds(action, thawDate) {
\r
1779 myopacShowHoldProcessing();
\r
1780 /* now we process them */
\r
1781 for(var i = 0; i < myopacHoldsToProcess.length; i++) {
\r
1783 hold = myopacHoldsToProcess[i];
\r
1789 req = new Request(CANCEL_HOLD, G.user.session, hold.id());
\r
1794 hold.thaw_date(null);
\r
1795 req = new Request(UPDATE_HOLD, G.user.session, hold);
\r
1801 hold.thaw_date(thawDate);
\r
1802 req = new Request(UPDATE_HOLD, G.user.session, hold);
\r
1804 //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML);
\r
1808 req.callback(myopacBatchHoldCallback);
\r
1814 function myopacDrawHoldThawDateForm() {
\r
1815 hideMe($('myopac_holds_main_table'));
\r
1816 unHideMe($('myopac_holds_thaw_date_form'));
\r
1817 $('myopac_holds_thaw_date_input').focus();
\r
1820 function myopacApplyThawDate() {
\r
1821 var obj = $('myopac_holds_thaw_date_input');
\r
1822 var dateString = obj.value;
\r
1824 dateString = dojo.date.stamp.toISOString(dateString);
\r
1826 dateString = holdsVerifyThawDate(dateString);
\r
1827 if(!dateString) return;
\r
1829 dateString = null;
\r
1832 myopacProcessHolds('freeze', dateString);
\r
1835 function myopacHoldIDFromRow(row) {
\r
1836 return row.id.replace(/.*_(\d+)$/, '$1');
\r
1839 function myopacShowHoldProcessing() {
\r
1840 unHideMe($('myopac_holds_processing'));
\r
1841 hideMe($('myopac_holds_main_table'));
\r
1844 function myopacHideHoldProcessing() {
\r
1845 hideMe($('myopac_holds_processing'));
\r
1846 unHideMe($('myopac_holds_main_table'));
\r
1847 hideMe($('myopac_holds_thaw_date_form'));
\r
1850 function myopacBatchHoldCallback(r) {
\r
1851 if(r) /* force load any exceptions */
\r
1852 r.getResultObject();
\r
1853 if(++myopacProcessedHolds >= myopacHoldsToProcess.length) {
\r
1854 myopacHideHoldProcessing();
\r
1856 holdStatusCache = {};
\r
1857 myopacForceHoldsRedraw = true;
\r
1858 myOPACShowHolds();
\r
1862 function switchHoldsPage(page) {
\r
1864 objs['holds_label'] = $('holds_label');
\r
1865 objs['holds_link'] = $('holds_link');
\r
1866 objs['holds_hist_link'] = $('holds_hist_link');
\r
1867 objs['holds_hist_label'] = $('holds_hist_label');
\r
1869 objs['holds_main'] = $('holds_main');
\r
1870 objs['holds_hist_table'] = $('holds_hist_table');
\r
1872 for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }
\r
1876 unHideMe(objs['holds_label']);
\r
1877 unHideMe(objs['holds_hist_link']);
\r
1878 unHideMe(objs['holds_main']);
\r
1879 $('acct_holds_header').innerHTML = "Current Items on Hold";
\r
1881 case "holds_hist":
\r
1882 unHideMe(objs['holds_link']);
\r
1883 unHideMe(objs['holds_hist_label']);
\r
1884 unHideMe(objs['holds_hist_table']);
\r
1885 $('acct_holds_header').innerHTML = "Holds History";
\r
1890 function switchPrefsPage(page) {
\r
1892 objs['acct_info_label'] = $('acct_info_label');
\r
1893 objs['acct_info_link'] = $('acct_info_link');
\r
1894 objs['acct_notify_label'] = $('acct_notify_label');
\r
1895 objs['acct_notify_link'] = $('acct_notify_link');
\r
1896 objs['acct_search_label'] = $('acct_search_label');
\r
1897 objs['acct_search_link'] = $('acct_search_link');
\r
1899 objs['acct_info_head'] = $('acct_info_head');
\r
1900 objs['acct_search_head'] = $('acct_search_head');
\r
1901 objs['acct_notify_head'] = $('acct_notify_head');
\r
1902 objs['acct_info_main'] = $('acct_info_main');
\r
1903 objs['acct_search_main'] = $('acct_search_main');
\r
1904 objs['acct_notify_main'] = $('acct_notify_main');
\r
1906 for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }
\r
1910 unHideMe(objs['acct_info_label']);
\r
1911 unHideMe(objs['acct_notify_link']);
\r
1912 unHideMe(objs['acct_search_link']);
\r
1913 unHideMe(objs['acct_info_head']);
\r
1914 unHideMe(objs['acct_info_main']);
\r
1915 hideMe($('acct_prefs_save'));
\r
1918 unHideMe(objs['acct_search_label']);
\r
1919 unHideMe(objs['acct_info_link']);
\r
1920 unHideMe(objs['acct_notify_link']);
\r
1921 unHideMe(objs['acct_search_head']);
\r
1922 unHideMe(objs['acct_search_main']);
\r
1923 unHideMe($('acct_prefs_save'));
\r
1926 unHideMe(objs['acct_info_link']);
\r
1927 unHideMe(objs['acct_notify_label']);
\r
1928 unHideMe(objs['acct_search_link']);
\r
1929 unHideMe(objs['acct_notify_head']);
\r
1930 unHideMe(objs['acct_notify_main']);
\r
1931 unHideMe($('acct_prefs_save'));
\r
1936 function switchCheckedPage(page) {
\r
1938 objs['checked_label'] = $('checked_label');
\r
1939 objs['checked_link'] = $('checked_link');
\r
1940 objs['checked_hist_link'] = $('checked_hist_link');
\r
1941 objs['checked_hist_label'] = $('checked_hist_label');
\r
1943 objs['checked_main'] = $('checked_main');
\r
1944 objs['checked_hist'] = $('checked_hist');
\r
1946 for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }
\r
1950 unHideMe(objs['checked_label']);
\r
1951 unHideMe(objs['checked_hist_link']);
\r
1952 unHideMe(objs['checked_main']);
\r
1953 $('acct_checked_header').innerHTML = "Current Items Checked Out";
\r
1954 //if(__can_renew_one) unHideMe($('mo_renew_button'));
\r
1956 case "checked_hist":
\r
1957 unHideMe(objs['checked_link']);
\r
1958 unHideMe(objs['checked_hist_label']);
\r
1959 unHideMe(objs['checked_hist']);
\r
1960 $('acct_checked_header').innerHTML = "Check Out History";
\r
1961 //hideMe($('mo_renew_button'));
\r
1966 function tickTheBoxes(bool,el) {
\r
1967 var rows = dojo.query('input[type=checkbox]',el.parentNode.parentNode.parentNode);
\r
1969 for(var i = 0; i < rows.length; i++) {
\r
1970 cb = $n(rows[i], 'item_remove_chbx');
\r
1971 if(cb) cb.checked = bool;
\r
1975 function removeSelectedItems() {
\r
1976 var items = dojo.query('.item_remove_chbx',$('acct_lists_prime')).filter(function(item, index, arr){return item.checked;},this);
\r
1978 if(items.length && confirm("Are you sure you want to remove the selected items?")) {
\r
1979 for(var i=0; i<items.length; i++) {
\r
1980 var box = items[i];
\r
1982 containerRemoveItem(box.itemID);
\r
1990 function reloadMyLists() {
\r
1991 var prime = $('acct_lists_prime');
\r
1992 var temp2 = $('acct_list_template2').cloneNode(true);
\r
1993 prime.innerHTML = "";
\r
1994 temp2.id = 'acct_list_template';
\r
1995 prime.appendChild(temp2);
\r
1996 myOPACShowBookbags(true);
\r
1999 function addMyList() {
\r
2000 var name = $('mylist_new').value;
\r
2001 if(!name) return false;
\r
2003 var exists = false;
\r
2004 for( var c in fleshedContainers ) { exists = true; break; }
\r
2006 /* let them know what they are getting into... */
\r
2007 if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return false;
\r
2008 var result = containerCreate( name, $('shareListYes').checked );
\r
2009 var code = checkILSEvent(result);
\r
2010 if(code) { alertILSEvent(result); return false; }
\r
2011 if(result) alert($('myopac_bb_update_success').innerHTML);
\r
2012 $('mylist_new').value="";
\r
2013 $('shareListYes').checked = false;
\r
2014 $('shareListNo').checked = true;
\r
2019 function showFinesDiv(el) {
\r
2021 if($('myopac_fines_div').className.indexOf('hide_me')>=0) {
\r
2022 unHideMe($('myopac_fines_div'));
\r
2023 el.innerHTML="Hide Overdue Materials";
\r
2025 hideMe($('myopac_fines_div'));
\r
2026 el.innerHTML="Show Overdue Materials";
\r