breaking summary out of display
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 11 Dec 2005 19:00:12 +0000 (19:00 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 11 Dec 2005 19:00:12 +0000 (19:00 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@2337 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/xul/staff_client/server/patron/summary.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/patron/summary.xul [new file with mode: 0644]
Open-ILS/xul/staff_client/server/patron/summary_overlay.xul [new file with mode: 0644]

diff --git a/Open-ILS/xul/staff_client/server/patron/summary.js b/Open-ILS/xul/staff_client/server/patron/summary.js
new file mode 100644 (file)
index 0000000..34ea4a0
--- /dev/null
@@ -0,0 +1,580 @@
+dump('entering patron.summary.js\n');
+
+if (typeof patron == 'undefined') patron = {};
+patron.summary = function (params) {
+
+       JSAN.use('util.error'); this.error = new util.error();
+       JSAN.use('main.window'); this.window = new main.window();
+       JSAN.use('main.network'); this.network = new main.network();
+       this.w = window;
+}
+
+patron.summary.prototype = {
+
+       'init' : function( params ) {
+
+               var obj = this;
+
+               obj.session = params['session'];
+               obj.barcode = params['barcode'];
+
+               JSAN.use('OpenILS.data'); this.OpenILS = {}; 
+               obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
+
+               JSAN.use('main.controller'); obj.controller = new main.controller();
+               obj.controller.init(
+                       {
+                               control_map : {
+                                       'cmd_broken' : [
+                                               ['command'],
+                                               function() { alert('Not Yet Implemented'); }
+                                       ],
+                                       'patron_name' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.family_name() + ', ' + obj.patron.first_given_name()
+                                                               );
+                                                               e.setAttribute('style','background-color: lime');
+                                                               //FIXME//bills should become a virtual field
+                                                               if (obj.patron.bills.length > 0)
+                                                                       e.setAttribute('style','background-color: yellow');
+                                                               if (obj.patron.standing() == 2)
+                                                                       e.setAttribute('style','background-color: lightred');
+
+                                                       };
+                                               }
+                                       ],
+                                       'patron_profile' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.OpenILS.data.hash.pgt[
+                                                                               obj.patron.profile()
+                                                                       ].name()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_standing' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() {
+                                                               e.setAttribute('value',
+                                                                       obj.OpenILS.data.hash.cst[
+                                                                               obj.patron.standing()
+                                                                       ].value()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_credit' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               JSAN.use('util.money');
+                                                               e.setAttribute('value',
+                                                                       util.money.cents_as_dollars(
+                                                                               obj.patron.credit_forward_balance()
+                                                                       )
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_bill' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               JSAN.use('util.money');
+                                                               var total = 0;
+                                                               //FIXME//adjust when .bills becomes a virtual field
+                                                               for (var i = 0; i < obj.patron.bills.length; i++) {
+                                                                       total += util.money.dollars_float_to_cents_integer( 
+                                                                               obj.patron.bills[i].balance_owed() 
+                                                                       );
+                                                               }
+                                                               e.setAttribute('value',
+                                                                       util.money.cents_as_dollars( total )
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_checkouts' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.checkouts().length   
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_overdue' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               //FIXME//Get Bill to do this correctly on server side
+                                                               JSAN.use('util.date');
+                                                               var total = 0;
+                                                               for (var i = 0; i < obj.patron.checkouts().length; i++) {
+                                                                       var item = obj.patron.checkouts()[i];
+                                                                       var due_date = item.circ.due_date();
+                                                                       due_date = due_date.substr(0,4) 
+                                                                               + due_date.substr(5,2) + due_date.substr(8,2);
+                                                                       var today = util.date.formatted_date( new Date() , '%Y%m%d' );
+                                                                       if (today > due_date) total++;
+                                                               }
+                                                               e.setAttribute('value',
+                                                                       total
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_holds' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.hold_requests.length
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_holds_available' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               var total = 0;
+                                                               for (var i = 0; i < obj.patron.hold_requests().length; i++) {
+                                                                       var hold = obj.patron.hold_requests()[i];
+                                                                       if (hold.capture_time()) total++;
+                                                               }
+                                                               e.setAttribute('value',
+                                                                       total
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_card' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.card().barcode()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_ident_type_1' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               var ident_string = '';
+                                                               var ident = obj.OpenILS.data.hash.cit[
+                                                                       obj.patron.ident_type()
+                                                               ];
+                                                               if (ident) ident_string = ident.name()
+                                                               e.setAttribute('value',
+                                                                       ident_string
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_ident_value_1' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.ident_value()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_ident_type_2' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               var ident_string = '';
+                                                               var ident = obj.OpenILS.data.hash.cit[
+                                                                       obj.patron.ident_type2()
+                                                               ];
+                                                               if (ident) ident_string = ident.name()
+                                                               e.setAttribute('value',
+                                                                       ident_string
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_ident_value_2' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.ident_value2()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_date_of_birth' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.dob()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_day_phone' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.day_phone()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_evening_phone' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.evening_phone()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_other_phone' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.other_phone()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_email' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.email()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_photo_url' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('src',
+                                                                       obj.patron.photo_url()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_library' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.OpenILS.data.hash.aou[
+                                                                               obj.patron.home_ou()
+                                                                       ].shortname()
+                                                               );
+                                                               e.setAttribute('tooltiptext',
+                                                                       obj.OpenILS.data.hash.aou[
+                                                                               obj.patron.home_ou()
+                                                                       ].name()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_last_library' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.OpenILS.data.hash.aou[
+                                                                               obj.patron.home_ou()
+                                                                       ].shortname()
+                                                               );
+                                                               e.setAttribute('tooltiptext',
+                                                                       obj.OpenILS.data.hash.aou[
+                                                                               obj.patron.home_ou()
+                                                                       ].name()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_mailing_address_street1' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.mailing_address().street1()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_mailing_address_street2' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.mailing_address().street2()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_mailing_address_city' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.mailing_address().city()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_mailing_address_state' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.mailing_address().state()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_mailing_address_post_code' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.mailing_address().post_code()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_physical_address_street1' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.billing_address().street1()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_physical_address_street2' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.billing_address().street2()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_physical_address_city' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.billing_address().city()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_physical_address_state' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.billing_address().state()
+                                                               );
+                                                       };
+                                               }
+                                       ],
+                                       'patron_physical_address_post_code' : [
+                                               ['render'],
+                                               function(e) {
+                                                       return function() { 
+                                                               e.setAttribute('value',
+                                                                       obj.patron.billing_address().post_code()
+                                                               );
+                                                       };
+                                               }
+                                       ]
+                               }
+                       }
+               );
+
+               obj.retrieve();
+
+       },
+
+       'retrieve' : function() {
+
+               try {
+
+                       var obj = this;
+
+                       var chain = [];
+
+                       // Retrieve the patron
+                       chain.push(
+                               function() {
+                                       try {
+                                               var robj = obj.network.request(
+                                                       api.fm_au_retrieve_via_barcode.app,
+                                                       api.fm_au_retrieve_via_barcode.method,
+                                                       [ obj.session, obj.barcode ]
+                                               );
+                                               if (robj) {
+
+                                                       if (instanceOf(robj,au)) {
+
+                                                               obj.patron = robj;
+
+                                                       } else if (typeof robj.ilsevent != 'undefined') {
+
+                                                               if (robj.ilsevent == 0) {
+
+                                                                       // are we moving toward a payload here?
+
+                                                               } else {
+                                                                       var error = robj.ilsevent + ' : ' 
+                                                                               + obj.error.get_ilsevent( robj.ilsevent );
+                                                                       throw(error);
+                                                               }
+                                                       } else {
+
+                                                               throw('result is not an au fm object');
+                                                       }
+                                               } else {
+
+                                                       throw('result == false');
+                                               }
+
+                                       } catch(E) {
+                                               var error = ('patron.summary.retrieve : ' + js2JSON(E));
+                                               obj.error.sdump('D_ERROR',error);
+                                               throw(error);
+                                       }
+                               }
+                       );
+
+                       // Retrieve the bills
+                       chain.push(
+                               function() {
+                                       try {
+                                               var bills = obj.network.request(
+                                                       api.fm_mobts_having_balance.app,
+                                                       api.fm_mobts_having_balance.method,
+                                                       [ obj.session, obj.patron.id() ]
+                                               );
+                                               //FIXME// obj.patron.bills( bills );
+                                               obj.patron.bills = bills;
+                                       } catch(E) {
+                                               var error = ('patron.summary.retrieve : ' + js2JSON(E));
+                                               obj.error.sdump('D_ERROR',error);
+                                               throw(error);
+                                       }
+                               }
+                       );
+
+                       // Retrieve the checkouts
+                       chain.push(
+                               function() {
+                                       try {
+                                               var checkouts = obj.network.request(
+                                                       api.blob_checkouts_retrieve.app,
+                                                       api.blob_checkouts_retrieve.method,
+                                                       [ obj.session, obj.patron.id() ]
+                                               );
+                                               obj.patron.checkouts( checkouts );
+                                       } catch(E) {
+                                               var error = ('patron.summary.retrieve : ' + js2JSON(E));
+                                               obj.error.sdump('D_ERROR',error);
+                                               throw(error);
+                                       }
+                               }
+                       );
+
+                       // Retrieve the holds
+                       chain.push(
+                               function() {
+                                       try {
+                                               var holds = obj.network.request(
+                                                       api.fm_ahr_retrieve.app,
+                                                       api.fm_ahr_retrieve.method,
+                                                       [ obj.session, obj.patron.id() ]
+                                               );
+                                               obj.patron.hold_requests( holds );
+                                       } catch(E) {
+                                               var error = ('patron.summary.retrieve : ' + js2JSON(E));
+                                               obj.error.sdump('D_ERROR',error);
+                                               throw(error);
+                                       }
+                               }
+                       );
+
+                       // Update the screen
+                       chain.push( function() { obj.controller.render(); } );
+
+                       // On Complete
+
+                       chain.push( function() {
+
+                               if (typeof window.xulG == 'object' && typeof window.xulG.on_finished == 'function') {
+                                       obj.error.sdump('D_PATRON_SUMMARY',
+                                               'patron.summary: Calling external .on_finished()\n');
+                                       window.xulG.on_finished(E);
+                               } else {
+                                       obj.error.sdump('D_PATRON_SUMMARY','patron.summary: No external .on_finished()\n');
+                               }
+
+                       } );
+
+                       // Do it
+                       JSAN.use('util.exec'); obj.exec = new util.exec();
+                       obj.exec.on_error = function(E) {
+                               //location.href = urls.remote_patron_barcode_entry + '?session=' + window.escape(obj.session);
+                               obj.patron = new au();
+                                       obj.patron.checkouts( [] );
+                                       obj.patron.hold_requests( [] );
+                                       obj.patron.bills = [];
+                                       var home_ou = new aou();
+                                       obj.patron.home_ou( home_ou );
+                                       var card = new ac(); card.barcode( obj.barcode );
+                                       obj.patron.card( card );
+                                       obj.patron.family_name( 'Could not retrieve patron' );
+                               alert('FIXME: Need better alert and error handling.\nProblem with barcode: ' 
+                                       + obj.barcode + '\n' + E);
+
+                               if (typeof window.xulG == 'object' && typeof window.xulG.on_error == 'function') {
+                                       obj.error.sdump('D_PATRON_SUMMARY',
+                                               'patron.summary: Calling external .on_error()\n');
+                                       window.xulG.on_error(E);
+                               } else {
+                                       obj.error.sdump('D_PATRON_SUMMARY','patron.summary: No external .on_error()\n');
+                               }
+
+                       }
+                       this.exec.chain( chain );
+
+               } catch(E) {
+                       var error = ('patron.summary.retrieve : ' + js2JSON(E));
+                       this.error.sdump('D_ERROR',error);
+                       alert(error);
+               }
+       }
+}
+
+dump('exiting patron.summary.js\n');
diff --git a/Open-ILS/xul/staff_client/server/patron/summary.xul b/Open-ILS/xul/staff_client/server/patron/summary.xul
new file mode 100644 (file)
index 0000000..5e4b402
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<!-- Application: Evergreen Staff Client -->
+<!-- Screen: Patron Display -->
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- STYLESHEETS -->
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/evergreen.css" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/patron_display.css" type="text/css"?>
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- LOCALIZATION -->
+<!DOCTYPE window SYSTEM "chrome://evergreen/locale/lang.dtd">
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- OVERLAYS -->
+<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
+<?xul-overlay href="/xul/server/patron/summary_overlay.xul"?>
+
+<window id="patron_summary_win" 
+       onload="my_init()"
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+       <!-- BEHAVIOR -->
+        <script type="text/javascript">var myPackageDir = 'evergreen'; var IAMXUL = true; var g = {};</script>
+        <scripts id="openils_util_scripts"/>
+
+       <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
+       <script>
+       <![CDATA[
+               function my_init() {
+                       try {
+                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                               if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
+                               JSAN.errorLevel = "die"; // none, warn, or die
+                               JSAN.addRepository('/xul/server/');
+                               JSAN.use('util.error'); g.error = new util.error();
+                               g.error.sdump('D_TRACE','my_init() for patron_summary.xul');
+
+                               g.cgi = new CGI();
+
+                               JSAN.use('patron.summary'); g.summary = new patron.summary();
+                               g.summary.init( { 'barcode' : g.cgi.param('barcode') , 'session' : g.cgi.param('session') } );
+       
+                       } catch(E) {
+                               var err_msg = "!! This software has encountered an error.  Please tell your friendly " +
+                                       "system administrator or software developer the following:\n" + E + '\n';
+                               try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
+                               alert(err_msg);
+                       }
+               }
+
+       ]]>
+       </script>
+
+       <commandset id="patron_summary_cmds">
+       </commandset>
+
+       <box id="patron_summary_main" />
+
+</window>
+
diff --git a/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul b/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
new file mode 100644 (file)
index 0000000..b61aff8
--- /dev/null
@@ -0,0 +1,179 @@
+<?xml version="1.0"?>
+<!DOCTYPE overlay SYSTEM "chrome://evergreen/locale/lang.dtd">
+<overlay id="patron_summary_overlay" 
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<script>dump('loading patron/summary_overlay.xul\n');</script>
+
+<commandset id="patron_summary_cmds" />
+
+<box id="patron_summary_main" flex="1" orient="vertical" class="my_overflow">
+       <vbox id="patron_info_sidebar" />
+</box>
+
+<vbox id="patron_info_sidebar" flex="0">
+       <groupbox id="PatronSummaryStatus_groupbox" flex="0"/>
+       <groupbox id="PatronSummarySurvey_groupbox" flex="0">
+               <caption id="pdsgbc" label="Surveys" />
+       </groupbox>
+       <groupbox id="PatronSummaryContact_groupbox" flex="1"/>
+</vbox>
+
+<groupbox id="PatronSummaryStatus_groupbox" orient="vertical">
+       <caption label="&staff.patron_display.status.caption;"/>
+       <grid id="PatronSummaryStatus_grid" flex="1"/>
+</groupbox>
+
+<grid id="PatronSummaryStatus_grid">
+       <columns id="pdsgc">
+               <column id="pdsgc1" />
+               <column id="pdsgc2" />
+               <column id="pdsgc3" />
+               <column id="pdsgc4" />
+       </columns>
+       <rows id="pdsgr" flex="1">
+               <row id="pdsgr1">
+                       <label id="PatronSummaryStatus_profile_label" class="text_right"
+                               value="&staff.patron_display.profile.label;" />
+                       <label id="patron_profile" />
+                       <label id="PatronSummaryStatus_standing_label" class="text_right"
+                               value="&staff.patron_display.standing.label;" />
+                       <label id="patron_standing" />
+               </row>
+               <row id="pdsgr2">
+                       <label id="PatronSummaryStatus_credit_label" class="text_right"
+                               value="&staff.patron_display.credit.label;" />
+                       <label id="patron_credit" />
+                       <label id="PatronSummaryStatus_bills_label" class="text_right"
+                               value="&staff.patron_display.bills.label;" />
+                       <label id="patron_bill" />
+               </row>
+               <row id="pdsgr3">
+                       <label id="PatronSummaryStatus_checkouts_label" class="text_right"
+                               value="&staff.patron_display.checkouts.label;" />
+                       <label id="patron_checkouts" />
+                       <label id="PatronSummaryStatus_checkouts_overdue_label" class="text_right"
+                               value="&staff.patron_display.checkouts_overdue.label;" />
+                       <label id="patron_overdue" />
+               </row>
+               <row id="pdsgr4">
+                       <label id="PatronSummaryStatus_holds_label" class="text_right"
+                               value="&staff.patron_display.holds.label;" />
+                       <label id="patron_holds" />
+                       <label id="PatronSummaryStatus_holds_available_label" class="text_right"
+                               value="&staff.patron_display.holds_available.label;" />
+                       <label id="patron_holds_available" />
+               </row>
+               <row id="pdsgr5">
+                       <label id="pdsgr5l1" class="text_right" value="Home Lib:" />
+                       <label id="patron_library" />
+                       <label id="pdsgr5l2" class="text_right" value="Last Lib:" />
+                       <label id="patron_last_library" />
+               </row>
+
+       </rows>
+</grid>
+
+<groupbox id="PatronSummaryContact_groupbox" orient="vertical">
+       <caption label="&staff.patron_display.contact.caption;"/>
+       <hbox id="pdcgbhb1">
+               <grid id="PatronSummaryContact_grid" />
+               <spacer id="pdcgbhbs1" flex="1"/>
+               <image id="patron_photo_url" />
+       </hbox>
+       <grid id="PatronSummaryContact_grid_phone" />
+       <groupbox id="PatronSummaryContact_mailing_address" />
+       <groupbox id="PatronSummaryContact_physical_address" />
+</groupbox>
+
+<grid id="PatronSummaryContact_grid">
+       <columns id="pdsgc">
+               <column id="pdsgc1" />
+               <column id="pdsgc2" />
+       </columns>
+       <rows id="pdsgr" flex="1">
+               <row id="pdsgr0">
+                       <label id="PatronSummaryContact_library_card_label" class="text_right"
+                               value="&staff.patron_display.library_card.label;"/>
+                       <label id="patron_card" />
+               </row>
+               <row id="pdsgr1">
+                       <label id="PatronSummaryContact_ident_label" class="text_right"
+                               value="&staff.patron_display.ident1.label;"/>
+                       <hbox id="pdsgr0h">
+                               <label id="patron_ident_type_1" />
+                               <label id="patron_ident_value_1" />
+                       </hbox>
+               </row>
+               <row id="pdsgr2">
+                       <label id="PatronSummaryContact_ident_label2" class="text_right"
+                               value="&staff.patron_display.ident2.label;"/>
+                       <hbox id="pdsgr0ah">
+                               <label id="patron_ident_type_2" />
+                               <label id="patron_ident_value_2" />
+                       </hbox>
+               </row>
+               <row id="pdsgr3">
+                       <label id="PatronSummaryContact_date_of_birth_label" class="text_right"
+                               value="&staff.patron_display.date_of_birth.label;"/>
+                       <label id="patron_date_of_birth" />
+               </row>
+               <row id="pdsgr4"><label id="pdsgr4l" value=" "/></row>
+       </rows>
+</grid>
+
+<grid id="PatronSummaryContact_grid_phone">
+       <columns id="pdcgpc">
+               <column id="pdcgpc1" />
+               <column id="pdcgpc2" />
+       </columns>
+       <rows id="pdcgpr" flex="1">
+               <row id="pdcgpr1">
+                       <label id="PatronSummaryContact_day_phone_label" class="text_right"
+                               value="&staff.patron_display.day_phone.label;" />
+                       <label id="patron_day_phone" /> 
+               </row>
+               <row id="pdcgpr2">
+                       <label id="PatronSummaryContact_evening_phone_label" class="text_right"
+                               value="&staff.patron_display.evening_phone.label;" />
+                       <label id="patron_evening_phone" />
+               </row>
+               <row id="pdcgpr3">
+                       <label id="PatronSummaryContact_other_phone_label" class="text_right"
+                               value="&staff.patron_display.other_phone.label;" />
+                       <label id="patron_other_phone" /> 
+               </row>
+               <row id="pdsgpr4"><label id="pdsgpr4l" value=" "/></row>
+               <row id="pdcgpr5">
+                       <label id="PatronSummaryContact_email_label" class="text_right"
+                               value="&staff.patron_display.email.label;" />
+                       <label id="patron_email" />
+               </row>
+               <row id="pdsgpr6"><label id="pdsgpr6l" value=" "/></row>
+
+       </rows>
+</grid>
+
+<groupbox id="PatronSummaryContact_mailing_address" orient="vertical">
+       <caption id="pdcmac" label="&staff.patron_display.mailing_address;"/>
+       <label id="patron_mailing_address_street1" tooltiptext="&staff.patron_display.mailing.street1.label;" />
+       <label id="patron_mailing_address_street2" tooltiptext="&staff.patron_display.mailing.street2.label;" />
+       <hbox id="pdcmah">
+               <label id="patron_mailing_address_city" tooltiptext="&staff.patron_display.mailing.city.label;" />
+               <label id="patron_mailing_address_state" tooltiptext="&staff.patron_display.mailing.state.label;" />
+               <label id="patron_mailing_address_post_code" tooltiptext="&staff.patron_display.mailing.post_code.label;" />
+       </hbox>
+</groupbox>
+
+<groupbox id="PatronSummaryContact_physical_address" orient="vertical">
+       <caption id="pdcpac" label="&staff.patron_display.physical_address;"/>
+       <label id="patron_physical_address_street1" tooltiptext="&staff.patron_display.physical.street1.label;" />
+       <label id="patron_physical_address_street2" tooltiptext="&staff.patron_display.physical.street2.label;" />
+       <hbox id="pdcpah">
+               <label id="patron_physical_address_city" tooltiptext="&staff.patron_display.physical.city.label;" />
+               <label id="patron_physical_address_state" tooltiptext="&staff.patron_display.physical.state.label;" />
+               <label id="patron_physical_address_post_code" tooltiptext="&staff.patron_display.physical.post_code.label;" />
+       </hbox>
+</groupbox>
+
+</overlay>