[open-ils-commits] SPAM: r9507 - in branches/acq-experiment: . Open-ILS/examples Open-ILS/examples/apache Open-ILS/src/extras Open-ILS/src/extras/import Open-ILS/src/perlmods/OpenILS/Application/Cat Open-ILS/src/python Open-ILS/src/sql/Pg Open-ILS/web/conify/global Open-ILS/web/conify/global/config Open-ILS/web/conify/global/permission Open-ILS/web/js/dojo/openils/widget Open-ILS/web/opac/common/js Open-ILS/web/opac/skin/default/js Open-ILS/web/reports Open-ILS/xul/staff_client/chrome/content/OpenILS Open-ILS/xul/staff_client/chrome/content/main Open-ILS/xul/staff_client/chrome/content/util Open-ILS/xul/staff_client/defaults/preferences Open-ILS/xul/staff_client/server/cat Open-ILS/xul/staff_client/server/main Open-ILS/xul/staff_client/server/patron

svn at svn.open-ils.org svn at svn.open-ils.org
Sun May 4 20:58:17 EDT 2008


Author: erickson
Date: 2008-05-04 20:58:16 -0400 (Sun, 04 May 2008)
New Revision: 9507

Added:
   branches/acq-experiment/Open-ILS/src/sql/Pg/012.schema.vandelay.sql
   branches/acq-experiment/Open-ILS/src/sql/Pg/1.2.1-1.2.2-upgrade-db.sql
   branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/nls/
Modified:
   branches/acq-experiment/
   branches/acq-experiment/Open-ILS/examples/apache/eg_vhost.conf
   branches/acq-experiment/Open-ILS/examples/fm_IDL.xml
   branches/acq-experiment/Open-ILS/examples/oils_sip.xml.example
   branches/acq-experiment/Open-ILS/src/extras/fieldmapper.pl
   branches/acq-experiment/Open-ILS/src/extras/import/marc2are.pl
   branches/acq-experiment/Open-ILS/src/extras/org_tree_js.pl
   branches/acq-experiment/Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm
   branches/acq-experiment/Open-ILS/src/python/setup.py
   branches/acq-experiment/Open-ILS/src/sql/Pg/002.functions.config.sql
   branches/acq-experiment/Open-ILS/src/sql/Pg/950.data.seed-values.sql
   branches/acq-experiment/Open-ILS/src/sql/Pg/example.reporter-extension.sql
   branches/acq-experiment/Open-ILS/src/sql/Pg/reporter-schema.sql
   branches/acq-experiment/Open-ILS/web/conify/global/admin.js
   branches/acq-experiment/Open-ILS/web/conify/global/config/copy_status.html
   branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.html
   branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.js
   branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/TranslatorPopup.js
   branches/acq-experiment/Open-ILS/web/opac/common/js/utils.js
   branches/acq-experiment/Open-ILS/web/opac/skin/default/js/result_common.js
   branches/acq-experiment/Open-ILS/web/reports/oils_rpt_folder_window.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/constants.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/menu.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/browser.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/deck.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/error.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/list.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/network.js
   branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/print.js
   branches/acq-experiment/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
   branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marc_new.xul
   branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marcedit.js
   branches/acq-experiment/Open-ILS/xul/staff_client/server/main/ws_info.xul
   branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue.xhtml
   branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue_config.js
   branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/util.js
Log:
Merged revisions 9444-9445,9447-9450,9452-9453,9456,9458,9460-9462,9464-9474,9476-9477,9479,9481-9484,9486,9490,9492,9494,9496,9498,9505-9506 via svnmerge from 
svn://svn.open-ils.org/ILS/trunk

........
  r9444 | miker | 2008-04-23 22:30:21 -0400 (Wed, 23 Apr 2008) | 1 line
  
  use 001 as the authority record number value
........
  r9445 | miker | 2008-04-23 23:02:32 -0400 (Wed, 23 Apr 2008) | 1 line
  
  initial vandelay schema
........
  r9447 | miker | 2008-04-24 12:50:56 -0400 (Thu, 24 Apr 2008) | 1 line
  
  adding vandelay IDL section
........
  r9448 | miker | 2008-04-24 16:10:54 -0400 (Thu, 24 Apr 2008) | 1 line
  
  add translation support to the, um, translation widget; add example es-us translation
........
  r9449 | miker | 2008-04-24 16:29:54 -0400 (Thu, 24 Apr 2008) | 1 line
  
  moving es-us to es to catch all es-*
........
  r9450 | miker | 2008-04-24 16:39:34 -0400 (Thu, 24 Apr 2008) | 1 line
  
  typo in translate
........
  r9452 | erickson | 2008-04-25 16:33:10 -0400 (Fri, 25 Apr 2008) | 4 lines
  
  
  forward-porting merge_bib_records perm and adding it to the seed data
........
  r9453 | miker | 2008-04-26 12:05:14 -0400 (Sat, 26 Apr 2008) | 1 line
  
  sql script for upgrading to a materialized version of the simple record view (reporting speed)
........
  r9456 | miker | 2008-04-26 12:13:13 -0400 (Sat, 26 Apr 2008) | 1 line
  
  add reporter.materialized_simple_record to the base schema
........
  r9458 | miker | 2008-04-26 12:49:25 -0400 (Sat, 26 Apr 2008) | 1 line
  
  base materialized simple record on old super_simple_record
........
  r9460 | miker | 2008-04-26 14:05:58 -0400 (Sat, 26 Apr 2008) | 1 line
  
  allow deleted records to be visible
........
  r9461 | dbs | 2008-04-27 21:11:04 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Kill one JavaScript warning for an apparent typo
........
  r9462 | dbs | 2008-04-27 21:25:36 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Clean up trailing comma
........
  r9464 | dbs | 2008-04-27 21:34:29 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  ECMA-262 isn't happy when variables are declared without var...
........
  r9465 | dbs | 2008-04-27 22:40:20 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Silence a few more trailing comma warnings
........
  r9466 | dbs | 2008-04-27 22:41:50 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  And silence a few more trailing comma warnings
........
  r9467 | dbs | 2008-04-27 22:57:52 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Silence some more trailing comma warnings
........
  r9468 | dbs | 2008-04-27 23:00:50 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Silence another trailing comma warning
........
  r9469 | dbs | 2008-04-27 23:13:43 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  ue.xhtml goes nuts with " if we escape the calendar script
........
  r9470 | dbs | 2008-04-27 23:38:54 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Declare the globalOrgTypes var to silence another warning
........
  r9471 | dbs | 2008-04-27 23:43:59 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Silence a few more trailing comma warnings
........
  r9472 | dbs | 2008-04-27 23:52:44 -0400 (Sun, 27 Apr 2008) | 2 lines
  
  Silence a lot more trailing comma warnings
........
  r9473 | miker | 2008-04-28 01:08:58 -0400 (Mon, 28 Apr 2008) | 1 line
  
  made translation widget self-contained
........
  r9474 | miker | 2008-04-28 03:42:25 -0400 (Mon, 28 Apr 2008) | 1 line
  
  fixing translator for grids
........
  r9476 | miker | 2008-04-28 08:15:25 -0400 (Mon, 28 Apr 2008) | 1 line
  
  improved concurrency detection
........
  r9477 | dbs | 2008-04-28 11:24:37 -0400 (Mon, 28 Apr 2008) | 2 lines
  
  x.y.z for egg versions seems to satisfy setuptools and avoid first-time install errors
........
  r9479 | miker | 2008-04-28 14:19:37 -0400 (Mon, 28 Apr 2008) | 1 line
  
  1.2.1 to 1.2.2 upgrade SQL script; will get 1.2 to 1.4/2.0 as well
........
  r9481 | dbs | 2008-04-29 09:48:20 -0400 (Tue, 29 Apr 2008) | 2 lines
  
  Try giving our application a default locale
........
  r9482 | dbs | 2008-04-29 09:49:05 -0400 (Tue, 29 Apr 2008) | 2 lines
  
  Remove duplicate span id
........
  r9483 | dbs | 2008-04-29 09:49:47 -0400 (Tue, 29 Apr 2008) | 2 lines
  
  JavaScript strictness cleanup to reduce warning noise at console
........
  r9484 | dbs | 2008-04-29 10:25:52 -0400 (Tue, 29 Apr 2008) | 2 lines
  
  Silence more trailing comma warnings
........
  r9486 | miker | 2008-04-29 13:50:09 -0400 (Tue, 29 Apr 2008) | 1 line
  
  protecting against existing views
........
  r9490 | miker | 2008-04-30 00:50:12 -0400 (Wed, 30 Apr 2008) | 1 line
  
  adding some more billing report views
........
  r9492 | miker | 2008-04-30 08:17:45 -0400 (Wed, 30 Apr 2008) | 1 line
  
  protect against empty folder names
........
  r9494 | miker | 2008-04-30 08:30:18 -0400 (Wed, 30 Apr 2008) | 1 line
  
  bz#618, stop duplicate authority cross-ref suggestions
........
  r9496 | miker | 2008-04-30 18:19:36 -0400 (Wed, 30 Apr 2008) | 1 line
  
  use org_unit datatype for easier filtering
........
  r9498 | miker | 2008-04-30 22:47:09 -0400 (Wed, 30 Apr 2008) | 1 line
  
  typo in field name
........
  r9505 | erickson | 2008-05-03 07:58:45 -0400 (Sat, 03 May 2008) | 1 line
  
  added additional needed script path to sip config
........
  r9506 | miker | 2008-05-04 19:51:08 -0400 (Sun, 04 May 2008) | 1 line
  
  break up the transactions a bit more, and move DROPs outside of transactions, as they are allowed to fail
........



Property changes on: branches/acq-experiment
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk:1-9442
   + /trunk:1-9506

Modified: branches/acq-experiment/Open-ILS/examples/apache/eg_vhost.conf
===================================================================
--- branches/acq-experiment/Open-ILS/examples/apache/eg_vhost.conf	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/examples/apache/eg_vhost.conf	2008-05-05 00:58:16 UTC (rev 9507)
@@ -103,6 +103,7 @@
 # ----------------------------------------------------------------------------------
 <LocationMatch /xul/.*\.xhtml$>
     Options +Includes
+    XMLEntEscapeScript "no"
     AddOutputFilter INCLUDES;XMLENT .xhtml
     allow from all
 

Modified: branches/acq-experiment/Open-ILS/examples/fm_IDL.xml
===================================================================
--- branches/acq-experiment/Open-ILS/examples/fm_IDL.xml	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/examples/fm_IDL.xml	2008-05-05 00:58:16 UTC (rev 9507)
@@ -136,6 +136,256 @@
 
 
 	<!-- Actually in the DB -->
+	<class id="vbq" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::bib_queue" oils_persist:tablename="vandelay.bib_queue" reporter:label="Import/Overlay Bib Queue">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Queue ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:selector="name" reporter:datatype="id"/>
+			<field reporter:label="Owner" name="owner" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Name" name="name" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+			<field reporter:label="Complete" name="complete" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="bool"/>
+			<field reporter:label="Type" name="queue_type" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Purpose" name="queue_purpose" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+		</fields>
+		<links>
+			<link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_BIB_IMPORT_QUEUE|UPDATE_BIB_IMPORT_QUEUE|DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqbr" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::queued_bib_record" oils_persist:tablename="vandelay.queued_bib_record" reporter:label="Queued Bib Record">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Record ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Create Time" name="create_time" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+			<field reporter:label="Import Time" name="import_time" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+			<field reporter:label="MARC" name="marc" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Queue" name="queue" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Bib Source" name="bib_source" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Final Target Record" name="imported_as" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="link"/>
+		</fields>
+		<links>
+			<link field="queue" reltype="has_a" key="id" map="" class="vbq"/>
+			<link field="bib_source" reltype="has_a" key="id" map="" class="cbs"/>
+			<link field="imported_as" reltype="has_a" key="id" map="" class="bre"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_BIB_IMPORT_QUEUE|UPDATE_BIB_IMPORT_QUEUE|DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqbrad" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::bib_attr_definition" oils_persist:tablename="vandelay.bib_attr_definition" reporter:label="Queued Bib Record Attribute Definition">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Code" name="code" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Description" name="description" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+			<field reporter:label="XPath" name="xpath" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Remove RegExp" name="remove" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Is Identifier?" name="ident" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="bool"/>
+		</fields>
+		<links/>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_BIB_IMPORT_FIELD_DEF" global_required="true"/>
+				<retrieve permission="CREATE_BIB_IMPORT_IMPORT_FIELD_DEF|UPDATE_BIB_IMPORT_IMPORT_FIELD_DEF|DELETE_BIB_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+				<update permission="UPDATE_BIB_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+				<delete permission="DELETE_BIB_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqbra" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::queued_bib_record_attr" oils_persist:tablename="vandelay.queued_bib_record_attr" reporter:label="Queued Bib Record Attribute">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Attribute ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Record" name="record" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Field" name="field" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Value" name="attr_value" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+		</fields>
+		<links>
+			<link field="record" reltype="has_a" key="id" map="" class="vqbr"/>
+			<link field="field" reltype="has_a" key="id" map="" class="vqbrad"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_BIB_IMPORT_QUEUE|UPDATE_BIB_IMPORT_QUEUE|DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vbm" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::bib_match" oils_persist:tablename="vandelay.bib_match" reporter:label="Queued Bib Record Match">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Match ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Queued Record" name="queued_record" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Matched Attribute" name="field" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Evergreen Record" name="eg_record" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Field Type" name="field_type" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+		</fields>
+		<links>
+			<link field="queued_record" reltype="has_a" key="id" map="" class="vqbr"/>
+			<link field="eg_record" reltype="has_a" key="id" map="" class="bre"/>
+			<link field="matched_attr" reltype="has_a" key="id" map="" class="vqbra"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_BIB_IMPORT_QUEUE|UPDATE_BIB_IMPORT_QUEUE|DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_BIB_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_BIB_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vaq" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::authority_queue" oils_persist:tablename="vandelay.authority_queue" reporter:label="Import/Overlay Authority Queue">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Queue ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:selector="name" reporter:datatype="id"/>
+			<field reporter:label="Owner" name="owner" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Name" name="name" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+			<field reporter:label="Complete" name="complete" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="bool"/>
+			<field reporter:label="Type" name="queue_type" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Purpose" name="queue_purpose" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+		</fields>
+		<links>
+			<link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_AUTHORITY_IMPORT_QUEUE|UPDATE_AUTHORITY_IMPORT_QUEUE|DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqar" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::queued_authority_record" oils_persist:tablename="vandelay.queued_authority_record" reporter:label="Queued Authority Record">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Record ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Create Time" name="create_time" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+			<field reporter:label="Import Time" name="import_time" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+			<field reporter:label="MARC" name="marc" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Queue" name="queue" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Final Target Record" name="imported_as" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="link"/>
+		</fields>
+		<links>
+			<link field="queue" reltype="has_a" key="id" map="" class="vaq"/>
+			<link field="imported_as" reltype="has_a" key="id" map="" class="are"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_AUTHORITY_IMPORT_QUEUE|UPDATE_AUTHORITY_IMPORT_QUEUE|DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqarad" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::authority_attr_definition" oils_persist:tablename="vandelay.authority_attr_definition" reporter:label="Queued Authority Record Attribute Definition">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Code" name="code" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Description" name="description" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+			<field reporter:label="XPath" name="xpath" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Remove RegExp" name="remove" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Is Identifier?" name="ident" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="bool"/>
+		</fields>
+		<links/>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+				<retrieve permission="CREATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF|UPDATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF|DELETE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+				<update permission="UPDATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+				<delete permission="DELETE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vqara" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::queued_authority_record_attr" oils_persist:tablename="vandelay.queued_authority_record_attr" reporter:label="Queued Authority Record Attribute">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Attribute ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Record" name="record" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Field" name="field" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Value" name="attr_value" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+		</fields>
+		<links>
+			<link field="record" reltype="has_a" key="id" map="" class="vaqr"/>
+			<link field="field" reltype="has_a" key="id" map="" class="vqarad"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_AUTHORITY_IMPORT_QUEUE|UPDATE_AUTHORITY_IMPORT_QUEUE|DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class id="vam" controller="open-ils.cstore" oils_obj:fieldmapper="vandelay::authority_match" oils_persist:tablename="vandelay.authority_match" reporter:label="Queued Authority Record Match">
+		<fields oils_persist:primary="code" oils_persist:sequence="">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Match ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+			<field reporter:label="Queued Record" name="queued_record" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Matched Attribute" name="field" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
+			<field reporter:label="Evergreen Record" name="eg_record" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="link"/>
+		</fields>
+		<links>
+			<link field="queued_record" reltype="has_a" key="id" map="" class="vqbr"/>
+			<link field="eg_record" reltype="has_a" key="id" map="" class="bre"/>
+			<link field="matched_attr" reltype="has_a" key="id" map="" class="vqbra"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<retrieve permission="CREATE_AUTHORITY_IMPORT_QUEUE|UPDATE_AUTHORITY_IMPORT_QUEUE|DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<update permission="UPDATE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+				<delete permission="DELETE_AUTHORITY_IMPORT_QUEUE" global_required="true"/>
+			</actions>
+		</permacrud>
+	</class>
+
+
 	<class id="auoi" controller="open-ils.cstore" oils_obj:fieldmapper="actor::usr_org_unit_opt_in" oils_persist:tablename="actor.usr_org_unit_opt_in" reporter:label="User Sharing Opt-in">
 		<fields oils_persist:primary="id" oils_persist:sequence="actor.usr_org_unit_opt_in_id_seq">
 			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -865,7 +1115,7 @@
 		<links>
 			<link field="editor" reltype="has_a" key="id" map="" class="au"/>
 			<link field="creator" reltype="has_a" key="id" map="" class="au"/>
-			<link field="simple_record" reltype="might_have" key="id" map="" class="rssr"/>
+			<link field="simple_record" reltype="might_have" key="id" map="" class="rmsr"/>
 			<link field="metarecord" reltype="might_have" key="source" map="metarecord" class="mmrsm"/>
 			<link field="call_numbers" reltype="has_many" key="record" map="" class="acn"/>
 			<link field="keyword_field_entries" reltype="has_many" key="source" map="" class="mkfe"/>
@@ -3513,6 +3763,28 @@
 			<link field="folder" reltype="has_a" key="id" map="" class="rof"/>
 		</links>
 	</class>
+	<class id="rmsr" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::materialized_simple_record" oils_persist:tablename="reporter.materialized_simple_record" reporter:label="Fast Simple Record Extracts">
+		<fields oils_persist:primary="id">
+			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+			<field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+			<field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+			<field reporter:label="Record ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+			<field reporter:label="Fingerprint" name="fingerprint" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Overall Record Quality" name="quality" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="int"/>
+			<field reporter:label="TCN Source" name="tcn_source" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="TCN Value" name="tcn_value" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Title Proper (normalized)" name="title" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Author (normalized)" name="author" oils_obj:array_position="9" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Publisher (normalized)" name="publisher" oils_obj:array_position="10" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Publication Year (normalized)" name="pubdate" oils_obj:array_position="11" oils_persist:virtual="false" reporter:datatype="int"/>
+			<field reporter:label="ISBN" name="isbn" oils_obj:array_position="12" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="ISSN" name="issn" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="text"/>
+			<field reporter:label="Full Bibliographic record" name="biblio_record" oils_obj:array_position="14" oils_persist:virtual="true" reporter:datatype="link"/>
+		</fields>
+		<links>
+			<link field="biblio_record" reltype="might_have" key="id" map="" class="bre"/>
+		</links>
+	</class>
 	<class id="rssr" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::super_simple_record" oils_persist:tablename="reporter.super_simple_record" reporter:label="Simple Record Extracts">
 		<fields oils_persist:primary="id">
 			<field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -3907,6 +4179,105 @@
         </links>
     </class>
 
+    <class id="rmocbbol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_circ_balance_by_owning_lib" oils_persist:tablename="money.open_circ_balance_by_owning_lib" reporter:core="true" reporter:label="Open Circulation Billing by Owning Library">
+        <fields oils_persist:primary="id">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="Circulation ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Type" name="billing_type" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Total Billed" name="billed" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="id" reltype="has_a" key="id" map="" class="circ"/>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+    <class id="rmobbol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_balance_by_owning_lib" oils_persist:tablename="money.open_balance_by_owning_lib" reporter:core="true" reporter:label="Open Circulation Balance by Owning Library">
+        <fields oils_persist:primary="owning_lib">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Types" name="billing_types" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Balance" name="balance" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+    <class id="rmocbbcol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_circ_balance_by_circ_and_owning_lib" oils_persist:tablename="money.open_circ_balance_by_circ_and_owning_lib" reporter:core="true" reporter:label="Open Circulation Billing by Circulating Library and Owning Library">
+        <fields oils_persist:primary="id">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="Circulation ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="Circulating Library" name="circ_lib" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Type" name="billing_type" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Total Billed" name="billed" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="id" reltype="has_a" key="id" map="" class="circ"/>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+            <link field="circ_lib" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+    <class id="rmobbcol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_balance_by_circ_and_owning_lib" oils_persist:tablename="money.open_balance_by_circ_and_owning_lib" reporter:core="true" reporter:label="Open Circulation Balance by Circulating Library and Owning Library">
+        <fields oils_persist:primary="circ_lib">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="Circulating Library" name="circ_lib" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Types" name="billing_types" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Balance" name="balance" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+            <link field="circ_lib" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+    <class id="rmocbbhol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_circ_balance_by_usr_home_and_owning_lib" oils_persist:tablename="money.open_circ_balance_by_usr_home_and_owning_lib" reporter:core="true" reporter:label="Open Circulation Billing by User Home Library and Owning Library">
+        <fields oils_persist:primary="id">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="Circulation ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="link"/>
+            <field reporter:label="User Home Library" name="home_ou" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Type" name="billing_type" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Total Billed" name="billed" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="id" reltype="has_a" key="id" map="" class="circ"/>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+            <link field="home_ou" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+    <class id="rmobbhol" controller="open-ils.reporter-store" oils_obj:fieldmapper="reporter::money::open_balance_by_usr_home_and_owning_lib" oils_persist:tablename="money.open_balance_by_usr_home_and_owning_lib" reporter:core="true" reporter:label="Open Circulation Balance by User Home Library and Owning Library">
+        <fields oils_persist:primary="home_ou">
+            <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+            <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+            <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+            <field reporter:label="User Home Library" name="home_ou" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Owning Library" name="owning_lib" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+            <field reporter:label="Billing Types" name="billing_types" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+            <field reporter:label="Balance" name="balance" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="money"/>
+        </fields>
+        <links>
+            <link field="owning_lib" reltype="has_a" key="id" map="" class="aou"/>
+            <link field="home_ou" reltype="has_a" key="id" map="" class="aou"/>
+        </links>
+    </class>
+
+
 	<!-- ********************************************************************************************************************* -->
 
 </IDL>

Modified: branches/acq-experiment/Open-ILS/examples/oils_sip.xml.example
===================================================================
--- branches/acq-experiment/Open-ILS/examples/oils_sip.xml.example	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/examples/oils_sip.xml.example	2008-05-05 00:58:16 UTC (rev 9507)
@@ -81,6 +81,7 @@
 
 				<scripts>
 					<path>/openils/var/</path>
+                    <path>/openils/var/catalog/</path>
 					<item_config>circ/circ_item_config.js</item_config>
 				</scripts>
 

Modified: branches/acq-experiment/Open-ILS/src/extras/fieldmapper.pl
===================================================================
--- branches/acq-experiment/Open-ILS/src/extras/fieldmapper.pl	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/extras/fieldmapper.pl	2008-05-05 00:58:16 UTC (rev 9507)
@@ -63,5 +63,5 @@
 
 }
 
-print "fmclasses = _c;\n";
+print "var fmclasses = _c;\n";
 

Modified: branches/acq-experiment/Open-ILS/src/extras/import/marc2are.pl
===================================================================
--- branches/acq-experiment/Open-ILS/src/extras/import/marc2are.pl	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/extras/import/marc2are.pl	2008-05-05 00:58:16 UTC (rev 9507)
@@ -61,6 +61,9 @@
 while ( try { $rec = $batch->next } otherwise { $rec = -1 } ) {
 	next if ($rec == -1);
 	my $id = $count;
+	my $_001 = $rec->field('001');
+	my $arn = $count;
+	$arn = $_001->data if ($_001);
 
 	(my $xml = $rec->as_xml_record()) =~ s/\n//sog;
 	$xml =~ s/^<\?xml.+\?\s*>//go;
@@ -79,7 +82,7 @@
 	$bib->editor($user);
 	$bib->edit_date('now');
 	$bib->arn_source('LEGACY');
-	$bib->arn_value($count);
+	$bib->arn_value($arn);
 	$bib->last_xact_id('IMPORT-'.$starttime);
 
 	print OpenSRF::Utils::JSON->perl2JSON($bib)."\n";

Modified: branches/acq-experiment/Open-ILS/src/extras/org_tree_js.pl
===================================================================
--- branches/acq-experiment/Open-ILS/src/extras/org_tree_js.pl	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/extras/org_tree_js.pl	2008-05-05 00:58:16 UTC (rev 9507)
@@ -59,7 +59,7 @@
 $pile .= "]; /* Org Units */ \n";
 
 
-$pile .= 'globalOrgTypes = [';
+$pile .= 'var globalOrgTypes = [';
 for my $t (@$types) {
     my ($u,$v,$d,$i,$n,$o,$p) = (val($t->can_have_users),val($t->can_have_vols),$t->depth,$t->id,val($t->name),val($t->opac_label),$t->parent);
     $p ||= 'null';

Modified: branches/acq-experiment/Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm
===================================================================
--- branches/acq-experiment/Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm	2008-05-05 00:58:16 UTC (rev 9507)
@@ -38,6 +38,10 @@
 sub merge_records {
 	my( $editor, $master, $records ) = @_;
 
+    # bib records are global objects, so no org context required.
+    return (undef, $editor->die_event) 
+        unless $editor->allowed('MERGE_BIB_RECORDS');
+
 	my $vol;
 	my $evt;
 
@@ -133,7 +137,7 @@
 				$record->deleted('f');
 				$record->editor($reqr->id);
 				$record->edit_date('now');
-				$editor->update_biblio_record_entry($record, {checkperm => 1})
+				$editor->update_biblio_record_entry($record)
 					or return $editor->die_event;
 			}
 
@@ -142,7 +146,7 @@
 			$record->deleted('t');
 			$record->editor($reqr->id);
 			$record->edit_date('now');
-			$editor->update_biblio_record_entry($record, {checkperm => 1})
+			$editor->update_biblio_record_entry($record)
 				or return $editor->die_event;
 		}
 	}
@@ -216,7 +220,6 @@
 		$_->deleted('t');
 		$_->editor($editor->requestor->id);
 		$_->edit_date('now');
-		return (undef,$editor->die_event) unless $editor->allowed('UPDATE_VOLUME', $_->owning_lib);
 		$editor->update_asset_call_number($_) or return (undef, $editor->die_event);
         merge_volume_holds($editor, $bigcn, $_->id);
 	}

Modified: branches/acq-experiment/Open-ILS/src/python/setup.py
===================================================================
--- branches/acq-experiment/Open-ILS/src/python/setup.py	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/python/setup.py	2008-05-05 00:58:16 UTC (rev 9507)
@@ -2,7 +2,7 @@
 from setuptools import setup
 
 setup(name='Evergreen',
-    version='1.4',
+    version='1.4.0',
     install_requires='OpenSRF>=1.0',
     description='Evergreen Python Modules',
     author='Bill Erickson',

Modified: branches/acq-experiment/Open-ILS/src/sql/Pg/002.functions.config.sql
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/002.functions.config.sql	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/002.functions.config.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -40,6 +40,14 @@
 
 */
 
+CREATE OR REPLACE FUNCTION public.extract_marc_field ( TEXT, BIGINT, TEXT, TEXT ) RETURNS TEXT AS $$
+    SELECT regexp_replace(array_to_string( array_accum( output ),' ' ),$4,'','g') FROM xpath_table('id', 'marc', $1, $3, 'id='||$2)x(id INT, output TEXT);
+$$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION public.extract_marc_field ( TEXT, BIGINT, TEXT ) RETURNS TEXT AS $$
+	SELECT public.extract_marc_field($1,$2,$3,'');
+$$ LANGUAGE SQL;
+
 CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keytable TEXT, keyclass TEXT, keycol TEXT, identcol TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
 DECLARE
     locale      TEXT := LOWER( REGEXP_REPLACE( REGEXP_REPLACE( raw_locale, E'[;, ].+$', '' ), E'-', '_', 'g' ) );

Copied: branches/acq-experiment/Open-ILS/src/sql/Pg/012.schema.vandelay.sql (from rev 9506, trunk/Open-ILS/src/sql/Pg/012.schema.vandelay.sql)
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/012.schema.vandelay.sql	                        (rev 0)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/012.schema.vandelay.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -0,0 +1,246 @@
+DROP SCHEMA vandelay CASCADE;
+
+BEGIN;
+
+CREATE SCHEMA vandelay;
+
+CREATE TABLE vandelay.queue (
+	id				BIGSERIAL	PRIMARY KEY,
+	owner			INT			NOT NULL REFERENCES actor.usr (id),
+	name			TEXT		NOT NULL,
+	complete		BOOL		NOT NULL DEFAULT FALSE,
+	queue_type		TEXT		NOT NULL DEFAULT 'bib' CHECK (queue_type IN ('bib','authority')),
+	queue_purpose	TEXT		NOT NULL DEFAULT 'import' CHECK (queue_purpose IN ('import','overlay')),
+	CONSTRAINT vand_queue_name_once_per_owner_const UNIQUE (owner,name,queue_type)
+);
+
+CREATE TABLE vandelay.queued_record (
+    id                  BIGSERIAL                   PRIMARY KEY,
+    create_time         TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
+    import_time         TIMESTAMP WITH TIME ZONE,
+    marc                TEXT                        NOT NULL
+);
+
+
+
+/* Bib stuff at the top */
+----------------------------------------------------
+
+CREATE TABLE vandelay.bib_attr_definition (
+	id			SERIAL	PRIMARY KEY,
+	code		TEXT	UNIQUE NOT NULL,
+	description	TEXT,
+	xpath		TEXT	NOT NULL,
+	remove		TEXT	NOT NULL DEFAULT '',
+	ident		BOOL	NOT NULL DEFAULT FALSE
+);
+
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('title','Title of work','//*[@tag="245"]/*[contains("abcmnopr", at code)]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('author','Author of work','//*[@tag="100" or @tag="110" or @tag="113"]/*[contains("ad", at code)]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('language','Lanuage of work','//*[@tag="240"]/*[@code="l"][1]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('pagination','Pagination','//*[@tag="300"]/*[@code="a"][1]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, ident, remove ) VALUES ('isbn','ISBN','//*[@tag="020"]/*[@code="a"]', TRUE, $r$(?:-|\s.+$)$r$);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, ident, remove ) VALUES ('issn','ISSN','//*[@tag="022"]/*[@code="a"]', TRUE, $r$(?:-|\s.+$)$r$);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('price','Price','//*[@tag="020" or @tag="022"]/*[@code="c"][1]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, ident ) VALUES ('rec_identifier','Identifier','//*[@tag="001"]', TRUE);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, ident ) VALUES ('eg_identifier','Identifier','//*[@tag="901"]/*[@code="c"]', TRUE);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, ident ) VALUES ('eg_tcn','Identifier','//*[@tag="901"]/*[@code="a"]', TRUE);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('publisher','Publisher','//*[@tag="260"]/*[@code="b"][1]');
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath, remove ) VALUES ('pubdate','Publication Date','//*[@tag="260"]/*[@code="c"][1]',$r$\D$r$);
+INSERT INTO vandelay.bib_attr_definition ( code, description, xpath ) VALUES ('edition','Edition','//*[@tag="250"]/*[@code="a"][1]');
+
+
+CREATE TABLE vandelay.bib_queue (
+	queue_type	TEXT		NOT NULL DEFAULT 'bib' CHECK (queue_type = 'bib'),
+	CONSTRAINT vand_bib_queue_name_once_per_owner_const UNIQUE (owner,name,queue_type)
+) INHERITS (vandelay.queue);
+ALTER TABLE vandelay.bib_queue ADD PRIMARY KEY (id);
+
+CREATE TABLE vandelay.queued_bib_record (
+	queue		INT	NOT NULL REFERENCES vandelay.bib_queue (id) ON DELETE CASCADE,
+	bib_source	INT	REFERENCES config.bib_source (id),
+	imported_as	INT	REFERENCES biblio.record_entry (id)
+) INHERITS (vandelay.queued_record);
+ALTER TABLE vandelay.queued_bib_record ADD PRIMARY KEY (id);
+
+CREATE TABLE vandelay.queued_bib_record_attr (
+	id			BIGSERIAL	PRIMARY KEY,
+	record		BIGINT		NOT NULL REFERENCES vandelay.queued_bib_record (id),
+	field		INT			NOT NULL REFERENCES vandelay.bib_attr_definition (id),
+	attr_value	TEXT		NOT NULL
+);
+
+CREATE TABLE vandelay.bib_match (
+	id				BIGSERIAL	PRIMARY KEY,
+	field_type		TEXT		NOT NULL CHECK (field_type in ('isbn','tcn_value','id')),
+	matched_attr	INT			REFERENCES vandelay.queued_bib_record_attr (id) ON DELETE CASCADE,
+	queued_record	BIGINT		REFERENCES vandelay.queued_bib_record (id) ON DELETE CASCADE,
+	eg_record		BIGINT		REFERENCES biblio.record_entry (id)
+);
+
+CREATE OR REPLACE FUNCTION vandelay.ingest_bib_marc ( ) RETURNS TRIGGER AS $$
+DECLARE
+    value   TEXT;
+    atype   TEXT;
+    adef    RECORD;
+BEGIN
+    FOR adef IN SELECT * FROM vandelay.bib_attr_definition LOOP
+
+        SELECT extract_marc_field('vandelay.queued_bib_record', id, adef.xpath, adef.remove) INTO value FROM vandelay.queued_bib_record WHERE id = NEW.id;
+        IF (value IS NOT NULL AND value <> '') THEN
+            INSERT INTO vandelay.queued_bib_record_attr (record, field, attr_value) VALUES (NEW.id, adef.id, value);
+        END IF;
+
+    END LOOP;
+
+    RETURN NULL;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION vandelay.match_bib_record ( ) RETURNS TRIGGER AS $func$
+DECLARE
+    attr    RECORD;
+    eg_rec  RECORD;
+BEGIN
+    FOR attr IN SELECT a.* FROM vandelay.queued_bib_record_attr a JOIN vandelay.bib_attr_definition d ON (d.id = a.field) WHERE record = NEW.id AND d.ident IS TRUE LOOP
+
+		-- All numbers? check for an id match
+		IF (attr.attr_value ~ $r$^\d+$$r$) THEN
+	        FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE id = attr.attr_value::BIGINT AND deleted IS FALSE LOOP
+		        INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('id', attr.id, NEW.id, eg_rec.id);
+			END LOOP;
+		END IF;
+
+		-- Looks like an ISBN? check for an isbn match
+		IF (attr.attr_value ~* $r$^[0-9x]+$$r$ AND character_length(attr.attr_value) IN (10,13)) THEN
+	        FOR eg_rec IN EXECUTE $$SELECT * FROM metabib.full_rec fr WHERE fr.value LIKE LOWER('$$ || attr.attr_value || $$%') AND fr.tag = '020' AND fr.subfield = 'a'$$ LOOP
+				PERFORM id FROM biblio.record_entry WHERE id = eg_rec.record AND deleted IS FALSE;
+				IF FOUND THEN
+			        INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('isbn', attr.id, NEW.id, eg_rec.record);
+				END IF;
+			END LOOP;
+
+			-- subcheck for isbn-as-tcn
+		    FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = 'i' || attr.attr_value AND deleted IS FALSE LOOP
+			    INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
+	        END LOOP;
+		END IF;
+
+		-- check for an OCLC tcn_value match
+		IF (attr.attr_value ~ $r$^o\d+$$r$) THEN
+		    FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = regexp_replace(attr.attr_value,'^o','ocm') AND deleted IS FALSE LOOP
+			    INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
+	        END LOOP;
+		END IF;
+
+		-- check for a direct tcn_value match
+        FOR eg_rec IN SELECT * FROM biblio.record_entry WHERE tcn_value = attr.attr_value AND deleted IS FALSE LOOP
+            INSERT INTO vandelay.bib_match (field_type, matched_attr, queued_record, eg_record) VALUES ('tcn_value', attr.id, NEW.id, eg_rec.id);
+        END LOOP;
+
+    END LOOP;
+
+    RETURN NULL;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION vandelay.cleanup_bib_marc ( ) RETURNS TRIGGER AS $$
+BEGIN
+    DELETE FROM vandelay.queued_bib_record_attr WHERE lineitem = OLD.id;
+    IF TG_OP = 'UPDATE' THEN
+        RETURN NEW;
+    END IF;
+    RETURN OLD;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER cleanup_bib_trigger
+    BEFORE UPDATE OR DELETE ON vandelay.queued_bib_record
+    FOR EACH ROW EXECUTE PROCEDURE vandelay.cleanup_bib_marc();
+
+CREATE TRIGGER ingest_bib_trigger
+    AFTER INSERT OR UPDATE ON vandelay.queued_bib_record
+    FOR EACH ROW EXECUTE PROCEDURE vandelay.ingest_bib_marc();
+
+CREATE TRIGGER zz_match_bibs_trigger
+    AFTER INSERT OR UPDATE ON vandelay.queued_bib_record
+    FOR EACH ROW EXECUTE PROCEDURE vandelay.match_bib_record();
+
+
+/* Authority stuff down here */
+---------------------------------------
+CREATE TABLE vandelay.authority_attr_definition (
+	id			SERIAL	PRIMARY KEY,
+	code		TEXT	UNIQUE NOT NULL,
+	description	TEXT,
+	xpath		TEXT	NOT NULL,
+	remove		TEXT	NOT NULL DEFAULT '',
+	ident		BOOL	NOT NULL DEFAULT FALSE
+);
+INSERT INTO vandelay.authority_attr_definition ( code, description, xpath, ident ) VALUES ('rec_identifier','Identifier','//*[@tag="001"]', TRUE);
+
+CREATE TABLE vandelay.authority_queue (
+	queue_type	TEXT		NOT NULL DEFAULT 'authority' CHECK (queue_type = 'authority'),
+	CONSTRAINT vand_authority_queue_name_once_per_owner_const UNIQUE (owner,name,queue_type)
+) INHERITS (vandelay.queue);
+ALTER TABLE vandelay.authority_queue ADD PRIMARY KEY (id);
+
+CREATE TABLE vandelay.queued_authority_record (
+	queue		INT	NOT NULL REFERENCES vandelay.authority_queue (id) ON DELETE CASCADE,
+	imported_as	INT	REFERENCES authority.record_entry (id)
+) INHERITS (vandelay.queued_record);
+ALTER TABLE vandelay.queued_authority_record ADD PRIMARY KEY (id);
+
+CREATE TABLE vandelay.queued_authority_record_attr (
+	id			BIGSERIAL	PRIMARY KEY,
+	record		BIGINT		NOT NULL REFERENCES vandelay.queued_authority_record (id),
+	field		INT			NOT NULL REFERENCES vandelay.authority_attr_definition (id),
+	attr_value	TEXT		NOT NULL
+);
+
+CREATE TABLE vandelay.authority_match (
+	id				BIGSERIAL	PRIMARY KEY,
+	matched_attr	INT			REFERENCES vandelay.queued_authority_record_attr (id) ON DELETE CASCADE,
+	queued_record	BIGINT		REFERENCES vandelay.queued_authority_record (id) ON DELETE CASCADE,
+	eg_record		BIGINT		REFERENCES authority.record_entry (id)
+);
+
+CREATE OR REPLACE FUNCTION vandelay.ingest_authority_marc ( ) RETURNS TRIGGER AS $$
+DECLARE
+    value   TEXT;
+    atype   TEXT;
+    adef    RECORD;
+BEGIN
+    FOR adef IN SELECT * FROM vandelay.authority_attr_definition LOOP
+
+        SELECT extract_marc_field('vandelay.queued_authority_record', id, adef.xpath, adef.remove) INTO value FROM vandelay.queued_authority_record WHERE id = NEW.id;
+        IF (value IS NOT NULL AND value <> '') THEN
+            INSERT INTO vandelay.queued_authority_record_attr (record, field, attr_value) VALUES (NEW.id, adef.id, value);
+        END IF;
+
+    END LOOP;
+
+    RETURN NULL;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION vandelay.cleanup_authority_marc ( ) RETURNS TRIGGER AS $$
+BEGIN
+    DELETE FROM vandelay.queued_authority_record_attr WHERE lineitem = OLD.id;
+    IF TG_OP = 'UPDATE' THEN
+        RETURN NEW;
+    END IF;
+    RETURN OLD;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER cleanup_authority_trigger
+    BEFORE UPDATE OR DELETE ON vandelay.queued_authority_record
+    FOR EACH ROW EXECUTE PROCEDURE vandelay.cleanup_authority_marc();
+
+CREATE TRIGGER ingest_authority_trigger
+    AFTER INSERT OR UPDATE ON vandelay.queued_authority_record
+    FOR EACH ROW EXECUTE PROCEDURE vandelay.ingest_authority_marc();
+
+COMMIT;
+

Copied: branches/acq-experiment/Open-ILS/src/sql/Pg/1.2.1-1.2.2-upgrade-db.sql (from rev 9506, trunk/Open-ILS/src/sql/Pg/1.2.1-1.2.2-upgrade-db.sql)
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/1.2.1-1.2.2-upgrade-db.sql	                        (rev 0)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/1.2.1-1.2.2-upgrade-db.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -0,0 +1,719 @@
+/*
+ * Copyright (C) 2008  Equinox Software, Inc.
+ * Mike Rylander <miker at esilibrary.com.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+BEGIN;
+
+-------------------------------------------------------------------
+/* new materialized view for reporting schema -- ok if it fails  */
+-------------------------------------------------------------------
+
+CREATE TABLE reporter.materialized_simple_record AS SELECT * FROM reporter.super_simple_record WHERE 1=0;
+
+INSERT INTO reporter.materialized_simple_record
+    (id,fingerprint,quality,tcn_source,tcn_value,title,author,publisher,pubdate,isbn,issn)
+    SELECT DISTINCT ON (id) * FROM reporter.super_simple_record;
+
+ALTER TABLE reporter.materialized_simple_record ADD PRIMARY KEY (id);
+
+CREATE OR REPLACE VIEW reporter.super_simple_record AS SELECT * FROM reporter.materialized_simple_record;
+
+CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
+SELECT  r.id,
+    r.fingerprint,
+    r.quality,
+    r.tcn_source,
+    r.tcn_value,
+    title.value AS title,
+    FIRST(author.value) AS author,
+    publisher.value AS publisher,
+    SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
+    ARRAY_ACCUM( SUBSTRING(isbn.value FROM $$^\S+$$) ) AS isbn,
+    ARRAY_ACCUM( SUBSTRING(issn.value FROM $$^\S+$$) ) AS issn
+  FROM  biblio.record_entry r
+    LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
+    LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
+    LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
+    LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
+    LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
+    LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
+  GROUP BY 1,2,3,4,5,6,8,9;
+
+CREATE OR REPLACE FUNCTION reporter.simple_rec_sync () RETURNS TRIGGER AS $$
+DECLARE
+    r_id        BIGINT;
+    new_data    RECORD;
+BEGIN
+    IF TG_OP IN ('DELETE') THEN
+        r_id := OLD.record;
+    ELSE
+        r_id := NEW.record;
+    END IF;
+
+    SELECT * INTO new_data FROM reporter.materialized_simple_record WHERE id = r_id FOR UPDATE;
+    DELETE FROM reporter.materialized_simple_record WHERE id = r_id;
+
+    IF TG_OP IN ('DELETE') THEN
+        RETURN OLD;
+    ELSE
+        INSERT INTO reporter.materialized_simple_record SELECT DISTINCT ON (id) * FROM reporter.old_super_simple_record WHERE id = NEW.record;
+        RETURN NEW;
+    END IF;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER zzz_update_materialized_simple_record_tgr
+    AFTER INSERT OR UPDATE OR DELETE ON metabib.full_rec
+    FOR EACH ROW EXECUTE PROCEDURE reporter.simple_rec_sync();
+
+COMMIT;
+
+
+DROP VIEW reporter.overdue_reports;
+DROP VIEW reporter.pending_reports;
+DROP VIEW reporter.currently_running;
+
+BEGIN;
+
+-------------------------------------------------------------------
+/* convenience views for report management                       */
+-------------------------------------------------------------------
+
+CREATE OR REPLACE VIEW reporter.overdue_reports AS
+ SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
+   FROM reporter.schedule s
+   JOIN reporter.report r ON r.id = s.report
+   JOIN actor.usr u ON s.runner = u.id
+   JOIN actor.card c ON c.id = u.card
+  WHERE s.start_time IS NULL AND s.run_time < now();
+
+CREATE OR REPLACE VIEW reporter.pending_reports AS
+ SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
+   FROM reporter.schedule s
+   JOIN reporter.report r ON r.id = s.report
+   JOIN actor.usr u ON s.runner = u.id
+   JOIN actor.card c ON c.id = u.card
+  WHERE s.start_time IS NULL;
+
+CREATE OR REPLACE VIEW reporter.currently_running AS
+ SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
+   FROM reporter.schedule s
+   JOIN reporter.report r ON r.id = s.report
+   JOIN actor.usr u ON s.runner = u.id
+   JOIN actor.card c ON c.id = u.card
+  WHERE s.start_time IS NOT NULL AND s.complete_time IS NULL;
+
+
+-------------------------------------------------------------------
+/* view for restricting circ counts by circ_mod                  */
+-------------------------------------------------------------------
+
+CREATE OR REPLACE VIEW action.open_circ_count_by_circ_mod AS
+    SELECT  circ.usr,
+            cp.circ_modifier,
+            count(circ.id)
+      FROM  action.circulation circ
+            JOIN asset.copy cp ON (circ.target_copy = cp.id)
+      WHERE circ.checkin_time IS NULL
+            AND ( circ.stop_fines IN ('LOST','LONGOVERDUE','CLAIMSRETURNED') OR circ.stop_fines IS NULL )
+      GROUP BY 1,2;
+
+
+-------------------------------------------------------------------
+/* reporting functions for new (and fixed) transforms            */
+-------------------------------------------------------------------
+
+CREATE OR REPLACE FUNCTION public.first_word ( TEXT ) RETURNS TEXT AS $$
+        SELECT SUBSTRING( $1 FROM $_$^\S+$_$);
+$$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION public.first5 ( TEXT ) RETURNS TEXT AS $$
+       SELECT SUBSTRING( $1, 1, 5);
+$$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION public.call_number_dewey( TEXT ) RETURNS TEXT AS $$
+        my $txt = shift;
+        $txt =~ s/^\s+//o;
+        $txt =~ s/[\[\]\{\}\(\)`'"#<>\*\?\-\+\$\\]+//o; #' To help vim in SQL mode
+        $txt =~ s/\s+$//o;
+        if ($txt =~ /(\d{3}(?:\.\d+)?)/o) {
+                return $1;
+        } else {
+                return (split /\s+/, $txt)[0];
+        }
+$$ LANGUAGE 'plperlu' STRICT IMMUTABLE;
+
+COMMIT;
+
+DROP SCHEMA search CASCADE;
+BEGIN;
+
+-------------------------------------------------------------------
+/* staged search -- also applied by 300.schema.staged_search.sql */
+-------------------------------------------------------------------
+
+CREATE SCHEMA search;
+
+CREATE TABLE search.relevance_adjustment (
+    id          SERIAL  PRIMARY KEY,
+    active      BOOL    NOT NULL DEFAULT TRUE,
+    field       INT     NOT NULL REFERENCES config.metabib_field (id),
+    bump_type   TEXT    NOT NULL CHECK (bump_type IN ('word_order','first_word','full_match')),
+    multiplier  NUMERIC NOT NULL DEFAULT 1.0
+);
+CREATE UNIQUE INDEX bump_once_per_field_idx ON search.relevance_adjustment ( field, bump_type );
+
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(1, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(1, 'full_match', 20);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(2, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(2, 'word_order', 10);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(2, 'full_match', 20);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(3, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(3, 'word_order', 10);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(3, 'full_match', 20);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(4, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(4, 'word_order', 10);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(4, 'full_match', 20);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(5, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(5, 'word_order', 10);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(5, 'full_match', 20);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(6, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(7, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(8, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(9, 'first_word', 1.5);
+INSERT INTO search.relevance_adjustment (field, bump_type, multiplier) VALUES(14, 'word_order', 10);
+
+CREATE OR REPLACE FUNCTION search.pick_table (TEXT) RETURNS TEXT AS $$
+    SELECT  CASE
+                WHEN $1 = 'author'  THEN 'metabib.author_field_entry'
+                WHEN $1 = 'title'   THEN 'metabib.title_field_entry'
+                WHEN $1 = 'subject' THEN 'metabib.subject_field_entry'
+                WHEN $1 = 'keyword' THEN 'metabib.keyword_field_entry'
+                WHEN $1 = 'series'  THEN 'metabib.series_field_entry'
+            END;
+$$ LANGUAGE SQL;
+
+CREATE TYPE search.search_result AS ( id BIGINT, rel NUMERIC, record INT, total INT, checked INT, visible INT, deleted INT, excluded INT );
+CREATE TYPE search.search_args AS ( id INT, field_class TEXT, field_name TEXT, table_alias TEXT, term TEXT, term_type TEXT );
+
+CREATE OR REPLACE FUNCTION search.staged_fts (
+
+    param_search_ou INT,
+    param_depth     INT,
+    param_searches  TEXT, -- JSON hash, to be turned into a resultset via search.parse_search_args
+    param_statuses  INT[],
+    param_audience  TEXT[],
+    param_language  TEXT[],
+    param_lit_form  TEXT[],
+    param_types     TEXT[],
+    param_forms     TEXT[],
+    param_vformats  TEXT[],
+    param_pref_lang TEXT,
+    param_pref_lang_multiplier REAL,
+    param_sort      TEXT,
+    param_sort_desc BOOL,
+    metarecord      BOOL,
+    staff           BOOL,
+    param_rel_limit INT,
+    param_chk_limit INT,
+    param_skip_chk  INT
+
+) RETURNS SETOF search.search_result AS $func$
+DECLARE
+
+    current_res         search.search_result%ROWTYPE;
+    query_part          search.search_args%ROWTYPE;
+    phrase_query_part   search.search_args%ROWTYPE;
+    rank_adjust_id      INT;
+    core_rel_limit      INT;
+    core_chk_limit      INT;
+    core_skip_chk       INT;
+    rank_adjust         search.relevance_adjustment%ROWTYPE;
+    query_table         TEXT;
+    tmp_text            TEXT;
+    tmp_int             INT;
+    current_rank        TEXT;
+    ranks               TEXT[] := '{}';
+    query_table_alias   TEXT;
+    from_alias_array    TEXT[] := '{}';
+    used_ranks          TEXT[] := '{}';
+    mb_field            INT;
+    mb_field_list       INT[];
+    search_org_list     INT[];
+    select_clause       TEXT := 'SELECT';
+    from_clause         TEXT := ' FROM  metabib.metarecord_source_map m JOIN metabib.rec_descriptor mrd ON (m.source = mrd.record) ';
+    where_clause        TEXT := ' WHERE 1=1 ';
+    mrd_used            BOOL := FALSE;
+    sort_desc           BOOL := FALSE;
+
+    core_result         RECORD;
+    core_cursor         REFCURSOR;
+    core_rel_query      TEXT;
+    vis_limit_query     TEXT;
+    inner_where_clause  TEXT;
+
+    total_count         INT := 0;
+    check_count         INT := 0;
+    deleted_count       INT := 0;
+    visible_count       INT := 0;
+    excluded_count      INT := 0;
+
+BEGIN
+
+    core_rel_limit := COALESCE( param_rel_limit, 25000 );
+    core_chk_limit := COALESCE( param_chk_limit, 1000 );
+    core_skip_chk := COALESCE( param_skip_chk, 1 );
+
+    IF metarecord THEN
+        select_clause := select_clause || ' m.metarecord as id, array_accum(distinct m.source) as records,';
+    ELSE
+        select_clause := select_clause || ' m.source as id, array_accum(distinct m.source) as records,';
+    END IF;
+
+    -- first we need to construct the base query
+    FOR query_part IN SELECT * FROM search.parse_search_args(param_searches) WHERE term_type = 'fts_query' LOOP
+
+        inner_where_clause := 'index_vector @@ ' || query_part.term;
+
+        IF query_part.field_name IS NOT NULL THEN
+
+           SELECT  id INTO mb_field
+             FROM  config.metabib_field
+             WHERE field_class = query_part.field_class
+                   AND name = query_part.field_name;
+
+            IF FOUND THEN
+                inner_where_clause := inner_where_clause ||
+                    ' AND ' || 'field = ' || mb_field;
+            END IF;
+
+        END IF;
+
+        -- moving on to the rank ...
+        SELECT  * INTO query_part
+          FROM  search.parse_search_args(param_searches)
+          WHERE term_type = 'fts_rank'
+                AND table_alias = query_part.table_alias;
+
+        current_rank := query_part.term || ' * ' || query_part.table_alias || '_weight.weight';
+
+        IF query_part.field_name IS NOT NULL THEN
+
+           SELECT  array_accum(distinct id) INTO mb_field_list
+             FROM  config.metabib_field
+             WHERE field_class = query_part.field_class
+                   AND name = query_part.field_name;
+
+        ELSE
+
+           SELECT  array_accum(distinct id) INTO mb_field_list
+             FROM  config.metabib_field
+             WHERE field_class = query_part.field_class;
+
+        END IF;
+
+        FOR rank_adjust IN SELECT * FROM search.relevance_adjustment WHERE active AND field IN ( SELECT * FROM search.explode_array( mb_field_list ) ) LOOP
+
+            IF NOT rank_adjust.bump_type = ANY (used_ranks) THEN
+
+                IF rank_adjust.bump_type = 'first_word' THEN
+                    SELECT  term INTO tmp_text
+                      FROM  search.parse_search_args(param_searches)
+                      WHERE table_alias = query_part.table_alias AND term_type = 'word'
+                      ORDER BY id
+                      LIMIT 1;
+
+                    tmp_text := query_part.table_alias || '.value ILIKE ' || quote_literal( tmp_text || '%' );
+
+                ELSIF rank_adjust.bump_type = 'word_order' THEN
+                    SELECT  array_to_string( array_accum( term ), '%' ) INTO tmp_text
+                      FROM  search.parse_search_args(param_searches)
+                      WHERE table_alias = query_part.table_alias AND term_type = 'word';
+
+                    tmp_text := query_part.table_alias || '.value ILIKE ' || quote_literal( '%' || tmp_text || '%' );
+
+                ELSIF rank_adjust.bump_type = 'full_match' THEN
+                    SELECT  array_to_string( array_accum( term ), E'\\s+' ) INTO tmp_text
+                      FROM  search.parse_search_args(param_searches)
+                      WHERE table_alias = query_part.table_alias AND term_type = 'word';
+
+                    tmp_text := query_part.table_alias || '.value  ~ ' || quote_literal( '^' || tmp_text || E'\\W*$' );
+
+                END IF;
+
+                current_rank := current_rank || ' * ( CASE WHEN ' || tmp_text ||
+                    ' THEN ' || rank_adjust.multiplier || '::REAL ELSE 1.0 END )';
+
+                used_ranks := array_append( used_ranks, rank_adjust.bump_type );
+
+            END IF;
+
+        END LOOP;
+
+        ranks := array_append( ranks, current_rank );
+        used_ranks := '{}';
+
+        FOR phrase_query_part IN
+            SELECT  *
+              FROM  search.parse_search_args(param_searches)
+              WHERE term_type = 'phrase'
+                    AND table_alias = query_part.table_alias LOOP
+
+            tmp_text := replace( phrase_query_part.term, '*', E'\\*' );
+            tmp_text := replace( tmp_text, '?', E'\\?' );
+            tmp_text := replace( tmp_text, '+', E'\\+' );
+            tmp_text := replace( tmp_text, '|', E'\\|' );
+            tmp_text := replace( tmp_text, '(', E'\\(' );
+            tmp_text := replace( tmp_text, ')', E'\\)' );
+            tmp_text := replace( tmp_text, '[', E'\\[' );
+            tmp_text := replace( tmp_text, ']', E'\\]' );
+
+            inner_where_clause := inner_where_clause || ' AND ' || 'value  ~* ' || quote_literal( E'(^|\\W+)' || regexp_replace(tmp_text, E'\\s+',E'\\\\s+','g') || E'(\\W+|\$)' );
+
+        END LOOP;
+
+        query_table := search.pick_table(query_part.field_class);
+
+        from_clause := from_clause ||
+            ' JOIN ( SELECT * FROM ' || query_table || ' WHERE ' || inner_where_clause ||
+                    CASE WHEN core_rel_limit > 0 THEN ' LIMIT ' || core_rel_limit::TEXT ELSE '' END || ' ) AS ' || query_part.table_alias ||
+                ' ON ( m.source = ' || query_part.table_alias || '.source )' ||
+            ' JOIN config.metabib_field AS ' || query_part.table_alias || '_weight' ||
+                ' ON ( ' || query_part.table_alias || '.field = ' || query_part.table_alias || '_weight.id  AND  ' || query_part.table_alias || '_weight.search_field)';
+
+        from_alias_array := array_append(from_alias_array, query_part.table_alias);
+
+    END LOOP;
+
+    IF param_pref_lang IS NOT NULL AND param_pref_lang_multiplier IS NOT NULL THEN
+        current_rank := ' CASE WHEN mrd.item_lang = ' || quote_literal( param_pref_lang ) ||
+            ' THEN ' || param_pref_lang_multiplier || '::REAL ELSE 1.0 END ';
+
+        --ranks := array_append( ranks, current_rank );
+    END IF;
+
+    current_rank := ' AVG( ( (' || array_to_string( ranks, ') + (' ) || ') ) * ' || current_rank || ' ) ';
+    select_clause := select_clause || current_rank || ' AS rel,';
+
+    sort_desc = param_sort_desc;
+
+    IF param_sort = 'pubdate' THEN
+
+        tmp_text := '999999';
+        IF param_sort_desc THEN tmp_text := '0'; END IF;
+
+        current_rank := $$
+            ( COALESCE( FIRST ((
+                SELECT  SUBSTRING(frp.value FROM E'\\d{4}')
+                  FROM  metabib.full_rec frp
+                  WHERE frp.record = m.source
+                    AND frp.tag = '260'
+                    AND frp.subfield = 'c'
+                  LIMIT 1
+            )), $$ || quote_literal(tmp_text) || $$ )::INT )
+        $$;
+
+    ELSIF param_sort = 'title' THEN
+
+        tmp_text := 'zzzzzz';
+        IF param_sort_desc THEN tmp_text := '    '; END IF;
+
+        current_rank := $$
+            ( COALESCE( FIRST ((
+                SELECT  LTRIM(SUBSTR( frt.value, COALESCE(SUBSTRING(frt.ind2 FROM E'\\d+'),'0')::INT + 1 ))
+                  FROM  metabib.full_rec frt
+                  WHERE frt.record = m.source
+                    AND frt.tag = '245'
+                    AND frt.subfield = 'a'
+                  LIMIT 1
+            )),$$ || quote_literal(tmp_text) || $$))
+        $$;
+
+    ELSIF param_sort = 'author' THEN
+
+        tmp_text := 'zzzzzz';
+        IF param_sort_desc THEN tmp_text := '    '; END IF;
+
+        current_rank := $$
+            ( COALESCE( FIRST ((
+                SELECT  LTRIM(fra.value)
+                  FROM  metabib.full_rec fra
+                  WHERE fra.record = m.source
+                    AND fra.tag LIKE '1%'
+                    AND fra.subfield = 'a'
+                  ORDER BY fra.tag::text::int
+                  LIMIT 1
+            )),$$ || quote_literal(tmp_text) || $$))
+        $$;
+
+    ELSIF param_sort = 'create_date' THEN
+            current_rank := $$( FIRST (( SELECT create_date FROM biblio.record_entry rbr WHERE rbr.id = m.source)) )$$;
+    ELSIF param_sort = 'edit_date' THEN
+            current_rank := $$( FIRST (( SELECT edit_date FROM biblio.record_entry rbr WHERE rbr.id = m.source)) )$$;
+    ELSE
+        sort_desc := NOT COALESCE(param_sort_desc, FALSE);
+    END IF;
+
+    select_clause := select_clause || current_rank || ' AS rank';
+
+    -- now add the other qualifiers
+    IF param_audience IS NOT NULL AND array_upper(param_audience, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.audience IN ('$$ || array_to_string(param_audience, $$','$$) || $$') $$;
+    END IF;
+
+    IF param_language IS NOT NULL AND array_upper(param_language, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.item_lang IN ('$$ || array_to_string(param_language, $$','$$) || $$') $$;
+    END IF;
+
+    IF param_lit_form IS NOT NULL AND array_upper(param_lit_form, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.lit_form IN ('$$ || array_to_string(param_lit_form, $$','$$) || $$') $$;
+    END IF;
+
+    IF param_types IS NOT NULL AND array_upper(param_types, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.item_type IN ('$$ || array_to_string(param_types, $$','$$) || $$') $$;
+    END IF;
+
+    IF param_forms IS NOT NULL AND array_upper(param_forms, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.item_form IN ('$$ || array_to_string(param_forms, $$','$$) || $$') $$;
+    END IF;
+
+    IF param_vformats IS NOT NULL AND array_upper(param_vformats, 1) > 0 THEN
+        where_clause = where_clause || $$ AND mrd.vr_format IN ('$$ || array_to_string(param_vformats, $$','$$) || $$') $$;
+    END IF;
+
+    core_rel_query := select_clause || from_clause || where_clause ||
+                        ' GROUP BY 1 ORDER BY 4' || CASE WHEN sort_desc THEN ' DESC' ELSE ' ASC' END || ';';
+    --RAISE NOTICE 'Base Query:  %', core_rel_query;
+
+    IF param_depth IS NOT NULL THEN
+        SELECT array_accum(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou, param_depth );
+    ELSE
+        SELECT array_accum(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou );
+    END IF;
+
+    OPEN core_cursor FOR EXECUTE core_rel_query;
+
+    LOOP
+
+        FETCH core_cursor INTO core_result;
+        EXIT WHEN NOT FOUND;
+
+        IF total_count % 1000 = 0 THEN
+            -- RAISE NOTICE ' % total, % checked so far ... ', total_count, check_count;
+        END IF;
+
+        IF core_chk_limit > 0 AND total_count - core_skip_chk + 1 >= core_chk_limit THEN
+            total_count := total_count + 1;
+            CONTINUE;
+        END IF;
+
+        total_count := total_count + 1;
+
+        CONTINUE WHEN param_skip_chk IS NOT NULL and total_count < param_skip_chk;
+
+        check_count := check_count + 1;
+
+        PERFORM 1 FROM biblio.record_entry b WHERE NOT b.deleted AND b.id IN ( SELECT * FROM search.explode_array( core_result.records ) );
+        IF NOT FOUND THEN
+            -- RAISE NOTICE ' % were all deleted ... ', core_result.records;
+            deleted_count := deleted_count + 1;
+            CONTINUE;
+        END IF;
+
+        PERFORM 1
+          FROM  biblio.record_entry b
+                JOIN config.bib_source s ON (b.source = s.id)
+          WHERE s.transcendant
+                AND b.id IN ( SELECT * FROM search.explode_array( core_result.records ) );
+
+        IF FOUND THEN
+            -- RAISE NOTICE ' % were all transcendant ... ', core_result.records;
+            visible_count := visible_count + 1;
+
+            current_res.id = core_result.id;
+            current_res.rel = core_result.rel;
+
+            tmp_int := 1;
+            IF metarecord THEN
+                SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+            END IF;
+
+            IF tmp_int = 1 THEN
+                current_res.record = core_result.records[1];
+            ELSE
+                current_res.record = NULL;
+            END IF;
+
+            RETURN NEXT current_res;
+
+            CONTINUE;
+        END IF;
+
+        IF param_statuses IS NOT NULL AND array_upper(param_statuses, 1) > 0 THEN
+
+            PERFORM 1
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cp.call_number = cn.id)
+              WHERE NOT cn.deleted
+                    AND NOT cp.deleted
+                    AND cp.status IN ( SELECT * FROM search.explode_array( param_statuses ) )
+                    AND cn.record IN ( SELECT * FROM search.explode_array( core_result.records ) )
+                    AND cp.circ_lib IN ( SELECT * FROM search.explode_array( search_org_list ) )
+              LIMIT 1;
+
+            IF NOT FOUND THEN
+                -- RAISE NOTICE ' % were all status-excluded ... ', core_result.records;
+                excluded_count := excluded_count + 1;
+                CONTINUE;
+            END IF;
+
+        END IF;
+
+        IF staff IS NULL OR NOT staff THEN
+
+            PERFORM 1
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cp.call_number = cn.id)
+                    JOIN actor.org_unit a ON (cp.circ_lib = a.id)
+                    JOIN asset.copy_location cl ON (cp.location = cl.id)
+                    JOIN config.copy_status cs ON (cp.status = cs.id)
+              WHERE NOT cn.deleted
+                    AND NOT cp.deleted
+                    AND cs.holdable
+                    AND cl.opac_visible
+                    AND cp.opac_visible
+                    AND a.opac_visible
+                    AND cp.circ_lib IN ( SELECT * FROM search.explode_array( search_org_list ) )
+                    AND cn.record IN ( SELECT * FROM search.explode_array( core_result.records ) )
+              LIMIT 1;
+
+            IF NOT FOUND THEN
+                -- RAISE NOTICE ' % were all visibility-excluded ... ', core_result.records;
+                excluded_count := excluded_count + 1;
+                CONTINUE;
+            END IF;
+
+        ELSE
+
+            PERFORM 1
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cp.call_number = cn.id)
+                    JOIN actor.org_unit a ON (cp.circ_lib = a.id)
+                    JOIN asset.copy_location cl ON (cp.location = cl.id)
+                    JOIN config.copy_status cs ON (cp.status = cs.id)
+              WHERE NOT cn.deleted
+                    AND NOT cp.deleted
+                    AND cp.circ_lib IN ( SELECT * FROM search.explode_array( search_org_list ) )
+                    AND cn.record IN ( SELECT * FROM search.explode_array( core_result.records ) )
+              LIMIT 1;
+
+            IF NOT FOUND THEN
+
+                PERFORM 1
+                  FROM  asset.call_number cn
+                  WHERE cn.record IN ( SELECT * FROM search.explode_array( core_result.records ) )
+                  LIMIT 1;
+
+                IF FOUND THEN
+                    -- RAISE NOTICE ' % were all visibility-excluded ... ', core_result.records;
+                    excluded_count := excluded_count + 1;
+                    CONTINUE;
+                END IF;
+
+            END IF;
+
+        END IF;
+
+        visible_count := visible_count + 1;
+
+        current_res.id = core_result.id;
+        current_res.rel = core_result.rel;
+
+        tmp_int := 1;
+        IF metarecord THEN
+            SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+        END IF;
+
+        IF tmp_int = 1 THEN
+            current_res.record = core_result.records[1];
+        ELSE
+            current_res.record = NULL;
+        END IF;
+
+        RETURN NEXT current_res;
+
+        IF visible_count % 1000 = 0 THEN
+            -- RAISE NOTICE ' % visible so far ... ', visible_count;
+        END IF;
+
+    END LOOP;
+
+    current_res.id = NULL;
+    current_res.rel = NULL;
+    current_res.record = NULL;
+    current_res.total = total_count;
+    current_res.checked = check_count;
+    current_res.deleted = deleted_count;
+    current_res.visible = visible_count;
+    current_res.excluded = excluded_count;
+
+    CLOSE core_cursor;
+
+    RETURN NEXT current_res;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION search.explode_array(anyarray) RETURNS SETOF anyelement AS $BODY$
+    SELECT ($1)[s] FROM generate_series(1, array_upper($1, 1)) AS s;
+$BODY$
+LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION search.parse_search_args (TEXT) RETURNS SETOF search.search_args AS $perlcode$
+    use JSON::XS;
+    my $json = shift;
+
+    my $args = decode_json( $json );
+
+    my $id = 1;
+
+    for my $k ( keys %$args ) {
+        (my $alias = $k) =~ s/\|/_/gso;
+        my ($class, $field) = split /\|/, $k;
+        my $part = $args->{$k};
+        for my $p ( keys %$part ) {
+            my $data = $part->{$p};
+            $data = [$data] if (!ref($data));
+            for my $datum ( @$data ) {
+                return_next(
+                    {   field_class => $class,
+                        field_name  => $field,
+                        term        => $datum,
+                        table_alias => $alias,
+                        term_type   => $p,
+                        id          => $id,
+                    }
+                );
+                $id++;
+            }
+        }
+    }
+
+    return undef;
+
+$perlcode$ LANGUAGE PLPERLU;
+
+COMMIT;

Modified: branches/acq-experiment/Open-ILS/src/sql/Pg/950.data.seed-values.sql
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/950.data.seed-values.sql	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/950.data.seed-values.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -1127,6 +1127,7 @@
 INSERT INTO permission.perm_list (code) VALUES ('UPDATE_VOLUME_NOTE');
 INSERT INTO permission.perm_list (code) VALUES ('UPDATE_VR_FORMAT');
 INSERT INTO permission.perm_list (code) VALUES ('UPDATE_XML_TRANSFORM');
+INSERT INTO permission.perm_list (code) VALUES ('MERGE_BIB_RECORDS');
 
 
 INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES

Modified: branches/acq-experiment/Open-ILS/src/sql/Pg/example.reporter-extension.sql
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/example.reporter-extension.sql	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/example.reporter-extension.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -224,6 +224,83 @@
     LEFT JOIN asset.stat_cat_entry_copy_map sc2 ON (sc2.owning_copy = cp.id AND sc2.stat_cat = 2)
     LEFT JOIN asset.stat_cat_entry sce2 ON (sce2.id = sc2.stat_cat_entry);
 
+
+CREATE OR REPLACE VIEW money.open_circ_balance_by_owning_lib AS
+	SELECT	circ.id,
+		cn.owning_lib,
+		bill.billing_type,
+		SUM(bill.amount) AS billed
+	  FROM	action.circulation circ
+		JOIN money.billing bill ON (circ.id = bill.xact) 
+		JOIN asset.copy cp ON (circ.target_copy = cp.id) 
+		JOIN asset.call_number cn ON (cn.id = cp.call_number) 
+	  WHERE	circ.xact_finish IS NULL
+		AND NOT bill.voided
+	  GROUP BY 1,2,3
+	  ORDER BY 1,2,3;
+
+CREATE OR REPLACE VIEW money.open_balance_by_owning_lib AS
+	SELECT	owning_lib,
+		ARRAY_TO_STRING(ARRAY_ACCUM(DISTINCT billing_type), ', ') AS billing_types,
+		SUM(billed) - SUM( COALESCE((SELECT SUM(amount) AS paid FROM money.payment WHERE NOT voided AND xact = x.id), 0::NUMERIC) ) AS balance
+	  FROM	money.open_circ_balance_by_owning_lib x
+	  GROUP BY 1;
+
+
+
+
+
+CREATE OR REPLACE VIEW money.open_circ_balance_by_circ_and_owning_lib AS
+	SELECT	circ.id,
+		circ.circ_lib,
+		cn.owning_lib,
+		bill.billing_type,
+		SUM(bill.amount) AS billed
+	  FROM	action.circulation circ
+		JOIN money.billing bill ON (circ.id = bill.xact) 
+		JOIN asset.copy cp ON (circ.target_copy = cp.id) 
+		JOIN asset.call_number cn ON (cn.id = cp.call_number) 
+	  WHERE	circ.xact_finish IS NULL
+		AND NOT bill.voided
+	  GROUP BY 1,2,3,4
+	  ORDER BY 1,2,3,4;
+
+CREATE OR REPLACE VIEW money.open_balance_by_circ_and_owning_lib AS
+	SELECT	circ_lib,
+		owning_lib,
+		ARRAY_TO_STRING(ARRAY_ACCUM(DISTINCT billing_type), ', ') AS billing_types,
+		SUM(billed) - SUM( COALESCE((SELECT SUM(amount) AS paid FROM money.payment WHERE NOT voided AND xact = x.id), 0::NUMERIC) ) AS balance
+	  FROM	money.open_circ_balance_by_circ_and_owning_lib x
+	  GROUP BY 1,2;
+
+
+
+
+
+CREATE OR REPLACE VIEW money.open_circ_balance_by_usr_home_and_owning_lib AS
+	SELECT	circ.id,
+		usr.home_ou,
+		cn.owning_lib,
+		bill.billing_type,
+		SUM(bill.amount) AS billed
+	  FROM	action.circulation circ
+		JOIN money.billing bill ON (circ.id = bill.xact) 
+		JOIN asset.copy cp ON (circ.target_copy = cp.id) 
+		JOIN asset.call_number cn ON (cn.id = cp.call_number) 
+		JOIN actor.usr usr ON (circ.usr = usr.id) 
+	  WHERE	circ.xact_finish IS NULL
+		AND NOT bill.voided
+	  GROUP BY 1,2,3,4
+	  ORDER BY 1,2,3,4;
+
+CREATE OR REPLACE VIEW money.open_balance_by_usr_home_and_owning_lib AS
+	SELECT	home_ou,
+		owning_lib,
+		ARRAY_TO_STRING(ARRAY_ACCUM(DISTINCT billing_type), ', ') AS billing_types,
+		SUM(billed) - SUM( COALESCE((SELECT SUM(amount) AS paid FROM money.payment WHERE NOT voided AND xact = x.id), 0::NUMERIC) ) AS balance
+	  FROM	money.open_circ_balance_by_usr_home_and_owning_lib x
+	  GROUP BY 1,2;
+
 COMMIT;
 
 

Modified: branches/acq-experiment/Open-ILS/src/sql/Pg/reporter-schema.sql
===================================================================
--- branches/acq-experiment/Open-ILS/src/sql/Pg/reporter-schema.sql	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/src/sql/Pg/reporter-schema.sql	2008-05-05 00:58:16 UTC (rev 9507)
@@ -129,10 +129,9 @@
 	LEFT JOIN metabib.full_rec series_title ON (r.id = series_title.record AND series_title.tag IN ('830','440') AND series_title.subfield = 'a')
 	LEFT JOIN metabib.full_rec series_statement ON (r.id = series_statement.record AND series_statement.tag = '490' AND series_statement.subfield = 'a')
 	LEFT JOIN metabib.full_rec summary ON (r.id = summary.record AND summary.tag = '520' AND summary.subfield = 'a')
-  WHERE	r.deleted IS FALSE
   GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
 
-CREATE OR REPLACE VIEW reporter.super_simple_record AS
+CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
 SELECT	r.id,
 	r.fingerprint,
 	r.quality,
@@ -151,9 +150,40 @@
 	LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
 	LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
 	LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
-  WHERE	r.deleted IS FALSE
   GROUP BY 1,2,3,4,5,6,8,9;
 
+CREATE TABLE reporter.materialized_simple_record AS SELECT * FROM reporter.old_super_simple_record WHERE 1=0;
+ALTER TABLE reporter.materialized_simple_record ADD PRIMARY KEY (id);
+CREATE VIEW reporter.super_simple_record AS SELECT * FROM reporter.materialized_simple_record;
+
+CREATE OR REPLACE FUNCTION reporter.simple_rec_sync () RETURNS TRIGGER AS $$
+DECLARE
+    r_id        BIGINT;
+    new_data    RECORD;
+BEGIN
+    IF TG_OP IN ('DELETE') THEN
+        r_id := OLD.record;
+    ELSE
+        r_id := NEW.record;
+    END IF;
+
+    SELECT * INTO new_data FROM reporter.materialized_simple_record WHERE id = r_id FOR UPDATE;
+    DELETE FROM reporter.materialized_simple_record WHERE id = r_id;
+
+    IF TG_OP IN ('DELETE') THEN
+        RETURN OLD;
+    ELSE
+        INSERT INTO reporter.materialized_simple_record SELECT DISTINCT ON (id) * FROM reporter.old_super_simple_record WHERE id = NEW.record;
+        RETURN NEW;
+    END IF;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER zzz_update_materialized_simple_record_tgr
+    AFTER INSERT OR UPDATE OR DELETE ON metabib.full_rec
+    FOR EACH ROW EXECUTE PROCEDURE reporter.simple_rec_sync();
+
 CREATE OR REPLACE VIEW reporter.demographic AS
 SELECT	u.id,
 	u.dob,

Modified: branches/acq-experiment/Open-ILS/web/conify/global/admin.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/conify/global/admin.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/conify/global/admin.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -1,6 +1,11 @@
 var djConfig = { parseOnLoad : true };
 
-var _url_locale = location.href.replace(/^.*conify\/(.+)\/global.*$/, "$1").toLowerCase().replace(/-/,'_');
-if (_url_locale) djConfig.locale = _url_locale;
-else djConfig.locale = '<!--#echo var="locale"-->';
+if (location.href.match(/^.*conify\/(.+)\/global.*$/, "$1")) {
+	var _url_locale = location.href.replace(/^.*conify\/(.+)\/global.*$/, "$1").toLowerCase().replace(/_/,'-','g');
 
+	if (_url_locale) djConfig.locale = _url_locale;
+
+} else {
+	var _url_locale = '<!--#echo var="locale"-->';
+	if (_url_locale != '(none)') djConfig.locale = _url_locale;
+}

Modified: branches/acq-experiment/Open-ILS/web/conify/global/config/copy_status.html
===================================================================
--- branches/acq-experiment/Open-ILS/web/conify/global/config/copy_status.html	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/conify/global/config/copy_status.html	2008-05-05 00:58:16 UTC (rev 9507)
@@ -189,7 +189,7 @@
 												setTimeout(
 													'dojo.query(".status_grid_trans_cell_' + row + '").'+
 														'instantiate(openils.widget.TranslatorPopup,{field:"name",'+
-														'targetObject:"window.status_rows['+row+']",unique:"' + row + '"});'+
+														'targetObject:"window.status_rows['+row+']"});'+
 														'status_grid.rowHeightChanged('+row+')',
 													0
 												);

Modified: branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.html
===================================================================
--- branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.html	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.html	2008-05-05 00:58:16 UTC (rev 9507)
@@ -102,8 +102,8 @@
 												window.perm_rows[row] = new ccs().fromHash(window.perm_data_model.getRow(row));
 												setTimeout(
 													'dojo.query(".perm_grid_trans_desc_' + row + '").'+
-														'instantiate(openils.I18N.translationWidget,{field:"description",'+
-														'targetObject:"window.perm_rows['+row+']",unique:"' + row + '"});'+
+														'instantiate(openils.widget.TranslatorPopup,{field:"description",'+
+														'targetObject:"window.perm_rows['+row+']"});'+
 														'perm_grid.rowHeightChanged('+row+')',
 													0
 												);

Modified: branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/conify/global/permission/perm_list.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -16,7 +16,7 @@
 */
 
 dojo.require('fieldmapper.dojoData');
-dojo.require('openils.I18N');
+dojo.require('openils.widget.TranslatorPopup');
 dojo.require('dojo.parser');
 dojo.require('dojo.string');
 dojo.require('dojo.data.ItemFileWriteStore');

Modified: branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/TranslatorPopup.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/TranslatorPopup.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/TranslatorPopup.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -30,6 +30,8 @@
 	dojo.require("dijit.form.Button");
 	dojo.require("dijit.form.TextBox");
 	dojo.require("dijit.form.ComboBox");
+	dojo.require("dojox.jsonPath");
+	dojo.requireLocalization("openils.widget", "TranslatorPopup");
 
 
     dojo.declare(
@@ -37,188 +39,207 @@
 		[dijit._Widget, dijit._Templated],
 		{
 
-			templateString : "<span dojoAttachPoint='node'><div dojoType='dijit.form.DropDownButton'><span>Translate</span><div id='${field}_translation_${unique}' dojoType='dijit.TooltipDialog' onOpen='openils.widget.TranslatorPopup.renderTranslationPopup(${targetObject}, \"${field}\", \"${unique}\")' ><div dojoType='dijit.layout.ContentPane'><table><tbody class='translation_tbody_template' style='display:none; visiblity:hidden;'><tr><th>Locale</th><td class='locale'><div class='locale_combobox'></div></td><th>Translation</th><td class='translation'><div class='translation_textbox'></div></td><td><button class='create_button' style='display:none; visiblity:hidden;'>Create</button><button class='update_button' style='display:none; visiblity:hidden;'>Update</button><button class='delete_button' style='display:none; visiblity:hidden;'>Remove</button></td></tr></tbody><tbody class='translation_tbody'></tbody></table></div></div></div></span>",
+			templateString : "<span dojoAttachPoint='node'><div id='${field}_translation_button_${unique}' dojoAttachPoint='translateLabelNode' dojoType='dijit.form.DropDownButton'><span>Translate</span><div id='${field}_translation_${unique}' dojoAttachPoint='tooltipDialog' dojoType='dijit.TooltipDialog'><div dojoType='dijit.layout.ContentPane'><table><tbody class='translation_tbody_template' style='display:none; visiblity:hidden;'><tr><th dojoAttachPoint='localeLabelNode'/><td class='locale'><div class='locale_combobox'></div></td><th dojoAttachPoint='translationLabelNode'/><td class='translation'><div class='translation_textbox'></div></td><td><button class='create_button' style='display:none; visiblity:hidden;'><span dojoAttachPoint='createButtonNode'/></button><button class='update_button' style='display:none; visiblity:hidden;'><span dojoAttachPoint='updateButtonNode'/></button><button class='delete_button' style='display:none; visiblity:hidden;'><span dojoAttachPoint='removeBu
 ttonNode'/></button></td></tr></tbody><tbody class='translation_tbody'></tbody></table></div></div></div></span>",
 
 			widgetsInTemplate: true,
 			field : "",
 			targetObject : "",
-			unique : ""
-		}
-	);
+			unique : "",
 
-	openils.widget.TranslatorPopup.renderTranslationPopup = function (obj, field, num) {
-		var node = dojo.byId(field + '_translation_' + num);
+			postCreate : function () {
 
-		var trans_list = openils.I18N.getTranslations( obj, field );
+				dojo.connect(this.tooltipDialog, 'onOpen', this, 'renderTranslatorPopup');
 
-		var trans_template = dojo.query('.translation_tbody_template', node)[0];
-		var trans_tbody = dojo.query('.translation_tbody', node)[0];
+				this.nls = dojo.i18n.getLocalization("openils.widget", "TranslatorPopup");
 
-		// Empty it
-		while (trans_tbody.lastChild) trans_tbody.removeChild( trans_tbody.lastChild );
+				this.translateLabelNode.setLabel(this.nls.translate);
 
-		for (var i in trans_list) {
-			if (!trans_list[i]) continue;
+				this.localeLabelNode.textContent = this.nls.locale;
+				this.translationLabelNode.textContent = this.nls.translation;
 
-			var trans_obj = trans_list[i];
-			var trans_id = trans_obj.id();
+				this.createButtonNode.textContent = this.nls.create;
+				this.updateButtonNode.textContent = this.nls.update;
+				this.removeButtonNode.textContent = this.nls.remove;
+			},
 
-			var trans_row = dojo.query('tr',trans_template)[0].cloneNode(true);
-			trans_row.id = 'translation_row_' + trans_id;
+			renderTranslatorPopup : function () {
+		
+				this._targetObject = dojox.jsonPath.query(window, '$.' + this.targetObject, {evalType:"RESULT"});
 
-			var old_dijit = dijit.byId('locale_' + trans_id);
-			if (old_dijit) old_dijit.destroy();
-
-			old_dijit = dijit.byId('translation_' + trans_id);
-			if (old_dijit) old_dijit.destroy();
-
-			dojo.query('.locale_combobox',trans_row).instantiate(
-				dijit.form.ComboBox,
-				{ store:openils.I18N.localeStore,
-				  searchAttr:'locale',
-				  lowercase:true,
-				  required:true,
-				  id:'locale_' + trans_id,
-				  value: trans_obj.translation(),
-				  invalidMessage:'Specify locale as {languageCode}_{countryCode}, like en_us',
-				  regExp:'[a-z_]+'
+				var node = dojo.byId(this.field + '_translation_' + this.unique);
+		
+				var trans_list = openils.I18N.getTranslations( this._targetObject, this.field );
+		
+				var trans_template = dojo.query('.translation_tbody_template', node)[0];
+				var trans_tbody = dojo.query('.translation_tbody', node)[0];
+		
+				// Empty it
+				while (trans_tbody.lastChild) trans_tbody.removeChild( trans_tbody.lastChild );
+		
+				for (var i in trans_list) {
+					if (!trans_list[i]) continue;
+		
+					var trans_obj = trans_list[i];
+					var trans_id = trans_obj.id();
+		
+					var trans_row = dojo.query('tr',trans_template)[0].cloneNode(true);
+					trans_row.id = 'translation_row_' + trans_id;
+		
+					var old_dijit = dijit.byId('locale_' + trans_id);
+					if (old_dijit) old_dijit.destroy();
+		
+					old_dijit = dijit.byId('translation_' + trans_id);
+					if (old_dijit) old_dijit.destroy();
+		
+					dojo.query('.locale_combobox',trans_row).instantiate(
+						dijit.form.ComboBox,
+						{ store:openils.I18N.localeStore,
+						  searchAttr:'locale',
+						  lowercase:true,
+						  required:true,
+						  id:'locale_' + trans_id,
+						  value: trans_obj.translation(),
+						  invalidMessage:'Specify locale as {languageCode}_{countryCode}, like en_us',
+						  regExp:'[a-z_]+'
+						}
+					);
+		
+					dojo.query('.translation_textbox',trans_row).instantiate(
+						dijit.form.TextBox,
+						{ required : true,
+						  id:'translation_' + trans_id,
+						  value: trans_obj.string()
+						}
+					);
+		
+					dojo.query('.update_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
+						dijit.form.Button,
+						{ onClick : dojo.hitch( this, 'updateTranslation') }
+					);
+		
+					dojo.query('.delete_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
+						dijit.form.Button,
+						{ onClick : dojo.hitch( this, 'removeTranslation') }
+					);
+		
+					trans_tbody.appendChild( trans_row );
+		
 				}
-			);
+		
+				old_dijit = dijit.byId('i18n_new_locale_' + this._targetObject.classname + '.' + this.field + this.unique);
+				if (old_dijit) old_dijit.destroy();
+		
+				old_dijit = dijit.byId('i18n_new_translation_' + this._targetObject.classname + '.' + this.field + this.unique);
+				if (old_dijit) old_dijit.destroy();
+		
+				trans_row = dojo.query('tr',trans_template)[0].cloneNode(true);
+		
+				dojo.query('.locale_combobox',trans_row).instantiate(
+					dijit.form.ComboBox,
+					{ store:openils.I18N.localeStore,
+					  searchAttr:'locale',
+					  id:'i18n_new_locale_' + this._targetObject.classname + '.' + this.field + this.unique,
+					  lowercase:true,
+					  required:true,
+					  invalidMessage:'Specify locale as {languageCode}_{countryCode}, like en_us',
+					  regExp:'[a-z_]+'
+					}
+				);
+		
+				dojo.query('.translation_textbox',trans_row).addClass('new_translation').instantiate(
+					dijit.form.TextBox,
+					{ required : true,
+					  id:'i18n_new_translation_' + this._targetObject.classname + '.' + this.field + this.unique
+					}
+				);
+		
+				dojo.query('.create_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
+					dijit.form.Button,
+					{ onClick : dojo.hitch( this, 'createTranslation') }
+				);
+		
+				trans_tbody.appendChild( trans_row );
 
-			dojo.query('.translation_textbox',trans_row).instantiate(
-				dijit.form.TextBox,
-				{ required : true,
-				  id:'translation_' + trans_id,
-				  value: trans_obj.string()
-				}
-			);
+			},
 
-			dojo.query('.update_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
-				dijit.form.Button,
-				{ onClick :
-					(function (trans_id, obj, field) {
-						return function () { openils.widget.TranslatorPopup.updateTranslation(trans_id, obj, field, num) }
-					})(trans_id, obj, field) 
-				}
-			);
+			updateTranslation : function (t) {
+				return this.changeTranslation('update',t);
+			},
+			
+			removeTranslation : function (t) {
+				return changeTranslation('delete',t);
+			},
+			
+			changeTranslation : function (method, trans_id) {
+			
+				var trans_obj = new i18n().fromHash({
+					ischanged : method == 'update' ? 1 : 0,
+					isdeleted : method == 'delete' ? 1 : 0,
+					id : trans_id,
+					fq_field : this._targetObject.classname + '.' + this.field,
+					identity_value : this._targetObject.id(),
+					translation : dijit.byId('locale_' + trans_id).getValue(),
+					string : dijit.byId('translation_' + trans_id).getValue()
+				});
+			
+				this.writeTranslation(method, trans_obj);
+			},
+			
+			createTranslation : function () {
+				var node = dojo.byId(this.field + '_translation_' + this.unique);
+			
+				var trans_obj = new i18n().fromHash({
+					isnew : 1,
+					fq_field : this._targetObject.classname + '.' + this.field,
+					identity_value : this._targetObject.id(),
+					translation : dijit.byId('i18n_new_locale_' + this._targetObject.classname + '.' + this.field + this.unique).getValue(),
+					string : dijit.byId('i18n_new_translation_' + this._targetObject.classname + '.' + this.field + this.unique).getValue()
+				});
+			
+				this.writeTranslation('create', trans_obj);
+			},
+	
+			writeTranslation : function (method, trans_obj) {
+			
+				OpenSRF.CachedClientSession('open-ils.permacrud').request({
+					method : 'open-ils.permacrud.' + method + '.i18n',
+					timeout: 10,
+					params : [ ses, trans_obj ],
+					onerror: function (r) {
+						//highlighter.editor_pane.red.play();
+						if (status_update) status_update( 'Problem saving translation for ' + this._targetObject[this.field]() );
+					},
+					oncomplete : function (r) {
+						var res = r.recv();
+						if ( res && res.content() ) {
+							//highlighter.editor_pane.green.play();
+							if (status_update) status_update( 'Saved changes to translation for ' + this._targetObject[this.field]() );
+			
+							if (method == 'delete') {
+								dojo.NodeList(dojo.byId('translation_row_' + trans_obj.id())).orphan();
+							} else if (method == 'create') {
+								var node = dojo.byId(this.field + '_translation_' + this.unique);
+								dijit.byId('i18n_new_locale_' + this._targetObject.classname + '.' + this.field + this.unique).setValue(null);
+								dijit.byId('i18n_new_translation_' + this._targetObject.classname + '.' + this.field + this.unique).setValue(null);
+								this.renderTranslatorPopup();
+							}
+			
+						} else {
+							//highlighter.editor_pane.red.play();
+							if (status_update) status_update( 'Problem saving translation for ' + this._targetObject[this.field]() );
+						}
+					},
+				}).send();
+			}
 
-			dojo.query('.delete_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
-				dijit.form.Button,
-				{ onClick :
-					(function (trans_id, obj, field) {
-						return function () { openils.widget.TranslatorPopup.removeTranslation(trans_id, obj, field, num) }
-					})(trans_id, obj, field) 
-				}
-			);
-
-			trans_tbody.appendChild( trans_row );
 		}
 
-		old_dijit = dijit.byId('i18n_new_locale_' + obj.classname + '.' + field + num);
-		if (old_dijit) old_dijit.destroy();
+	);
 
-		old_dijit = dijit.byId('i18n_new_translation_' + obj.classname + '.' + field + num);
-		if (old_dijit) old_dijit.destroy();
+	openils.widget.TranslatorPopup._unique = 1;
 
-		trans_row = dojo.query('tr',trans_template)[0].cloneNode(true);
 
-		dojo.query('.locale_combobox',trans_row).instantiate(
-			dijit.form.ComboBox,
-			{ store:openils.I18N.localeStore,
-			  searchAttr:'locale',
-			  id:'i18n_new_locale_' + obj.classname + '.' + field + num,
-			  lowercase:true,
-			  required:true,
-			  invalidMessage:'Specify locale as {languageCode}_{countryCode}, like en_us',
-			  regExp:'[a-z_]+'
-			}
-		);
 
-		dojo.query('.translation_textbox',trans_row).addClass('new_translation').instantiate(
-			dijit.form.TextBox,
-			{ required : true,
-			  id:'i18n_new_translation_' + obj.classname + '.' + field + num
-			}
-		);
-
-		dojo.query('.create_button',trans_row).style({ visibility : 'visible', display : 'inline'}).instantiate(
-			dijit.form.Button,
-			{ onClick : function () { openils.widget.TranslatorPopup.createTranslation( obj, field, num) } }
-		);
-
-		trans_tbody.appendChild( trans_row );
-	}
-
-	openils.widget.TranslatorPopup.updateTranslation = function (trans_id, obj, field, num) {
-		return openils.widget.TranslatorPopup.changeTranslation('update', trans_id, obj, field, num);
-	}
-	
-	openils.widget.TranslatorPopup.removeTranslation = function (trans_id, obj, field, num) {
-		return openils.widget.TranslatorPopup.changeTranslation('delete', trans_id, obj, field, num);
-	}
-	
-	openils.widget.TranslatorPopup.changeTranslation = function (method, trans_id, obj, field, num) {
-	
-		var trans_obj = new i18n().fromHash({
-			ischanged : method == 'update' ? 1 : 0,
-			isdeleted : method == 'delete' ? 1 : 0,
-			id : trans_id,
-			fq_field : obj.classname + '.' + field,
-			identity_value : obj.id(),
-			translation : dijit.byId('locale_' + trans_id).getValue(),
-			string : dijit.byId('translation_' + trans_id).getValue()
-		});
-	
-		openils.widget.TranslatorPopup.writeTranslation(method, trans_obj, obj, field, num);
-	}
-	
-	openils.widget.TranslatorPopup.createTranslation = function (obj, field, num) {
-		var node = dojo.byId(field + '_translation_' + num);
-	
-		var trans_obj = new i18n().fromHash({
-			isnew : 1,
-			fq_field : obj.classname + '.' + field,
-			identity_value : obj.id(),
-			translation : dijit.byId('i18n_new_locale_' + obj.classname + '.' + field + num).getValue(),
-			string : dijit.byId('i18n_new_translation_' + obj.classname + '.' + field + num).getValue()
-		});
-	
-		openils.widget.TranslatorPopup.writeTranslation('create', trans_obj, obj, field, num);
-	}
-	
-	openils.widget.TranslatorPopup.writeTranslation = function (method, trans_obj, obj, field, num) {
-	
-		OpenSRF.CachedClientSession('open-ils.permacrud').request({
-			method : 'open-ils.permacrud.' + method + '.i18n',
-			timeout: 10,
-			params : [ ses, trans_obj ],
-			onerror: function (r) {
-				//highlighter.editor_pane.red.play();
-				if (status_update) status_update( 'Problem saving translation for ' + obj[field]() );
-			},
-			oncomplete : function (r) {
-				var res = r.recv();
-				if ( res && res.content() ) {
-					//highlighter.editor_pane.green.play();
-					if (status_update) status_update( 'Saved changes to translation for ' + obj[field]() );
-	
-					if (method == 'delete') {
-						dojo.NodeList(dojo.byId('translation_row_' + trans_obj.id())).orphan();
-					} else if (method == 'create') {
-						var node = dojo.byId(field + '_translation_' + num);
-						dijit.byId('i18n_new_locale_' + obj.classname + '.' + field + num).setValue(null);
-						dijit.byId('i18n_new_translation_' + obj.classname + '.' + field + num).setValue(null);
-						openils.widget.TranslatorPopup.renderTranslationPopup(obj, field, num);
-					}
-	
-				} else {
-					//highlighter.editor_pane.red.play();
-					if (status_update) status_update( 'Problem saving translation for ' + obj[field]() );
-				}
-			},
-		}).send();
-	}
-
 }
 
 

Copied: branches/acq-experiment/Open-ILS/web/js/dojo/openils/widget/nls (from rev 9506, trunk/Open-ILS/web/js/dojo/openils/widget/nls)

Modified: branches/acq-experiment/Open-ILS/web/opac/common/js/utils.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/opac/common/js/utils.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/opac/common/js/utils.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -111,7 +111,7 @@
 
 /* ------------------------------------------------------------------------------------------- */
 /* detect my browser */
-var isMac, NS, NS4, NS6, IE, IE4, IE4mac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4;
+var isMac, NS, NS4, NS6, IE, IE4, IEmac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4;
 function detect_browser() {       
 
    isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false;

Modified: branches/acq-experiment/Open-ILS/web/opac/skin/default/js/result_common.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/opac/skin/default/js/result_common.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/opac/skin/default/js/result_common.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -209,6 +209,7 @@
 	if(getTerm()) resultExpandSearch(); /* advanced search */
 }
 
+var lowHitsXRefSet = {};
 var lowHitsXRefLink;
 var lowHitsXRefLinkParent;
 function resultLowHitXRef(r) {
@@ -224,6 +225,10 @@
 		var word;
 		var c = 0;
 		while( word = arr.shift() ) {
+
+            if (lowHitsXRefSet[word] == 1) continue;
+            lowHitsXRefSet[word] = 1;
+
 			if(c++ > 20) break;
 			var a = {};
 			a[PARAM_TERM] = word;

Modified: branches/acq-experiment/Open-ILS/web/reports/oils_rpt_folder_window.js
===================================================================
--- branches/acq-experiment/Open-ILS/web/reports/oils_rpt_folder_window.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/web/reports/oils_rpt_folder_window.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -604,7 +604,7 @@
 	DOM.oils_rpt_folder_manager_name_input.value = folder.name();
 	DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
 		var name = DOM.oils_rpt_folder_manager_name_input.value;
-		if(name) {
+		if(name != "") {
 			folder.name( name );
 			if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
 				oilsRptUpdateFolder(folder, obj.type,

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -213,7 +213,7 @@
 		'ccs' : [ api.FM_CCS_RETRIEVE.app, api.FM_CCS_RETRIEVE.method, [], true ],
 		'aou' : [ api.FM_AOU_RETRIEVE.app, api.FM_AOU_RETRIEVE.method, [], true ],
 		'aout' : [ api.FM_AOUT_RETRIEVE.app, api.FM_AOUT_RETRIEVE.method, [], true ],
-		'crahp' : [ api.FM_CRAHP_RETRIEVE.app, api.FM_CRAHP_RETRIEVE.method, [], true ],
+		'crahp' : [ api.FM_CRAHP_RETRIEVE.app, api.FM_CRAHP_RETRIEVE.method, [], true ]
 	},
 
 	'stash_retrieve' : function() {
@@ -255,92 +255,92 @@
 					'type' : 'items',
 					'header' : 'The following items have been examined:<hr/><ol>',
 					'line_item' : '<li>%title%<br/>\r\nBarcode: %barcode%\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				}, 
 				'transit_list' : {
 					'type' : 'transits',
 					'header' : 'Transits:<hr/><ol>',
 					'line_item' : '<li>From: %transit_source% To: %transit_dest_lib%<br/>\r\nWhen: %transit_source_send_time%<br />\r\nBarcode: %transit_item_barcode% Title: %transit_item_title%<br/>\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				}, 
 				'items_out' : {
 					'type' : 'items',
 					'header' : 'Welcome to %LIBRARY%!<br/>\r\nYou have the following items:<hr/><ol>',
 					'line_item' : '<li>%title%<br/>\r\nBarcode: %barcode% Due: %due_date%\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n'
 				}, 
 				'checkout' : {
 					'type' : 'items',
 					'header' : 'Welcome to %LIBRARY%!<br/>\r\nYou checked out the following items:<hr/><ol>',
 					'line_item' : '<li>%title%<br/>\r\nBarcode: %barcode% Due: %due_date%\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n'
 				}, 
 				'offline_checkout' : {
 					'type' : 'offline_checkout',
 					'header' : 'Patron %patron_barcode%<br/>\r\nYou checked out the following items:<hr/><ol>',
 					'line_item' : '<li>Barcode: %barcode%<br/>\r\nDue: %due_date%\r\n',
-					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'checkin' : {
 					'type' : 'items',
 					'header' : 'You checked in the following items:<hr/><ol>',
 					'line_item' : '<li>%title%<br/>\r\nBarcode: %barcode%  Call Number: %call_number%\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				}, 
 				'bill_payment' : {
 					'type' : 'payment',
 					'header' : 'Welcome to %LIBRARY%!<br/>A receipt of your  transaction:<hr/> <table width="100%"> <tr> <td>Original Balance:</td> <td align="right">$%original_balance%</td> </tr> <tr> <td>Payment Method:</td> <td align="right">%payment_type%</td> </tr> <tr> <td>Payment Received:</td> <td align="right">$%payment_received%</td> </tr> <tr> <td>Payment Applied:</td> <td align="right">$%payment_applied%</td> </tr> <tr> <td>Billings Voided:</td> <td align="right">%voided_balance%</td> </tr> <tr> <td>Change Given:</td> <td align="right">$%change_given%</td> </tr> <tr> <td>New Balance:</td> <td align="right">$%new_balance%</td> </tr> </table> <p> Note: %note% </p> <p> Specific bills: <blockquote>',
 					'line_item' : 'Bill #%bill_id%  %last_billing_type% Received: $%payment%<br />%barcode% %title%<br /><br />',
-					'footer' : '</blockquote> </p> <hr />%SHORTNAME% %TODAY_TRIM%<br/> <br/> ',
+					'footer' : '</blockquote> </p> <hr />%SHORTNAME% %TODAY_TRIM%<br/> <br/> '
 				},
 				'bills_historical' : {
 					'type' : 'bills',
 					'header' : 'Welcome to %LIBRARY%!<br/>You had the following bills:<hr/><ol>',
 					'line_item' : '<dt><b>Bill #%id%</b></dt> <dd> <table> <tr valign="top"><td>Date:</td><td>%xact_start%</td></tr> <tr valign="top"><td>Type:</td><td>%xact_type%</td></tr> <tr valign="top"><td>Last Billing:</td><td>%last_billing_type%<br/>%last_billing_note%</td></tr> <tr valign="top"><td>Total Billed:</td><td>$%total_owed%</td></tr> <tr valign="top"><td>Last Payment:</td><td>%last_payment_type%<br/>%last_payment_note%</td></tr> <tr valign="top"><td>Total Paid:</td><td>$%total_paid%</td></tr> <tr valign="top"><td><b>Balance:</b></td><td><b>$%balance_owed%</b></td></tr> </table><br/>',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				}, 
 				'bills_current' : {
 					'type' : 'bills',
 					'header' : 'Welcome to %LIBRARY%!<br/>You have the following bills:<hr/><ol>',
 					'line_item' : '<dt><b>Bill #%id%</b></dt> <dd> <table> <tr valign="top"><td>Date:</td><td>%xact_start%</td></tr> <tr valign="top"><td>Type:</td><td>%xact_type%</td></tr> <tr valign="top"><td>Last Billing:</td><td>%last_billing_type%<br/>%last_billing_note%</td></tr> <tr valign="top"><td>Total Billed:</td><td>$%total_owed%</td></tr> <tr valign="top"><td>Last Payment:</td><td>%last_payment_type%<br/>%last_payment_note%</td></tr> <tr valign="top"><td>Total Paid:</td><td>$%total_paid%</td></tr> <tr valign="top"><td><b>Balance:</b></td><td><b>$%balance_owed%</b></td></tr> </table><br/>',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'bills_main_view' : {
 					'type' : 'bills',
 					'header' : 'Welcome to %LIBRARY%!<br/>You have the following bills:<hr/><ol>',
 					'line_item' : '<dt><b>Bill #%id%</b> %title%</dt> <dd> <table width="100%"> <tr valign="top"><td>Date:</td><td>%xact_start%</td></tr> <tr valign="top"><td>Type:</td><td>%xact_type%</td></tr> <tr valign="top"><td>Last Billing:</td><td>%last_billing_type%<br/>%last_billing_note%</td></tr> <tr valign="top"><td>Total Billed:</td><td>$%total_owed%</td></tr> <tr valign="top"><td>Last Payment:</td><td>%last_payment_type%<br/>%last_payment_note%</td></tr> <tr valign="top"><td>Total Paid:</td><td>$%total_paid%</td></tr> <tr valign="top"><td><b>Balance:</b></td><td><b>$%balance_owed%</b></td></tr> </table><br/>',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'offline_checkin' : {
 					'type' : 'offline_checkin',
 					'header' : 'You checked in the following items:<hr/><ol>',
 					'line_item' : '<li>Barcode: %barcode%\r\n',
-					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'offline_renew' : {
 					'type' : 'offline_renew',
 					'header' : 'You renewed the following items:<hr/><ol>',
 					'line_item' : '<li>Barcode: %barcode%\r\n',
-					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'offline_inhouse_use' : {
 					'type' : 'offline_inhouse_use',
 					'header' : 'You marked the following in-house items used:<hr/><ol>',
 					'line_item' : '<li>Barcode: %barcode%\r\nUses: %count%',
-					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'in_house_use' : {
 					'type' : 'items',
 					'header' : 'You marked the following in-house items used:<hr/><ol>',
 					'line_item' : '<li>Barcode: %barcode%\r\nUses: %uses%\r\n<br />%alert_message%',
-					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n',
+					'footer' : '</ol><hr />%TODAY_TRIM%<br/>\r\n<br/>\r\n'
 				},
 				'holds' : {
 					'type' : 'holds',
 					'header' : 'Welcome to %LIBRARY%!<br/>\r\nYou have the following titles on hold:<hr/><ol>',
 					'line_item' : '<li>%title%\r\n',
-					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n',
-				} 
+					'footer' : '</ol><hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\nYou were helped by %STAFF_FIRSTNAME%<br/>\r\n<br/>\r\n'
+				}
 			}; 
 
 			obj.stash( 'print_list_templates', 'print_list_types' );

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/constants.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/constants.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/constants.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -15,7 +15,7 @@
 		'1' : { 'disable_in_copy_editor' : true, 'block_mark_item_action' : true }, /* | Checked out    | t */
 		'3' : { 'disable_in_copy_editor' : true, 'block_mark_item_action' : true }, /* | Lost           | f */
 		'6' : { 'disable_in_copy_editor' : true, 'block_mark_item_action' : true }, /* | In transit     | t */
-		'8' : { 'disable_in_copy_editor' : true, 'block_mark_item_action' : false }, /* | On holds shelf | t */
+		'8' : { 'disable_in_copy_editor' : true, 'block_mark_item_action' : false } /* | On holds shelf | t */
 	}
 }
 
@@ -214,7 +214,7 @@
 	'RECALCULATE_STANDING_PENALTIES' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.penalties.update' },
     'USER_ORG_UNIT_OPT_IN_FEATURE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.org_unit_opt_in.enabled' },
     'USER_ORG_UNIT_OPT_IN_CHECK' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.org_unit_opt_in.check' },
-    'USER_ORG_UNIT_OPT_IN_CREATE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.org_unit_opt_in.create' },
+    'USER_ORG_UNIT_OPT_IN_CREATE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.org_unit_opt_in.create' }
 }
 
 const urls = {
@@ -310,5 +310,5 @@
 	'XUL_VOLUME_EDITOR' : '/xul/server/cat/volume_editor.xul',
 	'XUL_Z3950_IMPORT' : '/xul/server/cat/z3950.xul',
 	'TEST_HTML' : '/xul/server/main/test.html',
-	'TEST_XUL' : '/xul/server/main/test.xul',
+	'TEST_XUL' : '/xul/server/main/test.xul'
 }

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/menu.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/menu.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/main/menu.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -323,7 +323,7 @@
 					var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
 						obj.url_prefix(urls.XUL_HOLD_PULL_LIST) + '?ses='+window.escape(ses())
 					);
-					obj.set_tab( loc, {'tab_name' : offlineStrings.getString('menu.cmd_browse_hold_pull_list.tab')}, { 'show_print_button' : true, } );
+					obj.set_tab( loc, {'tab_name' : offlineStrings.getString('menu.cmd_browse_hold_pull_list.tab')}, { 'show_print_button' : true } );
 				}
 			],
 

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/browser.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/browser.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/browser.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -72,7 +72,7 @@
 									obj.error.sdump('D_ERROR',err);
 								}
 							}
-						],
+						]
 					}
 				}
 			);
@@ -258,7 +258,7 @@
 		} catch(E) {
 			this.error.sdump('D_ERROR','util.browser.buildProgressListener: ' + E + '\n');
 		}
-	},
+	}
 }
 
 dump('exiting util.browser.js\n');

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/deck.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/deck.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/deck.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -164,7 +164,7 @@
 					'push_xulG' : true,
 					'alt_print' : false,
 					'browser_id' : 'frame_'+obj.id_incr,
-					'passthru_content_params' : content_params,
+					'passthru_content_params' : content_params
 				}
 			);
 		return browser;
@@ -180,7 +180,7 @@
 		}
 	},
 
-	'id_incr' : 0,
+	'id_incr' : 0
 }	
 
 dump('exiting util/deck.js\n');

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/error.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/error.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/error.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -509,7 +509,7 @@
 			}
 		}
 		return r;
-	},
+	}
 }
 
 dump('exiting util/error.js\n');

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/list.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/list.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/list.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -1294,7 +1294,7 @@
 		} catch(E) {
 			obj.error.standard_unexpected_error_alert('pre sorting', E);
 		}
-	},
+	}
 
 }
 dump('exiting util.list.js\n');

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/network.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/network.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/network.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -251,7 +251,7 @@
 			{
 				'login_type' : 'staff',
 				'desc_brief' : text ? 'Session Expired' : 'Operator Change',
-				'desc_full' : text ? 'Please enter the credentials for a new login session.' : 'Please enter the credentials for the new login session.  Note that the previous session is still active.',
+				'desc_full' : text ? 'Please enter the credentials for a new login session.' : 'Please enter the credentials for the new login session.  Note that the previous session is still active.'
 				//'simple_auth' : (new Date()).toString(),
 			}
 		);
@@ -315,7 +315,7 @@
 						{
 							'login_type' : 'temp',
 							'desc_brief' : 'Permission Denied: ' + robj.ilsperm,
-							'desc_full' : 'Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, please inform your friendly Evergreen developers or helpdesk staff of the above permission and this debug information: ' + name,
+							'desc_full' : 'Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, please inform your friendly Evergreen developers or helpdesk staff of the above permission and this debug information: ' + name
 							//'simple_auth' : (new Date()).toString(),
 						}
 					);
@@ -399,9 +399,7 @@
 		} catch(E) {
 			throw(E);
 		}
-	},
-
-
+	}
 }
 
 /*

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/print.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/print.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/chrome/content/util/print.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -436,7 +436,7 @@
 		} catch(E) {
 			this.error.standard_unexpected_error_alert("save_settings()",E);
 		}
-	},
+	}
 }
 
 dump('exiting util/print.js\n');

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/defaults/preferences/prefs.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/defaults/preferences/prefs.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -12,6 +12,9 @@
 pref("open-ils.repository.date","$Date$");
 pref("open-ils.repository.id","$Id$");
 
+// We'll set a default locale
+pref("general.useragent.locale", "en-US");
+
 // We need something like this to get window.open to work in some places (where it complains about
 // navigator.xul not being registered.  But is about:blank the best value to use here?
 pref("browser.chromeURL","about:blank");

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marc_new.xul
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marc_new.xul	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marc_new.xul	2008-05-05 00:58:16 UTC (rev 9507)
@@ -103,7 +103,7 @@
 											var content_params = {
 												'session' : ses(),
 												'authtime' : ses('authtime'),
-												'opac_url' : opac_url,
+												'opac_url' : opac_url
 											};
 											xulG.set_tab(
 												xulG.url_prefix(urls.XUL_OPAC_WRAPPER),

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marcedit.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marcedit.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/cat/marcedit.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -542,7 +542,7 @@
 		},
 		_6 : {
 			VIS : {start : 16, len : 1, def : ' ' }
-		},
+		}
 	},
 	Time : {
 		_8 : {
@@ -586,7 +586,7 @@
 		},
 		_6 : {
 			MAP : {start : 16, len : 2, def : ' ' }
-		},
+		}
 	},
 	Relf : {
 		_8 : {
@@ -1090,7 +1090,7 @@
 		ldr : _record.leader,
 		_6 : _record.controlfield.(@tag=='006'),
 		_7 : _record.controlfield.(@tag=='007'),
-		_8 : _record.controlfield.(@tag=='008'),
+		_8 : _record.controlfield.(@tag=='008')
 	};
 
 	var name = element.getAttribute('name');
@@ -1305,14 +1305,14 @@
 			  onmouseover : 'getTooltip(this, "subfield");',
 			  contextmenu : function (event) { getAuthorityContextMenu(event.target, sf) },
 			  size : new String(sf.text()).length + 2,
-			  oninput : "this.setAttribute('size', this.value.length + 2);",
+			  oninput : "this.setAttribute('size', this.value.length + 2);"
 			} )
 	);
 }
 
 function loadRecord(rec) {
 	try {
-			_record = rec;
+			var _record = rec;
 			var grid_rows = document.getElementById('recGrid').lastChild;
 
 			while (grid_rows.firstChild) grid_rows.removeChild(grid_rows.firstChild);
@@ -1408,7 +1408,7 @@
 						'var e = document.createEvent("MutationEvents");' +
 						'e.initMutationEvent("change",1,1,null,0,0,0,0);' +
 						'current_focus.inputField.dispatchEvent(e);',
-					  tooltiptext : sf.description,
+					  tooltiptext : sf.description
 					}
 				)
 			);
@@ -1582,7 +1582,7 @@
 				  command : function (event) {
 						applyAuthority(event.target.previousSibling, target, sf);
 						return true;
-				  },
+				  }
 				}
 			)
 		);
@@ -1792,7 +1792,7 @@
 			181 : 'z',
 			182 : 'z',
 			185 : 'z'
-		},
+		}
 	},
 	630 : {
 		'a' : { 130 : 'a' },

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/main/ws_info.xul
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/main/ws_info.xul	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/main/ws_info.xul	2008-05-05 00:58:16 UTC (rev 9507)
@@ -131,7 +131,7 @@
 							obj.shortname(), 
 							obj.id(), 
 							( !get_bool( g.aout_hash[ obj.ou_type() ].can_have_users() ) ),
-							( g.aout_hash[ obj.ou_type() ].depth() ),
+							( g.aout_hash[ obj.ou_type() ].depth() )
 						]; 
 					}
 				),
@@ -150,8 +150,8 @@
 					{
 						'title' : document.getElementById('commonStrings').getString('staff.main.gen_offline_widgets.registration.override'),
 						'overridable_events' : [ 
-							1703 /* WORKSTATION_NAME_EXISTS */, 
-						],
+							1703 /* WORKSTATION_NAME_EXISTS */
+						]
 					}
 				);
 
@@ -166,7 +166,7 @@
 					g.data.ws_info[ xulG.auth.controller.view.server_prompt.value ] = { 
 						'name' : g.my_libs_shortname_hash[ g.ml.value ] + '-' + g.tb.value, 
 						'owning_lib' : g.ml.value,
-						'lib_shortname' : g.my_libs_shortname_hash[ g.ml.value ],
+						'lib_shortname' : g.my_libs_shortname_hash[ g.ml.value ]
 					};
 					xulG.file.get('ws_info');
 					xulG.file.set_object(g.data.ws_info);

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue.xhtml
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue.xhtml	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue.xhtml	2008-05-05 00:58:16 UTC (rev 9507)
@@ -942,7 +942,6 @@
 		<span id='ue_no_profile'>A profile group must be selected</span>
 		<span id='ue_bad_expire'>The user expiration date is invalid.  We're expecting YYYY-MM-DD</span>
 		<span id='ue_bad_claims_returned'>The claims returned count is invalid</span>
-		<span id='ue_no_profile'>A profile group must be selected</span>
 		<span id='ue_unknown_error'>An unknown formatting error occurred</span>
 		<span id='ue_bad_addr_label'>Address label is invalid</span>
 		<span id='ue_bad_addr_street'>Address street is invalid</span>

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue_config.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue_config.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/ue_config.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -303,7 +303,7 @@
 			widget	: {
 				id			: 'ue_day_phone',
 				type		: 'input',
-				regex		:  phoneRegex,
+				regex		:  phoneRegex
 			}
 		},
 		{
@@ -314,7 +314,7 @@
 			widget	: {
 				id			: 'ue_night_phone',
 				type		: 'input',
-				regex		:  phoneRegex,
+				regex		:  phoneRegex
 			}
 		},
 		{
@@ -325,7 +325,7 @@
 			widget	: {
 				id			: 'ue_other_phone',
 				type		: 'input',
-				regex		:  phoneRegex,
+				regex		:  phoneRegex
 			}
 		},
 		{
@@ -335,7 +335,7 @@
 			widget	: {
 				id			: 'ue_org_selector',
 				type		: 'select',
-				regex		:  numRegex,
+				regex		:  numRegex
 			}
 		},
 		{
@@ -346,7 +346,7 @@
 			widget	: {
 				id			: 'ue_expire',
 				type		: 'input',
-				regex		:  dateRegex,
+				regex		:  dateRegex
 			}
 		},
 		{
@@ -355,7 +355,7 @@
 			key		: 'active',
 			widget	: {
 				id			: 'ue_active',
-				type		: 'checkbox',
+				type		: 'checkbox'
 			}
 		},
 		{
@@ -429,7 +429,7 @@
 			key		: 'master_account',
 			widget	: {
 				id			: 'ue_group_lead',
-				type		: 'checkbox',
+				type		: 'checkbox'
 			}
 		},
 		{
@@ -439,7 +439,7 @@
 			widget	: {
 				id			: 'ue_claims_returned',
 				type		: 'input',
-				regex		: numRegex,
+				regex		: numRegex
 			}
 		},
 		{
@@ -448,7 +448,7 @@
 			key		: 'alert_message',
 			widget	: {
 				id			: 'ue_alert_message',
-				type		: 'input',
+				type		: 'input'
 			}
 		}
 	];
@@ -659,7 +659,7 @@
 				base	: row,
 				name	: 'ue_addr_label',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -671,7 +671,7 @@
 				base	: row,
 				name	: 'ue_addr_street1',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -683,7 +683,7 @@
 				base	: row,
 				name	: 'ue_addr_street2',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -695,7 +695,7 @@
 				base	: row,
 				name	: 'ue_addr_city',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -706,7 +706,7 @@
 				base	: row,
 				name	: 'ue_addr_county',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -718,7 +718,7 @@
 				base	: row,
 				name	: 'ue_addr_state',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -730,7 +730,7 @@
 				base	: row,
 				name	: 'ue_addr_country',
 				type	: 'input',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -780,7 +780,7 @@
 				base	: row,
 				name	: 'ue_addr_inc_yes',
 				type	: 'checkbox',
-				disabled : disabled,
+				disabled : disabled
 			}
 		},
 		{ 
@@ -791,7 +791,7 @@
 				base	: row,
 				name	: 'ue_addr_valid_yes',
 				type	: 'checkbox',
-				disabled : disabled,
+				disabled : disabled
 			}
 		}
 	];

Modified: branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/util.js
===================================================================
--- branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/util.js	2008-05-04 23:51:08 UTC (rev 9506)
+++ branches/acq-experiment/Open-ILS/xul/staff_client/server/patron/util.js	2008-05-05 00:58:16 UTC (rev 9507)
@@ -19,62 +19,62 @@
 	var c = [
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : commonStrings.getString('staff.mbts_id_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.id(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.id(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'usr', 'label' : commonStrings.getString('staff.mbts_usr_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.usr() ? "Id = " + my.mbts.usr() : ""; },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.usr() ? "Id = " + my.mbts.usr() : ""; }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'xact_type', 'label' : commonStrings.getString('staff.mbts_xact_type_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_type(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_type(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'balance_owed', 'label' : commonStrings.getString('staff.mbts_balance_owed_label'), 'flex' : 1,
 			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.balance_owed() ); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'total_owed', 'label' : commonStrings.getString('staff.mbts_total_owed_label'), 'flex' : 1,
 			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_owed() ); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'total_paid', 'label' : commonStrings.getString('staff.mbts_total_paid_label'), 'flex' : 1,
 			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_paid() ); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_billing_note', 'label' : commonStrings.getString('staff.mbts_last_billing_note_label'), 'flex' : 2,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_note(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_note(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_billing_type', 'label' : commonStrings.getString('staff.mbts_last_billing_type_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_type(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_type(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_billing_ts', 'label' : commonStrings.getString('staff.mbts_last_billing_timestamp_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_billing_ts(), "" ); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_billing_ts(), "" ); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_payment_note', 'label' : commonStrings.getString('staff.mbts_last_payment_note_label'), 'flex' : 2,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_note(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_note(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_payment_type', 'label' : commonStrings.getString('staff.mbts_last_payment_type_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_type(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_type(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'last_payment_ts', 'label' : commonStrings.getString('staff.mbts_last_payment_timestamp_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_payment_ts(), "" ); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_payment_ts(), "" ); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'xact_start', 'label' : commonStrings.getString('staff.mbts_xact_start_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_start() ? my.mbts.xact_start().toString().substr(0,10) : ""; },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_start() ? my.mbts.xact_start().toString().substr(0,10) : ""; }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'xact_finish', 'label' : commonStrings.getString('staff.mbts_xact_finish_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_finish() ? my.mbts.xact_finish().toString().substr(0,10) : ""; },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_finish() ? my.mbts.xact_finish().toString().substr(0,10) : ""; }
 		},
 	];
 	for (var i = 0; i < c.length; i++) {
@@ -117,40 +117,40 @@
 	var c = [
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : commonStrings.getString('staff.mb_id_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.id(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.id(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'voided', 'label' : commonStrings.getString('staff.mb_voided_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return get_bool( my.mb.voided() ) ? "Yes" : "No"; },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return get_bool( my.mb.voided() ) ? "Yes" : "No"; }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'voider', 'label' : commonStrings.getString('staff.mb_voider_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.voider() ? "Id = " + my.mb.voider() : ""; },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.voider() ? "Id = " + my.mb.voider() : ""; }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'void_time', 'label' : commonStrings.getString('staff.mb_void_time_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.void_time(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.void_time(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'amount', 'label' : commonStrings.getString('staff.mb_amount_label'), 'flex' : 1,
 			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mb.amount() ); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'billing_type', 'label' : commonStrings.getString('staff.mb_billing_type_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.billing_type(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.billing_type(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'billing_ts', 'label' : commonStrings.getString('staff.mb_billing_ts_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mb.billing_ts(), "" ); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mb.billing_ts(), "" ); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'note', 'label' : commonStrings.getString('staff.mb_note_label'), 'flex' : 2,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.note(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.note(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'xact', 'label' : commonStrings.getString('staff.mb_xact_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.xact(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.xact(); }
 		},
 	];
 	for (var i = 0; i < c.length; i++) {
@@ -194,36 +194,36 @@
 	var c = [
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_id', 'label' : commonStrings.getString('staff.mp_id_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.id(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.id(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_amount', 'label' : commonStrings.getString('staff.mp_amount_label'), 'flex' : 1,
 			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mp.amount() ); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_payment_type', 'label' : commonStrings.getString('staff.mp_payment_type_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.payment_type(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.payment_type(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_payment_ts', 'label' : commonStrings.getString('staff.mp_payment_timestamp_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mp.payment_ts(), "" ); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mp.payment_ts(), "" ); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_note', 'label' : commonStrings.getString('staff.mp_note_label'), 'flex' : 2,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.note(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.note(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_ws', 'label' : commonStrings.getString('staff.mp_cash_drawer_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.cash_drawer().name(); }, 
+			'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.cash_drawer().name(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_staff', 'label' : commonStrings.getString('staff.mp_accepting_usr_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : false, 'render' : function(my) { var s = my.mp.accepting_usr(); if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); return s.family_name() + " (" + s.card().barcode() + ") @ " + data.hash.aou[ s.home_ou() ].shortname(); },
+			'primary' : false, 'hidden' : false, 'render' : function(my) { var s = my.mp.accepting_usr(); if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); return s.family_name() + " (" + s.card().barcode() + ") @ " + data.hash.aou[ s.home_ou() ].shortname(); }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'mp_xact', 'label' : commonStrings.getString('staff.mp_xact_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.xact(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.xact(); }
 		},
 	];
 	for (var i = 0; i < c.length; i++) {
@@ -266,125 +266,125 @@
 	var c = [
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'barcode', 'label' : commonStrings.getString('staff.card_barcode_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.card().barcode(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.card().barcode(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'usrname', 'label' : commonStrings.getString('staff.au_usrname_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.usrname(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.usrname(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'profile', 'label' : commonStrings.getString('staff.au_profile_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.pgt[ my.au.profile() ].name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.pgt[ my.au.profile() ].name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'active', 'label' : commonStrings.getString('staff.au_active_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.active() ) ? "Yes" : "No"; },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.active() ) ? "Yes" : "No"; }
 		},
 		{
 			'persist' : 'hidden width ordinal', 'id' : 'barred', 'label' : commonStrings.getString('staff.au_barred_label'), 'flex' : 1,
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.barred() ) ? "Yes" : "No"; },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.barred() ) ? "Yes" : "No"; }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : document.getElementById('commonStrings').getString('staff.au_id_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.id(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.id(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'prefix', 'label' : document.getElementById('commonStrings').getString('staff.au_name_prefix_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.prefix(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.prefix(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'family_name', 'label' : document.getElementById('commonStrings').getString('staff.au_family_name_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.family_name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.family_name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'first_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_first_given_name_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.first_given_name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.first_given_name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'second_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_second_given_name_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.second_given_name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.second_given_name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'suffix', 'label' : document.getElementById('commonStrings').getString('staff.au_name_suffix_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.suffix(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.suffix(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'alert_message', 'label' : commonStrings.getString('staff.au_alert_message_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.alert_message(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.alert_message(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'claims_returned_count', 'label' : commonStrings.getString('staff.au_claims_returned_count_label'), 'flex' : 1, 
 			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.claims_returned_count(); },
-			'sort_type' : 'number',
+			'sort_type' : 'number'
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'create_date', 'label' : commonStrings.getString('staff.au_create_date_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.create_date(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.create_date(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'expire_date', 'label' : commonStrings.getString('staff.au_expire_date_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.expire_date().substr(0,10); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.expire_date().substr(0,10); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'home_ou', 'label' : commonStrings.getString('staff.au_home_library_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].shortname(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].shortname(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'home_ou_fullname', 'label' : commonStrings.getString('staff.au_home_library_fullname_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'credit_forward_balance', 'label' : commonStrings.getString('staff.au_credit_forward_balance_label'), 'flex' : 1, 
 			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.credit_forward_balance(); },
-			'sort_type' : 'money',
+			'sort_type' : 'money'
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'day_phone', 'label' : commonStrings.getString('staff.au_day_phone_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.day_phone(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.day_phone(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'evening_phone', 'label' : commonStrings.getString('staff.au_evening_phone_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.evening_phone(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.evening_phone(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'other_phone', 'label' : commonStrings.getString('staff.au_other_phone_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.other_phone(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.other_phone(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'email', 'label' : commonStrings.getString('staff.au_email_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.email(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.email(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'dob', 'label' : commonStrings.getString('staff.au_birth_date_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.dob().substr(0,10); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.dob().substr(0,10); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'ident_type', 'label' : commonStrings.getString('staff.au_ident_type_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type() ].name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type() ].name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'ident_value', 'label' : commonStrings.getString('staff.au_ident_value_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'ident_type2', 'label' : commonStrings.getString('staff.au_ident_type2_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type2() ].name(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type2() ].name(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'ident_value2', 'label' : commonStrings.getString('staff.au_ident_value2_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value2(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value2(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'net_access_level', 'label' : commonStrings.getString('staff.au_net_access_level_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.net_access_level(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.net_access_level(); }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'master_account', 'label' : commonStrings.getString('staff.au_master_account_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.master_account() ) ? "Yes" : "No"; },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.master_account() ) ? "Yes" : "No"; }
 		},
 		{ 
 			'persist' : 'hidden width ordinal', 'id' : 'usrgroup', 'label' : commonStrings.getString('staff.au_group_id_label'), 'flex' : 1, 
-			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.usrgroup(); },
+			'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.usrgroup(); }
 		},
 	];
 	for (var i = 0; i < c.length; i++) {



More information about the open-ils-commits mailing list