2 <!-- Application: Evergreen Staff Client -->
3 <!-- Screen: Patron Display -->
5 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
7 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
8 <?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
9 <?xml-stylesheet href="/xul/server/skin/patron_display.css" type="text/css"?>
11 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
13 <!DOCTYPE window PUBLIC "" ""[
14 <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
17 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
19 <?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
21 <window id="patron_bill" title="&staff.patron.bill_cc_info.title;"
22 orient="vertical" style="overflow: auto" oils_persist="height width sizemode"
23 onload="try{info_init(); font_helper(); refresh_fields(); persist_helper(); }catch(E){alert(E);}"
24 onunload="try { persist_helper_cleanup(); } catch(E) { alert(E) }"
25 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
27 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
29 <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
30 <scripts id="openils_util_scripts"/>
32 <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
36 function $(id) { return document.getElementById(id); }
38 XULElement.prototype.hide = function() {
39 this.style.display = "none";
41 XULElement.prototype.reveal = function() {
42 this.style.display = "";
46 var show = {'int': 1, 'ext': 2}; // tied to Application::Circ::Money
47 var fields_of_interest = {
48 "cc_type": show['ext'],
49 "cc_number": show['int'],
50 "expire_month": show['int'],
51 "expire_year": show['int'],
52 "billing_first": show['ext'] + show['int'],
53 "billing_last": show['ext'] + show['int'],
54 "billing_address": show['int'],
55 "billing_city": show['int'],
56 "billing_state": show['int'],
57 "billing_zip": show['int'],
58 "approval_code": show['ext'],
59 "note": show['ext'] + show['int'],
60 "where_process": show['ext'] + show['int']
63 function is_relevant_here(field) {
64 var flag = $('where_process').value;
65 var field_flag = fields_of_interest[field];
66 return ((field_flag & flag) == flag);
69 function refresh_fields() {
70 for (var field in fields_of_interest) {
71 if (is_relevant_here(field)) {
72 $('row_' + field).reveal();
75 $('row_' + field).hide();
80 function populate_address_fields() {
81 $('billing_first').value = patron.first_given_name();
82 $('billing_last').value = patron.family_name();
83 if (patron.billing_address()) {
84 $('billing_address').value = patron.billing_address().street1();
85 var street2 = patron.billing_address().street2();
87 $('billing_address').value += (' ' + street2);
89 $('billing_city').value = patron.billing_address().city();
90 $('billing_state').value = patron.billing_address().state();
91 $('billing_zip').value = patron.billing_address().post_code();
95 function info_init() {
96 if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
97 JSAN.errorLevel = "die"; // none, warn, or die
98 JSAN.addRepository('/xul/server/');
99 JSAN.use('util.error'); g.error = new util.error();
100 JSAN.use('util.network'); g.network = new util.network();
101 g.error.sdump('D_TRACE','my_init() for patron_display.xul');
102 g.OpenILS = {}; JSAN.use('OpenILS.data'); g.OpenILS.data = new OpenILS.data();
103 g.OpenILS.data.init({'via':'stash'});
104 /* 'true' as a string matches the expectations in bill2.js */
105 g.payment_blob = { 'cc_args' : {}, 'cancelled' : 'true' };
106 g.OpenILS.data.temp = js2JSON( g.payment_blob );
107 g.OpenILS.data.stash('temp');
110 patron = g.network.simple_request(
111 'FM_AU_FLESHED_RETRIEVE_VIA_ID',
112 [ses(), xul_param('patron_id')]
115 alert ("Patron retrieval failed");
119 populate_address_fields();
120 document.getElementById('cc_number').focus();
123 function sanity_check() {
124 if ($('where_process').value == show['int']) { // internal process
125 if ($('cc_number').value.match(/^\s*$/)) {
126 alert($('patronStrings').getString('staff.patron.bill_cc_info.need_cc_number'));
131 if ($('approval_code').value.match(/^\s*$/)) {
132 alert($('patronStrings').getString('staff.patron.bill_cc_info.need_approval_code'));
139 function info_finish() {
140 /* FIXME -- need unique temp space name */
142 /* The following for loop gathers our payment_blob values from
143 the widgets in this window. This is better than the method of
144 gathering data that was here before (using oncommand attributes
145 to set values in this JS object whenever a field value changed)
146 because (if for no other reason), a select menu, if left at the
147 default value, would never reach the payment_blob, because its
148 oncommand attribute would never fire. */
149 for (var field in fields_of_interest) {
150 if (is_relevant_here(field)) {
151 var matches = field.match(/^cc_(.+)$/);
152 var target_key = matches ? matches[1] : field;
153 g.payment_blob.cc_args[target_key] = $(field).value;
156 delete( g.payment_blob.cancelled );
157 g.OpenILS.data.temp = js2JSON( g.payment_blob );
158 g.OpenILS.data.stash('temp');
164 <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties" />
167 <caption label="&staff.patron.bill_cc_info.info.label;"/>
169 <columns> <column flex="0" /> <column flex="0" /> </columns>
171 <row id="row_where_process">
172 <label value="&staff.patron.bill_cc_info.where_process.label;"/>
173 <menulist id="where_process" oncommand="refresh_fields();">
175 <menuitem label="&staff.patron.bill_cc_info.process_int.label;" value="1"/>
176 <menuitem label="&staff.patron.bill_cc_info.process_ext.label;" value="2"/>
180 <row id="row_cc_type">
181 <label value="&staff.patron.bill_cc_info.type.label;"/>
182 <menulist id="cc_type">
184 <menuitem label="&staff.patron.bill_cc_info.visa.label;" value="VISA"/><!-- capitalization to match CC processors' output -->
185 <menuitem label="&staff.patron.bill_cc_info.mastercard.label;" value="MasterCard"/><!-- capitalization to match CC processors' output -->
186 <menuitem label="&staff.patron.bill_cc_info.american_express.label;" value="American Express"/>
187 <menuitem label="&staff.patron.bill_cc_info.discover.label;" value="Discover"/>
188 <menuitem label="&staff.patron.bill_cc_info.other.label;" value="Other"/>
192 <row id="row_approval_code">
193 <label value="&staff.patron.bill_cc_info.approval_code.value;"/>
194 <textbox id="approval_code" context="clipboard"/>
196 <row id="row_cc_number">
197 <label value="&staff.patron.bill_cc_info.cc_number.value;"/>
198 <textbox id="cc_number" context="clipboard"/>
200 <row id="row_expire_month">
201 <label value="&staff.patron.bill_cc_info.month_expire.value;"/>
202 <textbox id="expire_month" context="clipboard"/>
204 <row id="row_expire_year">
205 <label value="&staff.patron.bill_cc_info.year_expire.value;"/>
206 <textbox id="expire_year" context="clipboard"/>
212 <caption label="Optional fields"/>
214 <columns><column flex="0" /><column flex="1" /></columns>
216 <row id="row_billing_first">
217 <label value="&staff.patron.bill_cc_info.billing_first.value;"/>
218 <textbox id="billing_first" context="clipboard"/>
220 <row id="row_billing_last">
221 <label value="&staff.patron.bill_cc_info.billing_last.value;"/>
222 <textbox id="billing_last" context="clipboard"/>
224 <row id="row_billing_address">
225 <label value="&staff.patron.bill_cc_info.billing_address.value;"/>
226 <textbox id="billing_address" context="clipboard"/>
228 <row id="row_billing_city">
229 <label value="&staff.patron.bill_cc_info.billing_city.value;"/>
230 <textbox id="billing_city" context="clipboard"/>
232 <row id="row_billing_state">
233 <label value="&staff.patron.bill_cc_info.billing_state.value;"/>
234 <textbox id="billing_state" context="clipboard"/>
236 <row id="row_billing_zip">
237 <label value="&staff.patron.bill_cc_info.billing_zip.value;"/>
238 <textbox cols="12" maxlength="11" id="billing_zip" context="clipboard"/>
241 <label value="&staff.patron.bill_cc_info.note.value;"/>
242 <textbox id="note" multiline="true" context="clipboard"/>
248 <button label="&staff.patron.bill_cc_info.cancel.label;" oncommand="window.close()" accesskey="&staff.patron.bill_cc_info.cancel.accesskey;"/>
249 <button label="&staff.patron.bill_cc_info.submit.label;" oncommand="if (sanity_check()) { info_finish(); window.close(); }" accesskey="&staff.patron.bill_cc_info.submit.accesskey;"/>