Merge branch 'kcls-grey-screen' of ssh://senator@yeti.esilibrary.com/home/evergreen...
authorsenator <lebbeous@esilibrary.com>
Thu, 3 Mar 2011 16:22:31 +0000 (11:22 -0500)
committersenator <lebbeous@esilibrary.com>
Thu, 3 Mar 2011 16:22:31 +0000 (11:22 -0500)
Conflicts:

Open-ILS/web/opac/skin/kcls/js/myopac.js

1  2 
Open-ILS/web/opac/skin/kcls/js/myopac.js

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