From 5b5804b5f0664dc24d79bc660088a06b112032c2 Mon Sep 17 00:00:00 2001 From: Jason Etheridge Date: Wed, 16 Feb 2011 12:43:52 -0500 Subject: [PATCH] KCLS local oils_web templates/javascript/css from devcatalog --- Open-ILS/examples/oils_web.xml.example | 1 + Open-ILS/web/css/skin/kcls/selfcheck.css | 208 +++ Open-ILS/web/js/ui/kcls/circ/selfcheck/floating.js | 223 +++ Open-ILS/web/js/ui/kcls/circ/selfcheck/payment.js | 120 ++ .../web/js/ui/kcls/circ/selfcheck/selfcheck.js | 1488 ++++++++++++++++++++ Open-ILS/web/local_templates/base.tt2 | 27 + Open-ILS/web/local_templates/base.tt2-aug17.old2 | 26 + Open-ILS/web/local_templates/base.tt2.old | 64 + .../default/actor/user/register_table.tt2.disabled | 116 ++ .../default/actor/user/register_table.tt2.orig | 98 ++ Open-ILS/web/local_templates/default/base.tt2 | 39 + Open-ILS/web/local_templates/default/base.tt2.old | 41 + .../default/circ/selfcheck/audio_config.tt2 | 13 + .../default/circ/selfcheck/banner.tt2 | 10 + .../default/circ/selfcheck/circ_page.tt2 | 30 + .../default/circ/selfcheck/fines.tt2 | 26 + .../circ/selfcheck/graphics/KCLS_logo_horiz.gif | Bin 0 -> 3526 bytes .../default/circ/selfcheck/graphics/arrow.gif | Bin 0 -> 366 bytes .../circ/selfcheck/graphics/barcodedetailbook.jpg | Bin 0 -> 9138 bytes .../default/circ/selfcheck/graphics/go-btn.png | Bin 0 -> 1243 bytes .../default/circ/selfcheck/graphics/gobutton.jpg | Bin 0 -> 695 bytes .../circ/selfcheck/graphics/libcard_barcode.jpg | Bin 0 -> 6861 bytes .../default/circ/selfcheck/graphics/login-btn.png | Bin 0 -> 3266 bytes .../default/circ/selfcheck/graphics/logout.gif | Bin 0 -> 105 bytes .../circ/selfcheck/graphics/logoutbutton.jpg | Bin 0 -> 8299 bytes .../circ/selfcheck/graphics/logoutnoreceipt.gif | Bin 0 -> 400 bytes .../graphics/logoutwithoutreceiptbutton.jpg | Bin 0 -> 5191 bytes .../default/circ/selfcheck/graphics/printlist.jpg | Bin 0 -> 1295 bytes .../default/circ/selfcheck/graphics/tool_font.gif | Bin 0 -> 95 bytes .../default/circ/selfcheck/graphics/tool_mail.gif | Bin 0 -> 147 bytes .../default/circ/selfcheck/graphics/tool_print.gif | Bin 0 -> 178 bytes .../circ/selfcheck/graphics/utils-corner-right.jpg | Bin 0 -> 630 bytes .../circ/selfcheck/graphics/utils-corner.jpg | Bin 0 -> 411 bytes .../default/circ/selfcheck/holds_page.tt2 | 20 + .../default/circ/selfcheck/main.tt2 | 238 ++++ .../default/circ/selfcheck/patron_login.tt2 | 7 + .../default/circ/selfcheck/payment.tt2 | 83 ++ .../default/circ/selfcheck/style.css | 179 +++ .../default/circ/selfcheck/summary.tt2 | 27 + 39 files changed, 3084 insertions(+) create mode 100644 Open-ILS/web/css/skin/kcls/selfcheck.css create mode 100644 Open-ILS/web/js/ui/kcls/circ/selfcheck/floating.js create mode 100644 Open-ILS/web/js/ui/kcls/circ/selfcheck/payment.js create mode 100644 Open-ILS/web/js/ui/kcls/circ/selfcheck/selfcheck.js create mode 100644 Open-ILS/web/local_templates/base.tt2 create mode 100644 Open-ILS/web/local_templates/base.tt2-aug17.old2 create mode 100644 Open-ILS/web/local_templates/base.tt2.old create mode 100644 Open-ILS/web/local_templates/default/actor/user/register_table.tt2.disabled create mode 100644 Open-ILS/web/local_templates/default/actor/user/register_table.tt2.orig create mode 100644 Open-ILS/web/local_templates/default/base.tt2 create mode 100644 Open-ILS/web/local_templates/default/base.tt2.old create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/audio_config.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/banner.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/circ_page.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/fines.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/KCLS_logo_horiz.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/arrow.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/barcodedetailbook.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/go-btn.png create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/gobutton.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/libcard_barcode.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/login-btn.png create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logout.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutbutton.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutnoreceipt.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutwithoutreceiptbutton.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/printlist.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_font.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_mail.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_print.gif create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/utils-corner-right.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/graphics/utils-corner.jpg create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/holds_page.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/main.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/patron_login.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/payment.tt2 create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/style.css create mode 100644 Open-ILS/web/local_templates/default/circ/selfcheck/summary.tt2 diff --git a/Open-ILS/examples/oils_web.xml.example b/Open-ILS/examples/oils_web.xml.example index 60f1573203..5e09bc578c 100644 --- a/Open-ILS/examples/oils_web.xml.example +++ b/Open-ILS/examples/oils_web.xml.example @@ -23,6 +23,7 @@ a path in front of the default template path --> + /openils/var/web/local_templates /openils/var/web/templates diff --git a/Open-ILS/web/css/skin/kcls/selfcheck.css b/Open-ILS/web/css/skin/kcls/selfcheck.css new file mode 100644 index 0000000000..2a5dc794d8 --- /dev/null +++ b/Open-ILS/web/css/skin/kcls/selfcheck.css @@ -0,0 +1,208 @@ +@charset "utf-8"; +/* CSS Document */ + +html, body { + margin:0; + font-family: Arial, Helvetica, sans-serif; + font-size: 18px; + background:#fff; + width:100%; +} + +img { + border: none; +} + +a { + color: #003399; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1 { + margin:0; + margin-bottom: 5px; + font-size: 22px; + font-weight:normal; +} + +h2 { + margin:0; + margin-bottom: 5px; + font-size: 20px; + font-weight:bold; +} + +#header { + color: #bda964; + font-weight:bold; + padding: 12px 0px 9px 17px; + width: 694px; + margin: auto; +} + +#content-wrapper { + background: white; +} + +#main-content { + width: 694px; + margin:auto; + padding-left:17px; +} + +.checkout { + font-size:18px; +} + +.checkout h1 { + font-size:36px; +} + +.checkout h2 { + font-size:24px; +} + +.checkout .sidebar h3 { + font-size: 19px; + margin:0; + padding-left:3px; +} + +.checkout .sidebar a { + font-size:18px; +} + +.checkout .sidebar a span { + font-weight:bold; +} + +.checkout .sidebar p { + margin:4px 0px; + padding:3px; +} + +.checkout .sidebar div, .checkout .sidebar p { + font-size: 18px; + line-height: 1em; +} + +.checkout input[type=text], .checkout input[type=password] { + border: 2px solid black; + width:300px; + height:22px; + padding:2px; + padding-top:1px; + margin:0px; + font-size:18px; +} + +.checkout .sidebar { + background: #b0b0b0; + border-left:2px ridge #eee; + border-right:2px ridge #eee; + border-bottom:2px ridge #eee; + padding:10px 7px; +} + +.checkout .sidebar .top { + float:right; + padding-right:5px; +} + +.checkout .sidebar .greet { + clear:both; + padding:15px 3px; +} + +.checkout .sidebar .selected { + background:#999 +} + +.checkout .header1 { + height:108px; + border-bottom:1px solid #a83135; + padding-top:20px; +} + +.checkout .userid { + width:200px !important; + font-size:18px; + font-weight:bold; + padding:5px 6px 6px 6px !important; + border:2px solid black !important; + background: none !important; + margin:0 !important; +} + +.checkout .item_table { + border-collapse: collapse; +} + +.checkout .item_table td { + font-size:18px; + border:2px solid black; + text-align: left; +} + +.checkout .item_table table td.label { + font-weight:bold; + text-transform: uppercase; + text-align: right; + white-space:nowrap; + padding-right:5px; + width:1px; +} + +.checkout .item_table table td { + border:none; +} + +.checkout #back_button:hover { + text-decoration: none; +} + +.checkout .status_box { + color:red; + font-weight:bold; + height:20px; +} + +.checkout .oils-selfck-status-div { + height:inherit !important; + vertical-align:inherit !important; + font-size: 18px; + font-weight: bold; + color: red; +} + +#oils-base-body-block { + height: auto; +} + +body .dijitAlignClient { + position:inherit; +} + +.dijitLayoutContainer { + position: inherit; +} + +#oils-base-content-block { + height: auto !important; + width: auto !important; + padding:0; +} + +#oils-base-main-block { + height: auto !important; + width: auto !important; +} + +#oils-base-header-block { + width:0px !important; +} + diff --git a/Open-ILS/web/js/ui/kcls/circ/selfcheck/floating.js b/Open-ILS/web/js/ui/kcls/circ/selfcheck/floating.js new file mode 100644 index 0000000000..863cde81e9 --- /dev/null +++ b/Open-ILS/web/js/ui/kcls/circ/selfcheck/floating.js @@ -0,0 +1,223 @@ +/* Script by: www.jtricks.com + * Version: 20071017 + * Latest version: + * www.jtricks.com/javascript/navigation/floating.html + */ +var floatingMenuId = 'floatdiv'; +var floatingMenu = +{ + targetX: -250, + targetY: -75, + + hasInner: typeof(window.innerWidth) == 'number', + hasElement: typeof(document.documentElement) == 'object' + && typeof(document.documentElement.clientWidth) == 'number', + + menu: + document.getElementById + ? document.getElementById(floatingMenuId) + : document.all + ? document.all[floatingMenuId] + : document.layers[floatingMenuId] +}; + +floatingMenu.move = function () +{ + floatingMenu.menu.style.left = floatingMenu.nextX + 'px'; + floatingMenu.menu.style.top = floatingMenu.nextY + 'px'; +} + +floatingMenu.computeShifts = function () +{ + var de = document.documentElement; + + floatingMenu.shiftX = + floatingMenu.hasInner + ? pageXOffset + : floatingMenu.hasElement + ? de.scrollLeft + : document.body.scrollLeft; + if (floatingMenu.targetX < 0) + { + floatingMenu.shiftX += + floatingMenu.hasElement + ? de.clientWidth + : document.body.clientWidth; + } + + floatingMenu.shiftY = + floatingMenu.hasInner + ? pageYOffset + : floatingMenu.hasElement + ? de.scrollTop + : document.body.scrollTop; +floatingMenu.shiftY = ( floatingMenu.shiftY < 76 ) ? 76 : +floatingMenu.shiftY; + if (floatingMenu.targetY < -75) + { + if (floatingMenu.hasElement && floatingMenu.hasInner) + { + // Handle Opera 8 problems + floatingMenu.shiftY += + de.clientHeight > window.innerHeight + ? window.innerHeight + : de.clientHeight + } + else + { + floatingMenu.shiftY += + floatingMenu.hasElement + ? de.clientHeight + : document.body.clientHeight; + } + } +} + +floatingMenu.calculateCornerX = function() +{ + return 0; + if (floatingMenu.targetX != 'center') + return floatingMenu.shiftX + floatingMenu.targetX; + + var width = parseInt(floatingMenu.menu.offsetWidth); + + var cornerX = + floatingMenu.hasElement + ? (floatingMenu.hasInner + ? pageXOffset + : document.documentElement.scrollLeft) + + (document.documentElement.clientWidth - width)/2 + : document.body.scrollLeft + + (document.body.clientWidth - width)/2; + return cornerX; +}; + +floatingMenu.calculateCornerY = function() +{ + if (floatingMenu.targetY != 'center') + return floatingMenu.shiftY + floatingMenu.targetY; + + var height = parseInt(floatingMenu.menu.offsetHeight); + + // Handle Opera 8 problems + var clientHeight = + floatingMenu.hasElement && floatingMenu.hasInner + && document.documentElement.clientHeight + > window.innerHeight + ? window.innerHeight + : document.documentElement.clientHeight + + var cornerY = + floatingMenu.hasElement + ? (floatingMenu.hasInner + ? pageYOffset + : document.documentElement.scrollTop) + + (clientHeight - height)/2 + : document.body.scrollTop + + (document.body.clientHeight - height)/2; + return cornerY; +}; + +floatingMenu.doFloat = function() +{ + // Check if reference to menu was lost due + // to ajax manipuations + if (!floatingMenu.menu) + { + menu = document.getElementById + ? document.getElementById(floatingMenuId) + : document.all + ? document.all[floatingMenuId] + : document.layers[floatingMenuId]; + + initSecondary(); + } + + var stepX, stepY; + + floatingMenu.computeShifts(); + + var cornerX = floatingMenu.calculateCornerX(); + + var stepX = (cornerX - floatingMenu.nextX) * .07; + if (Math.abs(stepX) < .5) + { + stepX = cornerX - floatingMenu.nextX; + } + + var cornerY = floatingMenu.calculateCornerY(); + + var stepY = (cornerY - floatingMenu.nextY) * .07; + if (Math.abs(stepY) < .5) + { + stepY = cornerY - floatingMenu.nextY; + } + + if (Math.abs(stepX) > 0 || + Math.abs(stepY) > 0) + { + floatingMenu.nextX += stepX; + floatingMenu.nextY += stepY; + floatingMenu.move(); + } + + setTimeout('floatingMenu.doFloat()', 20); +}; + +// addEvent designed by Aaron Moore +floatingMenu.addEvent = function(element, listener, handler) +{ + if(typeof element[listener] != 'function' || + typeof element[listener + '_num'] == 'undefined') + { + element[listener + '_num'] = 0; + if (typeof element[listener] == 'function') + { + element[listener + 0] = element[listener]; + element[listener + '_num']++; + } + element[listener] = function(e) + { + var r = true; + e = (e) ? e : window.event; + for(var i = element[listener + '_num'] -1; i >= 0; i--) + { + if(element[listener + i](e) == false) + r = false; + } + return r; + } + } + + //if handler is not already stored, assign it + for(var i = 0; i < element[listener + '_num']; i++) + if(element[listener + i] == handler) + return; + element[listener + element[listener + '_num']] = handler; + element[listener + '_num']++; +}; + +floatingMenu.init = function() +{ + floatingMenu.initSecondary(); + floatingMenu.doFloat(); +}; + +// Some browsers init scrollbars only after +// full document load. +floatingMenu.initSecondary = function() +{ + floatingMenu.computeShifts(); + floatingMenu.nextX = floatingMenu.calculateCornerX(); + floatingMenu.nextY = floatingMenu.calculateCornerY(); + floatingMenu.move(); +} + +if (document.layers) + floatingMenu.addEvent(window, 'onload', floatingMenu.init); +else +{ + floatingMenu.init(); + floatingMenu.addEvent(window, 'onload', + floatingMenu.initSecondary); +} \ No newline at end of file diff --git a/Open-ILS/web/js/ui/kcls/circ/selfcheck/payment.js b/Open-ILS/web/js/ui/kcls/circ/selfcheck/payment.js new file mode 100644 index 0000000000..a08d0aedb5 --- /dev/null +++ b/Open-ILS/web/js/ui/kcls/circ/selfcheck/payment.js @@ -0,0 +1,120 @@ +function PaymentForm() {} +var proto = (typeof(SelfCheckManager) == "undefined" ? + PaymentForm : SelfCheckManager).prototype; + +proto.drawPayFinesPage = function(patron, total, xacts, onPaymentSubmit) { + if (typeof(this.authtoken) == "undefined") + this.authtoken = patron.session; + + dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML = total; + + var d = new Date().getFullYear(); + oilsSelfckCCNumber.attr('value', ''); + oilsSelfckCCCVV.attr('value', ''); + oilsSelfckCCMonth.attr('value', '01'); + oilsSelfckCCYear.attr('value', d); + oilsSelfckCCFName.attr('value', patron.first_given_name()); + oilsSelfckCCLName.attr('value', patron.family_name()); + oilsSelfckCCYear.constraints.min=d; + oilsSelfckCCYear.constraints.max=d+10; + + 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( + ["open-ils.actor", "open-ils.actor.user.fleshed.retrieve"], { + "params": [ + patron.session, patron.id(), [ + "billing_address", "mailing_address" + ] + ], + "async": false, + "oncomplete": function(r) { + var usr = openils.Util.readResponse(r); + if (usr) + addr = usr.billing_address() || usr.mailing_address(); + } + } + ); + } + + if (addr) { + oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); + oilsSelfckCCCity.attr('value', addr.city()); + oilsSelfckCCState.attr('value', addr.state()); + oilsSelfckCCZip.attr('value', addr.post_code()); + } + + dojo.connect(oilsSelfckEditDetails, 'onChange', + function(newVal) { + dojo.forEach( + [ oilsSelfckCCFName, + oilsSelfckCCLName, + oilsSelfckCCStreet, + oilsSelfckCCCity, + oilsSelfckCCState, + oilsSelfckCCZip + ], + function(dij) { dij.attr('disabled', !newVal); } + ); + } + ); + + + var self = this; + dojo.connect(oilsSelfckCCSubmit, 'onClick', + function() { + /* XXX better to replace this check on progressDialog with some + * kind of passed-in function to support different use cases */ + if (typeof(progressDialog) != "undefined") + progressDialog.show(true); + + self.sendCCPayment(patron, xacts, onPaymentSubmit); + } + ); +} + +// In this form, this code only supports global on/off credit card +// payments and does not dissallow payments to transactions that started +// at remote locations or transactions that have accumulated billings at +// remote locations that dissalow credit card payments. +// TODO add per-transaction blocks for orgs that do not support CC payments + +proto.sendCCPayment = function(patron, xacts, onPaymentSubmit) { + this.keepMeLoggedIn(); + 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( + ['open-ils.circ', 'open-ils.circ.money.payment'], + {params : [this.authtoken, 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); + } +} diff --git a/Open-ILS/web/js/ui/kcls/circ/selfcheck/selfcheck.js b/Open-ILS/web/js/ui/kcls/circ/selfcheck/selfcheck.js new file mode 100644 index 0000000000..0859ec14b1 --- /dev/null +++ b/Open-ILS/web/js/ui/kcls/circ/selfcheck/selfcheck.js @@ -0,0 +1,1488 @@ +dojo.require('dojo.date.locale'); +dojo.require('dojo.date.stamp'); +dojo.require('dijit.form.CheckBox'); +dojo.require('dijit.form.NumberSpinner'); +dojo.require('openils.CGI'); +dojo.require('openils.Util'); +dojo.require('openils.User'); +dojo.require('openils.Event'); +dojo.require('openils.widget.ProgressDialog'); +dojo.require('openils.widget.OrgUnitFilteringSelect'); + +dojo.requireLocalization('openils.circ', 'selfcheck'); +var localeStrings = dojo.i18n.getLocalization('openils.circ', 'selfcheck'); +var selfCheckMgr; +var itemsOutCirc = []; +var itemsOutMod = []; +var itemsOutCopy = []; +var TIMEOUT = 45; // logout timer + + +const SET_BARCODE_REGEX = 'opac.barcode_regex'; +const SET_PATRON_TIMEOUT = 'circ.selfcheck.patron_login_timeout'; +const SET_AUTO_OVERRIDE_EVENTS = 'circ.selfcheck.auto_override_checkout_events'; +const SET_PATRON_PASSWORD_REQUIRED = 'circ.selfcheck.patron_password_required'; +const SET_AUTO_RENEW_INTERVAL = 'circ.checkout_auto_renew_age'; +const SET_WORKSTATION_REQUIRED = 'circ.selfcheck.workstation_required'; +const SET_ALERT_POPUP = 'circ.selfcheck.alert.popup'; +const SET_ALERT_SOUND = 'circ.selfcheck.alert.sound'; +const SET_CC_PAYMENT_ALLOWED = 'credit.payments.allow'; +// This setting only comes into play if COPY_NOT_AVAILABLE is in the SET_AUTO_OVERRIDE_EVENTS list +const SET_BLOCK_CHECKOUT_ON_COPY_STATUS = 'circ.selfcheck.block_checkout_on_copy_status'; + +function SelfCheckManager() { + selfCheckMgr = this; + switchTo('step1'); + + this.timer = null; + this.cgi = new openils.CGI(); + this.staff = null; + this.workstation = null; + this.authtoken = null; + + this.patron = null; + this.patronBarcodeRegex = null; + + this.checkouts = []; + this.itemsOut = []; + + // During renewals, keep track of the ID of the previous circulation. + // Previous circ is used for tracking failed renewals (for receipts). + this.prevCirc = null; + + // current item barcode + this.itemBarcode = null; + + // are we currently performing a renewal? + this.isRenewal = false; + + // dict of org unit settings for "here" + this.orgSettings = {}; + + // Construct a mock checkout for debugging purposes + if(this.mockCheckouts = this.cgi.param('mock-circ')) { + + this.mockCheckout = { + payload : { + record : new fieldmapper.mvr(), + copy : new fieldmapper.acp(), + circ : new fieldmapper.circ() + } + }; + + this.mockCheckout.payload.record.title('Jazz improvisation for guitar'); + this.mockCheckout.payload.record.author('Wise, Les'); + this.mockCheckout.payload.record.isbn('0634033565'); + this.mockCheckout.payload.copy.barcode('123456789'); + this.mockCheckout.payload.circ.renewal_remaining(1); + this.mockCheckout.payload.circ.parent_circ(1); + this.mockCheckout.payload.circ.due_date('2012-12-21'); + } + + this.initPrinter(); +} + +SelfCheckManager.prototype.keepMeLoggedIn = function() { + //alert(this.timer); + if(this.timer) try {clearTimeout(this.timer)} catch(e){} + this.timer = setTimeout('selfCheckMgr.logoutPatron();', TIMEOUT*1000); +} + +/** + * Fetch the org-unit settings, initialize the display, etc. + */ +SelfCheckManager.prototype.init = function() { + this.staff = openils.User.user; + this.workstation = openils.User.workstation; + this.authtoken = openils.User.authtoken; + this.loadOrgSettings(); + + this.circTbody = dojo.byId('oils-selfck-circ-tbody'); + this.itemsOutTbody = dojo.byId('oils-selfck-circ-out-tbody'); + + // workstation is required but none provided + if(this.orgSettings[SET_WORKSTATION_REQUIRED] && !this.workstation) { + if(confirm(dojo.string.substitute(localeStrings.WORKSTATION_REQUIRED))) { + this.registerWorkstation(); + } + return; + } + + var self = this; + // connect onclick handlers to the various navigation links + var linkHandlers = { + 'oils-selfck-hold-details-link' : function() { self.drawHoldsPage(true); }, + 'oils-selfck-view-fines-link' : function() { self.drawFinesPage(); openils.Util.show('oils-selfck-fines-tbody'); openils.Util.hide('pay_fines'); }, + 'oils-selfck-pay-fines-link' : function() { + switchTo('step3','step3c'); + openils.Util.hide('oils-selfck-fines-tbody'); + openils.Util.show('pay_fines'); + self.keepMeLoggedIn(); + self.drawPayFinesPage( + self.patron, + self.getSelectedFinesTotal(), + self.getSelectedFineTransactions(), + function(resp) { + var evt = openils.Event.parse(resp); + if(evt) { + var message = evt + ''; + if(evt.textcode == 'CREDIT_PROCESSOR_DECLINED_TRANSACTION' && evt.payload) + message += '\n' + evt.payload.error_message; + self.handleAlert(message, true, 'payment-failure'); + return; + } + self.patron.last_xact_id(resp.last_xact_id); + self.printPaymentReceipt( + resp, + function() { + self.updateFinesSummary(); + self.drawFinesPage(); + } + ); + } + ); + }, + //'oils-selfck-nav-home' : function() { self.drawCircPage(); }, + 'oils-selfck-nav-logout' : function() { self.logoutPatron(); }, + 'oils-selfck-nav-logout-print' : function() { self.logoutPatron(true); }, + 'oils-selfck-items-out-details-link' : function() { self.drawItemsOutPage(); }, + //'oils-selfck-print-list-link' : function() { self.printList(); } + } + + for(var id in linkHandlers) { + //var obj1 = dojo.byId(id); + //obj1.onclick = linkHandlers[id]; + dojo.connect(dojo.byId(id), 'onclick', linkHandlers[id]); + } + + + if(this.cgi.param('patron')) { + + // Patron barcode via cgi param. Mainly used for debugging and + // only works if password is not required by policy + this.loginPatron(this.cgi.param('patron')); + + } else { + this.drawLoginPage(); + } + + /** + * To test printing, pass a URL param of 'testprint'. The value for the param + * should be a JSON string like so: [{circ:}, ...] + */ + var testPrint = this.cgi.param('testprint'); + if(testPrint) { + this.checkouts = JSON2js(testPrint); + this.printSessionReceipt(); + this.checkouts = []; + } +} + + +SelfCheckManager.prototype.getSelectedFinesTotal = function() { + var total = 0; + dojo.forEach( + dojo.query("[name=selector]", this.finesTbody), + function(input) { + if(input.checked) + total += Number(input.balance_owed); + } + ); + return total.toFixed(2); +}; + +SelfCheckManager.prototype.getSelectedFineTransactions = function() { + return dojo.query("[name=selector]", this.finesTbody). + filter(function (o) { return o.checked }). + map( + function (o) { + return [ + o.getAttribute("xact"), + Number(o.balance_owed).toFixed(2) + ]; + } + ); +}; + +/** + * Registers a new workstion + */ +SelfCheckManager.prototype.registerWorkstation = function() { + + oilsSelfckWsDialog.show(); + + new openils.User().buildPermOrgSelector( + 'REGISTER_WORKSTATION', + oilsSelfckWsLocSelector, + this.staff.home_ou() + ); + + + var self = this; + dojo.connect(oilsSelfckWsSubmit, 'onClick', + + function() { + oilsSelfckWsDialog.hide(); + var name = oilsSelfckWsLocSelector.attr('displayedValue') + '-' + oilsSelfckWsName.attr('value'); + + var res = fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.workstation.register'], + { params : [ + self.authtoken, name, oilsSelfckWsLocSelector.attr('value') + ] + } + ); + + if(evt = openils.Event.parse(res)) { + if(evt.textcode == 'WORKSTATION_NAME_EXISTS') { + if(confirm(localeStrings.WORKSTATION_EXISTS)) { + location.href = location.href.replace(/\?.*/, '') + '?ws=' + name; + } else { + self.registerWorkstation(); + } + return; + } else { + alert(evt); + } + } else { + location.href = location.href.replace(/\?.*/, '') + '?ws=' + name; + } + } + ); +} + +/** + * Loads the org unit settings + */ +SelfCheckManager.prototype.loadOrgSettings = function() { + + var settings = fieldmapper.aou.fetchOrgSettingBatch( + this.staff.ws_ou(), [ + SET_BARCODE_REGEX, + SET_PATRON_TIMEOUT, + SET_ALERT_POPUP, + SET_ALERT_SOUND, + SET_AUTO_OVERRIDE_EVENTS, + SET_BLOCK_CHECKOUT_ON_COPY_STATUS, + SET_PATRON_PASSWORD_REQUIRED, + SET_AUTO_RENEW_INTERVAL, + SET_WORKSTATION_REQUIRED, + SET_CC_PAYMENT_ALLOWED + ] + ); + + for(k in settings) { + if(settings[k]) + this.orgSettings[k] = settings[k].value; + } + + if(settings[SET_BARCODE_REGEX]) + this.patronBarcodeRegex = new RegExp(settings[SET_BARCODE_REGEX].value); +} + +SelfCheckManager.prototype.drawLoginPage = function() { + var self = this; + var bcHandler = function(barcode) { + // handle patron barcode entry + + if(self.orgSettings[SET_PATRON_PASSWORD_REQUIRED]) { + + // password is required. wire up the scan box to read it + self.updateScanBox({ + msg : 'Please enter your password', // TODO i18n + handler : function(pw) { self.loginPatron(barcode, pw); }, + password : true + }); + + } else { + // password is not required, go ahead and login + self.loginPatron(barcode); + } + }; + + this.updateScanBox({ + msg : 'Please log in with your library barcode.', // TODO + handler : bcHandler + }); + + var txtBox = (dojo.byId('step2').style.display=='none') ? 'patron-login-username' : 'patron-login-password'; + try{var a=dojo.byId(txtBox);a.focus();a.select();}catch(e){} +} + +/** + * Login the patron. + */ +SelfCheckManager.prototype.loginPatron = function(barcode, passwd) { + + //if(this.orgSettings[SET_PATRON_PASSWORD_REQUIRED]) { // password always reqired, per KCLS - fail safe + if(!passwd) { + // would only happen in dev/debug mode when using the patron= param + alert('password required by org setting. remove patron= from URL'); + return; + } + + // patron password is required. Verify it. + + var res = fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.verify_user_password'], + {params : [this.authtoken, barcode, null, hex_md5(passwd)]} + ); + + if(res == 0) { + // user-not-found results in login failure + this.handleAlert( + dojo.string.substitute(localeStrings.LOGIN_FAILED, [barcode]), + false, 'login-failure' + ); + this.drawLoginPage(); + openils.Util.show('back_to_login'); + return; + } + //} + + // retrieve the fleshed user by barcode + this.patron = fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode'], + {params : [this.authtoken, barcode]} + ); + + var evt = openils.Event.parse(this.patron); + if(evt) { + this.handleAlert( + dojo.string.substitute(localeStrings.LOGIN_FAILED, [barcode]), + false, 'login-failure' + ); + this.drawLoginPage(); + openils.Util.show('back_to_login'); + + } else { + + //this.handleAlert('', true, 'login-success'); + dojo.byId('user_name').innerHTML = + dojo.string.substitute(localeStrings.WELCOME_BANNER, [this.patron.first_given_name()]); + dojo.byId('oils-selfck-status-div').innerHTML = ''; + dojo.byId('oils-selfck-status-div2').innerHTML = ''; + dojo.byId('oils-selfck-status-div3').innerHTML = ''; + openils.Util.hide('back_to_login'); + this.drawCircPage(); + } +} + + +SelfCheckManager.prototype.handleAlert = function(message, shouldPopup, sound) { + console.log("Handling alert " + message); + + dojo.byId('oils-selfck-status-div').innerHTML = message; + if(!this.patron){ + dojo.byId('oils-selfck-status-div2').innerHTML = message; + dojo.byId('oils-selfck-status-div3').innerHTML = message; + } + + if(shouldPopup && this.orgSettings[SET_ALERT_POPUP]) + alert(message); + + if(this.orgSettings[SET_ALERT_SOUND]) + openils.Util.playAudioUrl(SelfCheckManager.audioConfig[sound]); +} + + +/** + * Manages the main input box + * @param msg The context message to display with the box + * @param clearOnly Don't update the context message, just clear the value and re-focus + * @param handler Optional "on-enter" handler. + */ +SelfCheckManager.prototype.updateScanBox = function(args) { + args = args || {}; + + if(args.select) { + selfckScanBox.domNode.select(); + } else { + selfckScanBox.attr('value', ''); + } + + if(args.password) { + selfckScanBox.domNode.setAttribute('type', 'password'); + } else { + selfckScanBox.domNode.setAttribute('type', ''); + } + + if(args.value) + selfckScanBox.attr('value', args.value); + + if(args.msg) + dojo.byId('oils-selfck-scan-text').innerHTML = args.msg; + + if(selfckScanBox._lastHandler && (args.handler || args.clearHandler)) { + dojo.disconnect(selfckScanBox._lastHandler); + } + + if(args.handler) { + + selfckScanBox._lastHandler = dojo.connect( + selfckScanBox, + 'onKeyDown', + function(e) { + if(e.keyCode != dojo.keys.ENTER) + return; + args.handler(selfckScanBox.attr('value')); + } + ); + } + + selfckScanBox.focus(); +} + +/** + * Sets up the checkout/renewal interface + */ +SelfCheckManager.prototype.drawCircPage = function() { + this.keepMeLoggedIn(); + openils.Util.show('oils-selfck-circ-tbody', 'table-row-group'); + switchTo('step3'); + + var self = this; + this.updateScanBox({ + msg : 'Please enter an item barcode', // TODO i18n + handler : function(barcode) { + openils.Util.show('oils-selfck-fines-tbody'); + openils.Util.hide('pay_fines'); switchTo('step3'); + self.checkout(barcode); } + }); + + if(!this.circTemplate) + this.circTemplate = this.circTbody.removeChild(dojo.byId('oils-selfck-circ-row')); + + // fines summary + this.updateFinesSummary(); + + // holds summary + this.updateHoldsSummary(); + + // items out summary + this.updateCircSummary(); + + // render mock checkouts for debugging? + if(this.mockCheckouts) { + for(var i in [1,2,3]) + this.displayCheckout(this.mockCheckout, 'checkout'); + } +} + + +SelfCheckManager.prototype.updateFinesSummary = function() { + var self = this; + + // fines summary + fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.user.fines.summary'], + { async : true, + params : [this.authtoken, this.patron.id()], + oncomplete : function(r) { + var summary = openils.Util.readResponse(r); + var finesSum = dojo.byId('acct_fines'); + var bal = summary.balance_owed(); + var bal2 = parseFloat(bal); + + if(bal2>0) {finesSum.style.color="red"; openils.Util.show('oils-selfck-pay-fines-link');} + finesSum.innerHTML = dojo.string.substitute(localeStrings.TOTAL_FINES_ACCOUNT, [bal2.toFixed(2)]); + self.creditPayableBalance = bal2+''; + } + } + ); +} + + +SelfCheckManager.prototype.drawItemsOutPage = function() { + this.keepMeLoggedIn(); + switchTo('step3','step3d'); + + if(!this.outTemplate) + this.outTemplate = this.itemsOutTbody.removeChild(dojo.byId('oils-selfck-circ-out-row')); + while(this.itemsOutTbody.childNodes[0]) + this.itemsOutTbody.removeChild(this.itemsOutTbody.childNodes[0]); + + progressDialog.show(true); + var self = this; + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.actor.user.checked_out.atomic'], + { + async : true, + params : [this.authtoken, this.patron.id()], + oncomplete : function(r) { + var resp = openils.Util.readResponse(r); + + var circs = resp.sort( + function(a, b) { + if(a.circ.due_date() > b.circ.due_date()) + return -1; + return 1; + } + ); + + self.itemsOut = []; + dojo.forEach(circs, + function(circ) { + self.itemsOut.push(circ.circ.id()); + handleCheckedItems(circ); + } + ); + progressDialog.hide(); + } + } + ); +} + +function handleCheckedItems(circ) { + var self = selfCheckMgr; + var row = self.outTemplate.cloneNode(true); + + self.byName(row,'barcode').innerHTML = circ.copy.barcode(); + self.byName(row,'title').innerHTML = circ.record.title(); + self.byName(row,'author').innerHTML = circ.record.author(); + if(dojo.date.stamp.fromISOString(circ.circ.due_date())<(new Date())) self.byName(row,'due_date').style.color="red"; + self.byName(row,'due_date').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(circ.circ.due_date()), {selector: 'date', fullYear: true}); + self.byName(row,'format').innerHTML = circ.record.types_of_resource()[0]; + + self.itemsOutTbody.appendChild(row); +} + +SelfCheckManager.prototype.goToTab = function(name) { + this.tabName = name; + + openils.Util.hide('oils-selfck-fines-page'); + openils.Util.hide('oils-selfck-payment-page'); + openils.Util.hide('oils-selfck-holds-page'); + openils.Util.hide('oils-selfck-circ-page'); + openils.Util.hide('oils-selfck-pay-fines-link'); + + switch(name) { + case 'checkout': + openils.Util.show('oils-selfck-circ-page'); + break; + case 'items_out': + openils.Util.show('oils-selfck-circ-page'); + break; + case 'holds': + openils.Util.show('oils-selfck-holds-page'); + break; + case 'fines': + openils.Util.show('oils-selfck-fines-page'); + break; + case 'payment': + openils.Util.show('oils-selfck-payment-page'); + break; + } +} + + +SelfCheckManager.prototype.printList = function(which) { + this.keepMeLoggedIn(); + switch(which) { + case 'checkout': + this.printSessionReceipt(); + break; + case 'items_out': + this.printItemsOutReceipt(); + break; + case 'holds': + this.printHoldsReceipt(); + break; + case 'fines': + this.printFinesReceipt(); + break; + } +} + +SelfCheckManager.prototype.updateHoldsSummary = function() { + if(!this.holdsSummary) { + var summary = fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.holds.user_summary'], + {params : [this.authtoken, this.patron.id()]} + ); + + this.holdsSummary = {}; + this.holdsSummary.ready = Number(summary['4']); + this.holdsSummary.total = 0; + + for(var i in summary) + this.holdsSummary.total += Number(summary[i]); + } + + dojo.byId('oils-selfck-holds-total').innerHTML =dojo.string.substitute("${0}) Item"+(this.holdsSummary.total==1?"":"s"),[this.holdsSummary.total]); + dojo.byId('oils-selfck-holds-ready').innerHTML =dojo.string.substitute("${0}) Item"+(this.holdsSummary.ready==1?"":"s"),[this.holdsSummary.ready]); +} + + +SelfCheckManager.prototype.updateCircSummary = function(increment) { + if(!this.circSummary) { + + var summary = fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.user.checked_out.count'], + {params : [this.authtoken, this.patron.id()]} + ); + + this.circSummary = { + total : Number(summary.out) + Number(summary.overdue), + overdue : Number(summary.overdue), + session : 0 + }; + } + + if(increment) { + // local checkout occurred. Add to the total and the session. + this.circSummary.total += 1; + this.circSummary.session += 1; + } + + dojo.byId('oils-selfck-circ-account-total').innerHTML = dojo.string.substitute("${0}) Item"+(this.circSummary.total==1?"":"s"), [this.circSummary.total]); + + /* + dojo.byId('oils-selfck-circ-session-total').innerHTML = + dojo.string.substitute( + localeStrings.TOTAL_ITEMS_SESSION, + [this.circSummary.session] + ); + */ +} + + +SelfCheckManager.prototype.drawHoldsPage = function(bool) { + this.keepMeLoggedIn(); + if(bool) switchTo('step3','step3f'); else switchTo('step3','step3e'); + + this.holdTbody = dojo.byId('oils-selfck-hold-tbody'); + this.readyTbody = dojo.byId('oils-selfck-rdy-tbody'); + if(!this.readyTemplate) + this.readyTemplate = this.readyTbody.removeChild(dojo.byId('oils-selfck-rdy-row')); + if(!this.holdTemplate) + this.holdTemplate = this.holdTbody.removeChild(dojo.byId('oils-selfck-hold-row')); + while(this.holdTbody.childNodes[0]) + this.holdTbody.removeChild(this.holdTbody.childNodes[0]); + while(this.readyTbody.childNodes[0]) + this.readyTbody.removeChild(this.readyTbody.childNodes[0]); + + progressDialog.show(true); + + var self = this; + fieldmapper.standardRequest( // fetch the hold IDs + + ['open-ils.circ', 'open-ils.circ.holds.id_list.retrieve'], + { async : true, + params : [this.authtoken, this.patron.id()], + + oncomplete : function(r) { + var ids = openils.Util.readResponse(r); + if(!ids || ids.length == 0) { + progressDialog.hide(); + return; + } + + fieldmapper.standardRequest( // fetch the hold objects with fleshed details + ['open-ils.circ', 'open-ils.circ.hold.details.batch.retrieve'], + { async : true, + params : [self.authtoken, ids], + + onresponse : function(rr) { + progressDialog.hide(); + self.drawHolds(openils.Util.readResponse(rr)); + } + } + ); + } + } + ); +} + +/** + * Fetch and add a single hold to the list of holds + */ +SelfCheckManager.prototype.drawHolds = function(holds) { + //this.keepMeLoggedIn(); + this.holds = holds; + progressDialog.hide(); + + var data = holds; + if(!data) return; + var row = this.holdTemplate.cloneNode(true); + var row2 = this.readyTemplate.cloneNode(true); + + //if(data.mvr.isbn()) { + // this.byName(row, 'jacket').setAttribute('src', '/opac/extras/ac/jacket/small/' + data.mvr.isbn()); + //} + + if(data.status == 4) { + this.byName(row2, 'title').innerHTML = data.mvr.title(); + this.byName(row2, 'format').innerHTML = data.mvr.types_of_resource()[0]; + this.byName(row2, 'lib').innerHTML = fieldmapper.aou.findOrgUnit(data.hold.pickup_lib()).name(); + if(dojo.date.stamp.fromISOString(data.hold.capture_time())<(new Date())) this.byName(row2, 'date').style.color="red"; + this.byName(row2, 'date').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(data.hold.capture_time()), {selector: 'date', fullYear: true}); + this.readyTbody.appendChild(row2); + } else { + + this.byName(row, 'title').innerHTML = data.mvr.title(); + this.byName(row, 'author').innerHTML = data.mvr.author(); + this.byName(row, 'format').innerHTML = data.mvr.types_of_resource()[0]; + + // hold is still pending + this.byName(row, 'status').innerHTML = dojo.string.substitute(localeStrings.HOLD_STATUS_WAITING,[data.queue_position, data.potential_copies]); + this.holdTbody.appendChild(row); + } +} + + +SelfCheckManager.prototype.drawFinesPage = function() { + this.keepMeLoggedIn(); + // TODO add option to hid scanBox + // this.updateScanBox(...) + + //this.goToTab('fines'); + switchTo('step3','step3c'); + progressDialog.show(true); + + //if(this.creditPayableBalance > 0 && this.orgSettings[SET_CC_PAYMENT_ALLOWED]) + // openils.Util.show('oils-selfck-pay-fines-link', 'inline'); + + + this.finesTbody = dojo.byId('oils-selfck-fines-tbody'); + if(!this.finesTemplate) + this.finesTemplate = this.finesTbody.removeChild(dojo.byId('oils-selfck-fines-row')); + while(this.finesTbody.childNodes[0]) + this.finesTbody.removeChild(this.finesTbody.childNodes[0]); + +/* + // when user clicks on a selector checkbox, update the total owed + var updateSelected = function() { + var total = 0; + dojo.forEach( + dojo.query('[name=selector]', this.finesTbody), + function(input) { + if(input.checked) + total += Number(input.getAttribute('balance_owed')); + } + ); + + total = total.toFixed(2); + dojo.byId('oils-selfck-selected-total').innerHTML = + dojo.string.substitute(localeStrings.TOTAL_FINES_SELECTED, [total]); + } + + // wire up the batch on/off selector + var sel = dojo.byId('oils-selfck-fines-selector'); + sel.onchange = function() { + dojo.forEach( + dojo.query('[name=selector]', this.finesTbody), + function(input) { + input.checked = sel.checked; + } + ); + }; +*/ + var self = this; + var handler = function(dataList) { + + self.finesCount = dataList.length; + self.finesData = dataList; + + for(var i in dataList) { + + var data = dataList[i]; + var row = self.finesTemplate.cloneNode(true); + var type = data.transaction.xact_type(); + + if(type == 'circulation') { + self.byName(row, 'title').innerHTML = data.record.title(); + if(dojo.date.stamp.fromISOString(data.circ.due_date())<(new Date())) self.byName(row, 'due_date').style.color="red"; + self.byName(row, 'due_date').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(data.circ.due_date()), {selector: 'date', fullYear: true}); + self.byName(row, 'date_return').innerHTML = (data.circ.checkin_time())?dojo.date.locale.format(dojo.date.stamp.fromISOString(data.circ.checkin_time()), {selector: 'date', fullYear: true}):""; + + } else if(type == 'grocery') { + self.byName(row, 'title').innerHTML = (data.transaction.last_billing_type())?("Miscellaneous - "+data.transaction.last_billing_type()):"Miscellaneous"; // Go ahead and head off any confusion around "grocery". TODO i18n + } + + //self.byName(row, 'total_owed').innerHTML = data.transaction.total_owed(); + //self.byName(row, 'total_paid').innerHTML = data.transaction.total_paid(); + self.byName(row, 'balance').innerHTML = data.transaction.balance_owed(); + self.byName(row, 'selector').balance_owed = data.transaction.balance_owed(); + self.byName(row, 'selector').setAttribute('xact', data.transaction.id()); +/* + // row selector + var selector = self.byName(row, 'selector') + selector.onchange = updateSelected; + selector.setAttribute('xact', data.transaction.id()); + selector.setAttribute('balance_owed', data.transaction.balance_owed()); + selector.checked = true; +*/ + self.finesTbody.appendChild(row); + } + + //updateSelected(); + } + + + fieldmapper.standardRequest( + ['open-ils.actor', 'open-ils.actor.user.transactions.have_balance.fleshed'], + { async : true, + params : [this.authtoken, this.patron.id()], + oncomplete : function(r) { + progressDialog.hide(); + handler(openils.Util.readResponse(r)); + } + } + ); +} + +SelfCheckManager.prototype.checkin = function(barcode, abortTransit) { + var resp = fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.transit.abort'], + {params : [this.authtoken, {barcode : barcode}]} + ); + + // resp == 1 on success + if(openils.Event.parse(resp)) + return false; + + var resp = fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.checkin.override'], + {params : [ + this.authtoken, { + patron_id : this.patron.id(), + copy_barcode : barcode, + noop : true + } + ]} + ); + + if(!resp.length) resp = [resp]; + for(var i = 0; i < resp.length; i++) { + var tc = openils.Event.parse(resp[i]).textcode; + if(tc == 'SUCCESS' || tc == 'NO_CHANGE') { + continue; + } else { + return false; + } + } + + return true; +} + +/** + * Check out a single item. If the item is already checked + * out to the patron, redirect to renew() + */ +SelfCheckManager.prototype.checkout = function(barcode, override) { + this.keepMeLoggedIn(); + this.prevCirc = null; + + if(!barcode) { + this.updateScanbox(null, true); + return; + } + + if(this.mockCheckouts) { + // if we're in mock-checkout mode, just insert another + // fake circ into the table and get out of here. + this.displayCheckout(this.mockCheckout, 'checkout'); + return; + } + + // TODO see if it's a patron barcode + // TODO see if this item has already been checked out in this session + + var method = 'open-ils.circ.checkout.full'; + if(override) method += '.override'; + + console.log("Checkout out item " + barcode + " with method " + method); + + var result = fieldmapper.standardRequest( + ['open-ils.circ', method], + {params: [ + this.authtoken, { + patron_id : this.patron.id(), + copy_barcode : barcode + } + ]} + ); + + var stat = this.handleXactResult('checkout', barcode, result); + + if(stat.override) { + this.checkout(barcode, true); + } else if(stat.doOver) { + this.checkout(barcode); + } else if(stat.renew) { + this.renew(barcode); + } +} + +SelfCheckManager.prototype.failPartMessage = function(result) { + if (result.payload && result.payload.fail_part) { + var stringKey = "FAIL_PART_" + + result.payload.fail_part.replace(/\./g, "_"); + return localeStrings[stringKey]; + } else { + return null; + } +} + +SelfCheckManager.prototype.handleXactResult = function(action, item, result) { + var displayText = ''; + + // If true, the display message is important enough to pop up. Whether or not + // an alert() actually occurs, depends on org unit settings + var popup = false; + var sound = ''; // sound file reference + var payload = result.payload || {}; + var overrideEvents = this.orgSettings[SET_AUTO_OVERRIDE_EVENTS]; + var blockStatuses = this.orgSettings[SET_BLOCK_CHECKOUT_ON_COPY_STATUS]; + result.payload = payload; + + if(result.textcode == 'NO_SESSION') { + + return this.logoutStaff(); + + } else if(result.textcode == 'SUCCESS') { + + if(action == 'checkout') { + + displayText = dojo.string.substitute(localeStrings.CHECKOUT_SUCCESS, [item]); + this.displayCheckout(result, 'checkout'); + + if(payload.holds_fulfilled && payload.holds_fulfilled.length) { + // A hold was fulfilled, update the hold numbers in the circ summary + console.log("fulfilled hold " + payload.holds_fulfilled + " during checkout"); + this.holdsSummary = null; + this.updateHoldsSummary(); + } + + this.updateCircSummary(true); + + } else if(action == 'renew') { + + displayText = dojo.string.substitute(localeStrings.RENEW_SUCCESS, [item]); + this.displayCheckout(result, 'renew'); + } + + this.checkouts.push({circ : result.payload.circ.id()}); + sound = 'checkout-success'; + this.updateScanBox(); + + } else if(result.textcode == 'OPEN_CIRCULATION_EXISTS' && action == 'checkout') { + + // Server says the item is already checked out. If it's checked out to the + // current user, we may need to renew it. + + if(payload.old_circ) { + + /* + old_circ refers to the previous checkout IFF it's for the same user. + If no auto-renew interval is not defined, assume we should renew it + If an auto-renew interval is defined and the payload comes back with + auto_renew set to true, do the renewal. Otherwise, let the patron know + the item is already checked out to them. */ + + if( !this.orgSettings[SET_AUTO_RENEW_INTERVAL] || + (this.orgSettings[SET_AUTO_RENEW_INTERVAL] && payload.auto_renew) ) { + this.prevCirc = payload.old_circ.id(); + return { renew : true }; + } + + popup = false; + sound = 'checkout-failure'; + displayText = dojo.string.substitute(localeStrings.ALREADY_OUT, [item]); + + } else { + + if( // copy is marked lost. if configured to do so, check it in and try again. + result.payload.copy && + result.payload.copy.status() == /* LOST */ 3 && + overrideEvents && overrideEvents.length && + overrideEvents.indexOf('COPY_STATUS_LOST') != -1) { + + if(this.checkin(item)) { + return { doOver : true }; + } + } + + + // item is checked out to some other user + popup = false; + sound = 'checkout-failure'; + displayText = dojo.string.substitute(localeStrings.OPEN_CIRCULATION_EXISTS, [item]); + } + + this.updateScanBox(); + + } else { + + + if(overrideEvents && overrideEvents.length) { + + // see if the events we received are all in the list of + // events to override + + if(!result.length) result = [result]; + + var override = true; + for(var i = 0; i < result.length; i++) { + + var match = overrideEvents.filter(function(e) { return (e == result[i].textcode); })[0]; + + if(!match) { + override = false; + break; + } + + if(result[i].textcode == 'COPY_NOT_AVAILABLE' && blockStatuses && blockStatuses.length) { + + var stat = result[i].payload.status(); // copy status + if(typeof stat == 'object') stat = stat.id(); + + var match2 = blockStatuses.filter(function(e) { return (e == stat); })[0]; + + if(match2) { // copy is in a blocked status + override = false; + break; + } + } + + if(result[i].textcode == 'COPY_IN_TRANSIT') { + // to override a transit, we have to abort the transit and check it in first + if(this.checkin(item, true)) { + return { doOver : true }; + } else { + override = false; + } + } + } + + if(override) + return { override : true }; + } + + this.updateScanBox(); + popup = false; + sound = 'checkout-failure'; + + if(action == 'renew') + this.checkouts.push({circ : this.prevCirc, renewal_failure : true}); + + if(result.length) + result = result[0]; + + switch(result.textcode) { + + // TODO custom handler for blocking penalties + + case 'MAX_RENEWALS_REACHED' : + displayText = dojo.string.substitute( + localeStrings.MAX_RENEWALS, [item]); + break; + + case 'ITEM_NOT_CATALOGED' : + displayText = dojo.string.substitute( + localeStrings.ITEM_NOT_CATALOGED, [item]); + break; + + case 'OPEN_CIRCULATION_EXISTS' : + displayText = dojo.string.substitute( + localeStrings.OPEN_CIRCULATION_EXISTS, [item]); + + break; + + default: + console.error('Unhandled event ' + result.textcode); + + if (!(displayText = this.failPartMessage(result))) { + if (action == 'checkout' || action == 'renew') { + displayText = dojo.string.substitute( + localeStrings.GENERIC_CIRC_FAILURE, [item]); + } else { + displayText = dojo.string.substitute( + localeStrings.UNKNOWN_ERROR, [result.textcode]); + } + } + } + } + + this.handleAlert(displayText, popup, sound); + return {}; +} + + +/** + * Renew an item + */ +SelfCheckManager.prototype.renew = function(barcode, override) { + + var method = 'open-ils.circ.renew'; + if(override) method += '.override'; + + console.log("Renewing item " + barcode + " with method " + method); + + var result = fieldmapper.standardRequest( + ['open-ils.circ', method], + {params: [ + this.authtoken, { + patron_id : this.patron.id(), + copy_barcode : barcode + } + ]} + ); + + console.log(js2JSON(result)); + + var stat = this.handleXactResult('renew', barcode, result); + + if(stat.override) + this.renew(barcode, true); +} + +/** + * Display the result of a checkout or renewal in the items out table + */ +SelfCheckManager.prototype.displayCheckout = function(evt, type, itemsOut) { + var copy = evt.payload.copy; + var record = evt.payload.record; + var circ = evt.payload.circ; + var row = this.circTemplate.cloneNode(true); + + //if(record.isbn()) { + // this.byName(row, 'jacket').setAttribute('src', '/opac/extras/ac/jacket/small/' + record.isbn()); + //} + + this.byName(row, 'barcode').innerHTML = copy.barcode(); + this.byName(row, 'title').innerHTML = record.title(); + //this.byName(row, 'author').innerHTML = record.author(); + //this.byName(row, 'remaining').innerHTML = circ.renewal_remaining(); + openils.Util.show(this.byName(row, type)); + + var date = dojo.date.stamp.fromISOString(circ.due_date()); + this.byName(row, 'due_date').innerHTML = + dojo.date.locale.format(date, {selector : 'date'}); + + // put new circs at the top of the list + var tbody = this.circTbody; + if(itemsOut) tbody = this.itemsOutTbody; + tbody.insertBefore(row, tbody.getElementsByTagName('tr')[0]); +} + + +SelfCheckManager.prototype.byName = function(node, name) { + return dojo.query('[name=' + name+']', node)[0]; +} + + +SelfCheckManager.prototype.initPrinter = function() { + try { // Mozilla only + netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); + netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); + netscape.security.PrivilegeManager.enablePrivilege('UniversalPreferencesRead'); + netscape.security.PrivilegeManager.enablePrivilege('UniversalPreferencesWrite'); + var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); + if (pref) + pref.setBoolPref('print.always_print_silent', true); + } catch(E) { + console.log("Unable to initialize auto-printing"); + } +} + +/** + * Print a receipt for this session's checkouts + */ +SelfCheckManager.prototype.printSessionReceipt = function(callback) { + var circIds = []; + var circCtx = []; // circ context data. in this case, renewal_failure info + + // collect the circs and failure info + dojo.forEach( + this.checkouts, + function(blob) { + circIds.push(blob.circ); + circCtx.push({renewal_failure:blob.renewal_failure}); + } + ); + + var params = [ + this.authtoken, + this.staff.ws_ou(), + null, + 'format.selfcheck.checkout', + 'print-on-demand', + circIds, + circCtx + ]; + + var self = this; + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.fire_circ_trigger_events'], + { + async : true, + params : params, + oncomplete : function(r) { + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + if(output) { + self.printData(output.data(), self.checkouts.length, 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"); + } + } + } + } + ); +} + +SelfCheckManager.prototype.printData = function(data, numItems, callback) { + var win = window.open('', '', 'resizable,width=350,height=250,scrollbars=1'); + win.document.body.innerHTML = data; + win.print(); + + /* + * There is no way to know when the browser is done printing. + * Make a best guess at when to close the print window by basing + * the setTimeout wait on the number of items to be printed plus + * a small buffer + */ + var sleepTime = 1000; + if(numItems > 0) + sleepTime += (numItems / 2) * 1000; + + setTimeout( + function() { + win.close(); // close the print window + if(callback) callback(); // fire optional post-print callback + }, + sleepTime + ); +} + + +/** + * Print a receipt for this user's items out + */ +SelfCheckManager.prototype.printItemsOutReceipt = function(callback) { + if(!this.itemsOut.length) return; + + progressDialog.show(true); + + var params = [ + this.authtoken, + this.staff.ws_ou(), + null, + 'format.selfcheck.items_out', + 'print-on-demand', + this.itemsOut + ]; + + var self = this; + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.fire_circ_trigger_events'], + { + async : true, + params : params, + oncomplete : function(r) { + progressDialog.hide(); + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + if(output) { + self.printData(output.data(), self.itemsOut.length, 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"); + } + } + } + } + ); +} + +/** + * Print a receipt for this user's items out + */ +SelfCheckManager.prototype.printHoldsReceipt = function(callback) { + if(!this.holds.length) return; + + progressDialog.show(true); + + var holdIds = []; + var holdData = []; + + dojo.forEach(this.holds, + function(data) { + holdIds.push(data.hold.id()); + if(data.status == 4) { + holdData.push({ready : true}); + } else { + holdData.push({ + queue_position : data.queue_position, + potential_copies : data.potential_copies + }); + } + } + ); + + var params = [ + this.authtoken, + this.staff.ws_ou(), + null, + 'format.selfcheck.holds', + 'print-on-demand', + holdIds, + holdData + ]; + + var self = this; + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.fire_hold_trigger_events'], + { + async : true, + params : params, + oncomplete : function(r) { + progressDialog.hide(); + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + if(output) { + self.printData(output.data(), self.holds.length, 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"); + } + } + } + } + ); +} + + +SelfCheckManager.prototype.printPaymentReceipt = function(paymentIds, callback) { + var self = this; + progressDialog.show(true); + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.money.payment_receipt.print'], + { + async : true, + params : [this.authtoken, paymentIds], + oncomplete : function(r) { + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + progressDialog.hide(); + if(output) { + self.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"); + } + } + } + } + ); +} + +/** + * Print a receipt for this user's items out + */ +SelfCheckManager.prototype.printFinesReceipt = function(callback) { + progressDialog.show(true); + + var params = [ + this.authtoken, + this.staff.ws_ou(), + null, + 'format.selfcheck.fines', + 'print-on-demand', + [this.patron.id()] + ]; + + var self = this; + 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) { + self.printData(output.data(), self.finesCount, 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"); + } + } + } + } + ); +} + + +/** + * Logout the patron and return to the login page + */ +SelfCheckManager.prototype.logoutPatron = function(print) { + progressDialog.show(true); // prevent patron from clicking logout link twice + if(print && this.checkouts.length) { + this.printSessionReceipt( + function() { + location.href = location.href; + } + ); + } else { + location.href = location.href; + } +} + + +function checkLogin() { + selfCheckMgr.keepMeLoggedIn(); + if(selfCheckMgr.orgSettings[SET_PATRON_PASSWORD_REQUIRED]) { + switchTo('step2'); + try{dojo.byId('patron-login-password').focus();}catch(e){} + } else { + selfCheckMgr.loginPatron(dojo.byId('patron-login-username').value); + } +} + + +function cancelLogin() { + dojo.byId('oils-selfck-status-div').innerHTML = ''; + dojo.byId('oils-selfck-status-div2').innerHTML = ''; + dojo.byId('oils-selfck-status-div3').innerHTML = ''; + dojo.byId('patron-login-password').value = ''; + openils.Util.hide('back_to_login'); + switchTo('step1'); + try { + dojo.byId('patron-login-username').focus(); + dojo.byId('patron-login-username').select(); + } catch(e) {} +} + +/** + * Fire up the manager on page load + */ +openils.Util.addOnLoad( + function() { + new SelfCheckManager().init(); + openils.Util.registerEnterHandler(dojo.byId('patron-login-username'), function(){checkLogin();}); + openils.Util.registerEnterHandler(dojo.byId('patron-login-password'), function(){selfCheckMgr.loginPatron(dojo.byId('patron-login-username').value,dojo.byId('patron-login-password').value);}); + } +); diff --git a/Open-ILS/web/local_templates/base.tt2 b/Open-ILS/web/local_templates/base.tt2 new file mode 100644 index 0000000000..c95f117275 --- /dev/null +++ b/Open-ILS/web/local_templates/base.tt2 @@ -0,0 +1,27 @@ +[%- ctx.final_dtd = + '' -%] +[%- IF !ctx.dtd; ctx.dtd = ctx.final_dtd; END -%] +[% ctx.dtd %] + + + [% ctx.page_title %] + + + + + + + + + + + + [% INCLUDE login.tt2 %] + [% content %] + + diff --git a/Open-ILS/web/local_templates/base.tt2-aug17.old2 b/Open-ILS/web/local_templates/base.tt2-aug17.old2 new file mode 100644 index 0000000000..6bb7874aee --- /dev/null +++ b/Open-ILS/web/local_templates/base.tt2-aug17.old2 @@ -0,0 +1,26 @@ +[%- ctx.final_dtd = + '' -%] +[%- IF !ctx.dtd; ctx.dtd = ctx.final_dtd; END -%] +[% ctx.dtd %] + + + [% ctx.page_title %] + + + + + + + + + + + [% INCLUDE login.tt2 %] + [% content %] + + diff --git a/Open-ILS/web/local_templates/base.tt2.old b/Open-ILS/web/local_templates/base.tt2.old new file mode 100644 index 0000000000..9e7c8c36cd --- /dev/null +++ b/Open-ILS/web/local_templates/base.tt2.old @@ -0,0 +1,64 @@ +[%- ctx.final_dtd = + '' -%] +[%- ctx.home_path ='/local_templates/default/circ/selfcheck' -%] +[%- IF !ctx.dtd; ctx.dtd = ctx.final_dtd; END -%] +[% ctx.dtd %] + + + + [% ctx.page_title %] + + + + + + + + + + + + + + + + + +[% INCLUDE login.tt2 %] +[% content %] + + \ No newline at end of file diff --git a/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.disabled b/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.disabled new file mode 100644 index 0000000000..5083accce6 --- /dev/null +++ b/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.disabled @@ -0,0 +1,116 @@ + + + + Parent/Guardian + + + + + + + + Address + + Mailing + Billing + + + + + + + This is a pending address: + +
+
+
+ + + + + + This address is owned by another user: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verify Password + + + + + + + + + + + + + + + + + + User Settings + + + +
+ + + + + + + + + + + + + + + Statistical Categories + + + + + + + diff --git a/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.orig b/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.orig new file mode 100644 index 0000000000..e90e925121 --- /dev/null +++ b/Open-ILS/web/local_templates/default/actor/user/register_table.tt2.orig @@ -0,0 +1,98 @@ + + + + Parent/Guardian + + + + + + + + Address + + Mailing + Billing + + + + + + + This is a pending address: + +
+
+
+ + + + + + This address is owned by another user: + + + + + + + + + + + + + + + + + + + + + + Verify Password + + + + + + + + + + + + + + + + + + User Settings + + + +
+ + + + + + + + + + + + + + + Statistical Categories + + + + + + + diff --git a/Open-ILS/web/local_templates/default/base.tt2 b/Open-ILS/web/local_templates/default/base.tt2 new file mode 100644 index 0000000000..0570b12dda --- /dev/null +++ b/Open-ILS/web/local_templates/default/base.tt2 @@ -0,0 +1,39 @@ +[% WRAPPER 'base.tt2' %] + + + +
+
+ + + +
+ [% INCLUDE default/header.tt2 %] +
+
+
+ +
+ [% content %] +
+
+ +
+[% END %] diff --git a/Open-ILS/web/local_templates/default/base.tt2.old b/Open-ILS/web/local_templates/default/base.tt2.old new file mode 100644 index 0000000000..507fc1de79 --- /dev/null +++ b/Open-ILS/web/local_templates/default/base.tt2.old @@ -0,0 +1,41 @@ +[% WRAPPER 'base.tt2' %] + + +
+ + +
+ +
+
+
+ [% content %] +
+
+
+[% END %] diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/audio_config.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/audio_config.tt2 new file mode 100644 index 0000000000..9b084a1b50 --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/audio_config.tt2 @@ -0,0 +1,13 @@ +[%# + Override the audio config values by copying this template into your local templates + directory (matching the relative path) and change the values accordingly. +#%] + + diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/banner.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/banner.tt2 new file mode 100644 index 0000000000..cda4866c91 --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/banner.tt2 @@ -0,0 +1,10 @@ +
+
+ +
+
+
+ +
+
+ diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/circ_page.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/circ_page.tt2 new file mode 100644 index 0000000000..868f5f9e35 --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/circ_page.tt2 @@ -0,0 +1,30 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
BarcodeTitleAuthorDue DateType
+ + +
+
diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/fines.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/fines.tt2 new file mode 100644 index 0000000000..fee782e197 --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/fines.tt2 @@ -0,0 +1,26 @@ + +Pay Fines +
+ + + + + + + + + + + + + + + + + + + + + +
TypeDetailsTotal BilledTotal PaidBalance Owed
+
diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/KCLS_logo_horiz.gif b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/KCLS_logo_horiz.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e1d56ed5f5e35de017304295d825fed18c6bc6d GIT binary patch literal 3526 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

Hr*To(R^*bdc43^&co#+>pbloUKJa+v zr6&0At6LUzSr7*<+Ku>PARB-f8Zam!0|xd(TE3}(V1%ShP5?-R58b=iR}Q-2rho|W zM%MEUNh^W0M|Y7wMYJ9asg^5-$)F(u`)d>o+)RMMe1m^th22FkTP;LTkDtQfDKQv` z`alA>XA9&j<0A+x3AJbFzPtPf$W()&O*%(l7^If70Ug9F20d{P0E28rs~{ZkP?aV~ zERIOLgx3oX?_%GHn-#3ww+uQK6?EGG?y%BxR;#p2>(V<1pa*t&MDy`VPI$Y&!7V`733!dw(bKB1r{w1 z9VeDdiZIaNJN?2)SW8#t(whm43Oq`REfqd`liMX3R~k!{h)mm2o;uN ov@ybkXO4oPH0z$d`}XhkTFlEW9d+D^jbG-(2_BxaE{+V=0N#&Wg#Z8m literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/barcodedetailbook.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/barcodedetailbook.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0a237e924fd395556800291124a44c963cd6790 GIT binary patch literal 9138 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 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/go-btn.png b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/go-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..24091c99361870565f1e75cdfaf97d8dd0873aa4 GIT binary patch literal 1243 zcmV<11SI>3P)000W>0fLJSS^xk57IZ~ebVG7wVRUJ4ZXi@?ZDjy3HZLvmZ_X00cKlL_t(o zh257;Y*bYg$A9muo$0il4z{+ov{(qk1j+)9HK0`~DO5HlO)v&XOpF>eu_0Dip`aTR zLyU1zV{l5MX9T1@E`DI=mP?3V= zo*@94m{N5BDFiJ441sVI{q6^#EUuY_KuYe*kdxF|&9TYv?Zg}EMRRQIOgDpN0V2M_ zdwX0lllfP$i1-Q_E?I+>l{-f-BNoASWg%59jd<<`gb*Z~A%9;xuWx&lnyMOd zT^fC1i=)TdI6f+g+frgbMfU>?5Ql~_iO*TQ%Z{RvpM+Y zbF^Iy^40ej2o{uMt|&?(K`92bwW0ukmX0t|DEPG){_IJt_ApigWJW1#OAEN&8)kfR z>fX8WNr&6LVb+%VkXJ*q&G7Gp@@!=}o7NX|?Bo?r3_Fa^Hz+B%uglFJE5ijqjyb}Z z%g6ePQeNEPW0gl?aAbm?P7NXy1>H%Y*>N0g`WnqipbCeCo-y}MIlG2^-YnjG`+3G& z2RLzaY@Pwl)R2=%YMt(!0HE#>g`9ARQy02;_4D)GxY@&uUN8!4%2p5<=^`^~k{LA# zjC8T4Yz0?GrsinQ%#ezr;PH3}<6+nFAm3gO&D$5LKDiqM6a3gd${V{k6Z!Hi!=Zjw z23E5D>2+M`7(@z(kALZB`#K*7_ddZlCw>LsrM;UGipCe0LJzo8!!Qioo@^Q~hWPY+ zAGVX+pqz3I0o0%Vi-xKa8eZFq*QIm5%jEsmE^7Tgq;TjSi&58fi-xKa8b90xzz^-C z)HU6rdn`6b&(6xBV?t;D@tbrEPbTeW8i4{76drC1qH3NLRThL2ZzjFt@w7C|lOF|A z&d@^B^MI@+i<~|B{Eue2WZU-AC5@)ABuQsDU6S0_w&N(uqIS9Tks=Yg6Vm}9A|t=4 zxdl5G+fq7+X!ug1zay>zx)bi}(2LftMmO?MRToH>&2pwp5gEQbd9LZOGZeg|06O3U zihw-8VEGi31Z=!~qLP`~%C6p;aXK#UTIy002ovPDHLk FV1n+yIKuz{ literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/gobutton.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/gobutton.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33e7c380e5a6e2aa5868cb02471b695de26ceb1d GIT binary patch literal 695 zcmex=i3*BJ!6k`h{6D}T z$iX1VV93lU$iO7X$SlbC{|JLL0|O%~BO?O>ure^Su(2~T0VRzE7?>EDnV8tvIid25 zOw0@{tZafpitNH7hJlGnMvg&+8!w6)o0z&36(9Tv)Fgsp8dx7lR1nz?i0CZ_9%e?M zQ=`b7mh4#Ab%(n&J@w1%-MjO(7%!wgo0rli?YAkCpG)bp%6!JHjHlEAA|`^wsF`>Xy|{VJwfY0sQl^Xzsf zoE2Up{rg{Bjr9eeqc01~^*oKIeeayq;ccJwuC?jyhDQn?g*@%KSSwkN-glpI^!Q@0 z31|LpvN-ley6naVnZNtB__7jp_jMeKif1xXym?jndcsRnn50XE^S^)FAYFkJX0M*Ufwht@2S!{+D^)vj_a-ek>_1xWD3qdUqAa zkAG7XjvJfy9=*D=KE5G`|49B;=I~nOh&Z40-IJbG_A7njQ{LWgwqV_>w~0Nwjx90J r*%OxC04x9i78W)T2>36; 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%0A`(ovwMVz;CWkWxQqc?(A)W=80B5hz}>8O&a90 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 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/login-btn.png b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/login-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9d9de5c7184dfc89cb12c8cad856f394fed273 GIT binary patch literal 3266 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 F)&OaFDpCLd literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutbutton.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutbutton.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61092eddb74c82c9993e7d754e8a346566711b17 GIT binary patch literal 8299 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 HyzsvON~G=n literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutnoreceipt.gif b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutnoreceipt.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c88f4adb5410541d550c4b12bc69730a9768cc9 GIT binary patch literal 400 zcmV;B0dM|CNk%w1VHN-u0K@mNk*2j2 zS+J-ywnjuTnJ5^*MI!(U3>FlQqd=_|2!li85<@Hy6RWtO7(6I0kLExLkExE|qVmvq z5;Ve_YGD}YPZ9wPT2pTU84Cap5I+Y<2N7=$7!3~<1{w(keh4%dV={kd1Qt{Q23ZGg za0&$*1`(`p6Il@=>M9Hf5U;=lFAdUoD5FKn7zZ4( uP*4Elf;2W7E?96dh(ZknOnS(mv7knc1q&n%wCM4ogr^h|giPoW0suP->W5DN literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutwithoutreceiptbutton.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/logoutwithoutreceiptbutton.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20228bddb76c6f68818e7a712c4ad741965011fa GIT binary patch literal 5191 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 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/printlist.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/printlist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a83c0fc575c2d98abe71508fe8860dbbeb294bd4 GIT binary patch literal 1295 zcmex=i3*BJ!6k`h{6D}T z$iX1PP{GV7$iO7X$SlbC{|JLL0|OHiGa~~MU}0rrWMXCqN}3BWFfubUvI5=D#tc>g zlwe_C6%=97ba4Yf-j}i7i8Df3SMh? zTl}JL3w!o&<@L83-ZsDJ+n>d}_3y;%Zyn0^Z?d|OzRecMcHC@kS(IuhB*Ux~GF8On zbe4nd70ts(Q<*<4_;JD7%I@-ko|VBme48crp@p4`F7^X`&= z#l+{1*Y4(T*jagtzah{1WAX-Z!61VOum22zSJq!%ZBw&CBJX_0KjUpjV$7Q6bi~X$ zCFGN85#XWw>Y3dX&SM*Ir@yJ)JME^IzEGg*kM|5ra}4hu%$P5;Fve~Q@4L6TZ%=Gl zc2h9mY2MZQ`C9G|UcDv&9Cl78xa|IVkCU>HGHC&+@|pH*W3z zZA^EIwj5&0n$61T7$h`d^1bxEhvWM)6v`$A=f~X3+|lFWk}i{}WW{C5vZ5jM$deBX zj-5NY+kHpWw>II6b5hrS3<~bS;GgC8QQWTo88XVc-e*kAiw^td{L8Ua zf0xIl1?ybbPi3FwP!*IX&Rx?UtXL3osr;qH$-*gXoewtzT39@FWZi!M^8OR+e_g1O z{nM2E_@Mf?1tGCZxvkdP-fs>5&miPyee281=T93QqTgLwuu*qf$%|Rnp1yTf_dnJ6 z%xu@IGc$~Wr1Yb28r}$+RI$A$F{a}2p~jT^?>N$KT~5__vsAY*guPl%J8Em?M-kbW zTiuhVKe=~B`p1#S%$^qyT3M!_e(or-{n}18$75UdD{40RWvITp9jf=@_R7gZa$nzC zJyo0__wKQL=cG!WS`DMMYiB*#uIkY#Vlf3Te+Jk5~`7AJmIm`-}f%^loGCJWFy#L3AvRgBQQchobyz0_C zhk^yoJo7_qGtBPF2i9ir-rDQ>b%A--SMh5N5P^$urtvPjRlhDIY^epRxUliv`n7EH n`QKSyYxq%Lcy0^(;op6w3!EP3XJ)4!)vcPeuzCJm_Ww5lu*w*& literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_font.gif b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_font.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dc10a95f6970af7cf3e7fbbf5542e662899119a GIT binary patch literal 95 zcmZ?wbhEHb6l36Jn8?6TS6BD{|NpeKGzJC+#h)xdl7T@7M1bTOm<(F_CA44ecd8aK v2wQlhYq@sqy@QnxT-v7X;(9DKQ=0qu)1Gay$)_#LX77n|JUk(gfx#L8VA&xF literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_mail.gif b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_mail.gif new file mode 100644 index 0000000000000000000000000000000000000000..83c357369e8dd0bb4488f737383c2813da1ff516 GIT binary patch literal 147 zcmZ?wbhEHb6k_0J*v!C?mX`Ma|NnF6&h6T<R z_>%=JrUN2DW-zcg2%PZD=C#PS6~2+cz!UVS_2vskkKe6}xh1xIEOOQrw5jiImUAr9 g5Ykj}_^6<1!rj_f!cfYzhM}?S^wX$)_c<7>0b!OkA^-pY literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_print.gif b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/tool_print.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3d7ee388ee218721094c3eac6e9704fe7a9a026 GIT binary patch literal 178 zcmZ?wbhEHb6k-r&*v!C?mX=mmSNH$_|3{A=-Me>h=FFK-pFX{O`SOh$H_o3wf9A{? z22`N%oj|mGRx8;E}~FfdsGamoMN3@r?d!~-S-V1@&zb|ywfpezu>C5UDGKg1x& z!641R&deytz$D1XEXer(2*Y%c!+?%Q02T&zG!dYj00YoQgc=401ttMuW)U_)p#Ru8 zkqlrKVGv{z5@r<@U^EPDJT#d_)l>*c8f=7uFfgo`SXmL~F)|1`Dky$13@qH3IC0^@ zi~nyi@Gvt1UC9izfYFlER2eA30dy84D^rhWa`CS%{~5p{Odt_{Fq0XT<8DpmCG)y4Z$Z&&o#8ywouxu_mu4Kt&?Vtnm_Crsxz zW!(uA7TV`jn+>rJB(oS|FpP OHy7L_0fb3F=1l+{f^L!k literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/utils-corner.jpg b/Open-ILS/web/local_templates/default/circ/selfcheck/graphics/utils-corner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4932a2867226e26bb2253fdf3344c1e7c46d0972 GIT binary patch literal 411 zcmex=#gTwa)A`=$yzhQ3f>FIZo+hkks*0l7D$hGLGYpGtY zrBhzmWwUB4sVtXZP2MzBo*`uNB(4tI7pC){{AXyYnB7yU op{Ic=H*ffPZ&opm)jH)`!?Ne`xz!(6FFMk7GxFCAx90yh0p#LPfB*mh literal 0 HcmV?d00001 diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/holds_page.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/holds_page.tt2 new file mode 100644 index 0000000000..333624948d --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/holds_page.tt2 @@ -0,0 +1,20 @@ +

diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/main.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/main.tt2 new file mode 100644 index 0000000000..9c89e55324 --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/main.tt2 @@ -0,0 +1,238 @@ +[%- ctx.home_path ='/local_templates/default/circ/selfcheck' -%] +[% ctx.page_title = 'Self Checkout' %] +[% WRAPPER default/base.tt2 %] + + + +
+ + + + +
+ + +
+ +
+
+
+ + + + + +[% INCLUDE 'default/circ/selfcheck/audio_config.tt2' %] + +
Staff login required
+ + + + + + + + + +
+
+
+
+ +[% END %] \ No newline at end of file diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/patron_login.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/patron_login.tt2 new file mode 100644 index 0000000000..da65d791de --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/patron_login.tt2 @@ -0,0 +1,7 @@ +
Please login using your library barcode
+ + diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/payment.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/payment.tt2 new file mode 100644 index 0000000000..f4fe97eb6d --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/payment.tt2 @@ -0,0 +1,83 @@ +
+ Total amount to pay: $ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Credit Card #
CVV #
Exipration Month + +
Expiration Year
Edit Billing Details
First Name
Last Name
Street Address
City
State or Province
ZIP or Postal Code
+ +
diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/style.css b/Open-ILS/web/local_templates/default/circ/selfcheck/style.css new file mode 100644 index 0000000000..4f342db8fb --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/style.css @@ -0,0 +1,179 @@ +@charset "utf-8"; +/* CSS Document */ + +html, body { + margin:0; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + background:#333; + width:100%; +} + +img { + border: none; +} + +a { + color: #003399; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1 { + margin:0; + margin-bottom: 5px; + font-size: 20px; + font-weight:normal; +} + +h2 { + margin:0; + margin-bottom: 5px; + font-size: 14px; + font-weight:bold; +} + +#header { + color: #bda964; + font-weight:bold; + padding: 12px 0px 9px 17px; + width: 694px; + margin: auto; +} + +#content-wrapper { + background: white; + min-height: 260px; + border-bottom: 1px solid black; +} + +#main-content { + width: 694px; + margin:auto; + padding-left:17px; +} + +.checkout { + font-size:16px; +} + +.checkout h1 { + font-size:36px; +} + +.checkout h2 { + font-size:24px; +} + +.checkout .sidebar h3 { + font-size: 16px; + margin:0; + padding-left:3px; +} + +.checkout .sidebar a { + font-size:12px; +} + +.checkout .sidebar a span { + font-weight:bold; +} + +.checkout .sidebar p { + margin:4px 0px; + padding:3px; +} + +.checkout .sidebar div, .checkout .sidebar p { + font-size: 16px; + line-height: 1em; +} + +.checkout input[type=text], .checkout input[type=password] { + border: 1px solid black; + width:300px; + height:20px; + padding:2px; + padding-top:1px; + margin:0px; + font-size:16px; +} + +.checkout .sidebar { + background: #b0b0b0; + border-left:2px ridge #eee; + border-right:2px ridge #eee; + padding:10px 7px; +} + +.checkout .sidebar .top { + float:right; + padding-right:5px; +} + +.checkout .sidebar .greet { + clear:both; + padding:15px 3px; +} + +.checkout .sidebar .selected { + background:#999 +} + +.checkout .header1 { + height:108px; + border-bottom:1px solid #a83135; + padding-top:20px; +} + +.checkout .userid { + width:200px; + font-size:16px; + font-weight:bold; + padding:5px 6px 6px 6px !important; + border:2px solid black !important; + background: none !important; + margin:0 !important; +} + +.checkout .item_table { + border-collapse: collapse; +} + +.checkout .item_table td { + font-size:16px; + border:2px solid black; + text-align: left; +} + +.checkout .item_table table td.label { + font-weight:bold; + text-transform: uppercase; + text-align: right; + white-space:nowrap; + padding-right:5px; + width:1px; +} + +.checkout .item_table table td { + border:none; +} + +.checkout #back_button:hover { + text-decoration: none; +} + +.checkout .status_box { + color:red; + font-weight:bold; + height:20px; +} + +.checkout .oils-selfck-status-div { + height:inherit !important; + vertical-align:inherit !important; +} + diff --git a/Open-ILS/web/local_templates/default/circ/selfcheck/summary.tt2 b/Open-ILS/web/local_templates/default/circ/selfcheck/summary.tt2 new file mode 100644 index 0000000000..b037ad7d6b --- /dev/null +++ b/Open-ILS/web/local_templates/default/circ/selfcheck/summary.tt2 @@ -0,0 +1,27 @@ +
+ +
+ Items Checked Out +
+
+ +
+
+ Holds +
+
+ +
+
+ Fines +
+ +
+
+ -- 2.11.0