From: senator Date: Thu, 3 Mar 2011 16:22:31 +0000 (-0500) Subject: Merge branch 'kcls-grey-screen' of ssh://senator@yeti.esilibrary.com/home/evergreen... X-Git-Tag: kcls-grey-screen-prod1~45 X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=0f359706c32676fdcac506fa0bedaff85108d025;p=evergreen%2Fequinox.git Merge branch 'kcls-grey-screen' of ssh://senator@yeti.esilibrary.com/home/evergreen/evergreen-equinox into kcls-grey-screen Conflicts: Open-ILS/web/opac/skin/kcls/js/myopac.js --- 0f359706c32676fdcac506fa0bedaff85108d025 diff --cc Open-ILS/web/opac/skin/kcls/js/myopac.js index 8af56cfb38,2434cc0f86..63594aede3 --- a/Open-ILS/web/opac/skin/kcls/js/myopac.js +++ b/Open-ILS/web/opac/skin/kcls/js/myopac.js @@@ -1,2318 -1,2320 +1,2320 @@@ - -//attachEvt("common", "run", myOPACInit ); -// force init to run after opac_init(); -dojo.addOnLoad(function(){setTimeout(myOPACInit, 0)}); - -attachEvt('common','locationUpdated', myopacReload ); -dojo.require('openils.Util'); - -var FETCH_CONTAINER_DETAILS = ['open-ils.actor','open-ils.actor.container.flesh']; -var FETCH_CHECKED_DETAILS = ['open-ils.circ','open-ils.circ.actor.user.checked_out.atomic']; -var FETCH_CHECKED_HISTORY = ['open-ils.actor','open-ils.actor.history.circ.visible.atomic']; -var FETCH_FAV_SEARCHES = ['open-ils.actor','open-ils.actor.user.saved_search.retrieve']; -var FETCH_HOLD_DETAILS = ['open-ils.circ','open-ils.circ.hold.details.batch.retrieve.atomic']; -var FETCH_MODS_BY_COPY = ['open-ils.search','open-ils.search.biblio.mods_from_copy']; -var FETCH_CALL_NUMBER = ['open-ils.search','open-ils.search.callnumber.retrieve']; -var FETCH_MODS_SLIM = ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve']; -var FETCH_FULL_USER = ['open-ils.actor','open-ils.actor.user.fleshed.retrieve']; -var FETCH_HOLD_IDS = ['open-ils.circ','open-ils.circ.holds.id_list.retrieve']; -var FETCH_COPY_OBJ = ['open-ils.search','open-ils.search.asset.copy.retrieve']; -var FETCH_OPT_INS = ['open-ils.actor','open-ils.actor.event_def.opt_in.settings.atomic']; -var FETCH_LISTS = ['open-ils.actor','open-ils.actor.container.flesh']; -var PASS_RESET = ['open-ils.actor','open-ils.actor.patron.password_reset.request']; -var PAY_BILLS = ['open-ils.circ','open-ils.circ.money.payment']; -// number of api calls to run before firing myOPACPostCollect() -- helps make all data available first (avoids having to make sync'd calls) -var TOTAL_CALLS = 6; - -var PREFS_HOLD_PHONE = "notification.hold.pickup.phone"; -var PREFS_HOLD_EMAIL = "notification.hold.pickup.email"; -var PREFS_PREDUE_3DAY = "notification.predue.email"; -var PREFS_OVER_FIRST = "notification.overdue.first.email"; -var PREFS_OVER_FIRST_P = "notification.overdue.first.phone"; -var PREFS_HOLD_EXPIRE = "notification.hold.expire.email"; -var PREFS_HOLD_CANCEL = "notification.hold.cancel.email"; -var PREFS_CIRC_HIST_AGE = "history.circ.retention_age"; -var PREFS_CIRC_HIST_START = "history.circ.retention_start"; - -var listsCache = []; -var holdsCache = []; -var holdsCacheMap = []; -var itemsOutCache = []; -var callNumCache = []; -var favsCache = []; -var copyObjCache = []; -var mvrObjCache = []; -var itemsOutHistory = []; -var userOptIns = []; -var userOptInsMap = []; -var fleshedLists = []; -var imgFormatCache = []; -var transCache = []; -var fleshedContainers = {}; -var subPageObjs = {}; - -var CIRC_HIST_PAGE_LIMIT = 10; -var circHistPage = 0; -var showXUL = false; -var holdsList = null; -var fleshedUser = null; -var allowPendingAddr = false; -var currPage = ""; -var templates = {}; -var containerTemplate; -var containerTemplate2; -var myopacGenericTransTemplate; -var myopacCircTransTemplate; -var addrRowTemplate; -var notesTemplate; -var myopacReturnToPayment = false; - -function myOPACInit() { - if(!(G.user && G.user.session)) { - initLogin(); - } else { - allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address'); - if(allowPendingAddr) unHideMe($('myopac_pending_addr_td')); - - unHideMe($('myopac_tabs')); - currPage = "summary"; - holdsList = getCacheValue('saveAnonCache'); - if(holdsList) { currPage = "holds"; swapTabs($('acct_holds')); setCacheValue('saveAnonCache', null); TOTAL_CALLS -= 2; } - var retUrl = getCacheValue('returnURL'); - if(retUrl) { setCacheValue('returnURL', null); setCacheValue('showHoldEditor', {record:retUrl.record, type:retUrl.type}); window.location=retUrl.href; } - - var sel = $('myopac_new_home'); - buildOrgSel(sel, globalOrgTree, 0); - setSelector(sel, G.user.home_ou()); - - switch(new CGI().param('acctpage')) { - case "1": currPage = "summary"; break; - case "2": currPage = "checked"; swapTabs($('acct_checked_out')); break; - case "3": currPage = "holds"; swapTabs($('acct_holds')); break; - case "4": currPage = "prefs"; swapTabs($('acct_prefs')); break; - case "5": currPage = "fines"; swapTabs($('acct_favs')); break; - case "6": currPage = "bookbag"; swapTabs($('acct_lists')); break; - } - - if(!isXUL()) { - unHideMe($('myopac_summary_email_change')); - unHideMe($('myopac_summary_password_change')); - unHideMe($('myopac_summary_username_change')); - } else { - unHideMe($('myopac_summary_phone1_change')); - unHideMe($('myopac_summary_phone2_change')); - unHideMe($('myopac_summary_phone3_change')); - } - - - fieldmapper.standardRequest(FETCH_FULL_USER, {async:true, params:[G.user.session, G.user.id()], - oncomplete:function(r) { - showXUL = isXUL(); - fleshedUser = openils.Util.readResponse(r); - myOPACShowFines(true); - myOPACShowUser(false); - myOPACChangePage(currPage); - myOPACInitTemplates(); - myOPACInitSubpages(); - //myOPACShowBookbags(true); - if(holdsList) doBatchAnonHolds(); - showCanvas(); - } - }); - } -} - -function myopacReload() { - var a = {}; - a[PARAM_LOCATION] = getNewSearchLocation(); - a[PARAM_DEPTH] = getNewSearchDepth(); - hideMe($('canvas_main')); - goTo(buildOPACLink(a, true)); -} - -function myOPACChangePage( page ) { - var s = $("myopac_summary_td"); - var c = $("myopac_checked_td"); - var f = $("myopac_fines_td"); - var h = $("myopac_holds_td"); - var p = $("myopac_prefs_td"); - var b = $('myopac_bookbag_td'); - - var ss = $("myopac_summary_div"); - var cc = $("myopac_checked_div"); - var ff = $("myopac_fines_div"); - var hh = $("myopac_holds_div"); - var pp = $("myopac_prefs_div"); - var bb = $('myopac_bookbag_div'); - - hideMe(ss); - hideMe(cc); hideMe(ff); - hideMe(hh); hideMe(pp); - hideMe(bb); - - if(page != 'prefs') - myopacReturnToPayment = false; - - var oncomplete = null; - - switch( page ) { - case "summary": unHideMe(ss); - if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff); - oncomplete = myOPACDrawSummary; - break; - - case "checked": - unHideMe(cc); - oncomplete = drawCheckedPage; - break; - - case "holds": - unHideMe(hh); - oncomplete = drawHoldsPage; - break; - - case "prefs": - unHideMe(pp); - oncomplete = myOPACShowPrefs; - break; - - case 'bookbag': - unHideMe(bb); - break; - } - currPage = page; - myOPACGrabPageData(page, oncomplete); -} - -var fetchedPages={} -function myOPACGrabPageData(page, oncomplete) { - if(fetchedPages[page]) return; - fetchedPages[page] = true; - - switch(page) { - - case "summary": - oncomplete(); - break; - - case "checked": - - progressDialog.show(true); - fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:true, params:[G.user.session, G.user.id()], - oncomplete:function(r) { - progressDialog.hide(); - itemsOutCache = openils.Util.readResponse(r); - oncomplete(); - } - }); - - break; - - case "holds": - - holdsCache=null; - fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:true, params:[G.user.session, G.user.id()], - oncomplete: function(r) { - oncomplete(false, openils.Util.readResponse(r)); - - /* - var holdids = openils.Util.readResponse(r); - fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, holdids], - oncomplete: function(rr) { - progressDialog.hide(); - var holds = openils.Util.readResponse(rr); - holdsCache = holds; - setTimeout(function(){oncomplete()}, 150); // give the progress dialog a chance to clear out - oncomplete(); - } - }); - */ - } - }); - - break; - - case "prefs": - fieldmapper.standardRequest(FETCH_OPT_INS, {async:true, params:[G.user.session], - oncomplete:function(r) { - userOptIns = openils.Util.readResponse(r); - for(var i=0; i 0) { - var bal = $('myopac_sum_fines_bal'); - bal.style.color = "red"; - appendClear(bal, text("$" + Number(stats.fines.balance_owed).toFixed(2))); - showFinesDiv($('show_fines_link')); - unHideMe($('pay_fines_btn1')); - unHideMe($('show_fines_link')); - } -} - -function myOPACInitTemplates() { - //holds page - if(!templates.holdsParent) templates.holdsParent = $('holds_temp_parent'); - if(!templates.holdsTemp) templates.holdsTemp = templates.holdsParent.removeChild($('acct_holds_temp')); - //checked out page - if(!templates.checkedParent) templates.checkedParent = $('checked_temp_parent'); - if(!templates.checkedTemp) templates.checkedTemp = templates.checkedParent.removeChild($('acct_checked_temp')); - //checked history page - if(!templates.circHistPar) templates.circHistPar = $('acct_checked_hist_parent'); - if(!templates.circHistTemp) templates.circHistTemp = templates.circHistPar.removeChild($('acct_checked_hist_temp')); -} - -// link-up all the Account sub-pages for switchSubPage() -function myOPACInitSubpages() { - // create a primary object for each page... - subPageObjs.checked = {}; - subPageObjs.holds = {}; - subPageObjs.prefs = {}; - - // ... then create an array for each sub-page - subPageObjs.checked.main = []; - subPageObjs.checked.hist = []; - subPageObjs.holds.main = []; - subPageObjs.holds.hist = []; - subPageObjs.prefs.info = []; - subPageObjs.prefs.notify = []; - subPageObjs.prefs.search = []; - - // add .header to each primary page object and link to the page's blue header bar. - // add ['header'] to each sub-page array and put the text to display - subPageObjs.checked.header = $('acct_checked_header'); - subPageObjs.checked.main['header'] = "Current Items Checked Out"; - subPageObjs.checked.hist['header'] = "Check Out History"; - subPageObjs.checked.main.push($('checked_label')); - subPageObjs.checked.hist.push($('checked_link')); - subPageObjs.checked.main.push($('checked_hist_link')); - subPageObjs.checked.hist.push($('checked_hist_label')); - subPageObjs.checked.main.push($('checked_main')); - subPageObjs.checked.hist.push($('checked_hist')); - - subPageObjs.holds.header = $('acct_holds_header'); - subPageObjs.holds.main['header'] = "Current Items on Hold"; - subPageObjs.holds.hist['header'] = "Holds History"; - subPageObjs.holds.main.push($('holds_label')); - subPageObjs.holds.hist.push($('holds_link')); - subPageObjs.holds.main.push($('holds_hist_link')); - subPageObjs.holds.hist.push($('holds_hist_label')); - subPageObjs.holds.main.push($('holds_main')); - subPageObjs.holds.hist.push($('holds_hist_table')); - - subPageObjs.prefs.header = $('acct_prefs_header'); - subPageObjs.prefs.info['header'] = "Account Information and Preferences"; - subPageObjs.prefs.notify['header'] = "Notification Preferences"; - subPageObjs.prefs.search['header'] = "Search Preferences"; - subPageObjs.prefs.info.push($('prefs_info_lbl')); - subPageObjs.prefs.notify.push($('prefs_info_link')); - subPageObjs.prefs.notify.push($('prefs_notify_lbl')); - subPageObjs.prefs.info.push($('prefs_notify_link')); - subPageObjs.prefs.search.push($('prefs_search_lbl')); - subPageObjs.prefs.info.push($('prefs_search_link')); - subPageObjs.prefs.notify.push($('prefs_search_link')); - subPageObjs.prefs.search.push($('prefs_notify_link')); - subPageObjs.prefs.search.push($('prefs_info_link')); - subPageObjs.prefs.info.push($('acct_info_main')); - subPageObjs.prefs.search.push($('acct_search_main')); - subPageObjs.prefs.notify.push($('acct_notify_main')); - subPageObjs.prefs.notify.push($('acct_prefs_save')); - subPageObjs.prefs.search.push($('acct_prefs_save')); -} - -function fetchAllHolds() { -} - -var myopacForceHoldsRedraw = false; -function drawHoldsPage(sort, holdIds) { - if(sort == undefined) sort = true; - if(!templates.holdsParent || !templates.holdsTemp) return; - var parent = templates.holdsParent; - var temp = templates.holdsTemp; - var holdsReady = 0; - - if(myopacForceHoldsRedraw) { - holdsCache = fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:false, params:[G.user.session, - fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:false, params:[G.user.session, G.user.id()]}) - ]}); - } - - if(sort) holdsCache = holdsCache.sort(function(a, b) { - if(a.status==4) return -1; - if(b.status==4) return 1; - if(isTrue(a.hold.frozen())) return 1; - if(isTrue(b.hold.frozen())) return -1; - return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?1:-1; - }); - - function allHoldsFetched() { - holdsCacheMap=[]; - for(var i=0; i
- - if(hold.status == 4) holdsReady++; - } - allHoldsFetched(); - - } else if(holdIds) { - - holdsCache = []; - var holdsReceived = 0; - - dojo.forEach(holdIds, - function(holdId) { - var row = temp.cloneNode(true); - dojo.style(row, 'visibility', 'hidden'); - parent.appendChild(row); - - //parent.appendChild(elem('tr').appendChild(elem('td', {'colspan':'10'}).appendChild(elem('div', {'style':'position:absolute;'}).appendChild(elem('div', {'style':'position:relative;'}).appendChild(elem('div', {'style':'width:974px;height:1px;background:#dcdbdb;'})))))); - - fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, [holdId]], - oncomplete: function(rr) { - var hold = openils.Util.readResponse(rr)[0]; - holdsCache.push(hold); - dojo.style(row, 'visibility', 'visible'); - drawOneHold(hold, row, parent); - if(hold.status == 4) holdsReady++; - if(++holdsReceived == holdIds.length) - allHoldsFetched(); - } - }); - } - ); - } -} - -function drawOneHold(h, row, parent) { - var imgTD = null; - var imgEl = null; - var d = null; - var exp_date; - var suffix = ""; - - row.id = "myopac_holds_row_" + h.hold.id(); - var form = $n(row, "myopac_holds_formats"); - form.id = "myopac_holds_form_" + h.hold.id(); - $n(row,'hold_pickup_lib_span').appendChild($('hold_pickup_lib_temp').cloneNode(true)); - - var tree = $n(row,'hold_pickup_lib_sel'); - buildOrgSelAlt(tree, globalOrgTree, 0); - setSelector(tree, h.hold.pickup_lib()); - $n(row,'check_all_holds').holdid = h.hold.id(); - $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+h.hold.id()+');'); - $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+h.hold.id()+');'); - $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+h.hold.id()+');'); - var activeSel = $n(row,'hold_active_sel'); - activeSel.selectedIndex = isTrue(h.hold.frozen())?1:0; - - //var djBox = $n(row,'activate_box').parentNode.parentNode.parentNode; - //djBox.id=djBox.id+h.hold.id(); - //var blah = dojo.query('input',$n(row,'activate_box').parentNode)[0]; - //blah.id = djBox.getAttribute("widgetId")+h.hold.id(); - //$().id = djBox.id+h.hold.id(); - //djBox.setAttribute("widgetId", djBox.getAttribute("widgetId")+h.hold.id()); - - $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.hold.pickup_lib()).name(); - $n(row,'hold_active').innerHTML = isTrue(h.hold.frozen())?"Suspended":"Active"; - if(isTrue(h.hold.frozen())) row.style.background="#e5e5e5"; - - if(h.hold.thaw_date()) { - d = dojo.date.stamp.fromISOString(h.hold.thaw_date()); - $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); - unHideMe($n(row,'activate_label')); - $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); - } - - if(h.hold.expire_time()) { - exp_date = dojo.date.stamp.fromISOString(h.hold.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3")) - $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - unHideMe($n(row,'hold_expires_label')); - $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - } - - buildTitleDetailLink(h.mvr, $n(row,'myopac_holds_title_link')); - $n(row,'myopac_holds_title_link').title = h.mvr.title(); - - imgTD = $n(row, "myopac_holds_formats"); - imgEl = elem('img'); - imgEl.className = 'hide_me'; - imgEl.name = 'format_icon_'+h.hold.id(); - imgTD.appendChild(imgEl); - if(imgFormatCache[h.hold.id()]==null) imgFormatCache[h.hold.id()] = getMarcData(h.mvr.doc_id(),"998","d"); - setFormatIcon(imgEl, imgFormatCache[h.hold.id()]); - - $n(row,'myopac_holds_author').innerHTML = h.mvr.author(); - - if( h.status == 4) { - $n(row,'acct_holds_status').innerHTML = "Ready for Pickup"; - hideMe($n(row,'holds_editor_row')); - unHideMe($n(row,'holds_ready_row')); - if(h.hold.shelf_expire_time()) $n(row,'hold_ready_expire').innerHTML = - dojo.date.locale.format(dojo.date.stamp.fromISOString(h.hold.shelf_expire_time()), {selector:'date', fullYear: true});; - } else { - var num = h.queue_position+''; - suffix = (num.charAt(num.length-1)=="1")?"st":(num.charAt(num.length-1)=="2")?"nd":(num.charAt(num.length-1)=="3")?"rd":"th"; - if(num=="11" || num=="12" || num=="13") suffix = "th"; - $n(row,'acct_holds_status').innerHTML = h.queue_position+suffix+" hold on "+h.potential_copies+" circulating cop"+(h.potential_copies==1?"y":"ies"); - } -} - -var checkedDrawn = true; -function drawCheckedPage(sort) { - if(sort==undefined) sort = true; - if(!templates.checkedParent || !templates.checkedTemp) return; - var parent = templates.checkedParent; - var temp = templates.checkedTemp; - - if(!checkedDrawn) itemsOutCache = fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:false, params:[G.user.session, G.user.id()]}); - if(sort) itemsOutCache = itemsOutCache.sort(function(a, b) { - if(dojo.date.stamp.fromISOString(a.circ.due_date()) > dojo.date.stamp.fromISOString(b.circ.due_date())) return 1; - return -1; - }); - checkedDrawn = true; - - removeChildren(parent); - for(var i in itemsOutCache) { - var row = temp.cloneNode(true); - var out = itemsOutCache[i]; - //row.id = "myopac_holds_row_" + out.hold.id(); - if(!mvrObjCache[out.circ.target_copy()]) mvrObjCache[out.circ.target_copy()] = out.record; - if(!copyObjCache[out.copy.id()]) copyObjCache[out.copy.id()] = out.copy; - - if(out.circ.due_date()) { - var exp_date = dojo.date.stamp.fromISOString(out.circ.due_date()); - if(exp_date<(new Date())) $n(row,'due_date').style.color="red"; - $n(row, 'due_date').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - } - - $n(row, 'renewals').innerHTML = out.circ.renewal_remaining(); - buildTitleDetailLink(out.record, $n(row,'title')); - if(out.record.author()) $n(row, 'author').appendChild(text(" / "+out.record.author())); - dojo.attr($n(row, 'check_all_checked'), 'circid', out.circ.id()) - $n(row,'title').title = out.record.title(); - $n(row, 'barcode').innerHTML = out.copy.barcode(); - if(callNumCache[out.copy.call_number()]==null) callNumCache[out.copy.call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[out.copy.call_number()]}); - $n(row, 'call_number').innerHTML = callNumCache[out.copy.call_number()].label(); - - parent.appendChild(row); - } - - if(!itemsOutCache.length) parent.appendChild(elem('div',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items checked out.')); -} - -var circHistDrawn = true; -function drawCircHistory(sort, offset) { - if(sort==undefined) sort = true; - if(offset==undefined) offset = circHistPage; else circHistPage = offset; - if(!templates.circHistPar || !templates.circHistTemp) return; - var parent = templates.circHistPar; - var temp = templates.circHistTemp; - - if(!circHistDrawn) itemsOutHistory = fieldmapper.standardRequest(FETCH_CHECKED_HISTORY, {async:false, params:[G.user.session, G.user.id(), {'limit':CIRC_HIST_PAGE_LIMIT, 'offset':offset}]}); - circHistDrawn = true; - - removeChildren(parent); - for(var i in itemsOutHistory) { - var row = temp.cloneNode(true); - var h = itemsOutHistory[i]; - if(mvrObjCache[h.circ.target_copy()]==null) mvrObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_MODS_BY_COPY, {async:false, params:[h.circ.target_copy()]}); - var mvr = mvrObjCache[h.circ.target_copy()]; - - if(mvr && !mvr.desc) { - buildTitleDetailLink(mvr, $n(row, 'title')); - $n(row, 'title').title = mvr.title(); - $n(row, 'author').innerHTML = mvr.author(); - - //dojo.date.locale.format(dojo.date.stamp.fromISOString(), {selector:'date', fullYear: true}); - } - - //date formatting and coloring - var ret = $n(row, 'returned'); - var due = $n(row, 'due_date'); - $n(row, 'checkout').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.create_time()), {selector:'date', fullYear: true}); - due.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.due_date()), {selector:'date', fullYear: true}); - if(!h.circ.checkin_time() && new Date() > dojo.date.stamp.fromISOString(h.circ.due_date())) due.style.color="red"; - if(h.circ.checkin_time() && dojo.date.stamp.fromISOString(h.circ.checkin_time()) > dojo.date.stamp.fromISOString(h.circ.due_date())) ret.style.color="red"; - if(h.circ.checkin_time()) ret.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.checkin_time()), {selector:'date', fullYear: true}); - else ret.innerHTML = "Checked Out"; - - if(copyObjCache[h.circ.target_copy()]==null) copyObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_COPY_OBJ, {async:false, params:[h.circ.target_copy()]}); - if(callNumCache[copyObjCache[h.circ.target_copy()].call_number()]==null) - callNumCache[copyObjCache[h.circ.target_copy()].call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[copyObjCache[h.circ.target_copy()].call_number()]}); - - if(copyObjCache[h.circ.target_copy()] && callNumCache[copyObjCache[h.circ.target_copy()].call_number()]) - $n(row,'call_number').innerHTML = callNumCache[copyObjCache[h.circ.target_copy()].call_number()].label(); - parent.appendChild(row); - } - - if(!itemsOutHistory.length) { - parent.appendChild(elem('tr').appendChild(elem('td',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items found.'))); - return; - } - - //build pagination - var pageTR = elem('tr'); - var pageTD = elem('td', {'align':'center', 'colspan':'5'}, null); - - var offPrev = offset - CIRC_HIST_PAGE_LIMIT; - var offNext = offset + CIRC_HIST_PAGE_LIMIT; - if(offset==0) offPrev = 0; - - if(offset!=0) var prev = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offPrev+');'}, '< Previous'); - else var prev = elem('span', null, '< Previous'); - if(itemsOutHistory.length'); - else var next = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offNext+');'}, 'Next >'); - - pageTD.appendChild(prev); - pageTD.appendChild(elem('span', null, ' ')); - pageTD.appendChild(next); - pageTR.appendChild(pageTD); - parent.appendChild(pageTR); -} - -function myOPACShowPrefs() { - grabUserPrefs(); - myOPACShowHitsPer(); - myOPACShowDefFont(); - myOPACShowDefLocation(); - myOPACShowNotifyPrefs(); - hideMe($('myopac_prefs_loading')); -} - -var defSearchLocationDrawn = false; -var defDepthIndex = 0; -function myOPACShowDefLocation() { - - var selector = $('prefs_def_location'); - var rsel = $('prefs_def_range'); - - if(!defSearchLocationDrawn) { - defSearchLocationDrawn = true; - var org = G.user.prefs[PREF_DEF_LOCATION]; - - if(!org) { - $('myopac_pref_home_lib').checked = true; - $('prefs_def_location').disabled = true; - org = G.user.home_ou(); - } - buildOrgSel(selector, globalOrgTree, 0); - - globalOrgTypes = globalOrgTypes.sort( - function(a, b) { - if( a.depth() < b.depth() ) return -1; - return 1; - } - ); - - iterate(globalOrgTypes, - function(t) { - if( t.depth() <= findOrgDepth(org) ) { - setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth()); - if( t.depth() == findOrgDepth(org)) - setSelector(rsel, t.depth()); - } - } - ); - } - - setSelector(selector, org); -} - -function myOPACShowNotifyPrefs() { - var preEmail = $(PREFS_PREDUE_3DAY); - var overEmail = $(PREFS_OVER_FIRST); - var overPhone = $(PREFS_OVER_FIRST_P); - var holdsCancel = $(PREFS_HOLD_CANCEL); - var holdsExpire = $(PREFS_HOLD_EXPIRE); - var holdsEmail = $("opac.hold_notify.email"); - var holdsPhone = $("opac.hold_notify.phone"); - if(G.user.prefs[PREFS_CIRC_HIST_START]) { $('circHistStart').checked = true; } - - if(preEmail && typeof(G.user.prefs[PREFS_PREDUE_3DAY]) !="undefined") preEmail.checked = G.user.prefs[PREFS_PREDUE_3DAY]; - if(overEmail && typeof(G.user.prefs[PREFS_OVER_FIRST]) !="undefined") overEmail.checked = G.user.prefs[PREFS_OVER_FIRST]; - if(overPhone && typeof(G.user.prefs[PREFS_OVER_FIRST_P]) !="undefined") overPhone.checked = G.user.prefs[PREFS_OVER_FIRST_P]; - if(holdsCancel && typeof(G.user.prefs[PREFS_HOLD_CANCEL])!="undefined") holdsCancel.checked = G.user.prefs[PREFS_HOLD_CANCEL]; - if(holdsExpire && typeof(G.user.prefs[PREFS_HOLD_EXPIRE])!="undefined") holdsExpire.checked = G.user.prefs[PREFS_HOLD_EXPIRE]; - if(holdsPhone && typeof(G.user.prefs[PREFS_HOLD_PHONE]) !="undefined") holdsPhone.checked = G.user.prefs[PREFS_HOLD_PHONE]; - if(holdsEmail && typeof(G.user.prefs[PREFS_HOLD_EMAIL]) !="undefined") holdsEmail.checked = G.user.prefs[PREFS_HOLD_EMAIL]; -} - -function myOPACShowHitsPer() { - var hits = 10; - if(G.user.prefs[PREF_HITS_PER]) - hits = G.user.prefs[PREF_HITS_PER]; - var hitsSel = $('prefs_hits_per'); - setSelector(hitsSel, hits); -} - -function myOPACShowDefFont() { - var font; - if(G.user.prefs[PREF_DEF_FONT]) - font = G.user.prefs[PREF_DEF_FONT]; - else font = "regular"; - setSelector($('prefs_def_font'), font); -} - -function myOPACShowUser(bool) { - if(bool) fleshedUser = fieldmapper.standardRequest(FETCH_FULL_USER, {async:false, params:[G.user.session, G.user.id()]}); - var user = fleshedUser; - - var expireDate = dojo.date.stamp.fromISOString(user.expire_date()); - if( expireDate < new Date() ) { - appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD')); - unHideMe($('myopac.expired.alert')); - } - - var iv1 = user.ident_value()+''; - if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********'; - - appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); - appendClear($('myopac_summary_prefix'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); - appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name())); - - appendClear($('myopac_summary_dayphone'),text(user.day_phone())); - appendClear($('myopac_summary_eveningphone'),text(user.evening_phone())); - appendClear($('myopac_summary_otherphone'),text(user.other_phone())); - appendClear($('myopac_summary_suffix'),text(user.suffix())); - appendClear($('myopac_summary_username'),text(user.usrname())); - appendClear($('myopac_summary_email'),text(user.email())); - appendClear($('myopac_summary_barcode'),text(user.card().barcode())); - appendClear($('myopac_summary_ident1'),text(iv1)); - appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date()))); - - var req = new Request( - FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()}); - req.callback(myopacDrawNotes); - req.send(); - - var tbody = $('myopac_addr_tbody'); - var template; - - if(addrRowTemplate) { - template = addrRowTemplate; - } else { - template = tbody.removeChild($('myopac_addr_row')); - addrRowTemplate = template; - } - removeChildren(tbody); - - var addrs = user.addresses(); - for( var a in addrs ) { - var addr = addrs[a]; - if(!allowPendingAddr && isTrue(addr.pending())) - continue; - if(addr.replaces() != null) continue; - var row = template.cloneNode(true); - myOPACDrawAddr(row, addr, addrs); - tbody.appendChild(row); - } -} - -function myopacDrawNotes(r) { - var notes = r.getResultObject(); - var tbody = $('myopac.notes.tbody'); - if(!notesTemplate) - notesTemplate = tbody.removeChild($('myopac.notes.tr')); - removeChildren(tbody); - - iterate(notes, - function(note) { - unHideMe($('myopac.notes.div')); - var row = notesTemplate.cloneNode(true); - $n(row, 'title').appendChild(text(note.title())); - $n(row, 'value').appendChild(text(note.value())); - tbody.appendChild(row); - } - ); -} - -function myOPACDrawAddr(row, addr, addrs) { - appendClear($n(row, 'myopac_addr_type'),text(addr.address_type())); - appendClear($n(row, 'myopac_addr_street'),text(addr.street1())); - appendClear($n(row, 'myopac_addr_street2'),text(addr.street2())); - appendClear($n(row, 'myopac_addr_city'),text(addr.city())); - appendClear($n(row, 'myopac_addr_county'),text(addr.county())); - appendClear($n(row, 'myopac_addr_state'),text(addr.state())); - appendClear($n(row, 'myopac_addr_country'),text(addr.country())); - appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code())); - - if(!allowPendingAddr) return; - - $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)}; - unHideMe($n(row, 'myopac_addr_edit_td')); - - /* if we have a replacement address, plop it into the table next to this addr */ - var repl = grep(addrs, function(a) { return a.replaces() == addr.id(); }); - - $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id(); - - if(repl) { - hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link - repl = repl[0]; - myopacSetAddrInputs(row, repl); - } -} - -function myopacEditAddress(addr) { - var td = $('myopac_pending_addr_td_' + addr.id()); - var row = td.parentNode; - myopacSetAddrInputs(row, addr); -} - -function myopacSetAddrInputs(row, addr, prefix) { - unHideMe($n(row, 'myopac_pending_addr_td')); - $n(row, 'myopac_pending_addr_type').value = addr.address_type(); - $n(row, 'myopac_pending_addr_street').value = addr.street1(); - $n(row, 'myopac_pending_addr_street2').value = addr.street2(); - $n(row, 'myopac_pending_addr_city').value = addr.city(); - $n(row, 'myopac_pending_addr_county').value = addr.county(); - $n(row, 'myopac_pending_addr_state').value = addr.state(); - $n(row, 'myopac_pending_addr_country').value = addr.country(); - $n(row, 'myopac_pending_addr_zip').value = addr.post_code(); - $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)}; - $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)}; -} - -function _trimTime(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMD'); -} - -function _trimSeconds(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMDHM',null,true,true); -} - -function myopacSaveAddress(row, addr, deleteMe) { - if(addr.replaces() == null) { - var repl = new aua(); - repl.usr(addr.usr()); - repl.address_type(addr.address_type()); - repl.within_city_limits(addr.within_city_limits()); - repl.replaces(addr.id()); - repl.pending('t'); - repl.isnew(true); - repl.id(null); - addr = repl; - } - - if(deleteMe) { - if(addr.id() == null) { - hideMe($n(row, 'myopac_pending_addr_td')); - return; - } - addr.isdeleted(true); - } else { - addr.address_type($n(row, 'myopac_pending_addr_type').value); - addr.street1($n(row, 'myopac_pending_addr_street').value); - addr.street2($n(row, 'myopac_pending_addr_street2').value); - addr.city($n(row, 'myopac_pending_addr_city').value); - addr.county($n(row, 'myopac_pending_addr_county').value); - addr.state($n(row, 'myopac_pending_addr_state').value); - addr.country($n(row, 'myopac_pending_addr_country').value); - addr.post_code($n(row, 'myopac_pending_addr_zip').value); - } - - var req = new Request('open-ils.actor:open-ils.actor.user.address.pending.cud', G.user.session, addr); - - req.callback( - function(r) { - var resp = r.getResultObject(); - - if(addr.isnew()) { - // new, add to list of addrs - addr.id(resp); - fleshedUser.addresses().push(addr); - } else { - // deleted, remove from list of addrs - if(addr.isdeleted()) { - hideMe($n(row, 'myopac_pending_addr_td')); - var addrs = []; - for(var i in fleshedUser.addresses()) { - var a = fleshedUser.addresses()[i]; - if(a.id() != addr.id()) addrs.push(a); - } - fleshedUser.addresses(addrs); - } - } - alertId('myopac_addr_changes_saved'); - } - ); - req.send(); -} - -function myOPACSavePrefs() { - G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per')); - G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font')); - G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range')); - - var holdsPhone = $("opac.hold_notify.phone"); - var holdsEmail = $("opac.hold_notify.email"); - var circStartBox = $('circHistStart').checked; - var circStart = null; - circStart = (circStartBox && G.user.prefs[PREFS_CIRC_HIST_START])?G.user.prefs[PREFS_CIRC_HIST_START]:dojo.date.stamp.toISOString(new Date()); - if(!circStartBox) circStart = null; - - G.user.prefs[PREFS_HOLD_PHONE] = holdsPhone.checked; - G.user.prefs[PREFS_HOLD_EMAIL] = holdsEmail.checked; - G.user.prefs[PREFS_PREDUE_3DAY] = $(PREFS_PREDUE_3DAY).checked; - G.user.prefs[PREFS_OVER_FIRST] = $(PREFS_OVER_FIRST).checked; - G.user.prefs[PREFS_OVER_FIRST_P] = $(PREFS_OVER_FIRST_P).checked; - G.user.prefs[PREFS_HOLD_EXPIRE] = $(PREFS_HOLD_EXPIRE).checked; - G.user.prefs[PREFS_HOLD_CANCEL] = $(PREFS_HOLD_CANCEL).checked; - //G.user.prefs[PREFS_CIRC_HIST_AGE] = "2592000"; - G.user.prefs[PREFS_CIRC_HIST_START] = circStart; - - if( $('myopac_pref_home_lib').checked == true ) - G.user.prefs[PREF_DEF_LOCATION] = null; - else - G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location')); - - try { - if(commitUserPrefs()) - alert($('prefs_update_success').innerHTML); - else alert($('prefs_update_failure').innerHTML); - } catch(e) { - alert(e); - } - fieldmapper.standardRequest(FETCH_CHECKED_HISTORY,{params:[G.user.session, G.user.id()],oncomplete:function(r){ - var resp = r.recv(); - if(resp) resp = resp.content(); - }}); -} - -function myOPACUpdateEmail() { - var email = $('myopac_new_email').value; - if(email == null || email == "") { - alert($('myopac_email_error').innerHTML); - return; - } - - var req = new Request(UPDATE_EMAIL, G.user.session, email ); - req.send(true); - if(req.result()) { - //G.user.email(email); - // force re-fetch to pick up latest last_xact_id - grabUser(null, true); - hideMe($('myopac_update_email_row')); - userShown = false; - alertId('myopac_email_success'); - myOPACShowUser(true); - - // user got here after trying to make a payment then deciding - // the email addr needed updating. take the user back to the - // in-progress payment form - if(myopacReturnToPayment) { - myopacReturnToPayment = false; - myOPACChangePage("summary"); - $('myopac-cc-email').innerHTML = email; - } - return; - } - - alert($('myopac_email_failure').innerHTML); -} - -function myOPACUpdatePassword() { - var curpassword = $('myopac_current_password').value; - var password = $('myopac_new_password').value; - var password2 = $('myopac_new_password2').value; - - if( curpassword == null || curpassword == "" || - password == null || password == "" || - password2 == null || password2 == "" || password != password2 ) { - alert($('myopac_password_error').innerHTML); - return; - } - - if(!strongPassword(password, true)) return; - - var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword ); - req.send(true); - if(req.result()) { - grabUser(null, true); - hideMe($('myopac_update_password_row')); - userShown = false; - alertId('myopac_password_success'); - myOPACShowUser(true); - return; - } - - alert($('myopac_password_failure').innerHTML); -} - -function myOPACUpdatePhone(which) { - if(!which) return; - var tr = $('myopac_update_phone'+which+'_row'); - var input = $('myopac_new_phone'+which); - if(!tr || !input) return; - var val = input.value; - if(!val.match(REGEX_PHONE)) { - alert("Not a valid phone number. Should be in the form ###-###-####"); - input.focus(); - input.select(); - return; - } - - var newUser = fleshedUser.clone(true); - switch(which) { - case "1": newUser.day_phone(val); break; - case "2": newUser.evening_phone(val); break; - case "3": newUser.other_phone(val); break; - } - - newUser.ischanged("t"); - var resp = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.patron.update'], {async:false, params:[G.user.session, newUser]}); - if(typeof(resp.desc)=="undefined") { - hideMe(tr); - userShown = false; - fleshedUser = resp; - alert("Phone number updated successfully."); - myOPACShowUser(true); - } else { - alert(resp.textcode+'\n'+resp.desc); - input.focus(); - input.select(); - } -} - -function myOPACUpdateUsername() { - var username = $('myopac_new_username').value; - if(username == null || username == "") { - alert($('myopac_username_error').innerHTML); - return; - } - - if( username.match(/.*\s.*/) ) { - alert($('myopac_invalid_username').innerHTML); - return; - } - - r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex'); - if(r) REGEX_BARCODE = new RegExp(r); - - if(username.match(REGEX_BARCODE)) { - alert($('myopac_invalid_username').innerHTML); - return; - } - - /* first see if the requested username is taken */ - var req = new Request(CHECK_USERNAME, G.user.session, username); - req.send(true); - var res = req.result(); - if( res !== null && res != G.user.id() ) { - alertId('myopac_username_dup'); - return; - } - - var req = new Request(UPDATE_USERNAME, G.user.session, username ); - req.send(true); - if(req.result()) { - - var evt; - var res = req.result(); - if(evt = checkILSEvent(res)) { - alertILSEvent(res); - return; - } - - grabUser(null, true); - hideMe($('myopac_update_username_row')); - userShown = false; - alertId('myopac_username_success'); - myOPACShowUser(true); - return; - } - - alert($('myopac_username_failure').innerHTML); -} - -function iForgotMyPassword(un,email) { - if(!un) return; - //var type = un.match(/^\d+$/)?'barcode':'username'; - fieldmapper.standardRequest(PASS_RESET,{params:['barcode',un,email],oncomplete:function(rr){ - var resp = rr.recv().content(); - if(resp.textcode=="ACTOR_USER_NOT_FOUND") fieldmapper.standardRequest(PASS_RESET,{params:['username',un,email],oncomplete:function(r){ - var resp2 = r.recv().content(); - if(resp2.textcode) alert(resp2.textcode+'\n'+resp2.desc); - else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } - }}); else { - if(resp.textcode) alert(resp.textcode+'\n'+resp.desc); - else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } - } - }}); -} - -function myOPACShowBookbags(force) { - if(anonListCache.length) drawAnonLists(force); else hideMe($('acct_list_template2')); - var wrapper = $('acct_lists_prime'); - if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return; - if(!wrapper) return; - - var containers = containerFetchAll(); - - var found = false; - for(var i in containers) { - found = true; - var cont = containers[i]; - fleshedContainers[cont.id()] = cont; - var temp = containerTemplate.cloneNode(true); - var title = $n(temp, 'list_name'); - var share = $n(temp, 'share_list_link'); - var rem = $n(temp, 'remove_list'); - if(!title || !share || !rem) continue; - - title.appendChild(text(cont.name())); - share.onclick = myListAction; - share.listID = cont.id(); - rem.value='delete'; - rem.onclick = myListAction; - rem.listID = cont.id(); - temp.setAttribute("id",temp.id + '_' + cont.id()); - - if(containers.length>1) { - var sel = $n(temp, 'list_actions'); - var optg = elem('optgroup', {label:'Move Items to'}); - for(var n in containers) { - var cont2 = containers[n]; - if(cont2.id()==cont.id()) continue; - var opt = elem('option', {value:'move', container:cont2.id()}, cont2.name()); - optg.appendChild(opt); - } - sel.appendChild(optg); - } - - if(isTrue(cont.pub())) { - share.value='hide'; - share.innerHTML = 'Un-share'; - share.title=''; - var link = $n(temp,'share_list_rss'); - link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false)); - unHideMe(link); - } else { - share.value='share'; - share.title = 'Sharing this bookbag will allow the contents of the bookbag to be seen by others.' - share.innerHTML = 'Share'; - } - - wrapper.appendChild(temp); - // grab container items after adding each list to the page - fieldmapper.standardRequest(FETCH_CONTAINER_DETAILS,{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows}); - } - - if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists")); - - var anonSel = $('sel_all_list_anon'); - if(!anonSel) return; - var optg2 = elem('optgroup', {label:'Move Items to', id:'anon_list_grp'}); - for(var t in containers) { - var cont3 = containers[t]; - var opt2 = elem('option', {value:'move', container:cont3.id()}, cont3.name()); - optg2.appendChild(opt2); - } - anonSel.appendChild(optg2); -} - -function drawAnonLists() { - var cont = $('acct_list_template2'); - var bibs = fieldmapper.standardRequest(FETCH_MODS_SLIM, {async:false, params:[anonListCache]}); - - var tbody = $('anon_list_tbody'); - for(var i in bibs) { - var it = bibs[i]; - var tr = elem('tr'); - var td1 = elem('td',{style:'padding-right:5px;'},it.title()); - var td2 = elem('td',{width:'1'}); - var el = elem('input',{type:'checkbox', name:'list_action_chbx', recordid:it.doc_id()+'', doc_id:it.doc_id()+'', listID:'anon'}); - el.className = "list_action_chbx"; - el.name="list_action_chbx"; - td2.appendChild(el); - tr.appendChild(td2); - tr.appendChild(td1); - tbody.appendChild(tr); - } - unHideMe(cont); -} - -function drawListItemRows(r) { - var fleshed = r.recv().content(); - if(!fleshed) return; - var modsArr = []; - - var temp = $('acct_list_template_'+fleshed.id()); - if(!temp) return; - var tbody = $n(temp,'list_tbody'); - if(!tbody) return; - var items = fleshed.items(); - - for(var i=0; i 0.00) { - var bal = $('myopac_sum_fines_bal'); - bal.style.color = "red"; - appendClear(bal,text("$"+balance2)); - unHideMe($('myopac_sum_fines')); - unHideMe($('myopac_sum_fines_slim')); - unHideMe($('pay_fines_btn')); - if(!r.__showing) - showFinesDiv($('show_fines_link')); - } - - appendClear($('myopac_fines_summary_total'), text(total)); - appendClear($('myopac_fines_summary_paid'), text(paid)); - appendClear($('myopac_fines_summary_balance'), text(balance)); -} - -function _finesFormatNumber(num) { - if(isNull(num)) num = 0; - num = num + ""; - if(num.length < 2 || !num.match(/\./)) num += ".00"; - if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0"; - return num; -} - -function _trimTime(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMD'); -} - -function _trimSeconds(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMDHM',null,true,true); -} - -function myOPACShowTransactions(r) { - var transactions = r.getResultObject(); - - if(!myopacGenericTransTemplate) myopacGenericTransTemplate = $('myopac_trans_tbody').removeChild($('myopac_trans_row')); - if(!myopacCircTransTemplate) myopacCircTransTemplate = $('myopac_circ_trans_tbody').removeChild($('myopac_circ_trans_row')); - removeChildren($('myopac_trans_tbody')); - removeChildren($('myopac_circ_trans_tbody')); - transCache = []; - - transactions = transactions.sort( - function(a, b) { - if(a.transaction.xact_start() < b.transaction.xact_start()) - return 1; - else return -1; - } - ); - - for( var idx in transactions ) { - var trans = transactions[idx].transaction; - var record = transactions[idx].record; - var circ = transactions[idx].circ; - transCache[trans.id()] = transactions[idx]; - - if(trans.xact_type() == 'circulation') myOPACShowCircTransaction(trans, record, circ); - else if(trans.xact_type() == 'grocery') myopacShowGenericTransaction( trans ); - } -} - -// for toggling between payments and fines tabs -function showFinesTab() { - hideMe($("myopac_payments_div")); - unHideMe($("pay-fines-image")); - unHideMe($("myopac_trans_div")); - unHideMe($("myopac_circ_trans_div")); - $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom"; - $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom"; -} - -var paymentsDrawn = false; -function myopacDrawPayments() { - - unHideMe($("myopac_payments_div")); - hideMe($("myopac_circ_trans_div")); - hideMe($("myopac_trans_div")); - hideMe($("pay-fines-image")); - $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_off.jpg') no-repeat bottom"; - $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_on.jpg') no-repeat bottom"; - - if(paymentsDrawn) return; - paymentsDrawn = true; - progressDialog.show(true); - - var before = new Date() - before.setFullYear(before.getFullYear() - 1); - // KCLS limits payment history view to 1 year. This will eventually be expanded - // out to a history view page, but for now, just fetch what's needed. - var req = new Request( - 'open-ils.actor:open-ils.actor.user.payments.retrieve', - G.user.session, G.user.id(), - {"where":{"payment_ts":{">=":dojo.date.stamp.toISOString(before)}}}); - - req.callback(_myopacDrawPayments); - req.send(); -} - -function _myopacDrawPayments(r) { - - progressDialog.hide(); - var payments = r.getResultObject(); - var tbody = $('myopac_payments_tbody'); - rowTmpl = tbody.removeChild($('myopac_payments_tmpl')); - - dojo.forEach(payments, - function(payment) { - var row = rowTmpl.cloneNode(true); - $n(row, 'date').innerHTML = dojo.date.locale.format( - dojo.date.stamp.fromISOString(payment.mp.payment_ts()), - {selector:'date', fullYear: true} - ); - $n(row, 'for').innerHTML = (payment.title) ? payment.title : payment.last_billing_type; - $n(row, 'amount').innerHTML += Number(payment.mp.amount()).toFixed(2); - if(payment.mp.payment_type() == 'credit_card_payment') { - $n(row, 'print_recpt').onclick = function () { printPaymentReceipt([payment.mp.id()]) }; - $n(row, 'email_recpt').onclick = function () { emailPaymentReceipt([payment.mp.id()]) }; - } else { - $n(row, 'print_recpt').parentNode.style.visibility = 'hidden'; - } - tbody.appendChild(row); - } - ); -} - -function emailPaymentReceipt(paymentIds, callback) { - - if(!G.user.email()) { - if(callback) callback(); - return; - } - - progressDialog.show(true); - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.money.payment_receipt.email'], - { - async : true, - params : [G.user.session, paymentIds], - oncomplete : function(r) { - progressDialog.hide(); - openils.Util.readResponse(r); - if(callback) callback(); - } - } - ); -} - -function dateFromISO(d) { - if(!d) return ''; - return dojo.date.locale.format( - dojo.date.stamp.fromISOString(d), - {selector:'date', fullYear: true} - ); -} - -function myopacShowGenericTransaction( trans ) { - var tbody = $('myopac_trans_tbody'); - - var row = myopacGenericTransTemplate.cloneNode(true); - $n(row,'myopac_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); - $n(row,'myopac_trans_last_payment').appendChild(text(dateFromISO(trans.last_payment_ts()))); - $n(row,'myopac_trans_init_amount').appendChild(text(_finesFormatNumber(trans.total_owed()))); - $n(row,'myopac_trans_total_paid').appendChild(text(_finesFormatNumber(trans.total_paid()))); - $n(row,'myopac_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); - $n(row,'selector').balance_owed = trans.balance_owed(); - $n(row,'selector').setAttribute("xact", trans.id()); - - var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id()); - req.send(true); - var bills = req.result(); - if(bills && bills[0]) $n(row,'myopac_trans_bill_type').appendChild(text(bills[0].billing_type())); - - tbody.appendChild(row); - unHideMe($('myopac_trans_div')); -} - -function myOPACShowCircTransaction(trans, record, circ) { - var tbody = $('myopac_circ_trans_tbody'); - - var row = myopacCircTransTemplate.cloneNode(true); - if(record) { - buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title')); - $n(row,'myopac_circ_trans_author').appendChild(text(normalize(truncate(record.author(), 65)))); - } else { - var req = new Request( FETCH_COPY, circ.target_copy() ); - req.alertEvents = false; - req.send(true); - var copy = req.result(); - if( copy ) { - $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title())); - $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author())); - } - } - - $n(row,'myopac_circ_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); - - var due = dateFromISO(circ.due_date()); - var checkin = dateFromISO(circ.stop_fines_time()); - - $n(row,'myopac_circ_trans_due').appendChild(text(due)) - if(checkin) appendClear($n(row,'myopac_circ_trans_finished'), text(checkin)); - if(circ.stop_fines() == 'LOST') appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines())); - if(circ.stop_fines() == 'CLAIMSRETURNED') appendClear($n(row,'myopac_circ_trans_finished'), text("")); - $n(row,'myopac_circ_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); - $n(row,'selector').balance_owed = trans.balance_owed(); - $n(row,'selector').setAttribute("xact",trans.id()); - - tbody.appendChild(row); - unHideMe($('myopac_circ_trans_div')); -} - -function showFinesDiv(el) { - if(!el) return; - if($('myopac_fines_div').className.indexOf('hide_me')>=0) { - unHideMe($('myopac_fines_div')); - el.innerHTML="Hide Overdue Materials"; - if(!finesShown) { - myOPACShowFines(true); - } - } else { - hideMe($('myopac_fines_div')); - el.innerHTML="Show Overdue Materials"; - } -} - -var ecom_event_map = { - CREDIT_PROCESSOR_DECLINED_TRANSACTION : - 'Sorry. Your payment has been declined. Please confirm your information is entered correctly or contact your credit card company.', - CREDIT_PROCESSOR_INVALID_CC_NUMBER : - 'The credit card number entered is not valid. Please confirm your information is entered correctly or contact your credit card company.', - SUCCESS : 'Your payment has been approved' -} - -function showPaymentForm() { - unHideMe($('pay_fines_now')); - hideMe($('acct_sum')); - hideMe($('cc-payment-error-message')); - drawPayFinesPage( - G.user, - getSelectedFinesTotal(), - getSelectedFineTransactions(), - function(resp) { - unHideMe($('cc-payment-error-message')); - if(resp.textcode) { - var message = ecom_event_map[resp.textcode] || resp.textcode+'\n'+resp.desc + ''; - $('cc-payment-error-message').innerHTML = message; - return; - } - G.user.last_xact_id(resp.last_xact_id); // update to match latest from server - $('cc-payment-error-message').innerHTML = ecom_event_map.SUCCESS; - printPaymentReceipt(resp.payments); - emailPaymentReceipt(resp.payments); - hideMe($('pay_fines_now'));unHideMe($('acct_sum')); - finesShown = false; - myOPACShowFines(); - showFinesDiv($('show_fines_link')); - } - ); -} - -function getSelectedFinesTotal() { - var total = 0; - dojo.forEach( - dojo.query("[name=selector]", $('myopac_circ_trans_tbody')), - function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } - ); - - dojo.forEach( - dojo.query("[name=selector]", $('myopac_trans_tbody')), - function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } - ); - return total.toFixed(2); -} - -function getSelectedFineTransactions() { - var set1 = dojo.query("[name=selector]", $('myopac_circ_trans_tbody')). - filter(function (o) { return o.checked }). - map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} - ); - var set2 = dojo.query("[name=selector]", $('myopac_trans_tbody')). - filter(function (o) { return o.checked }). - map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} - ); - var obj = set1.concat(set2); - return obj.filter(function(el){return el[0]==null?false:true;}); -} - -var payFinesDrawn = false; -function drawPayFinesPage(patron, total, xacts, onPaymentSubmit) { - if (typeof(this.authtoken) == "undefined") - this.authtoken = patron.session; - - dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML = total; - - $('myopac-cc-email').innerHTML = patron.email(); - oilsSelfckCCNumber.attr('value', ''); - oilsSelfckCCCVV.attr('value', ''); - oilsSelfckCCMonth.attr('value', '01'); - oilsSelfckCCYear.attr('value', new Date().getFullYear()); - oilsSelfckCCFName.attr('value', patron.first_given_name()); - oilsSelfckCCLName.attr('value', patron.family_name()); - - var addr = patron.billing_address() || patron.mailing_address(); - - if (typeof(addr) != "object") { - /* still don't have usable address? try getting better user object. */ - fieldmapper.standardRequest( - FETCH_FULL_USER, { - "params": [patron.session, patron.id(), ["billing_address", "mailing_address"]], - "async": false, - "oncomplete": function(r) { - var usr = r.recv().content(); - if (usr) addr = usr.billing_address() || usr.mailing_address(); - } - } - ); - } - - if (addr) { - //oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); - oilsSelfckCCCity.attr('value', addr.city()); - oilsSelfckCCState.attr('value', addr.state()); - oilsSelfckCCZip.attr('value', addr.post_code()); - } - - dojo.connect(oilsSelfckEditDetails, 'onChange', - function(newVal) { - dojo.forEach( - [oilsSelfckCCFName, oilsSelfckCCLName, oilsSelfckCCStreet, oilsSelfckCCCity, oilsSelfckCCState, oilsSelfckCCZip], - function(dij) { dij.attr('disabled', !newVal); } - ); - } - ); - - if(!payFinesDrawn) { - dojo.connect(oilsSelfckCCSubmit, 'onClick', - function() { - hideMe($('pay_fines_now')); - unHideMe($('pay_fines_confirm')); - - $('pay_fines_confirm_amount').innerHTML = - dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML; - - dojo.connect(payConfirmSubmit, 'onClick', - function() { - if (typeof(progressDialog) != "undefined") progressDialog.show(true); - unHideMe($('pay_fines_now')); - hideMe($('pay_fines_confirm')); - sendCCPayment(patron, xacts, onPaymentSubmit); - } - ); - - dojo.connect(payConfirmCancel, 'onClick', - function() { - unHideMe($('pay_fines_now')); - hideMe($('pay_fines_confirm')); - } - ); - - /* - if(!confirm("Are you sure?")) return; - sendCCPayment(patron, xacts, onPaymentSubmit); - */ - } - ); - payFinesDrawn = true; - } - - var selFines = $('selectedFines'); - removeChildren(selFines); - for(var i in xacts) { - var xact = transCache[xacts[i][0]]; - if(!xact) continue; - var tr = elem('tr'); - var td1 = elem('td', {}, xact["record"]?xact.record.title():xact.transaction.last_billing_type()); - var td2 = elem('td', {'nowrap':'nowrap', 'valign':'top'}, '$'+xact.transaction.balance_owed()); - td2.style.paddingLeft = '5px'; - td2.style.color = 'red'; - tr.appendChild(td1); - tr.appendChild(td2); - selFines.appendChild(tr); - } -} - -function sendCCPayment(patron, xacts, onPaymentSubmit) { - // in this context, patron will always be G.user. set it explicitly - // to pick up the latest last_xact_id value - patron = G.user; - - var args = { - userid : patron.id(), - payment_type : 'credit_card_payment', - payments : xacts, - cc_args : { - where_process : 1, - //type : 'MasterCard',//oilsSelfckCCType.attr('value'), - number : oilsSelfckCCNumber.attr('value'), - cvv2 : oilsSelfckCCCVV.attr('value'), - expire_year : oilsSelfckCCYear.attr('value'), - expire_month : oilsSelfckCCMonth.attr('value'), - billing_first : oilsSelfckCCFName.attr('value'), - billing_last : oilsSelfckCCLName.attr('value'), - billing_address : oilsSelfckCCStreet.attr('value'), - billing_city : oilsSelfckCCCity.attr('value'), - billing_state : oilsSelfckCCState.attr('value'), - billing_zip : oilsSelfckCCZip.attr('value') - } - } - - var resp = fieldmapper.standardRequest(PAY_BILLS,{params : [patron.session, args, patron.last_xact_id()]}); - if (typeof(progressDialog) != "undefined") - progressDialog.hide(); - - if (typeof(onPaymentSubmit) == "function") { - onPaymentSubmit(resp); - } else { - var evt = openils.Event.parse(resp); - if (evt) alert(evt); - } -} - -function myopacSelectedHoldsRows() { - var r = []; - var cb; - var rows = dojo.query('[name=acct_holds_temp]',$("holds_temp_parent")); - for(var i = 0; i < rows.length; i++) { - cb = $n(rows[i], 'check_all_holds'); - if(cb && cb.checked) - r.push(rows[i]); - } - return r; -} - -var myopacProcessedHolds = 0; -var myopacHoldsToProcess = 0; -function myopacDoHoldAction() { - var selectedRows = myopacSelectedHoldsRows(); - var action = getSelectorVal($('acct_holds_actions')); - $('myopac_holds_actions_none').selected = true; - if(selectedRows.length == 0) return; - - myopacProcessedHolds = 0; - - if(!confirmId('myopac.holds.'+action+'.confirm')) return; - //myopacSelectNoneHolds(); /* clear the selection */ - - - /* first, let's collect the holds that actually need processing and - collect the full process count while we're at it */ - var holds = []; - for(var i = 0; i < selectedRows.length; i++) { - var ahold = $n(selectedRows[i],'check_all_holds'); - var hold = holdsCache[holdsCacheMap[ahold.holdid]]; - var qstats = hold.status; - switch(action) { - case 'cancel': - holds.push(hold.hold); - break; - case 'thaw_date': - case 'thaw': - if(isTrue(hold.hold.frozen())) - holds.push(hold.hold); - break; - case 'freeze': - if(!isTrue(hold.hold.frozen()) && qstats < 3) - holds.push(hold.hold); - break; - } - } - - myopacHoldsToProcess = holds; - if(myopacHoldsToProcess.length == 0) return; - - if(action == 'thaw_date' || action == 'freeze') - myopacDrawHoldThawDateForm(); - else - myopacProcessHolds(action); -} - -function myopacDrawHoldThawDateForm() { - hideMe($('myopac_holds_div')); - unHideMe($('myopac_holds_thaw_date_form')); - $('myopac_holds_thaw_date_input').focus(); -} - -function myopacApplyThawDate() { - var dateString = dijit.byId('myopac_holds_thaw_date_input').getValue(); - if(dateString) { - dateString = dojo.date.stamp.toISOString(dateString); - if(dateString) { - dateString = holdsVerifyThawDate(dateString); - if(!dateString) return; - } else { - dateString = null; - } - } - unHideMe($('myopac_holds_div')); - hideMe($('myopac_holds_thaw_date_form')); - myopacProcessHolds('freeze', dateString); -} - - -function myopacProcessHolds(action, thawDate) { - progressDialog.show(true); - // myopacShowHoldProcessing(); - /* now we process them */ - for(var i = 0; i < myopacHoldsToProcess.length; i++) { - var hold = myopacHoldsToProcess[i]; - - var req; - switch(action) { - - case 'cancel': - req = new Request(CANCEL_HOLD, G.user.session, hold.id()); - break; - - case 'thaw': - hold.frozen('f'); - hold.thaw_date(null); - req = new Request(UPDATE_HOLD, G.user.session, hold); - break; - - case 'thaw_date': - case 'freeze': - hold.frozen('t'); - hold.thaw_date(thawDate); - req = new Request(UPDATE_HOLD, G.user.session, hold); - break; - //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML); - - } - - req.callback(myopacBatchHoldCallback); - req.send(); - req = null; - } -} - -function myopacBatchHoldCallback(r) { - var res = r.getResultObject(); - myopacHoldsToProcess = grep(myopacHoldsToProcess, function(i) { return (i.id() != res); }); - if(!myopacHoldsToProcess || ++myopacProcessedHolds >= myopacHoldsToProcess.length) { - //alert(res); - progressDialog.hide(); - myopacForceHoldsRedraw = true; - $('check_all_holds').checked = false; - drawHoldsPage(); - } -} - -function myOPACRenewSelected() { - var rows = dojo.query('input[name=check_all_checked]',$('checked_temp_parent')).filter(function(n,i){ return n.checked; }); - __renew_circs = []; - if(!rows.length || !confirm($('myopac_renew_confirm').innerHTML)) return; - __success_count = 0; - __fail_count = 0; - - for( var i = 0; i < rows.length; i++ ) { - var row = rows[i]; - var circ_id = row.getAttribute('circid'); - - var circ; - for( var j = 0; j != itemsOutCache.length; j++ ) - if(itemsOutCache[j].circ.id() == circ_id) - circ = itemsOutCache[j].circ; - - __renew_circs.push(circ); - } - - if( __renew_circs.length == 0 ) return; - - //unHideMe($('my_renewing')); - //moClearCheckedTable(); - - for( var i = 0; i < __renew_circs.length; i++ ) { - var circ = __renew_circs[i]; - moRenewCirc( circ.target_copy(), G.user.id(), circ ); - } -} - -var __renew_circs = []; -var __rewnew_errors = []; -var __success_count = 0; -var __fail_count = 0; -function moRenewCirc(copy_id, user_id, circ) { - - _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id); - var req = new Request(RENEW_CIRC, G.user.session, - { patron : user_id, - copyid : copy_id, - opac_renewal : 1 - } - ); - - req.request.alertEvent = false; - req.callback(myHandleRenewResponse); - req.request.circ = circ; - req.send(); -} - -/* handles the circ renew results */ - -function myHandleRenewResponse(r) { - try{ var res = r.getResultObject(); } catch(e){ alert("Renew Error\n\n"+e); __renew_circs = []; __rewnew_errors = []; return; } - var circ = r.circ; - - /* remove this circ from the list of circs to renew */ - if(checkILSEvent(res) || checkILSEvent(res[0])) { - var str1 = truncate(mvrObjCache[circ.target_copy()].title(),65)+'\n'; - if(res.ilsevent) str1 += res.ilsevent+': '+res.desc+'\n'; else for(var i in res) str1 += res[i].ilsevent+': '+res[i].desc+'\n'; - __rewnew_errors[circ.id()] = str1; - } - __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); }); - _debug("handling renew result for " + circ.id()); - - if(checkILSEvent(res) || checkILSEvent(res[0])) __fail_count++; - //alertIdText('myopac_renew_fail', __circ_titles[circ.id()]); - else __success_count++; - - if(__renew_circs) return; /* more to come */ - __renew_circs = []; - - var str = ""; - if(__success_count) str+= __success_count+" items renewed successfully"; - if(__fail_count) str+=__fail_count+" items did not renew."; - str+='\n\n'; - for(var i in __rewnew_errors) str+=__rewnew_errors[i]+'\n'; - - if(__success_count || __fail_count) alert(str); - __rewnew_errors = []; - - //if( __success_count > 0 ) - // alertIdText('myopac_renew_success', __success_count); - - hideMe($('my_renewing')); - checkedDrawn = false; - drawCheckedPage(); - $('check_all_checked').checked = false; -} - - -function moveToNewList(parent, dest) { - if(!parent || !dest) return; - - var items = dojo.query('input[name=list_action_chbx]', parent); - if(!items.length) items = dojo.query('.list_action_chbx', parent); - items.filter(function(item, index, arr){return item.checked;},this); - - if(items.length) { - for(var i=0; iget998dValue(imgFormatCache[b.hold.id()])?-1:1; - }); - break; - case "title": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return a.mvr.title()b.mvr.title()?-1:1; - }); - break; - case "pickup": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return findOrgUnit(a.hold.pickup_lib()).name()findOrgUnit(b.hold.pickup_lib()).name()?-1:1; - }); - break; - case "author": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return a.mvr.author()b.mvr.author()?-1:1; - }); - break; - case "status": - if(sortOrder) { - drawHoldsPage(true); - return; - } else { - holdsCache = holdsCache.sort(function(a, b) { - if(a.status==4) return 1; - if(b.status==4) return -1; - if(isTrue(a.hold.frozen())) return -1; - if(isTrue(b.hold.frozen())) return 1; - return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?-1:1; - }); - } - } - - drawHoldsPage(false); -} - -function sortChecked(by) { - if(!by) return; - - sortOrder = !sortOrder; - switch(by.toLowerCase()) { - case "title": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return a.record.title()b.record.title()?-1:1; - }); - break; - case "author": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return a.record.author()b.record.author()?-1:1; - }); - break; - case "due": - if(sortOrder) { - drawCheckedPage(); return; - } else itemsOutCache = itemsOutCache.sort(function(a, b) { - return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; - }); - break; - case "barcode": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return Number(a.copy.barcode())Number(b.copy.barcode())?-1:1; - }); - break; - case "cn": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return callNumCache[a.copy.call_number()]callNumCache[b.copy.call_number()]?-1:1; - }); - break; - case "renews": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return Number(a.circ.renewal_remaining())Number(b.circ.renewal_remaining())?-1:1; - }); - break; - } - - drawCheckedPage(false); -} - -function sortCheckedHist(by) { - if(!by) return; - - sortOrder = !sortOrder; - switch(by.toLowerCase()) { - case "title": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - if(mvrObjCache[a.circ.target_copy()].title()==null) return 1; - if(mvrObjCache[b.circ.target_copy()].title()==null) return -1; - if(sortOrder) return mvrObjCache[a.circ.target_copy()].title().toLowerCase()mvrObjCache[b.circ.target_copy()].title().toLowerCase()?-1:1; - }); - break; - case "author": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - if(mvrObjCache[a.circ.target_copy()].author()==null) return 1; - if(mvrObjCache[b.circ.target_copy()].author()==null) return -1; - if(sortOrder) return mvrObjCache[a.circ.target_copy()].author().toLowerCase()mvrObjCache[b.circ.target_copy()].author().toLowerCase()?1:-1; - }); - break; - case "duedate": - if(sortOrder) { - drawCheckedPage(); return; - } else itemsOutHistory = itemsOutHistory.sort(function(a, b) { - return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; - }); - break; - case "cn": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - // ya, i know, but it gets the job done. - if(sortOrder) return callNumCache[copyObjCache[a.circ.target_copy()].call_number()].label().toLowerCase()callNumCache[copyObjCache[b.circ.target_copy()].call_number()].label().toLowerCase()?-1:1; - }); - break; - } - - drawCircHistory(false); -} - -function printData(data, numItems, callback) { - - //unHideMe($('receipt-print-frame-wrapper')); - receiptPrintDialog.show(); - - var frame = window["receipt-frame"]; - frame.document.body.innerHTML = data; - - var cancel = $('receipt-view-print-cancel'); - cancel.onclick = function() { - frame.document.body.innerHTML = ''; - // hideMe($('receipt-print-frame-wrapper')); - receiptPrintDialog.hide(); - } - - $('receipt-view-print-button').onclick = function() { - frame.focus(); - frame.print(); - var sleepTime = 1000; - if(numItems > 0) - sleepTime += (numItems / 2) * 1000; - - setTimeout( - function() { - cancel.onclick(); - if(callback) callback(); // fire optional post-print callback - }, - sleepTime - ); - }; -} - - -function printPaymentReceipt(paymentIds, callback) { - progressDialog.show(true); - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.money.payment_receipt.print'], - { - async : true, - params : [G.user.session, paymentIds], - oncomplete : function(r) { - var resp = openils.Util.readResponse(r); - var output = ""; - if(resp) output = resp.template_output(); - progressDialog.hide(); - if(output) { - printData(output.data(), 1, callback); - } else { - var error = resp.error_output(); - if(error) { - throw new Error("Error creating receipt: " + error.data()); - } else { - throw new Error("No receipt data returned from server"); - } - } - } - } - ); -} - -function printFinesReceipt(callback) { - progressDialog.show(true); - - var params = [ - G.user.session, - G.user.ws_ou(), - null, - 'format.selfcheck.fines', - 'print-on-demand', - [G.user.id()] - ]; - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.fire_user_trigger_events'], - { - async : true, - params : params, - oncomplete : function(r) { - progressDialog.hide(); - var resp = openils.Util.readResponse(r); - var output = resp.template_output(); - if(output) { - printData(output.data(), 240, callback); - } else { - var error = resp.error_output(); - if(error) { - throw new Error("Error creating receipt: " + error.data()); - } else { - throw new Error("No receipt data returned from server"); - } - } - } - } - ); -} - -function buildOrgSelAlt(selector, org, offset, namecol) { - if(!namecol) namecol = 'name'; - if(!showXUL && !isTrue(org.opac_visible())) return; // for some reason, isXUL() is rather slow when used in a decently sized loop. - insertSelectorVal( selector, -1, - org[namecol](), org.id(), null, findOrgDepth(org) - offset ); - var kids = org.children(); - if (kids) { - for( var c = 0; c < kids.length; c++ ) - buildOrgSelAlt( selector, kids[c], offset, namecol); - } -} + +//attachEvt("common", "run", myOPACInit ); +// force init to run after opac_init(); +dojo.addOnLoad(function(){setTimeout(myOPACInit, 0)}); + +attachEvt('common','locationUpdated', myopacReload ); +dojo.require('openils.Util'); + +var FETCH_CONTAINER_DETAILS = ['open-ils.actor','open-ils.actor.container.flesh']; +var FETCH_CHECKED_DETAILS = ['open-ils.circ','open-ils.circ.actor.user.checked_out.atomic']; +var FETCH_CHECKED_HISTORY = ['open-ils.actor','open-ils.actor.history.circ.visible.atomic']; +var FETCH_FAV_SEARCHES = ['open-ils.actor','open-ils.actor.user.saved_search.retrieve']; +var FETCH_HOLD_DETAILS = ['open-ils.circ','open-ils.circ.hold.details.batch.retrieve.atomic']; +var FETCH_MODS_BY_COPY = ['open-ils.search','open-ils.search.biblio.mods_from_copy']; +var FETCH_CALL_NUMBER = ['open-ils.search','open-ils.search.callnumber.retrieve']; +var FETCH_MODS_SLIM = ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve']; +var FETCH_FULL_USER = ['open-ils.actor','open-ils.actor.user.fleshed.retrieve']; +var FETCH_HOLD_IDS = ['open-ils.circ','open-ils.circ.holds.id_list.retrieve']; +var FETCH_COPY_OBJ = ['open-ils.search','open-ils.search.asset.copy.retrieve']; +var FETCH_OPT_INS = ['open-ils.actor','open-ils.actor.event_def.opt_in.settings.atomic']; +var FETCH_LISTS = ['open-ils.actor','open-ils.actor.container.flesh']; +var PASS_RESET = ['open-ils.actor','open-ils.actor.patron.password_reset.request']; +var PAY_BILLS = ['open-ils.circ','open-ils.circ.money.payment']; +// number of api calls to run before firing myOPACPostCollect() -- helps make all data available first (avoids having to make sync'd calls) +var TOTAL_CALLS = 6; + +var PREFS_HOLD_PHONE = "notification.hold.pickup.phone"; +var PREFS_HOLD_EMAIL = "notification.hold.pickup.email"; +var PREFS_PREDUE_3DAY = "notification.predue.email"; +var PREFS_OVER_FIRST = "notification.overdue.first.email"; +var PREFS_OVER_FIRST_P = "notification.overdue.first.phone"; +var PREFS_HOLD_EXPIRE = "notification.hold.expire.email"; +var PREFS_HOLD_CANCEL = "notification.hold.cancel.email"; +var PREFS_CIRC_HIST_AGE = "history.circ.retention_age"; +var PREFS_CIRC_HIST_START = "history.circ.retention_start"; + +var listsCache = []; +var holdsCache = []; +var holdsCacheMap = []; +var itemsOutCache = []; +var callNumCache = []; +var favsCache = []; +var copyObjCache = []; +var mvrObjCache = []; +var itemsOutHistory = []; +var userOptIns = []; +var userOptInsMap = []; +var fleshedLists = []; +var imgFormatCache = []; +var transCache = []; +var fleshedContainers = {}; +var subPageObjs = {}; + +var CIRC_HIST_PAGE_LIMIT = 10; +var circHistPage = 0; +var showXUL = false; +var holdsList = null; +var fleshedUser = null; +var allowPendingAddr = false; +var currPage = ""; +var templates = {}; +var containerTemplate; +var containerTemplate2; +var myopacGenericTransTemplate; +var myopacCircTransTemplate; +var addrRowTemplate; +var notesTemplate; +var myopacReturnToPayment = false; + +function myOPACInit() { + if(!(G.user && G.user.session)) { + initLogin(); + } else { + allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address'); + if(allowPendingAddr) unHideMe($('myopac_pending_addr_td')); + + unHideMe($('myopac_tabs')); + currPage = "summary"; + holdsList = getCacheValue('saveAnonCache'); + if(holdsList) { currPage = "holds"; swapTabs($('acct_holds')); setCacheValue('saveAnonCache', null); TOTAL_CALLS -= 2; } + var retUrl = getCacheValue('returnURL'); + if(retUrl) { setCacheValue('returnURL', null); setCacheValue('showHoldEditor', {record:retUrl.record, type:retUrl.type}); window.location=retUrl.href; } + + var sel = $('myopac_new_home'); + buildOrgSel(sel, globalOrgTree, 0); + setSelector(sel, G.user.home_ou()); + + switch(new CGI().param('acctpage')) { + case "1": currPage = "summary"; break; + case "2": currPage = "checked"; swapTabs($('acct_checked_out')); break; + case "3": currPage = "holds"; swapTabs($('acct_holds')); break; + case "4": currPage = "prefs"; swapTabs($('acct_prefs')); break; + case "5": currPage = "fines"; swapTabs($('acct_favs')); break; + case "6": currPage = "bookbag"; swapTabs($('acct_lists')); break; + } + + if(!isXUL()) { + unHideMe($('myopac_summary_email_change')); + unHideMe($('myopac_summary_password_change')); + unHideMe($('myopac_summary_username_change')); + } else { + unHideMe($('myopac_summary_phone1_change')); + unHideMe($('myopac_summary_phone2_change')); + unHideMe($('myopac_summary_phone3_change')); + } + + + fieldmapper.standardRequest(FETCH_FULL_USER, {async:true, params:[G.user.session, G.user.id()], + oncomplete:function(r) { + showXUL = isXUL(); + fleshedUser = openils.Util.readResponse(r); + myOPACShowFines(true); + myOPACShowUser(false); + myOPACChangePage(currPage); + myOPACInitTemplates(); + myOPACInitSubpages(); + //myOPACShowBookbags(true); + if(holdsList) doBatchAnonHolds(); + showCanvas(); + } + }); + } +} + +function myopacReload() { + var a = {}; + a[PARAM_LOCATION] = getNewSearchLocation(); + a[PARAM_DEPTH] = getNewSearchDepth(); + hideMe($('canvas_main')); + goTo(buildOPACLink(a, true)); +} + +function myOPACChangePage( page ) { + var s = $("myopac_summary_td"); + var c = $("myopac_checked_td"); + var f = $("myopac_fines_td"); + var h = $("myopac_holds_td"); + var p = $("myopac_prefs_td"); + var b = $('myopac_bookbag_td'); + + var ss = $("myopac_summary_div"); + var cc = $("myopac_checked_div"); + var ff = $("myopac_fines_div"); + var hh = $("myopac_holds_div"); + var pp = $("myopac_prefs_div"); + var bb = $('myopac_bookbag_div'); + + hideMe(ss); + hideMe(cc); hideMe(ff); + hideMe(hh); hideMe(pp); + hideMe(bb); + + if(page != 'prefs') + myopacReturnToPayment = false; + + var oncomplete = null; + + switch( page ) { + case "summary": unHideMe(ss); + if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff); + oncomplete = myOPACDrawSummary; + break; + + case "checked": + unHideMe(cc); + oncomplete = drawCheckedPage; + break; + + case "holds": + unHideMe(hh); + oncomplete = drawHoldsPage; + break; + + case "prefs": + unHideMe(pp); + oncomplete = myOPACShowPrefs; + break; + + case 'bookbag': + unHideMe(bb); + break; + } + currPage = page; + myOPACGrabPageData(page, oncomplete); +} + +var fetchedPages={} +function myOPACGrabPageData(page, oncomplete) { + if(fetchedPages[page]) return; + fetchedPages[page] = true; + + switch(page) { + + case "summary": + oncomplete(); + break; + + case "checked": + + progressDialog.show(true); + fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:true, params:[G.user.session, G.user.id()], + oncomplete:function(r) { + progressDialog.hide(); + itemsOutCache = openils.Util.readResponse(r); + oncomplete(); + } + }); + + break; + + case "holds": + + holdsCache=null; + fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:true, params:[G.user.session, G.user.id()], + oncomplete: function(r) { + oncomplete(false, openils.Util.readResponse(r)); + + /* + var holdids = openils.Util.readResponse(r); + fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, holdids], + oncomplete: function(rr) { + progressDialog.hide(); + var holds = openils.Util.readResponse(rr); + holdsCache = holds; + setTimeout(function(){oncomplete()}, 150); // give the progress dialog a chance to clear out + oncomplete(); + } + }); + */ + } + }); + + break; + + case "prefs": + fieldmapper.standardRequest(FETCH_OPT_INS, {async:true, params:[G.user.session], + oncomplete:function(r) { + userOptIns = openils.Util.readResponse(r); + for(var i=0; i 0) { + var bal = $('myopac_sum_fines_bal'); + bal.style.color = "red"; + appendClear(bal, text("$" + Number(stats.fines.balance_owed).toFixed(2))); + showFinesDiv($('show_fines_link')); + unHideMe($('pay_fines_btn1')); + unHideMe($('show_fines_link')); + } +} + +function myOPACInitTemplates() { + //holds page + if(!templates.holdsParent) templates.holdsParent = $('holds_temp_parent'); + if(!templates.holdsTemp) templates.holdsTemp = templates.holdsParent.removeChild($('acct_holds_temp')); + //checked out page + if(!templates.checkedParent) templates.checkedParent = $('checked_temp_parent'); + if(!templates.checkedTemp) templates.checkedTemp = templates.checkedParent.removeChild($('acct_checked_temp')); + //checked history page + if(!templates.circHistPar) templates.circHistPar = $('acct_checked_hist_parent'); + if(!templates.circHistTemp) templates.circHistTemp = templates.circHistPar.removeChild($('acct_checked_hist_temp')); +} + +// link-up all the Account sub-pages for switchSubPage() +function myOPACInitSubpages() { + // create a primary object for each page... + subPageObjs.checked = {}; + subPageObjs.holds = {}; + subPageObjs.prefs = {}; + + // ... then create an array for each sub-page + subPageObjs.checked.main = []; + subPageObjs.checked.hist = []; + subPageObjs.holds.main = []; + subPageObjs.holds.hist = []; + subPageObjs.prefs.info = []; + subPageObjs.prefs.notify = []; + subPageObjs.prefs.search = []; + + // add .header to each primary page object and link to the page's blue header bar. + // add ['header'] to each sub-page array and put the text to display + subPageObjs.checked.header = $('acct_checked_header'); + subPageObjs.checked.main['header'] = "Current Items Checked Out"; + subPageObjs.checked.hist['header'] = "Check Out History"; + subPageObjs.checked.main.push($('checked_label')); + subPageObjs.checked.hist.push($('checked_link')); + subPageObjs.checked.main.push($('checked_hist_link')); + subPageObjs.checked.hist.push($('checked_hist_label')); + subPageObjs.checked.main.push($('checked_main')); + subPageObjs.checked.hist.push($('checked_hist')); + + subPageObjs.holds.header = $('acct_holds_header'); + subPageObjs.holds.main['header'] = "Current Items on Hold"; + subPageObjs.holds.hist['header'] = "Holds History"; + subPageObjs.holds.main.push($('holds_label')); + subPageObjs.holds.hist.push($('holds_link')); + subPageObjs.holds.main.push($('holds_hist_link')); + subPageObjs.holds.hist.push($('holds_hist_label')); + subPageObjs.holds.main.push($('holds_main')); + subPageObjs.holds.hist.push($('holds_hist_table')); + + subPageObjs.prefs.header = $('acct_prefs_header'); + subPageObjs.prefs.info['header'] = "Account Information and Preferences"; + subPageObjs.prefs.notify['header'] = "Notification Preferences"; + subPageObjs.prefs.search['header'] = "Search Preferences"; + subPageObjs.prefs.info.push($('prefs_info_lbl')); + subPageObjs.prefs.notify.push($('prefs_info_link')); + subPageObjs.prefs.notify.push($('prefs_notify_lbl')); + subPageObjs.prefs.info.push($('prefs_notify_link')); + subPageObjs.prefs.search.push($('prefs_search_lbl')); + subPageObjs.prefs.info.push($('prefs_search_link')); + subPageObjs.prefs.notify.push($('prefs_search_link')); + subPageObjs.prefs.search.push($('prefs_notify_link')); + subPageObjs.prefs.search.push($('prefs_info_link')); + subPageObjs.prefs.info.push($('acct_info_main')); + subPageObjs.prefs.search.push($('acct_search_main')); + subPageObjs.prefs.notify.push($('acct_notify_main')); + subPageObjs.prefs.notify.push($('acct_prefs_save')); + subPageObjs.prefs.search.push($('acct_prefs_save')); +} + +function fetchAllHolds() { +} + +var myopacForceHoldsRedraw = false; +function drawHoldsPage(sort, holdIds) { + if(sort == undefined) sort = true; + if(!templates.holdsParent || !templates.holdsTemp) return; + var parent = templates.holdsParent; + var temp = templates.holdsTemp; + var holdsReady = 0; + + if(myopacForceHoldsRedraw) { + holdsCache = fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:false, params:[G.user.session, + fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:false, params:[G.user.session, G.user.id()]}) + ]}); + } + + if(sort) holdsCache = holdsCache.sort(function(a, b) { + if(a.status==4) return -1; + if(b.status==4) return 1; + if(isTrue(a.hold.frozen())) return 1; + if(isTrue(b.hold.frozen())) return -1; + return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?1:-1; + }); + + function allHoldsFetched() { + holdsCacheMap=[]; + for(var i=0; i
+ + if(hold.status == 4) holdsReady++; + } + allHoldsFetched(); + + } else if(holdIds) { + + holdsCache = []; + var holdsReceived = 0; + + dojo.forEach(holdIds, + function(holdId) { + var row = temp.cloneNode(true); + dojo.style(row, 'visibility', 'hidden'); + parent.appendChild(row); + + //parent.appendChild(elem('tr').appendChild(elem('td', {'colspan':'10'}).appendChild(elem('div', {'style':'position:absolute;'}).appendChild(elem('div', {'style':'position:relative;'}).appendChild(elem('div', {'style':'width:974px;height:1px;background:#dcdbdb;'})))))); + + fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, [holdId]], + oncomplete: function(rr) { + var hold = openils.Util.readResponse(rr)[0]; + holdsCache.push(hold); + dojo.style(row, 'visibility', 'visible'); + drawOneHold(hold, row, parent); + if(hold.status == 4) holdsReady++; + if(++holdsReceived == holdIds.length) + allHoldsFetched(); + } + }); + } + ); + } +} + +function drawOneHold(h, row, parent) { + var imgTD = null; + var imgEl = null; + var d = null; + var exp_date; + var suffix = ""; + + row.id = "myopac_holds_row_" + h.hold.id(); + var form = $n(row, "myopac_holds_formats"); + form.id = "myopac_holds_form_" + h.hold.id(); + $n(row,'hold_pickup_lib_span').appendChild($('hold_pickup_lib_temp').cloneNode(true)); + + var tree = $n(row,'hold_pickup_lib_sel'); + buildOrgSelAlt(tree, globalOrgTree, 0); + setSelector(tree, h.hold.pickup_lib()); + $n(row,'check_all_holds').holdid = h.hold.id(); + $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+h.hold.id()+');'); + $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+h.hold.id()+');'); + $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+h.hold.id()+');'); + var activeSel = $n(row,'hold_active_sel'); + activeSel.selectedIndex = isTrue(h.hold.frozen())?1:0; + + //var djBox = $n(row,'activate_box').parentNode.parentNode.parentNode; + //djBox.id=djBox.id+h.hold.id(); + //var blah = dojo.query('input',$n(row,'activate_box').parentNode)[0]; + //blah.id = djBox.getAttribute("widgetId")+h.hold.id(); + //$().id = djBox.id+h.hold.id(); + //djBox.setAttribute("widgetId", djBox.getAttribute("widgetId")+h.hold.id()); + + $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.hold.pickup_lib()).name(); + $n(row,'hold_active').innerHTML = isTrue(h.hold.frozen())?"Suspended":"Active"; + if(isTrue(h.hold.frozen())) row.style.background="#e5e5e5"; + + if(h.hold.thaw_date()) { + d = dojo.date.stamp.fromISOString(h.hold.thaw_date()); + $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); + unHideMe($n(row,'activate_label')); + $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); + } + + if(h.hold.expire_time()) { + exp_date = dojo.date.stamp.fromISOString(h.hold.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3")) + $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + unHideMe($n(row,'hold_expires_label')); + $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + } + + buildTitleDetailLink(h.mvr, $n(row,'myopac_holds_title_link')); + $n(row,'myopac_holds_title_link').title = h.mvr.title(); + + imgTD = $n(row, "myopac_holds_formats"); + imgEl = elem('img'); + imgEl.className = 'hide_me'; + imgEl.name = 'format_icon_'+h.hold.id(); + imgTD.appendChild(imgEl); + if(imgFormatCache[h.hold.id()]==null) imgFormatCache[h.hold.id()] = getMarcData(h.mvr.doc_id(),"998","d"); + setFormatIcon(imgEl, imgFormatCache[h.hold.id()]); + + $n(row,'myopac_holds_author').innerHTML = h.mvr.author(); + + if( h.status == 4) { + $n(row,'acct_holds_status').innerHTML = "Ready for Pickup"; + hideMe($n(row,'holds_editor_row')); + unHideMe($n(row,'holds_ready_row')); + if(h.hold.shelf_expire_time()) $n(row,'hold_ready_expire').innerHTML = + dojo.date.locale.format(dojo.date.stamp.fromISOString(h.hold.shelf_expire_time()), {selector:'date', fullYear: true});; + } else { + var num = h.queue_position+''; + suffix = (num.charAt(num.length-1)=="1")?"st":(num.charAt(num.length-1)=="2")?"nd":(num.charAt(num.length-1)=="3")?"rd":"th"; + if(num=="11" || num=="12" || num=="13") suffix = "th"; + $n(row,'acct_holds_status').innerHTML = h.queue_position+suffix+" hold on "+h.potential_copies+" circulating cop"+(h.potential_copies==1?"y":"ies"); + } +} + +var checkedDrawn = true; +function drawCheckedPage(sort) { + if(sort==undefined) sort = true; + if(!templates.checkedParent || !templates.checkedTemp) return; + var parent = templates.checkedParent; + var temp = templates.checkedTemp; + + if(!checkedDrawn) itemsOutCache = fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:false, params:[G.user.session, G.user.id()]}); + if(sort) itemsOutCache = itemsOutCache.sort(function(a, b) { + if(dojo.date.stamp.fromISOString(a.circ.due_date()) > dojo.date.stamp.fromISOString(b.circ.due_date())) return 1; + return -1; + }); + checkedDrawn = true; + + removeChildren(parent); + for(var i in itemsOutCache) { + var row = temp.cloneNode(true); + var out = itemsOutCache[i]; + //row.id = "myopac_holds_row_" + out.hold.id(); + if(!mvrObjCache[out.circ.target_copy()]) mvrObjCache[out.circ.target_copy()] = out.record; + if(!copyObjCache[out.copy.id()]) copyObjCache[out.copy.id()] = out.copy; + + if(out.circ.due_date()) { + var exp_date = dojo.date.stamp.fromISOString(out.circ.due_date()); + if(exp_date<(new Date())) $n(row,'due_date').style.color="red"; + $n(row, 'due_date').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + } + + $n(row, 'renewals').innerHTML = out.circ.renewal_remaining(); + buildTitleDetailLink(out.record, $n(row,'title')); + if(out.record.author()) $n(row, 'author').appendChild(text(" / "+out.record.author())); + dojo.attr($n(row, 'check_all_checked'), 'circid', out.circ.id()) + $n(row,'title').title = out.record.title(); + $n(row, 'barcode').innerHTML = out.copy.barcode(); + if(callNumCache[out.copy.call_number()]==null) callNumCache[out.copy.call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[out.copy.call_number()]}); + $n(row, 'call_number').innerHTML = callNumCache[out.copy.call_number()].label(); + + parent.appendChild(row); + } + + if(!itemsOutCache.length) parent.appendChild(elem('div',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items checked out.')); +} + +var circHistDrawn = true; +function drawCircHistory(sort, offset) { + if(sort==undefined) sort = true; + if(offset==undefined) offset = circHistPage; else circHistPage = offset; + if(!templates.circHistPar || !templates.circHistTemp) return; + var parent = templates.circHistPar; + var temp = templates.circHistTemp; + + if(!circHistDrawn) itemsOutHistory = fieldmapper.standardRequest(FETCH_CHECKED_HISTORY, {async:false, params:[G.user.session, G.user.id(), {'limit':CIRC_HIST_PAGE_LIMIT, 'offset':offset}]}); + circHistDrawn = true; + + removeChildren(parent); + for(var i in itemsOutHistory) { + var row = temp.cloneNode(true); + var h = itemsOutHistory[i]; + if(mvrObjCache[h.circ.target_copy()]==null) mvrObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_MODS_BY_COPY, {async:false, params:[h.circ.target_copy()]}); + var mvr = mvrObjCache[h.circ.target_copy()]; + + if(mvr && !mvr.desc) { + buildTitleDetailLink(mvr, $n(row, 'title')); + $n(row, 'title').title = mvr.title(); + $n(row, 'author').innerHTML = mvr.author(); + + //dojo.date.locale.format(dojo.date.stamp.fromISOString(), {selector:'date', fullYear: true}); + } + + //date formatting and coloring + var ret = $n(row, 'returned'); + var due = $n(row, 'due_date'); + $n(row, 'checkout').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.create_time()), {selector:'date', fullYear: true}); + due.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.due_date()), {selector:'date', fullYear: true}); + if(!h.circ.checkin_time() && new Date() > dojo.date.stamp.fromISOString(h.circ.due_date())) due.style.color="red"; + if(h.circ.checkin_time() && dojo.date.stamp.fromISOString(h.circ.checkin_time()) > dojo.date.stamp.fromISOString(h.circ.due_date())) ret.style.color="red"; + if(h.circ.checkin_time()) ret.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.checkin_time()), {selector:'date', fullYear: true}); + else ret.innerHTML = "Checked Out"; + + if(copyObjCache[h.circ.target_copy()]==null) copyObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_COPY_OBJ, {async:false, params:[h.circ.target_copy()]}); + if(callNumCache[copyObjCache[h.circ.target_copy()].call_number()]==null) + callNumCache[copyObjCache[h.circ.target_copy()].call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[copyObjCache[h.circ.target_copy()].call_number()]}); + + if(copyObjCache[h.circ.target_copy()] && callNumCache[copyObjCache[h.circ.target_copy()].call_number()]) + $n(row,'call_number').innerHTML = callNumCache[copyObjCache[h.circ.target_copy()].call_number()].label(); + parent.appendChild(row); + } + + if(!itemsOutHistory.length) { + parent.appendChild(elem('tr').appendChild(elem('td',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items found.'))); + return; + } + + //build pagination + var pageTR = elem('tr'); + var pageTD = elem('td', {'align':'center', 'colspan':'5'}, null); + + var offPrev = offset - CIRC_HIST_PAGE_LIMIT; + var offNext = offset + CIRC_HIST_PAGE_LIMIT; + if(offset==0) offPrev = 0; + + if(offset!=0) var prev = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offPrev+');'}, '< Previous'); + else var prev = elem('span', null, '< Previous'); + if(itemsOutHistory.length'); + else var next = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offNext+');'}, 'Next >'); + + pageTD.appendChild(prev); + pageTD.appendChild(elem('span', null, ' ')); + pageTD.appendChild(next); + pageTR.appendChild(pageTD); + parent.appendChild(pageTR); +} + +function myOPACShowPrefs() { + grabUserPrefs(); + myOPACShowHitsPer(); + myOPACShowDefFont(); + myOPACShowDefLocation(); + myOPACShowNotifyPrefs(); + hideMe($('myopac_prefs_loading')); +} + +var defSearchLocationDrawn = false; +var defDepthIndex = 0; +function myOPACShowDefLocation() { + + var selector = $('prefs_def_location'); + var rsel = $('prefs_def_range'); + + if(!defSearchLocationDrawn) { + defSearchLocationDrawn = true; + var org = G.user.prefs[PREF_DEF_LOCATION]; + + if(!org) { + $('myopac_pref_home_lib').checked = true; + $('prefs_def_location').disabled = true; + org = G.user.home_ou(); + } + buildOrgSel(selector, globalOrgTree, 0); + + globalOrgTypes = globalOrgTypes.sort( + function(a, b) { + if( a.depth() < b.depth() ) return -1; + return 1; + } + ); + + iterate(globalOrgTypes, + function(t) { + if( t.depth() <= findOrgDepth(org) ) { + setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth()); + if( t.depth() == findOrgDepth(org)) + setSelector(rsel, t.depth()); + } + } + ); + } + + setSelector(selector, org); +} + +function myOPACShowNotifyPrefs() { + var preEmail = $(PREFS_PREDUE_3DAY); + var overEmail = $(PREFS_OVER_FIRST); + var overPhone = $(PREFS_OVER_FIRST_P); + var holdsCancel = $(PREFS_HOLD_CANCEL); + var holdsExpire = $(PREFS_HOLD_EXPIRE); + var holdsEmail = $("opac.hold_notify.email"); + var holdsPhone = $("opac.hold_notify.phone"); + if(G.user.prefs[PREFS_CIRC_HIST_START]) { $('circHistStart').checked = true; } + + if(preEmail && typeof(G.user.prefs[PREFS_PREDUE_3DAY]) !="undefined") preEmail.checked = G.user.prefs[PREFS_PREDUE_3DAY]; + if(overEmail && typeof(G.user.prefs[PREFS_OVER_FIRST]) !="undefined") overEmail.checked = G.user.prefs[PREFS_OVER_FIRST]; + if(overPhone && typeof(G.user.prefs[PREFS_OVER_FIRST_P]) !="undefined") overPhone.checked = G.user.prefs[PREFS_OVER_FIRST_P]; + if(holdsCancel && typeof(G.user.prefs[PREFS_HOLD_CANCEL])!="undefined") holdsCancel.checked = G.user.prefs[PREFS_HOLD_CANCEL]; + if(holdsExpire && typeof(G.user.prefs[PREFS_HOLD_EXPIRE])!="undefined") holdsExpire.checked = G.user.prefs[PREFS_HOLD_EXPIRE]; + if(holdsPhone && typeof(G.user.prefs[PREFS_HOLD_PHONE]) !="undefined") holdsPhone.checked = G.user.prefs[PREFS_HOLD_PHONE]; + if(holdsEmail && typeof(G.user.prefs[PREFS_HOLD_EMAIL]) !="undefined") holdsEmail.checked = G.user.prefs[PREFS_HOLD_EMAIL]; +} + +function myOPACShowHitsPer() { + var hits = 10; + if(G.user.prefs[PREF_HITS_PER]) + hits = G.user.prefs[PREF_HITS_PER]; + var hitsSel = $('prefs_hits_per'); + setSelector(hitsSel, hits); +} + +function myOPACShowDefFont() { + var font; + if(G.user.prefs[PREF_DEF_FONT]) + font = G.user.prefs[PREF_DEF_FONT]; + else font = "regular"; + setSelector($('prefs_def_font'), font); +} + +function myOPACShowUser(bool) { + if(bool) fleshedUser = fieldmapper.standardRequest(FETCH_FULL_USER, {async:false, params:[G.user.session, G.user.id()]}); + var user = fleshedUser; + + var expireDate = dojo.date.stamp.fromISOString(user.expire_date()); + if( expireDate < new Date() ) { + appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD')); + unHideMe($('myopac.expired.alert')); + } + + var iv1 = user.ident_value()+''; + if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********'; + + appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); + appendClear($('myopac_summary_prefix'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); + appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name())); + + appendClear($('myopac_summary_dayphone'),text(user.day_phone())); + appendClear($('myopac_summary_eveningphone'),text(user.evening_phone())); + appendClear($('myopac_summary_otherphone'),text(user.other_phone())); + appendClear($('myopac_summary_suffix'),text(user.suffix())); + appendClear($('myopac_summary_username'),text(user.usrname())); + appendClear($('myopac_summary_email'),text(user.email())); + appendClear($('myopac_summary_barcode'),text(user.card().barcode())); + appendClear($('myopac_summary_ident1'),text(iv1)); + appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date()))); + + var req = new Request( + FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()}); + req.callback(myopacDrawNotes); + req.send(); + + var tbody = $('myopac_addr_tbody'); + var template; + + if(addrRowTemplate) { + template = addrRowTemplate; + } else { + template = tbody.removeChild($('myopac_addr_row')); + addrRowTemplate = template; + } + removeChildren(tbody); + + var addrs = user.addresses(); + for( var a in addrs ) { + var addr = addrs[a]; + if(!allowPendingAddr && isTrue(addr.pending())) + continue; + if(addr.replaces() != null) continue; + var row = template.cloneNode(true); + myOPACDrawAddr(row, addr, addrs); + tbody.appendChild(row); + } +} + +function myopacDrawNotes(r) { + var notes = r.getResultObject(); + var tbody = $('myopac.notes.tbody'); + if(!notesTemplate) + notesTemplate = tbody.removeChild($('myopac.notes.tr')); + removeChildren(tbody); + + iterate(notes, + function(note) { + unHideMe($('myopac.notes.div')); + var row = notesTemplate.cloneNode(true); + $n(row, 'title').appendChild(text(note.title())); + $n(row, 'value').appendChild(text(note.value())); + tbody.appendChild(row); + } + ); +} + +function myOPACDrawAddr(row, addr, addrs) { + appendClear($n(row, 'myopac_addr_type'),text(addr.address_type())); + appendClear($n(row, 'myopac_addr_street'),text(addr.street1())); + appendClear($n(row, 'myopac_addr_street2'),text(addr.street2())); + appendClear($n(row, 'myopac_addr_city'),text(addr.city())); + appendClear($n(row, 'myopac_addr_county'),text(addr.county())); + appendClear($n(row, 'myopac_addr_state'),text(addr.state())); + appendClear($n(row, 'myopac_addr_country'),text(addr.country())); + appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code())); + + if(!allowPendingAddr) return; + + $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)}; + unHideMe($n(row, 'myopac_addr_edit_td')); + + /* if we have a replacement address, plop it into the table next to this addr */ + var repl = grep(addrs, function(a) { return a.replaces() == addr.id(); }); + + $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id(); + + if(repl) { + hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link + repl = repl[0]; + myopacSetAddrInputs(row, repl); + } +} + +function myopacEditAddress(addr) { + var td = $('myopac_pending_addr_td_' + addr.id()); + var row = td.parentNode; + myopacSetAddrInputs(row, addr); +} + +function myopacSetAddrInputs(row, addr, prefix) { + unHideMe($n(row, 'myopac_pending_addr_td')); + $n(row, 'myopac_pending_addr_type').value = addr.address_type(); + $n(row, 'myopac_pending_addr_street').value = addr.street1(); + $n(row, 'myopac_pending_addr_street2').value = addr.street2(); + $n(row, 'myopac_pending_addr_city').value = addr.city(); + $n(row, 'myopac_pending_addr_county').value = addr.county(); + $n(row, 'myopac_pending_addr_state').value = addr.state(); + $n(row, 'myopac_pending_addr_country').value = addr.country(); + $n(row, 'myopac_pending_addr_zip').value = addr.post_code(); + $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)}; + $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)}; +} + +function _trimTime(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMD'); +} + +function _trimSeconds(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMDHM',null,true,true); +} + +function myopacSaveAddress(row, addr, deleteMe) { + if(addr.replaces() == null) { + var repl = new aua(); + repl.usr(addr.usr()); + repl.address_type(addr.address_type()); + repl.within_city_limits(addr.within_city_limits()); + repl.replaces(addr.id()); + repl.pending('t'); + repl.isnew(true); + repl.id(null); + addr = repl; + } + + if(deleteMe) { + if(addr.id() == null) { + hideMe($n(row, 'myopac_pending_addr_td')); + return; + } + addr.isdeleted(true); + } else { + addr.address_type($n(row, 'myopac_pending_addr_type').value); + addr.street1($n(row, 'myopac_pending_addr_street').value); + addr.street2($n(row, 'myopac_pending_addr_street2').value); + addr.city($n(row, 'myopac_pending_addr_city').value); + addr.county($n(row, 'myopac_pending_addr_county').value); + addr.state($n(row, 'myopac_pending_addr_state').value); + addr.country($n(row, 'myopac_pending_addr_country').value); + addr.post_code($n(row, 'myopac_pending_addr_zip').value); + } + + var req = new Request('open-ils.actor:open-ils.actor.user.address.pending.cud', G.user.session, addr); + + req.callback( + function(r) { + var resp = r.getResultObject(); + + if(addr.isnew()) { + // new, add to list of addrs + addr.id(resp); + fleshedUser.addresses().push(addr); + } else { + // deleted, remove from list of addrs + if(addr.isdeleted()) { + hideMe($n(row, 'myopac_pending_addr_td')); + var addrs = []; + for(var i in fleshedUser.addresses()) { + var a = fleshedUser.addresses()[i]; + if(a.id() != addr.id()) addrs.push(a); + } + fleshedUser.addresses(addrs); + } + } + alertId('myopac_addr_changes_saved'); + } + ); + req.send(); +} + +function myOPACSavePrefs() { + G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per')); + G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font')); + G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range')); + + var holdsPhone = $("opac.hold_notify.phone"); + var holdsEmail = $("opac.hold_notify.email"); + var circStartBox = $('circHistStart').checked; + var circStart = null; + circStart = (circStartBox && G.user.prefs[PREFS_CIRC_HIST_START])?G.user.prefs[PREFS_CIRC_HIST_START]:dojo.date.stamp.toISOString(new Date()); + if(!circStartBox) circStart = null; + + G.user.prefs[PREFS_HOLD_PHONE] = holdsPhone.checked; + G.user.prefs[PREFS_HOLD_EMAIL] = holdsEmail.checked; + G.user.prefs[PREFS_PREDUE_3DAY] = $(PREFS_PREDUE_3DAY).checked; + G.user.prefs[PREFS_OVER_FIRST] = $(PREFS_OVER_FIRST).checked; + G.user.prefs[PREFS_OVER_FIRST_P] = $(PREFS_OVER_FIRST_P).checked; + G.user.prefs[PREFS_HOLD_EXPIRE] = $(PREFS_HOLD_EXPIRE).checked; + G.user.prefs[PREFS_HOLD_CANCEL] = $(PREFS_HOLD_CANCEL).checked; + //G.user.prefs[PREFS_CIRC_HIST_AGE] = "2592000"; + G.user.prefs[PREFS_CIRC_HIST_START] = circStart; + + if( $('myopac_pref_home_lib').checked == true ) + G.user.prefs[PREF_DEF_LOCATION] = null; + else + G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location')); + + try { + if(commitUserPrefs()) + alert($('prefs_update_success').innerHTML); + else alert($('prefs_update_failure').innerHTML); + } catch(e) { + alert(e); + } + fieldmapper.standardRequest(FETCH_CHECKED_HISTORY,{params:[G.user.session, G.user.id()],oncomplete:function(r){ + var resp = r.recv(); + if(resp) resp = resp.content(); + }}); +} + +function myOPACUpdateEmail() { + var email = $('myopac_new_email').value; + if(email == null || email == "") { + alert($('myopac_email_error').innerHTML); + return; + } + + var req = new Request(UPDATE_EMAIL, G.user.session, email ); + req.send(true); + if(req.result()) { + //G.user.email(email); + // force re-fetch to pick up latest last_xact_id + grabUser(null, true); + hideMe($('myopac_update_email_row')); + userShown = false; + alertId('myopac_email_success'); + myOPACShowUser(true); + + // user got here after trying to make a payment then deciding + // the email addr needed updating. take the user back to the + // in-progress payment form + if(myopacReturnToPayment) { + myopacReturnToPayment = false; + myOPACChangePage("summary"); + $('myopac-cc-email').innerHTML = email; + } + return; + } + + alert($('myopac_email_failure').innerHTML); +} + +function myOPACUpdatePassword() { + var curpassword = $('myopac_current_password').value; + var password = $('myopac_new_password').value; + var password2 = $('myopac_new_password2').value; + + if( curpassword == null || curpassword == "" || + password == null || password == "" || + password2 == null || password2 == "" || password != password2 ) { + alert($('myopac_password_error').innerHTML); + return; + } + + if(!strongPassword(password, true)) return; + + var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword ); + req.send(true); + if(req.result()) { + grabUser(null, true); + hideMe($('myopac_update_password_row')); + userShown = false; + alertId('myopac_password_success'); + myOPACShowUser(true); + return; + } + + alert($('myopac_password_failure').innerHTML); +} + +function myOPACUpdatePhone(which) { + if(!which) return; + var tr = $('myopac_update_phone'+which+'_row'); + var input = $('myopac_new_phone'+which); + if(!tr || !input) return; + var val = input.value; + if(!val.match(REGEX_PHONE)) { + alert("Not a valid phone number. Should be in the form ###-###-####"); + input.focus(); + input.select(); + return; + } + + var newUser = fleshedUser.clone(true); + switch(which) { + case "1": newUser.day_phone(val); break; + case "2": newUser.evening_phone(val); break; + case "3": newUser.other_phone(val); break; + } + + newUser.ischanged("t"); + var resp = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.patron.update'], {async:false, params:[G.user.session, newUser]}); + if(typeof(resp.desc)=="undefined") { + hideMe(tr); + userShown = false; + fleshedUser = resp; + alert("Phone number updated successfully."); + myOPACShowUser(true); + } else { + alert(resp.textcode+'\n'+resp.desc); + input.focus(); + input.select(); + } +} + +function myOPACUpdateUsername() { + var username = $('myopac_new_username').value; + if(username == null || username == "") { + alert($('myopac_username_error').innerHTML); + return; + } + + if( username.match(/.*\s.*/) ) { + alert($('myopac_invalid_username').innerHTML); + return; + } + + r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex'); + if(r) REGEX_BARCODE = new RegExp(r); + + if(username.match(REGEX_BARCODE)) { + alert($('myopac_invalid_username').innerHTML); + return; + } + + /* first see if the requested username is taken */ + var req = new Request(CHECK_USERNAME, G.user.session, username); + req.send(true); + var res = req.result(); + if( res !== null && res != G.user.id() ) { + alertId('myopac_username_dup'); + return; + } + + var req = new Request(UPDATE_USERNAME, G.user.session, username ); + req.send(true); + if(req.result()) { + + var evt; + var res = req.result(); + if(evt = checkILSEvent(res)) { + alertILSEvent(res); + return; + } + + grabUser(null, true); + hideMe($('myopac_update_username_row')); + userShown = false; + alertId('myopac_username_success'); + myOPACShowUser(true); + return; + } + + alert($('myopac_username_failure').innerHTML); +} + +function iForgotMyPassword(un,email) { + if(!un) return; + //var type = un.match(/^\d+$/)?'barcode':'username'; + fieldmapper.standardRequest(PASS_RESET,{params:['barcode',un,email],oncomplete:function(rr){ + var resp = rr.recv().content(); + if(resp.textcode=="ACTOR_USER_NOT_FOUND") fieldmapper.standardRequest(PASS_RESET,{params:['username',un,email],oncomplete:function(r){ + var resp2 = r.recv().content(); + if(resp2.textcode) alert(resp2.textcode+'\n'+resp2.desc); + else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } + }}); else { + if(resp.textcode) alert(resp.textcode+'\n'+resp.desc); + else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } + } + }}); +} + +function myOPACShowBookbags(force) { + if(anonListCache.length) drawAnonLists(force); else hideMe($('acct_list_template2')); + var wrapper = $('acct_lists_prime'); + if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return; + if(!wrapper) return; + + var containers = containerFetchAll(); + + var found = false; + for(var i in containers) { + found = true; + var cont = containers[i]; + fleshedContainers[cont.id()] = cont; + var temp = containerTemplate.cloneNode(true); + var title = $n(temp, 'list_name'); + var share = $n(temp, 'share_list_link'); + var rem = $n(temp, 'remove_list'); + if(!title || !share || !rem) continue; + + title.appendChild(text(cont.name())); + share.onclick = myListAction; + share.listID = cont.id(); + rem.value='delete'; + rem.onclick = myListAction; + rem.listID = cont.id(); + temp.setAttribute("id",temp.id + '_' + cont.id()); + + if(containers.length>1) { + var sel = $n(temp, 'list_actions'); + var optg = elem('optgroup', {label:'Move Items to'}); + for(var n in containers) { + var cont2 = containers[n]; + if(cont2.id()==cont.id()) continue; + var opt = elem('option', {value:'move', container:cont2.id()}, cont2.name()); + optg.appendChild(opt); + } + sel.appendChild(optg); + } + + if(isTrue(cont.pub())) { + share.value='hide'; + share.innerHTML = 'Un-share'; + share.title=''; + var link = $n(temp,'share_list_rss'); + link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false)); + unHideMe(link); + } else { + share.value='share'; + share.title = 'Sharing this bookbag will allow the contents of the bookbag to be seen by others.' + share.innerHTML = 'Share'; + } + + wrapper.appendChild(temp); + // grab container items after adding each list to the page + fieldmapper.standardRequest(FETCH_CONTAINER_DETAILS,{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows}); + } + + if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists")); + + var anonSel = $('sel_all_list_anon'); + if(!anonSel) return; + var optg2 = elem('optgroup', {label:'Move Items to', id:'anon_list_grp'}); + for(var t in containers) { + var cont3 = containers[t]; + var opt2 = elem('option', {value:'move', container:cont3.id()}, cont3.name()); + optg2.appendChild(opt2); + } + anonSel.appendChild(optg2); +} + +function drawAnonLists() { + var cont = $('acct_list_template2'); + var bibs = fieldmapper.standardRequest(FETCH_MODS_SLIM, {async:false, params:[anonListCache]}); + + var tbody = $('anon_list_tbody'); + for(var i in bibs) { + var it = bibs[i]; + var tr = elem('tr'); + var td1 = elem('td',{style:'padding-right:5px;'},it.title()); + var td2 = elem('td',{width:'1'}); + var el = elem('input',{type:'checkbox', name:'list_action_chbx', recordid:it.doc_id()+'', doc_id:it.doc_id()+'', listID:'anon'}); + el.className = "list_action_chbx"; + el.name="list_action_chbx"; + td2.appendChild(el); + tr.appendChild(td2); + tr.appendChild(td1); + tbody.appendChild(tr); + } + unHideMe(cont); +} + +function drawListItemRows(r) { + var fleshed = r.recv().content(); + if(!fleshed) return; + var modsArr = []; + + var temp = $('acct_list_template_'+fleshed.id()); + if(!temp) return; + var tbody = $n(temp,'list_tbody'); + if(!tbody) return; + var items = fleshed.items(); + + for(var i=0; i 0.00) { + var bal = $('myopac_sum_fines_bal'); + bal.style.color = "red"; + appendClear(bal,text("$"+balance2)); + unHideMe($('myopac_sum_fines')); + unHideMe($('myopac_sum_fines_slim')); + unHideMe($('pay_fines_btn')); + if(!r.__showing) + showFinesDiv($('show_fines_link')); + } + + appendClear($('myopac_fines_summary_total'), text(total)); + appendClear($('myopac_fines_summary_paid'), text(paid)); + appendClear($('myopac_fines_summary_balance'), text(balance)); +} + +function _finesFormatNumber(num) { + if(isNull(num)) num = 0; + num = num + ""; + if(num.length < 2 || !num.match(/\./)) num += ".00"; + if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0"; + return num; +} + +function _trimTime(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMD'); +} + +function _trimSeconds(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMDHM',null,true,true); +} + +function myOPACShowTransactions(r) { + var transactions = r.getResultObject(); + + if(!myopacGenericTransTemplate) myopacGenericTransTemplate = $('myopac_trans_tbody').removeChild($('myopac_trans_row')); + if(!myopacCircTransTemplate) myopacCircTransTemplate = $('myopac_circ_trans_tbody').removeChild($('myopac_circ_trans_row')); + removeChildren($('myopac_trans_tbody')); + removeChildren($('myopac_circ_trans_tbody')); + transCache = []; + + transactions = transactions.sort( + function(a, b) { + if(a.transaction.xact_start() < b.transaction.xact_start()) + return 1; + else return -1; + } + ); + + for( var idx in transactions ) { + var trans = transactions[idx].transaction; + var record = transactions[idx].record; + var circ = transactions[idx].circ; + transCache[trans.id()] = transactions[idx]; + + if(trans.xact_type() == 'circulation') myOPACShowCircTransaction(trans, record, circ); + else if(trans.xact_type() == 'grocery') myopacShowGenericTransaction( trans ); + } +} + +// for toggling between payments and fines tabs +function showFinesTab() { + hideMe($("myopac_payments_div")); + unHideMe($("pay-fines-image")); + unHideMe($("myopac_trans_div")); + unHideMe($("myopac_circ_trans_div")); + $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom"; + $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom"; +} + +var paymentsDrawn = false; +function myopacDrawPayments() { + + unHideMe($("myopac_payments_div")); + hideMe($("myopac_circ_trans_div")); + hideMe($("myopac_trans_div")); + hideMe($("pay-fines-image")); + $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_off.jpg') no-repeat bottom"; + $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_on.jpg') no-repeat bottom"; + + if(paymentsDrawn) return; + paymentsDrawn = true; ++ progressDialog.show(true); + + var before = new Date() + before.setFullYear(before.getFullYear() - 1); + // KCLS limits payment history view to 1 year. This will eventually be expanded + // out to a history view page, but for now, just fetch what's needed. + var req = new Request( + 'open-ils.actor:open-ils.actor.user.payments.retrieve', + G.user.session, G.user.id(), + {"where":{"payment_ts":{">=":dojo.date.stamp.toISOString(before)}}}); + + req.callback(_myopacDrawPayments); + req.send(); +} + +function _myopacDrawPayments(r) { + ++ progressDialog.hide(); + var payments = r.getResultObject(); + var tbody = $('myopac_payments_tbody'); + rowTmpl = tbody.removeChild($('myopac_payments_tmpl')); + + dojo.forEach(payments, + function(payment) { + var row = rowTmpl.cloneNode(true); + $n(row, 'date').innerHTML = dojo.date.locale.format( + dojo.date.stamp.fromISOString(payment.mp.payment_ts()), + {selector:'date', fullYear: true} + ); + $n(row, 'for').innerHTML = (payment.title) ? payment.title : payment.last_billing_type; + $n(row, 'amount').innerHTML += Number(payment.mp.amount()).toFixed(2); + if(payment.mp.payment_type() == 'credit_card_payment') { + $n(row, 'print_recpt').onclick = function () { printPaymentReceipt([payment.mp.id()]) }; + $n(row, 'email_recpt').onclick = function () { emailPaymentReceipt([payment.mp.id()]) }; + } else { + $n(row, 'print_recpt').parentNode.style.visibility = 'hidden'; + } + tbody.appendChild(row); + } + ); +} + +function emailPaymentReceipt(paymentIds, callback) { + + if(!G.user.email()) { + if(callback) callback(); + return; + } + + progressDialog.show(true); + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.money.payment_receipt.email'], + { + async : true, + params : [G.user.session, paymentIds], + oncomplete : function(r) { + progressDialog.hide(); + openils.Util.readResponse(r); + if(callback) callback(); + } + } + ); +} + +function dateFromISO(d) { + if(!d) return ''; + return dojo.date.locale.format( + dojo.date.stamp.fromISOString(d), + {selector:'date', fullYear: true} + ); +} + +function myopacShowGenericTransaction( trans ) { + var tbody = $('myopac_trans_tbody'); + + var row = myopacGenericTransTemplate.cloneNode(true); + $n(row,'myopac_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); + $n(row,'myopac_trans_last_payment').appendChild(text(dateFromISO(trans.last_payment_ts()))); + $n(row,'myopac_trans_init_amount').appendChild(text(_finesFormatNumber(trans.total_owed()))); + $n(row,'myopac_trans_total_paid').appendChild(text(_finesFormatNumber(trans.total_paid()))); + $n(row,'myopac_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); + $n(row,'selector').balance_owed = trans.balance_owed(); + $n(row,'selector').setAttribute("xact", trans.id()); + + var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id()); + req.send(true); + var bills = req.result(); + if(bills && bills[0]) $n(row,'myopac_trans_bill_type').appendChild(text(bills[0].billing_type())); + + tbody.appendChild(row); + unHideMe($('myopac_trans_div')); +} + +function myOPACShowCircTransaction(trans, record, circ) { + var tbody = $('myopac_circ_trans_tbody'); + + var row = myopacCircTransTemplate.cloneNode(true); + if(record) { + buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title')); + $n(row,'myopac_circ_trans_author').appendChild(text(normalize(truncate(record.author(), 65)))); + } else { + var req = new Request( FETCH_COPY, circ.target_copy() ); + req.alertEvents = false; + req.send(true); + var copy = req.result(); + if( copy ) { + $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title())); + $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author())); + } + } + + $n(row,'myopac_circ_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); + + var due = dateFromISO(circ.due_date()); + var checkin = dateFromISO(circ.stop_fines_time()); + + $n(row,'myopac_circ_trans_due').appendChild(text(due)) + if(checkin) appendClear($n(row,'myopac_circ_trans_finished'), text(checkin)); + if(circ.stop_fines() == 'LOST') appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines())); + if(circ.stop_fines() == 'CLAIMSRETURNED') appendClear($n(row,'myopac_circ_trans_finished'), text("")); + $n(row,'myopac_circ_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); + $n(row,'selector').balance_owed = trans.balance_owed(); + $n(row,'selector').setAttribute("xact",trans.id()); + + tbody.appendChild(row); + unHideMe($('myopac_circ_trans_div')); +} + +function showFinesDiv(el) { + if(!el) return; + if($('myopac_fines_div').className.indexOf('hide_me')>=0) { + unHideMe($('myopac_fines_div')); + el.innerHTML="Hide Overdue Materials"; + if(!finesShown) { + myOPACShowFines(true); + } + } else { + hideMe($('myopac_fines_div')); + el.innerHTML="Show Overdue Materials"; + } +} + +var ecom_event_map = { + CREDIT_PROCESSOR_DECLINED_TRANSACTION : + 'Sorry. Your payment has been declined. Please confirm your information is entered correctly or contact your credit card company.', + CREDIT_PROCESSOR_INVALID_CC_NUMBER : + 'The credit card number entered is not valid. Please confirm your information is entered correctly or contact your credit card company.', + SUCCESS : 'Your payment has been approved' +} + +function showPaymentForm() { + unHideMe($('pay_fines_now')); + hideMe($('acct_sum')); + hideMe($('cc-payment-error-message')); + drawPayFinesPage( + G.user, + getSelectedFinesTotal(), + getSelectedFineTransactions(), + function(resp) { + unHideMe($('cc-payment-error-message')); + if(resp.textcode) { + var message = ecom_event_map[resp.textcode] || resp.textcode+'\n'+resp.desc + ''; + $('cc-payment-error-message').innerHTML = message; + return; + } + G.user.last_xact_id(resp.last_xact_id); // update to match latest from server + $('cc-payment-error-message').innerHTML = ecom_event_map.SUCCESS; + printPaymentReceipt(resp.payments); + emailPaymentReceipt(resp.payments); + hideMe($('pay_fines_now'));unHideMe($('acct_sum')); + finesShown = false; + myOPACShowFines(); + showFinesDiv($('show_fines_link')); + } + ); +} + +function getSelectedFinesTotal() { + var total = 0; + dojo.forEach( + dojo.query("[name=selector]", $('myopac_circ_trans_tbody')), + function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } + ); + + dojo.forEach( + dojo.query("[name=selector]", $('myopac_trans_tbody')), + function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } + ); + return total.toFixed(2); +} + +function getSelectedFineTransactions() { + var set1 = dojo.query("[name=selector]", $('myopac_circ_trans_tbody')). + filter(function (o) { return o.checked }). + map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} + ); + var set2 = dojo.query("[name=selector]", $('myopac_trans_tbody')). + filter(function (o) { return o.checked }). + map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} + ); + var obj = set1.concat(set2); + return obj.filter(function(el){return el[0]==null?false:true;}); +} + +var payFinesDrawn = false; +function drawPayFinesPage(patron, total, xacts, onPaymentSubmit) { + if (typeof(this.authtoken) == "undefined") + this.authtoken = patron.session; + + dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML = total; + + $('myopac-cc-email').innerHTML = patron.email(); + oilsSelfckCCNumber.attr('value', ''); + oilsSelfckCCCVV.attr('value', ''); + oilsSelfckCCMonth.attr('value', '01'); + oilsSelfckCCYear.attr('value', new Date().getFullYear()); + oilsSelfckCCFName.attr('value', patron.first_given_name()); + oilsSelfckCCLName.attr('value', patron.family_name()); + + var addr = patron.billing_address() || patron.mailing_address(); + + if (typeof(addr) != "object") { + /* still don't have usable address? try getting better user object. */ + fieldmapper.standardRequest( + FETCH_FULL_USER, { + "params": [patron.session, patron.id(), ["billing_address", "mailing_address"]], + "async": false, + "oncomplete": function(r) { + var usr = r.recv().content(); + if (usr) addr = usr.billing_address() || usr.mailing_address(); + } + } + ); + } + + if (addr) { - oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); ++ //oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); + oilsSelfckCCCity.attr('value', addr.city()); + oilsSelfckCCState.attr('value', addr.state()); + oilsSelfckCCZip.attr('value', addr.post_code()); + } + + dojo.connect(oilsSelfckEditDetails, 'onChange', + function(newVal) { + dojo.forEach( + [oilsSelfckCCFName, oilsSelfckCCLName, oilsSelfckCCStreet, oilsSelfckCCCity, oilsSelfckCCState, oilsSelfckCCZip], + function(dij) { dij.attr('disabled', !newVal); } + ); + } + ); + + if(!payFinesDrawn) { + dojo.connect(oilsSelfckCCSubmit, 'onClick', + function() { + hideMe($('pay_fines_now')); + unHideMe($('pay_fines_confirm')); + + $('pay_fines_confirm_amount').innerHTML = + dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML; + + dojo.connect(payConfirmSubmit, 'onClick', + function() { + if (typeof(progressDialog) != "undefined") progressDialog.show(true); + unHideMe($('pay_fines_now')); + hideMe($('pay_fines_confirm')); + sendCCPayment(patron, xacts, onPaymentSubmit); + } + ); + + dojo.connect(payConfirmCancel, 'onClick', + function() { + unHideMe($('pay_fines_now')); + hideMe($('pay_fines_confirm')); + } + ); + + /* + if(!confirm("Are you sure?")) return; + sendCCPayment(patron, xacts, onPaymentSubmit); + */ + } + ); + payFinesDrawn = true; + } + + var selFines = $('selectedFines'); + removeChildren(selFines); + for(var i in xacts) { + var xact = transCache[xacts[i][0]]; + if(!xact) continue; + var tr = elem('tr'); + var td1 = elem('td', {}, xact["record"]?xact.record.title():xact.transaction.last_billing_type()); + var td2 = elem('td', {'nowrap':'nowrap', 'valign':'top'}, '$'+xact.transaction.balance_owed()); + td2.style.paddingLeft = '5px'; + td2.style.color = 'red'; + tr.appendChild(td1); + tr.appendChild(td2); + selFines.appendChild(tr); + } +} + +function sendCCPayment(patron, xacts, onPaymentSubmit) { + // in this context, patron will always be G.user. set it explicitly + // to pick up the latest last_xact_id value + patron = G.user; + + var args = { + userid : patron.id(), + payment_type : 'credit_card_payment', + payments : xacts, + cc_args : { + where_process : 1, + //type : 'MasterCard',//oilsSelfckCCType.attr('value'), + number : oilsSelfckCCNumber.attr('value'), + cvv2 : oilsSelfckCCCVV.attr('value'), + expire_year : oilsSelfckCCYear.attr('value'), + expire_month : oilsSelfckCCMonth.attr('value'), + billing_first : oilsSelfckCCFName.attr('value'), + billing_last : oilsSelfckCCLName.attr('value'), + billing_address : oilsSelfckCCStreet.attr('value'), + billing_city : oilsSelfckCCCity.attr('value'), + billing_state : oilsSelfckCCState.attr('value'), + billing_zip : oilsSelfckCCZip.attr('value') + } + } + + var resp = fieldmapper.standardRequest(PAY_BILLS,{params : [patron.session, args, patron.last_xact_id()]}); + if (typeof(progressDialog) != "undefined") + progressDialog.hide(); + + if (typeof(onPaymentSubmit) == "function") { + onPaymentSubmit(resp); + } else { + var evt = openils.Event.parse(resp); + if (evt) alert(evt); + } +} + +function myopacSelectedHoldsRows() { + var r = []; + var cb; + var rows = dojo.query('[name=acct_holds_temp]',$("holds_temp_parent")); + for(var i = 0; i < rows.length; i++) { + cb = $n(rows[i], 'check_all_holds'); + if(cb && cb.checked) + r.push(rows[i]); + } + return r; +} + +var myopacProcessedHolds = 0; +var myopacHoldsToProcess = 0; +function myopacDoHoldAction() { + var selectedRows = myopacSelectedHoldsRows(); + var action = getSelectorVal($('acct_holds_actions')); + $('myopac_holds_actions_none').selected = true; + if(selectedRows.length == 0) return; + + myopacProcessedHolds = 0; + + if(!confirmId('myopac.holds.'+action+'.confirm')) return; + //myopacSelectNoneHolds(); /* clear the selection */ + + + /* first, let's collect the holds that actually need processing and + collect the full process count while we're at it */ + var holds = []; + for(var i = 0; i < selectedRows.length; i++) { + var ahold = $n(selectedRows[i],'check_all_holds'); + var hold = holdsCache[holdsCacheMap[ahold.holdid]]; + var qstats = hold.status; + switch(action) { + case 'cancel': + holds.push(hold.hold); + break; + case 'thaw_date': + case 'thaw': + if(isTrue(hold.hold.frozen())) + holds.push(hold.hold); + break; + case 'freeze': + if(!isTrue(hold.hold.frozen()) && qstats < 3) + holds.push(hold.hold); + break; + } + } + + myopacHoldsToProcess = holds; + if(myopacHoldsToProcess.length == 0) return; + + if(action == 'thaw_date' || action == 'freeze') + myopacDrawHoldThawDateForm(); + else + myopacProcessHolds(action); +} + +function myopacDrawHoldThawDateForm() { + hideMe($('myopac_holds_div')); + unHideMe($('myopac_holds_thaw_date_form')); + $('myopac_holds_thaw_date_input').focus(); +} + +function myopacApplyThawDate() { + var dateString = dijit.byId('myopac_holds_thaw_date_input').getValue(); + if(dateString) { + dateString = dojo.date.stamp.toISOString(dateString); + if(dateString) { + dateString = holdsVerifyThawDate(dateString); + if(!dateString) return; + } else { + dateString = null; + } + } + unHideMe($('myopac_holds_div')); + hideMe($('myopac_holds_thaw_date_form')); + myopacProcessHolds('freeze', dateString); +} + + +function myopacProcessHolds(action, thawDate) { + progressDialog.show(true); + // myopacShowHoldProcessing(); + /* now we process them */ + for(var i = 0; i < myopacHoldsToProcess.length; i++) { + var hold = myopacHoldsToProcess[i]; + + var req; + switch(action) { + + case 'cancel': + req = new Request(CANCEL_HOLD, G.user.session, hold.id()); + break; + + case 'thaw': + hold.frozen('f'); + hold.thaw_date(null); + req = new Request(UPDATE_HOLD, G.user.session, hold); + break; + + case 'thaw_date': + case 'freeze': + hold.frozen('t'); + hold.thaw_date(thawDate); + req = new Request(UPDATE_HOLD, G.user.session, hold); + break; + //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML); + + } + + req.callback(myopacBatchHoldCallback); + req.send(); + req = null; + } +} + +function myopacBatchHoldCallback(r) { + var res = r.getResultObject(); + myopacHoldsToProcess = grep(myopacHoldsToProcess, function(i) { return (i.id() != res); }); + if(!myopacHoldsToProcess || ++myopacProcessedHolds >= myopacHoldsToProcess.length) { + //alert(res); + progressDialog.hide(); + myopacForceHoldsRedraw = true; + $('check_all_holds').checked = false; + drawHoldsPage(); + } +} + +function myOPACRenewSelected() { + var rows = dojo.query('input[name=check_all_checked]',$('checked_temp_parent')).filter(function(n,i){ return n.checked; }); + __renew_circs = []; + if(!rows.length || !confirm($('myopac_renew_confirm').innerHTML)) return; + __success_count = 0; + __fail_count = 0; + + for( var i = 0; i < rows.length; i++ ) { + var row = rows[i]; + var circ_id = row.getAttribute('circid'); + + var circ; + for( var j = 0; j != itemsOutCache.length; j++ ) + if(itemsOutCache[j].circ.id() == circ_id) + circ = itemsOutCache[j].circ; + + __renew_circs.push(circ); + } + + if( __renew_circs.length == 0 ) return; + + //unHideMe($('my_renewing')); + //moClearCheckedTable(); + + for( var i = 0; i < __renew_circs.length; i++ ) { + var circ = __renew_circs[i]; + moRenewCirc( circ.target_copy(), G.user.id(), circ ); + } +} + +var __renew_circs = []; +var __rewnew_errors = []; +var __success_count = 0; +var __fail_count = 0; +function moRenewCirc(copy_id, user_id, circ) { + + _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id); + var req = new Request(RENEW_CIRC, G.user.session, + { patron : user_id, + copyid : copy_id, + opac_renewal : 1 + } + ); + + req.request.alertEvent = false; + req.callback(myHandleRenewResponse); + req.request.circ = circ; + req.send(); +} + +/* handles the circ renew results */ + +function myHandleRenewResponse(r) { + try{ var res = r.getResultObject(); } catch(e){ alert("Renew Error\n\n"+e); __renew_circs = []; __rewnew_errors = []; return; } + var circ = r.circ; + + /* remove this circ from the list of circs to renew */ + if(checkILSEvent(res) || checkILSEvent(res[0])) { + var str1 = truncate(mvrObjCache[circ.target_copy()].title(),65)+'\n'; + if(res.ilsevent) str1 += res.ilsevent+': '+res.desc+'\n'; else for(var i in res) str1 += res[i].ilsevent+': '+res[i].desc+'\n'; + __rewnew_errors[circ.id()] = str1; + } + __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); }); + _debug("handling renew result for " + circ.id()); + + if(checkILSEvent(res) || checkILSEvent(res[0])) __fail_count++; + //alertIdText('myopac_renew_fail', __circ_titles[circ.id()]); + else __success_count++; + + if(__renew_circs) return; /* more to come */ + __renew_circs = []; + + var str = ""; + if(__success_count) str+= __success_count+" items renewed successfully"; + if(__fail_count) str+=__fail_count+" items did not renew."; + str+='\n\n'; + for(var i in __rewnew_errors) str+=__rewnew_errors[i]+'\n'; + + if(__success_count || __fail_count) alert(str); + __rewnew_errors = []; + + //if( __success_count > 0 ) + // alertIdText('myopac_renew_success', __success_count); + + hideMe($('my_renewing')); + checkedDrawn = false; + drawCheckedPage(); + $('check_all_checked').checked = false; +} + + +function moveToNewList(parent, dest) { + if(!parent || !dest) return; + + var items = dojo.query('input[name=list_action_chbx]', parent); + if(!items.length) items = dojo.query('.list_action_chbx', parent); + items.filter(function(item, index, arr){return item.checked;},this); + + if(items.length) { + for(var i=0; iget998dValue(imgFormatCache[b.hold.id()])?-1:1; + }); + break; + case "title": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return a.mvr.title()b.mvr.title()?-1:1; + }); + break; + case "pickup": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return findOrgUnit(a.hold.pickup_lib()).name()findOrgUnit(b.hold.pickup_lib()).name()?-1:1; + }); + break; + case "author": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return a.mvr.author()b.mvr.author()?-1:1; + }); + break; + case "status": + if(sortOrder) { + drawHoldsPage(true); + return; + } else { + holdsCache = holdsCache.sort(function(a, b) { + if(a.status==4) return 1; + if(b.status==4) return -1; + if(isTrue(a.hold.frozen())) return -1; + if(isTrue(b.hold.frozen())) return 1; + return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?-1:1; + }); + } + } + + drawHoldsPage(false); +} + +function sortChecked(by) { + if(!by) return; + + sortOrder = !sortOrder; + switch(by.toLowerCase()) { + case "title": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return a.record.title()b.record.title()?-1:1; + }); + break; + case "author": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return a.record.author()b.record.author()?-1:1; + }); + break; + case "due": + if(sortOrder) { + drawCheckedPage(); return; + } else itemsOutCache = itemsOutCache.sort(function(a, b) { + return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; + }); + break; + case "barcode": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return Number(a.copy.barcode())Number(b.copy.barcode())?-1:1; + }); + break; + case "cn": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return callNumCache[a.copy.call_number()]callNumCache[b.copy.call_number()]?-1:1; + }); + break; + case "renews": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return Number(a.circ.renewal_remaining())Number(b.circ.renewal_remaining())?-1:1; + }); + break; + } + + drawCheckedPage(false); +} + +function sortCheckedHist(by) { + if(!by) return; + + sortOrder = !sortOrder; + switch(by.toLowerCase()) { + case "title": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + if(mvrObjCache[a.circ.target_copy()].title()==null) return 1; + if(mvrObjCache[b.circ.target_copy()].title()==null) return -1; + if(sortOrder) return mvrObjCache[a.circ.target_copy()].title().toLowerCase()mvrObjCache[b.circ.target_copy()].title().toLowerCase()?-1:1; + }); + break; + case "author": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + if(mvrObjCache[a.circ.target_copy()].author()==null) return 1; + if(mvrObjCache[b.circ.target_copy()].author()==null) return -1; + if(sortOrder) return mvrObjCache[a.circ.target_copy()].author().toLowerCase()mvrObjCache[b.circ.target_copy()].author().toLowerCase()?1:-1; + }); + break; + case "duedate": + if(sortOrder) { + drawCheckedPage(); return; + } else itemsOutHistory = itemsOutHistory.sort(function(a, b) { + return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; + }); + break; + case "cn": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + // ya, i know, but it gets the job done. + if(sortOrder) return callNumCache[copyObjCache[a.circ.target_copy()].call_number()].label().toLowerCase()callNumCache[copyObjCache[b.circ.target_copy()].call_number()].label().toLowerCase()?-1:1; + }); + break; + } + + drawCircHistory(false); +} + +function printData(data, numItems, callback) { + + //unHideMe($('receipt-print-frame-wrapper')); + receiptPrintDialog.show(); + + var frame = window["receipt-frame"]; + frame.document.body.innerHTML = data; + + var cancel = $('receipt-view-print-cancel'); + cancel.onclick = function() { + frame.document.body.innerHTML = ''; + // hideMe($('receipt-print-frame-wrapper')); + receiptPrintDialog.hide(); + } + + $('receipt-view-print-button').onclick = function() { + frame.focus(); + frame.print(); + var sleepTime = 1000; + if(numItems > 0) + sleepTime += (numItems / 2) * 1000; + + setTimeout( + function() { + cancel.onclick(); + if(callback) callback(); // fire optional post-print callback + }, + sleepTime + ); + }; +} + + +function printPaymentReceipt(paymentIds, callback) { + progressDialog.show(true); + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.money.payment_receipt.print'], + { + async : true, + params : [G.user.session, paymentIds], + oncomplete : function(r) { + var resp = openils.Util.readResponse(r); + var output = ""; + if(resp) output = resp.template_output(); + progressDialog.hide(); + if(output) { + printData(output.data(), 1, callback); + } else { + var error = resp.error_output(); + if(error) { + throw new Error("Error creating receipt: " + error.data()); + } else { + throw new Error("No receipt data returned from server"); + } + } + } + } + ); +} + +function printFinesReceipt(callback) { + progressDialog.show(true); + + var params = [ + G.user.session, + G.user.ws_ou(), + null, + 'format.selfcheck.fines', + 'print-on-demand', + [G.user.id()] + ]; + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.fire_user_trigger_events'], + { + async : true, + params : params, + oncomplete : function(r) { + progressDialog.hide(); + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + if(output) { + printData(output.data(), 240, callback); + } else { + var error = resp.error_output(); + if(error) { + throw new Error("Error creating receipt: " + error.data()); + } else { + throw new Error("No receipt data returned from server"); + } + } + } + } + ); +} + +function buildOrgSelAlt(selector, org, offset, namecol) { + if(!namecol) namecol = 'name'; + if(!showXUL && !isTrue(org.opac_visible())) return; // for some reason, isXUL() is rather slow when used in a decently sized loop. + insertSelectorVal( selector, -1, + org[namecol](), org.id(), null, findOrgDepth(org) - offset ); + var kids = org.children(); + if (kids) { + for( var c = 0; c < kids.length; c++ ) + buildOrgSelAlt( selector, kids[c], offset, namecol); + } +}